-c1E
+\/d
ГЛАВА VI. МУЗЫКАЛЬНЫЕ СРЕДСТВА MSX-BASIC
+\/d-
У меня под руками оказался жалкий спинет;
и вскоре я начал писать ноты, вот и все.
Дж. Верди
-
MSX-BASIC включает в себя Музыкальный Макро-Язык (MML), позволяющий
управлять четырехканальным звуковым генератором компьютера.Этот генератор
работает как независимый процессор: если музыкальные или другие звуковые
MML - это Музыкальный Макро-Язык ("Musical Macro-Language"), в некото-
ром смысле аналогичный GML ("Graphics Macro Language").
MML использует для записи нот символы:
-
- C D E F G A B
+ C D E F G A B ,
до ре ми фа соль ля си
-
которые вызывают исполнение соответствующей ноты в текущей октаве.
Для обеспечения хроматизма игры ноты можно модифицировать добавлением
символов: ┌───────────────────────────────────────────────────────┐
"C D E" или "CDE".
-
VI.1. О п и с а н и е к о м а н д MML
-
Приведем список команд MML.Каждая команда представлена одиночной ключе-
вой буквой (L,O,N,T,V,S,M,R), за которой следует один числовой параметр
(аргумент).
-
1. К о м а н д а Lk ("Length"-"длительность"),
где k - целое число, принадлежащее отрезку [1,64], устанавливает текущую
длительность для всех последующих нот.
Код длительности звука равный 1 соответствует целой длительности, 2 -
половинной, 4 - четвертной, 8 - восьмой, 16 - шестнадцатой, 32 - тридцать
второй, 64 - шестьдесят четвертой.
- Например, команда L8 установит длительность звука равной восьмой.
+ Например, команда L8 установит длительность звука равную восьмой.
Заметим,что "C32" равносильна "L32C", но учтите, что команда L действу-
ет и на все последующие ноты до ее "сброса" оператором BEEP (см.раздел
VI.2) или командой L с другим аргументом.
ется нота вне текущей октавы.
Команда O влияет на все последующие ноты,пока октава не будет переопре-
делена.
-
3. К о м а н д а Nk (Note"-"нота"),
где k - целое число, принадлежащее отрезку [1,96], позволяет кодировать
ноты целыми числами.
Самая низкая нота - "N1", самая высокая - "N96",при этом "О4С" и "N36"-
- это одна и та же нота! Вообще, "доступна" л ю б а я нота, т.е. "N37"-
- это нота "С+" 4-й октавы, а не нота "D" 4-й октавы!
-
П р и м е р. 10 FOR I=1 TO 96:CLS:PRINT"Номер ноты";I:PLAY"N=I;"
─────────── 20 FOR D=1 TO 300:NEXTD:NEXTI
- Для записи нот вне текущей длительности, Вы должны записать символ ";"
+ Для записи нот вне текущей длительности Вы должны записать символ ";"
после номера ноты и только потом указать ее длительность, например:
"О4С8" - соответствует "N36;8".
Таким образом, можно задавать индивидуальную длительность.
одной форме волны звук, постепенно нарастающий по громкости, внезапно рез-
ко обрывается,другой волновой пакет соответствует обратной ситуации. Мож-
но также получить с помощью компьютера трели, свист и другие интересные
-звуковые эффекты. Однако,одновременно допускается пользоваться лишь одной
+звуковые эффекты. Однако одновременно допускается пользоваться лишь одной
из восьми форм, и разным звуковым каналам не могут соответствовать различ-
ные пакеты.
К о м а н д а Sk ("Shape"-"форма"),
ны ("конверта"). Параметр k (цикл модуляции) определяет несущую частоту
звукового генератора. По умолчанию k=1.
Ниже показаны допустимые формы волновых пакетов.
-
▲ ▲ ▲ ▲
│ │ │ │
│ │ │ │
│ │ │ │
└───────────▶ └───────────▶ └───────────▶ └───────────▶
S=11 S=12 S=13 S=14
-
Выполнив следующую программу, Вы услышите особенности звучания каждого
из восьми пакетов.
-
П р и м е р [76]. В о с е м ь волновых пакетов
────────────────
20 CLS:A$="M500O4L4DF#ARAF#D"
90 NEXT I
100 END
110 DATA s1,s4,s8,s10,s11,s12,s13,s14
-
Все пакеты можно подразделить на два типа: "н е п р е р ы в н ы е" и
"с к а ч к о о б р а з н ы е".
В непрерывных пакетах звук изменяется непрерывно. К ним относятся паке-
70 PLAY"S11M1900L64O3F+GACO2A"
80 NEXT I
90 END
-
4) 10 CLS:INPUT"Начало модуляции";X
20 INPUT"Конец модуляции";Y:INPUT"Шаг модуляции";Z
30 CLS:FOR S=1 TO 8:READ I:PRINT"Форма";I
40 FOR M=X TO Y STEP Z:BEEP:PRINT"Модуляция";M
50 PLAY"S=I;M=M;B":FOR D=1TO500:NEXTD:NEXTM:NEXTS
60 DATA 0,4,8,10,11,12,13,14
-
Как уже говорилось, имеется 8 "конвертов", которые могут быть выбраны
командой S. Период каждого "конверта" можно уменьшить, уменьшив значение
аргумента команды M (другими словами, количество "пилочек" в единицу вре-
то период также возрастает и различие предыдущих операторов исчезает.
Попытаемся убедить Вас в этом. Рассмотрим операторы:
PLAY"S8M6000cdefg" и PLAY"S10M6000cdefg" .
-К нашему удивлению, звучит одинаковая "музыка"! Однако, изобразим "конвер-
+К нашему удивлению, звучит одинаковая "музыка"! Однако изобразим "конвер-
ты", соответствующие каждому оператору:
-
▲
│ │
S8 M6000 │ │
S10 M6000 │ │
└─────────────────────────────────▶
исполняемая музыка
-
... и "тайное становится явным"! Однако учтите, что длительность исполня-
емого фрагмента можно легко изменить командой L.
ставляющих при исполнении legato указанную длительность, при исполнении
non legato - 7/8 и 1/8 указанной длительности, при исполнении staccato -
3/4 и 1/4 указанной длительности.
-
┌─────────────────────┬─────────┬───────────────────┬───────────────────┐
│ Н а з в а н и е │ legato │ non legato │ staccato │
│ длительности ├─────────┼─────────┬─────────┼─────────┬─────────┤
9. К о м а н д а XA; (символ ";" обязателен!),
где A - строковая переменная, выполняет "подпрограмму" на MML, которая
определяется значением строковой переменной.
-
П р и м е р. 10 A$="DCF"
─────────── 20 PLAY "V15XA$;V6XA$;"
Подпрограммы могут быть вложенными, что упрощает запись повторяющихся
VI.2. O п е р а т о р PLAY. Ф у н к ц и я PLAY. О п е р а т о р BEEP
-
А Вы ноктюрн сыграть могли бы
На флейте водосточных труб?
В. Маяковский
-
Синтаксис оператора: ┌──────────────────────┐
│ PLAY [А][,B][,C] │ ,
└──────────────────────┘
Оператор PLAY содержит одну, две или три строки (для одного, двух или
трех голосов), поэтому можно добиться одновременного звучания не более
т р е х голосов! Приведем примеры:
-
α) Аккорд ми-минор(4-я октава). β) Аккорд до-мажор(4-я октава).
10 А$="L2М10000S1Е" 10 A$="L4M8000S1C"
20 B$="L2M10000S1G+" 20 B$="L4M8000S1E"
30 C$="L2M10000S1B" 30 C$="L4M8000S1G"
40 PLAY A$,B$,C$ 40 PLAY A$,B$,C$:GOTO 40
-
γ) 10 A$="O4CDO3BO4E2R4"
20 B$="O4EFDG2R4"
30 C$="O4GAGO5C2R4"
40 PLAY A$,B$,C$
-
Если для одного из трех голосов указана пустая строка, то данный голос
будет "молчать". Например:
10 PLAY"O4L8CDEFGAB"
ная программа может "заниматься" чем-либо другим.После выполнения команды
макроязыка удаляются из очередей. Когда все очереди пусты,музыка прекраща-
ется.
- Далее, может выполняться новый оператор PLAY, но его выполнение, как
+ Далее может выполняться новый оператор PLAY, но его выполнение, как
правило, должно начаться сразу же после считывания из очереди последней
команды предыдущего оператора PLAY, и даже в этом случае загрузка новых
очередей вызовет задержку.
одновременно сопровождать индикацией на дисплее названия ноты. Как легко
убедиться, названия нот появляются почти одновременно в виде списка, без
всякой связи с их исполнением.
-
П р и м е р. 30 CLS
─────────── 40 PLAY"T255O5L16"
50 FOR I=1 TO 10
90 NEXT I
100 END
110 DATA C,A,E,F,G,B,D,G,E,C
-
Наиболее простое решение проблемы сводится к организации цикла времен-
ной задержки внутри временного основного цикла FOR. Период задержки необ-
ходимо согласовать с темпом и длительностью звучания нот.
и в процессе игры в качестве фоновой задачи, причем PLAY(0) сообщает,есть
ли еще несыгранная музыка, PLAY(1) проверяет только голос А, PLAY(2) - го-
лос B, PLAY(3) - голос C. Функция возвращает 0, если музыки в очереди нет,
-если же в очереди "что-нибудь" есть и играется,то функция возвращает (-1).
+если же в очереди "что-нибудь" есть и играется, то функция возвращает -1.
Приведем пример использования функции PLAY:
10 PLAY A$,B$,C$
20 IF PLAY(0) THEN 20 ELSE READ A$:PLAY A$'Выполнение программы не про
Оператор BEEP используется для вывода звукового сигнала продолжительно-
стью 0.04 с частотой 1.3 Гц и инициализации синтезатора звуков: установки
-всех его регистров в начальное состояние и очистку очередей всех его кана-
+всех его регистров в начальное состояние и очистки очередей всех его кана-
лов от последовательности музыкальных команд оператора PLAY.
Его синтаксис: ┌────────────┐
│ BEEP │ ,
Например: 10 INPUT"Номер месяца";MN
20 IF MN>12 OR MN<1 THEN BEEP:GOTO 10 ELSE PRINT DAY$(MN)
Несколько звонков подряд дадут длительный сигнал и привлекут, если тре-
-буется Ваше внимание, например:
+буется, Ваше внимание, например:
FOR I=1 TO 10:BEEP:NEXT
Во-вторых, для предоставления пользователю возможности прекратить в лю-
бой момент воспроизведение музыки или звуковых эффектов (в командном режи-
ме наберите BEEP или PRINT CHR$(7) , или нажмите клавиши "CTRL"+"G").
-
Определенная усидчивость и аккуратность позволят Вам перевести на MML
любую партитуру из трех или менее голосов. При правильной организации про-
граммы компьютер может исполнять музыкальное произведение пока "работают"
Взгляните на следующий пример. Возможно, получаемое качество звучания
далеко от совершенства, тем не менее оно дает представление о том, каких
результатов Вы можете добиться.
-
П р и м е р [76]. Ф о н о в а я музыка
────────────────
20 CLS:KEYOFF:R=RND(-TIME)
170 NEXTI
180 PRINT W$;
190 GOTO 110
-
Теперь разберем подробнее организацию музыкальной программы и некото-
рые о с о б е н н о с т и , которые следует учесть при ее составлении.
Оператор BEEP или ошибка в программе останавливают исполнение музыки.
всегда образуют короткую паузу между концом музыкальных данных первого
оператора PLAY и началом музыкальных данных следующего оператора PLAY.
Оператор PLAY позволяет исполнять ноты с четкими перерывами между ними
-- staccato, без перерывов - legato,и с короткими перерывами, вполне доста-
+- staccato, без перерывов - legato и с короткими перерывами, вполне доста-
точными для того,чтобы отличить звуки друг от друга - non legato. Как уже
говорилось, исполнение staccato достигается только за счет того,что выдер-
живается 3/4 номинальной длительности ноты и 1/4 оставляется на паузу.Для
стандартную длительность, например: PLAY"L8 CDEF R8 GAB" .
Если после R в данном случае не была бы указана длительность (8),то не-
смотря на текущую длительность L8, "нота" R в действительности имела бы
-длительность по умолчанию (4). Однако, это не лучший способ для игры stac-
+длительность по умолчанию (4). Однако это не лучший способ для игры stac-
cato и non legato. Гораздо проще обратиться за помощью к PSG (Программиру-
емому Звуковому Генератору) (см. раздел VI.3).
Если научиться умело пользоваться командами S и M, то Вам будут доступ-
так уж и много!
Обратите также внимание на следующие т о н к и е м о м е н т ы.
-
α) Значения аргументов команд MML не уничтожаются оператором NEW, поэ-
тому новую программу следует начинать с конкретного определения текущих
значений аргументов команд L,М,S,O,T. Если этого не сделать,то не следует
10 PLAY"cdefgab" 10 PLAY"sm500cdefgab" 10 PLAY"cdefgab"
run run run
Ok Ok Ok
-
β) Запомните, что все текущие значения аргументов команд MML лучше все-
го определять в программе я в н о:
10 A$="S M5000 T150 O4 L4":B$="S M5000 T150 O4 L4":C$="S M5000 T150 O4 L4"
20 PLAY A$,B$,C$
-
Приведем программы, по которым компьютер исполнит несколько разных по
сложности музыкальных произведений.
70 C$="t100s2m2000O4L16ddaaR16r16c+c+ddaaddaaddaaR16r16c+c+ddaaaacceeb
baaccaaccaacceebbeecc"
80 PLAY A$,B$,C$:PLAY"O4a4","O4E4","O4c4":NEXT
-
2) 10 '"Гопак" (Украинский народный танец).
20 FOR I=1 TO 2
30 A$="sm2000L8O5T150D4O4AR16g16f+ef+dO3aO4df+aL16gf+geL8f+dO5ddO4aR16
dO4d4dad4gdgdR8ab4"
100 PLAY A$,B$,C$
110 NEXT
-
3) 2 '"Неаполитанская песенка" (отрывок) П.И.Чайковский.
5 A$="sm1500l6o6t112":B$="sm1500l6o6t112":C$="sm1500l6o6t112"
6 PLAY A$,B$,C$
музыки. Не избежал заразительного увлечения даже Моцарт. В 1793 году он
пишет "Руководство, как при помощи двух игральных костей сочинять вальсы,
не имея ни малейшего представления о музыке и композиции".
- В ХVII в.было создано немало музыкальных пьес "на случайную тему",и не-
-которые из них приписывают Моцарту и Гайдну. Например, в шестнадцатитакто-
-вой части можно предусмотреть 11 различных вариантов для каждого такта,
+ В ХVII в. было создано немало музыкальных пьес "на случайную тему", и
+некоторые из них приписывают Моцарту и Гайдну. Например, в шестнадцатитак-
+товой части можно предусмотреть 11 различных вариантов для каждого такта,
что можно представить в виде таблицы из 16 столбцов по 11 тактов в каждой,
а исполнителю дано выбирать каждый такт, бросая игральные кости (по-види-
мому,музыкант должен заранее бросать кости 16 раз, чтобы не останавливать-
VI.3. О п е р а т о р SOUND
-
Этот оператор позволяет квалифицированному пользователю управлять Про-
граммируемым Звуковым Генератором (PSG).Имеется четырнадцать 8-битовых ре-
гистров,пронумерованных от 0 до 13, каждый из которых предназначен только
для записи и может содержать значения в диапазоне от 0 до 255(см.таблицу).
-
┌───────────┬──────────────────────────┬────────────┬─────────────────┐
│ Н о м е р │ С о д е р ж и м о е │ Значение │ Значение на паре│
│ регистра │ │ │ регистров │
│ 13 │(управление законом изме-│ │ │
│ │ нения громкости). │ │ │
└───────────┴──────────────────────────┴────────────┘─────────────────┘
-
Оператор SOUND обеспечивает прямой доступ к регистрам звукового гeнера-
тора. Синтаксис оператора: ┌────────────────┐
- │ SOUND R,V │
+ │ SOUND R,V │ ,
└────────────────┘
где: SOUND ("звук") - служебное слово;
R - арифметическое выражение, целая часть значения которого при-
V - арифметическое выражение,целая часть значения которого принад-
лежит [0,255] и определяет новое содержимое звукового регистра,номер кото-
рого определяется параметром R.
-
1. О п р е д е л е н и е ч а с т о т ы з в у ч а н и я
Частотой звука управляют 6 регистров (номера 0,1,2,...,5). Данные,кото-
рые необходимо поместить в регистры, могут быть определены из уравнения:
───────── ≈ 373 = 256*1+117 .
16╳300
А теперь запишем с помощью оператора SOUND число 117 в регистр 0, а 1 -
-в регистр 1: SOUND 0,117:SOUND 1,1
+в регистр 1: SOUND 0,117:SOUND 1,1 .
В случае канала В (используйте теперь регистры 2 и 3!) операторы при-
-мут вид: SOUND 2,117:SOUND 3,1
+мут вид: SOUND 2,117:SOUND 3,1 .
Поскольку ширина полосы звукового канала не превышает на практике 10000
Гц, минимальное значение, которое может быть введено в пару регистров, за-
дается величиной следующего выражения
1789772.5
- ────────── ≈ 11.19
+ ────────── ≈ 11.19 .
16·10000
Таким образом, 11 надо поместить в регистр 0,а 0 -в регистр 1. Звук уже
в значительной степени смягчился, но еще "кое-что" слышно (разумеется,пре-
тат из 63 и запишите полученное в регистр 7. Например,если Вы хотите полу-
чить звук голосов А и В и одновременно звук и шум голоса С, то проведите
несложное вычисление 63-(2+1+4+32)=24 и используйте оператор SOUND 7,24 .
-
П р и м е р. 10 SOUND 0,47:SOUND 1,1 'Частота канала А = 200 Гц.
─────────── 30 SOUND 2,140:SOUND 3,0 'Частота канала В = 800 Гц.
50 SOUND 4,56:SOUND 5,0 'Частота канала С =2000 Гц.
70 SOUND 7,56 'Выбор звука из каналов А, В и С.
80 SOUND 8,9:SOUND 9,10:SOUND10,11'Выбор громкости канала.
-
Выполните эту программу. А затем включите в программу строку:
65 SOUND 6,31 'Определена частота шума.
и замените строку 70 на строку
три запрещают (1) или разрешают (0) выход шума, последние три запрещают
(1) или разрешают (0) выход звука.
Обратите внимание на то, что порядок каналов обратный!
-
П р и м е р. CBA CBA
─────────── SOUND 7, &B10 110 011
шум звук
Канал А: шум, т.к. бит, соответствующий шуму из канала A - нулевой.
- Канал В: отсутствие шума и звука
+ Канал В: отсутствие шума и звука.
Канал С: звук, т.к. бит, соответствующий звуку из канала C - нулевой.
4. Звуковые эффекты, связанные с ф о р м о й в о л н ы
Минимальное значение частоты, следовательно, равно 0.107 Гц,что прибли-
женно соответствует периоду 9.4 секунды. Максимальное значение оценивает-
ся около 6991.3 Гц и тем самым принадлежит к слышимым частотам.
-
П р и м е р. Программа, позволяющая генерировать звук движущегося паро-
─────────── воза.
10 FOR I=6 TO 13:READ J:SOUND I,J:NEXT I
└─────────────────────────────────────────────────┘
Для иллюстрации возможностей оператора SOUND, рассмотрим следующие при-
меры:
-
1) 5 'Звук бомбардировщика. Формирование различных частот в трех канал
ах имитирует "биения" в шуме пропеллеров, вращающихся с разными ско
ростями.
120 DATA &B10110111 120 DATA &B10000001
130 DATA 16,0,0 130 DATA 8,8,16
140 DATA 0,90,&B1110 140 DATA 0,20,&B1100
-
2) 5 'Вертолет 2 3) 5 ' Звук бомбы
10 BEEP:FOR I=0 TO 13:READ V 10 FOR I=0 TO 13:READ V
20 SOUND I,V:NEXT 20 SOUND I,V:NEXT
120 DATA &B10000001 120 DATA &B10111110
130 DATA 8,8,16 130 DATA 10,0,16
140 DATA 0,20,&1100 140 DATA 0,0,0
-
Для прекращения звука достаточно выполнить оператор BEEP или сбросить
регистры 8-10 на 0.
-
4) 10 FOR I=1 TO 12:SOUND I+1,I+82:NEXT
20 FOR I=1 TO 8:SOUND I+1,I+81:NEXT '∗∗∗∗ Шум морского прибоя
50 FOR X=0 TO 13:SOUND X,0:NEXT 'Очистка всех регистров
230 END 'Вызывает STOP, далее BEEP и звучание прекращается.
П р и м е р ы 5÷10 заимствованы из [76].
-
5) 10 'С и р е н а
20 SOUND 0,255:SOUND 1,0:SOUND 8,15:SOUND 7,&B00111110
60 'Нарастание высоты звука
100 'Убывание высоты звука
110 FOR I=170 TO 252 STEP 1:SOUND 0,I:NEXT
140 GOTO 70
-
Для генерации завывающего звука используется регистр, позволяющий изме-
нять высоту исполняемой ноты. В данном примере высота периодически равно-
мерно, круто нарастает, после падает до прежнего уровня.
100 FOR J=1 TO 25:NEXT J
110 NEXT
120 GOTO 50
-
Для одного канала генерируется шум, частота которого непрерывно меня-
ется от высокого значения до низкого. Такой эффект достигается при измене-
нии содержимого регистра 6.
120 SOUND 12,1
130 SOUND 0,RND(1)*255
140 GOTO 130
-
Здесь звучание основного тона сопровождается эффектом модуляции. При
нажатии клавиши регистр 12 вызывает рост периода волнового пакета, а час-
тота звука (регистр 0) изменяется случайным образом. Этот пример хорошо
демонстрирует широчайший диапазон генерируемых звуков.
-
8) 10 '"Перевернутые" звуки. Выбирается другая форма пакета, при кото
рой амплитуда медленно растет, а затем резко падает. Используются
все три звуковых канала, причем частота одного из них слегка "расст
120 SOUND 4,X+5:SOUND 5,Y:SOUND 13,13
140 GOTO 60
150 DATA 62,2,60,2,60,2,0,56,16,16,16,120,30,13
-
9) звуки барабана можно имитировать, создавая шумовой эффект с помощью
"скачкообразного" пакета. Для имитации ударов турецкого барабана использу-
ется тот же пакет, но на этот раз модулируется не шум, а звуковой тон. В
160 END
170 DATA 229,0,97,0,115,0,0,63,16,16,16,190,120
- 11) "П а р о в о з" (автор программы студент 5 курса Никитин А.Н.)
+ 11) "П а р о в о з" (автор программы студент 5-го курса Никитин А.Н.)
10 SOUND 7,&B00000111:SOUND 6,20
20 FOR I=8 TO 15:SOUND 8,I:SOUND 9,I:SOUND 10,I:GOSUB 80:FOR L=1 TO
50:NEXT:NEXT
VI.4. П р и м е р ы м у з ы к а л ь н ы х п р о г р а м м
-
Отметим, что во всех примерах программ, приведенных в данном разделе,
рекомендуется перед запуском программы выполнить команду BEEP. Последняя
инициализирует звуковую микросхему,устанавливая ее регистры по умолчанию
220 A$="O4L8R8B4O5CDE16D16CO4BAR8O5e4":B$="O3L4BEO4EG+O3AO4C"
230 C$="O4L4R4G+R4BR4O4a4":PLAY A$,B$,C$:END
-3. "М е н у э т из с о н а т ы 13" (Йозеф Гайдн)
+3. "М е н у э т из с о н а т ы 13" (Й.Гайдн)
NEW
Ok
2 FOR I=1 TO 2
Будем создавать мелодию в до-мажор,что соответствует игре только по бе-
лым клавишам пианино (все ноты без диезов и бемолей). Более того, исполь-
зуем только 9 клавиш:
+
┌─────────────┬────────────────────────────────────┐
│ н о т а │ E F G A B C D E F │
│ о к т а в а │ O4 O4 O4 O4 O4 O5 O5 O5 O5 │
└─────────────┴────────────────────────────────────┘
- По желанию легко расширить диапазон, в котором звучит мелодия.Кроме то-
-го, можно выбрать другую тональность, указав на нотах знаки "-" и "+".
+
+ По желанию можно легко расширить диапазон,в котором звучит мелодия.Кро-
+ме того, можно выбрать другую тональность,указав на нотах знаки "-" и "+".
Используем две функции: одну для построения мелодии, другую для созда-
ния ритма. Обе функции зависят от двух переменных К и Х.
Вычисляется значение функции FNF, определяется остаток (положительный)
к переменной М$, содержащей мелодию, два раза (строки 210-230).
Когда построение мелодии закончено, она исполняется (строка 250).
Способ "вытягивания" нот в линию поясним рисунком.
-
K=0 K=1 K=2 K=3
│◀─────────────▶│◀─────────────▶│◀─────────────▶│◀──────────────▶│
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬────┐
│ ──────────────────────────────────────────────────────────────▶│
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴────┘
X= 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
-
Замысловатая функция FNF, конечно подобрана. Испробуйте более простые
функции. Если включить в определение функций стандартную функцию RND, ком-
пьютер начнет "сочинять".
NEW
Ok
10 '∗∗∗∗ Подготовка ∗∗∗∗
- 20 CLEAR 600
- 30 OPEN "GRP:" AS #1
+ 20 CLEAR 600: OPEN "GRP:" AS #1
40 DATA C,D,E,F,G,A,B
50 DIM N$(20)
60 FOR I=0 TO 2
70 FOR J=0 TO 6
- 80 READ A$
- 90 N$(I*7+J)="O"+STR$(I+3)+A$
+ 80 READ A$: N$(I*7+J)="O"+STR$(I+3)+A$
100 NEXT J
110 RESTORE
120 NEXT I
270 IF ASC(F$)=28 THEN 290
280 IF ASC(F$)=13 GOTO 370 ELSE 210
290 '∗∗∗∗ Установка ноты ∗∗∗∗
- 300 PSET(X,Y-4),4
- 310 PRINT #1,"♪"
- 320 P1=0:P2=0
- 330 X=X+8:M$=M$+W$+" "
+ 300 PSET(X,Y-4),4: PRINT #1,"♪"
+ 320 P1=0: P2=0: X=X+8: M$=M$+W$+" "
340 PLAY W$:W$=N$(K)
350 GOTO 190
360 '∗∗∗∗ Окончание работы ∗∗∗∗
370 PLAY M$
- 380 SCREEN 0
- 390 PRINT M$
- 400 END
+ 380 SCREEN 0:PRINT M$:END
- ...в заключение данной главы приведем весьма полезную таблицу:
+ В заключении данной главы приведем весьма полезную таблицу:
┌────────┬─────────────────────────────────────────────────┐
│ Октава │ Название ноты и ее номер в команде N │
├────────┼─────────────────────────────────────────────────┤
│ 9 │ C │
│ │ 96 │
└────────┴─────────────────────────────────────────────────┘
+\page
+ Д о п о л н е н и е.
+ ────────────────────
+ 7. "С о л о в е й" (музыка народная)
+ 10 SOUND7,&B10001000: SOUND8,15:SOUND1,0
+ 20 J=RND(1)*25:U=RND(1)*15:E=RND(1)*20:FORC=0TOJ:FORI=0TO20:SOUND0,I:
+ NEXT:NEXT:FORC=0TOU:FORI=0TO45:SOUND0,I:NEXT:NEXT:FORC=0TOE:FORI=30TO
+ 0STEP-1:SOUND0,I:NEXT:NEXT
+ 30 GOTO 20
+