====== Глава VI ====== |{{..author_files:006.msx|}}|{{..author_files:006.txt|}}|[[..006|]]| @@ -1,12 +1,12 @@ -c1E +\/d ГЛАВА VI. МУЗЫКАЛЬНЫЕ СРЕДСТВА MSX-BASIC +\/d- У меня под руками оказался жалкий спинет; и вскоре я начал писать ноты, вот и все. Дж. Верди - MSX-BASIC включает в себя Музыкальный Макро-Язык (MML), позволяющий управлять четырехканальным звуковым генератором компьютера.Этот генератор работает как независимый процессор: если музыкальные или другие звуковые @@ -21,10 +21,8 @@ MML - это Музыкальный Макро-Язык ("Musical Macro-Language"), в некото- ром смысле аналогичный GML ("Graphics Macro Language"). MML использует для записи нот символы: - - C D E F G A B + C D E F G A B , до ре ми фа соль ля си - которые вызывают исполнение соответствующей ноты в текущей октаве. Для обеспечения хроматизма игры ноты можно модифицировать добавлением символов: ┌───────────────────────────────────────────────────────┐ @@ -50,14 +48,11 @@ "C D E" или "CDE". - VI.1. О п и с а н и е к о м а н д MML - Приведем список команд MML.Каждая команда представлена одиночной ключе- вой буквой (L,O,N,T,V,S,M,R), за которой следует один числовой параметр (аргумент). - 1. К о м а н д а Lk ("Length"-"длительность"), где k - целое число, принадлежащее отрезку [1,64], устанавливает текущую длительность для всех последующих нот. @@ -66,7 +61,7 @@ Код длительности звука равный 1 соответствует целой длительности, 2 - половинной, 4 - четвертной, 8 - восьмой, 16 - шестнадцатой, 32 - тридцать второй, 64 - шестьдесят четвертой. - Например, команда L8 установит длительность звука равной восьмой. + Например, команда L8 установит длительность звука равную восьмой. Заметим,что "C32" равносильна "L32C", но учтите, что команда L действу- ет и на все последующие ноты до ее "сброса" оператором BEEP (см.раздел VI.2) или командой L с другим аргументом. @@ -83,17 +78,15 @@ ется нота вне текущей октавы. Команда 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". Таким образом, можно задавать индивидуальную длительность. @@ -123,7 +116,7 @@ одной форме волны звук, постепенно нарастающий по громкости, внезапно рез- ко обрывается,другой волновой пакет соответствует обратной ситуации. Мож- но также получить с помощью компьютера трели, свист и другие интересные -звуковые эффекты. Однако,одновременно допускается пользоваться лишь одной +звуковые эффекты. Однако одновременно допускается пользоваться лишь одной из восьми форм, и разным звуковым каналам не могут соответствовать различ- ные пакеты. К о м а н д а Sk ("Shape"-"форма"), @@ -131,7 +124,6 @@ ны ("конверта"). Параметр k (цикл модуляции) определяет несущую частоту звукового генератора. По умолчанию k=1. Ниже показаны допустимые формы волновых пакетов. - ▲ ▲ ▲ ▲ │ │ │ │ │ │ │ │ @@ -142,10 +134,8 @@ │ │ │ │ └───────────▶ └───────────▶ └───────────▶ └───────────▶ S=11 S=12 S=13 S=14 - Выполнив следующую программу, Вы услышите особенности звучания каждого из восьми пакетов. - П р и м е р [76]. В о с е м ь волновых пакетов ──────────────── 20 CLS:A$="M500O4L4DF#ARAF#D" @@ -155,7 +145,6 @@ 90 NEXT I 100 END 110 DATA s1,s4,s8,s10,s11,s12,s13,s14 - Все пакеты можно подразделить на два типа: "н е п р е р ы в н ы е" и "с к а ч к о о б р а з н ы е". В непрерывных пакетах звук изменяется непрерывно. К ним относятся паке- @@ -210,14 +199,12 @@ 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 (другими словами, количество "пилочек" в единицу вре- @@ -228,9 +215,8 @@ то период также возрастает и различие предыдущих операторов исчезает. Попытаемся убедить Вас в этом. Рассмотрим операторы: PLAY"S8M6000cdefg" и PLAY"S10M6000cdefg" . -К нашему удивлению, звучит одинаковая "музыка"! Однако, изобразим "конвер- +К нашему удивлению, звучит одинаковая "музыка"! Однако изобразим "конвер- ты", соответствующие каждому оператору: - ▲ │ │ S8 M6000 │ │ @@ -240,7 +226,6 @@ S10 M6000 │ │ └─────────────────────────────────▶ исполняемая музыка - ... и "тайное становится явным"! Однако учтите, что длительность исполня- емого фрагмента можно легко изменить командой L. @@ -279,7 +264,6 @@ ставляющих при исполнении legato указанную длительность, при исполнении non legato - 7/8 и 1/8 указанной длительности, при исполнении staccato - 3/4 и 1/4 указанной длительности. - ┌─────────────────────┬─────────┬───────────────────┬───────────────────┐ │ Н а з в а н и е │ legato │ non legato │ staccato │ │ длительности ├─────────┼─────────┬─────────┼─────────┬─────────┤ @@ -306,7 +290,6 @@ 9. К о м а н д а XA; (символ ";" обязателен!), где A - строковая переменная, выполняет "подпрограмму" на MML, которая определяется значением строковой переменной. - П р и м е р. 10 A$="DCF" ─────────── 20 PLAY "V15XA$;V6XA$;" Подпрограммы могут быть вложенными, что упрощает запись повторяющихся @@ -336,12 +319,10 @@ VI.2. O п е р а т о р PLAY. Ф у н к ц и я PLAY. О п е р а т о р BEEP - А Вы ноктюрн сыграть могли бы На флейте водосточных труб? В. Маяковский - Синтаксис оператора: ┌──────────────────────┐ │ PLAY [А][,B][,C] │ , └──────────────────────┘ @@ -350,18 +331,15 @@ Оператор 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" @@ -373,7 +351,7 @@ ная программа может "заниматься" чем-либо другим.После выполнения команды макроязыка удаляются из очередей. Когда все очереди пусты,музыка прекраща- ется. - Далее, может выполняться новый оператор PLAY, но его выполнение, как + Далее может выполняться новый оператор PLAY, но его выполнение, как правило, должно начаться сразу же после считывания из очереди последней команды предыдущего оператора PLAY, и даже в этом случае загрузка новых очередей вызовет задержку. @@ -382,7 +360,6 @@ одновременно сопровождать индикацией на дисплее названия ноты. Как легко убедиться, названия нот появляются почти одновременно в виде списка, без всякой связи с их исполнением. - П р и м е р. 30 CLS ─────────── 40 PLAY"T255O5L16" 50 FOR I=1 TO 10 @@ -390,7 +367,6 @@ 90 NEXT I 100 END 110 DATA C,A,E,F,G,B,D,G,E,C - Наиболее простое решение проблемы сводится к организации цикла времен- ной задержки внутри временного основного цикла FOR. Период задержки необ- ходимо согласовать с темпом и длительностью звучания нот. @@ -407,7 +383,7 @@ и в процессе игры в качестве фоновой задачи, причем 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$'Выполнение программы не про @@ -415,7 +391,7 @@ Оператор BEEP используется для вывода звукового сигнала продолжительно- стью 0.04 с частотой 1.3 Гц и инициализации синтезатора звуков: установки -всех его регистров в начальное состояние и очистку очередей всех его кана- +всех его регистров в начальное состояние и очистки очередей всех его кана- лов от последовательности музыкальных команд оператора PLAY. Его синтаксис: ┌────────────┐ │ BEEP │ , @@ -433,12 +409,11 @@ Например: 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 любую партитуру из трех или менее голосов. При правильной организации про- граммы компьютер может исполнять музыкальное произведение пока "работают" @@ -447,7 +422,6 @@ Взгляните на следующий пример. Возможно, получаемое качество звучания далеко от совершенства, тем не менее оно дает представление о том, каких результатов Вы можете добиться. - П р и м е р [76]. Ф о н о в а я музыка ──────────────── 20 CLS:KEYOFF:R=RND(-TIME) @@ -464,7 +438,6 @@ 170 NEXTI 180 PRINT W$; 190 GOTO 110 - Теперь разберем подробнее организацию музыкальной программы и некото- рые о с о б е н н о с т и , которые следует учесть при ее составлении. Оператор BEEP или ошибка в программе останавливают исполнение музыки. @@ -473,7 +446,7 @@ всегда образуют короткую паузу между концом музыкальных данных первого оператора PLAY и началом музыкальных данных следующего оператора PLAY. Оператор PLAY позволяет исполнять ноты с четкими перерывами между ними -- staccato, без перерывов - legato,и с короткими перерывами, вполне доста- +- staccato, без перерывов - legato и с короткими перерывами, вполне доста- точными для того,чтобы отличить звуки друг от друга - non legato. Как уже говорилось, исполнение staccato достигается только за счет того,что выдер- живается 3/4 номинальной длительности ноты и 1/4 оставляется на паузу.Для @@ -488,7 +461,7 @@ стандартную длительность, например: PLAY"L8 CDEF R8 GAB" . Если после R в данном случае не была бы указана длительность (8),то не- смотря на текущую длительность L8, "нота" R в действительности имела бы -длительность по умолчанию (4). Однако, это не лучший способ для игры stac- +длительность по умолчанию (4). Однако это не лучший способ для игры stac- cato и non legato. Гораздо проще обратиться за помощью к PSG (Программиру- емому Звуковому Генератору) (см. раздел VI.3). Если научиться умело пользоваться командами S и M, то Вам будут доступ- @@ -534,7 +507,6 @@ так уж и много! Обратите также внимание на следующие т о н к и е м о м е н т ы. - α) Значения аргументов команд MML не уничтожаются оператором NEW, поэ- тому новую программу следует начинать с конкретного определения текущих значений аргументов команд L,М,S,O,T. Если этого не сделать,то не следует @@ -546,12 +518,10 @@ 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$ - Приведем программы, по которым компьютер исполнит несколько разных по сложности музыкальных произведений. @@ -567,7 +537,6 @@ 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 @@ -583,7 +552,6 @@ dO4d4dad4gdgdR8ab4" 100 PLAY A$,B$,C$ 110 NEXT - 3) 2 '"Неаполитанская песенка" (отрывок) П.И.Чайковский. 5 A$="sm1500l6o6t112":B$="sm1500l6o6t112":C$="sm1500l6o6t112" 6 PLAY A$,B$,C$ @@ -623,9 +591,9 @@ музыки. Не избежал заразительного увлечения даже Моцарт. В 1793 году он пишет "Руководство, как при помощи двух игральных костей сочинять вальсы, не имея ни малейшего представления о музыке и композиции". - В ХVII в.было создано немало музыкальных пьес "на случайную тему",и не- -которые из них приписывают Моцарту и Гайдну. Например, в шестнадцатитакто- -вой части можно предусмотреть 11 различных вариантов для каждого такта, + В ХVII в. было создано немало музыкальных пьес "на случайную тему", и +некоторые из них приписывают Моцарту и Гайдну. Например, в шестнадцатитак- +товой части можно предусмотреть 11 различных вариантов для каждого такта, что можно представить в виде таблицы из 16 столбцов по 11 тактов в каждой, а исполнителю дано выбирать каждый такт, бросая игральные кости (по-види- мому,музыкант должен заранее бросать кости 16 раз, чтобы не останавливать- @@ -666,12 +634,10 @@ VI.3. О п е р а т о р SOUND - Этот оператор позволяет квалифицированному пользователю управлять Про- граммируемым Звуковым Генератором (PSG).Имеется четырнадцать 8-битовых ре- гистров,пронумерованных от 0 до 13, каждый из которых предназначен только для записи и может содержать значения в диапазоне от 0 до 255(см.таблицу). - ┌───────────┬──────────────────────────┬────────────┬─────────────────┐ │ Н о м е р │ С о д е р ж и м о е │ Значение │ Значение на паре│ │ регистра │ │ │ регистров │ @@ -705,10 +671,9 @@ │ 13 │(управление законом изме-│ │ │ │ │ нения громкости). │ │ │ └───────────┴──────────────────────────┴────────────┘─────────────────┘ - Оператор SOUND обеспечивает прямой доступ к регистрам звукового гeнера- тора. Синтаксис оператора: ┌────────────────┐ - │ SOUND R,V │ + │ SOUND R,V │ , └────────────────┘ где: SOUND ("звук") - служебное слово; R - арифметическое выражение, целая часть значения которого при- @@ -716,7 +681,6 @@ V - арифметическое выражение,целая часть значения которого принад- лежит [0,255] и определяет новое содержимое звукового регистра,номер кото- рого определяется параметром R. - 1. О п р е д е л е н и е ч а с т о т ы з в у ч а н и я Частотой звука управляют 6 регистров (номера 0,1,2,...,5). Данные,кото- рые необходимо поместить в регистры, могут быть определены из уравнения: @@ -733,14 +697,14 @@ ───────── ≈ 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. Звук уже в значительной степени смягчился, но еще "кое-что" слышно (разумеется,пре- @@ -805,13 +769,11 @@ тат из 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 на строку @@ -824,12 +786,11 @@ три запрещают (1) или разрешают (0) выход шума, последние три запрещают (1) или разрешают (0) выход звука. Обратите внимание на то, что порядок каналов обратный! - П р и м е р. CBA CBA ─────────── SOUND 7, &B10 110 011 шум звук Канал А: шум, т.к. бит, соответствующий шуму из канала A - нулевой. - Канал В: отсутствие шума и звука + Канал В: отсутствие шума и звука. Канал С: звук, т.к. бит, соответствующий звуку из канала C - нулевой. 4. Звуковые эффекты, связанные с ф о р м о й в о л н ы @@ -850,7 +811,6 @@ Минимальное значение частоты, следовательно, равно 0.107 Гц,что прибли- женно соответствует периоду 9.4 секунды. Максимальное значение оценивает- ся около 6991.3 Гц и тем самым принадлежит к слышимым частотам. - П р и м е р. Программа, позволяющая генерировать звук движущегося паро- ─────────── воза. 10 FOR I=6 TO 13:READ J:SOUND I,J:NEXT I @@ -907,7 +867,6 @@ └─────────────────────────────────────────────────┘ Для иллюстрации возможностей оператора SOUND, рассмотрим следующие при- меры: - 1) 5 'Звук бомбардировщика. Формирование различных частот в трех канал ах имитирует "биения" в шуме пропеллеров, вращающихся с разными ско ростями. @@ -926,7 +885,6 @@ 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 @@ -939,10 +897,8 @@ 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 'Очистка всех регистров @@ -962,7 +918,6 @@ 230 END 'Вызывает STOP, далее BEEP и звучание прекращается. П р и м е р ы 5÷10 заимствованы из [76]. - 5) 10 'С и р е н а 20 SOUND 0,255:SOUND 1,0:SOUND 8,15:SOUND 7,&B00111110 60 'Нарастание высоты звука @@ -970,7 +925,6 @@ 100 'Убывание высоты звука 110 FOR I=170 TO 252 STEP 1:SOUND 0,I:NEXT 140 GOTO 70 - Для генерации завывающего звука используется регистр, позволяющий изме- нять высоту исполняемой ноты. В данном примере высота периодически равно- мерно, круто нарастает, после падает до прежнего уровня. @@ -986,7 +940,6 @@ 100 FOR J=1 TO 25:NEXT J 110 NEXT 120 GOTO 50 - Для одного канала генерируется шум, частота которого непрерывно меня- ется от высокого значения до низкого. Такой эффект достигается при измене- нии содержимого регистра 6. @@ -1000,12 +953,10 @@ 120 SOUND 12,1 130 SOUND 0,RND(1)*255 140 GOTO 130 - Здесь звучание основного тона сопровождается эффектом модуляции. При нажатии клавиши регистр 12 вызывает рост периода волнового пакета, а час- тота звука (регистр 0) изменяется случайным образом. Этот пример хорошо демонстрирует широчайший диапазон генерируемых звуков. - 8) 10 '"Перевернутые" звуки. Выбирается другая форма пакета, при кото рой амплитуда медленно растет, а затем резко падает. Используются все три звуковых канала, причем частота одного из них слегка "расст @@ -1020,7 +971,6 @@ 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) звуки барабана можно имитировать, создавая шумовой эффект с помощью "скачкообразного" пакета. Для имитации ударов турецкого барабана использу- ется тот же пакет, но на этот раз модулируется не шум, а звуковой тон. В @@ -1059,7 +1009,7 @@ 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 @@ -1090,7 +1040,6 @@ VI.4. П р и м е р ы м у з ы к а л ь н ы х п р о г р а м м - Отметим, что во всех примерах программ, приведенных в данном разделе, рекомендуется перед запуском программы выполнить команду BEEP. Последняя инициализирует звуковую микросхему,устанавливая ее регистры по умолчанию @@ -1148,7 +1097,7 @@ 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 @@ -1235,12 +1184,14 @@ Будем создавать мелодию в до-мажор,что соответствует игре только по бе- лым клавишам пианино (все ноты без диезов и бемолей). Более того, исполь- зуем только 9 клавиш: + ┌─────────────┬────────────────────────────────────┐ │ н о т а │ E F G A B C D E F │ │ о к т а в а │ O4 O4 O4 O4 O4 O5 O5 O5 O5 │ └─────────────┴────────────────────────────────────┘ - По желанию легко расширить диапазон, в котором звучит мелодия.Кроме то- -го, можно выбрать другую тональность, указав на нотах знаки "-" и "+". + + По желанию можно легко расширить диапазон,в котором звучит мелодия.Кро- +ме того, можно выбрать другую тональность,указав на нотах знаки "-" и "+". Используем две функции: одну для построения мелодии, другую для созда- ния ритма. Обе функции зависят от двух переменных К и Х. Вычисляется значение функции FNF, определяется остаток (положительный) @@ -1251,14 +1202,12 @@ к переменной М$, содержащей мелодию, два раза (строки 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, ком- пьютер начнет "сочинять". @@ -1321,14 +1270,12 @@ 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 @@ -1349,19 +1296,15 @@ 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 │ ├────────┼─────────────────────────────────────────────────┤ @@ -1392,4 +1335,14 @@ │ 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 + {{tag> }}