ГЛАВА VI. МУЗЫКАЛЬНЫЕ СРЕДСТВА MSX-BASIC У меня под руками оказался жалкий спинет; и вскоре я начал писать ноты, вот и все. Дж. Верди MSX-BASIC включает в себя Музыкальный Макро-Язык (MML), позволяющий управлять четырехканальным звуковым генератором компьютера.Этот генератор работает как независимый процессор: если музыкальные или другие звуковые эффекты запрограммированы,то они запускаются параллельно с использованием основной программы. Звукогенератор имеет три независимых выходных канала (A, B, C), допус- кается тем самым трехголосный полифонический выход. Звуковой сигнал форми- руется генератором регулярных сигналов, частота которых (высота звука) мо- жет программироваться, либо широкополосным генератором шумов. Амплитуда сигнала(громкость) может устанавливаться для каждого сигнала отдельно или модулироваться генератором огибающей. MML - это Музыкальный Макро-Язык ("Musical Macro-Language"), в некото- ром смысле аналогичный GML ("Graphics Macro Language"). MML использует для записи нот символы: C D E F G A B до ре ми фа соль ля си которые вызывают исполнение соответствующей ноты в текущей октаве. Для обеспечения хроматизма игры ноты можно модифицировать добавлением символов: ┌───────────────────────────────────────────────────────┐ │ "#" - д и е з, "+" - д и е з, "-" - б е м о л ь │ , └───────────────────────────────────────────────────────┘ т.е."D#" и "D+" это ре-диез,"G-" соль-бемоль и т.д. Запомните:"В+"соответ- ствует "С" т о й же октавы. После символов C,D,E,F,G,A,B Вы можете указать д л и т е л ь н о с т ь ноты - любое целое число k, принадлежащее отрезку [1,64] (длительность но- ты получается по формуле 1/k), так, например, C1 - ц е л а я нота "до", C2 - п о л о в и н н а я нота "до", C4 - ч е т в е р т н а я нота "до". К сожалению, длительность ноты в этом случае не может задаваться с по- мощью переменной. После указания ноты и длительности можете добавить необ- ходимое Вам количество т о ч е к ("."), первая из которых удлинит ноту наполовину, а роль последующих аналогична их роли на нотном стане (вторая точка добавляет половину длительности, определяемой первой точкой). Например, нота C4.. имеет длительность 1/4+1/8+1/16=7/16. Если длительность не указана, то компьютер играет "в четвертях". В качестве символов-разделителей нот можно использовать либо точку с запятой,либо пробелы,либо ноты вообще не разделять, например: "C;D;E" или "C D E" или "CDE". VI.1. О п и с а н и е к о м а н д MML Приведем список команд MML.Каждая команда представлена одиночной ключе- вой буквой (L,O,N,T,V,S,M,R), за которой следует один числовой параметр (аргумент). 1. К о м а н д а Lk ("Length"-"длительность"), где k - целое число, принадлежащее отрезку [1,64], устанавливает текущую длительность для всех последующих нот. Если длительность не будет задана или не будет указана после ноты, то по умолчанию k=4 (четверть). Код длительности звука равный 1 соответствует целой длительности, 2 - половинной, 4 - четвертной, 8 - восьмой, 16 - шестнадцатой, 32 - тридцать второй, 64 - шестьдесят четвертой. Например, команда L8 установит длительность звука равной восьмой. Заметим,что "C32" равносильна "L32C", но учтите, что команда L действу- ет и на все последующие ноты до ее "сброса" оператором BEEP (см.раздел VI.2) или командой L с другим аргументом. Команда Lk называется командой задания длительности г р у п п ы нот. Текущую длительность можно задать и с помощью переменной (см.ниже). 2. К о м а н д а Ok ("Octave"-"октава"), где k - целое число, принадлежащее отрезку [1,8], позволяет выбрать окта- ву. Диапазон MML 8 октав (наименьшая октава O1, а наибольшая - О8). Октава О4 устанавливается компьютером по умолчанию (она соответствует первой октаве рояля). Напомним, что С - самая низкая нота, а В - самая высокая нота в октаве. Вы можете указать новую октаву в любой момент времени, когда Вам потребу- ется нота вне текущей октавы. Команда 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". Таким образом, можно задавать индивидуальную длительность. 4. К о м а н д а Tk ("Tempo"-"темп"), где k - целое число, принадлежащее отрезку [32,255], устанавливает темп исполнения музыки (по умолчанию k=120). Это значение задает количество четвертей, проигрываемых в минуту. Например, команда T120 установит разновидность темпа Allegro ("скоро"). Забегая вперед, отметим, что оператор BEEP сбрасывает текущий темп на темп, принятый по умолчанию. 5. К о м а н д а Vk ("Volume of sound"-"громкость звука"), где k - целое число, принадлежащее отрезку [0,15],устанавливает громкость исполнения музыки. По умолчанию k=8. Громкость сохраняется до следующей команды V (или оператора BEEP). Заметим, что команда V "сбрасывает" значения аргументoв команд S и М (см.ниже пункты 6 и 7) на их значения по умолчанию. Приведем примеры: 10 FOR V=0 TO15:CLS:?"Volume";V 10 BEEP 20 PLAY"V=V;C":FOR D=1 TO 500 20 PLAY"V15O5":FOR N=1TO10 30 NEXTD:NEXTV 30 PLAY"CE":NEXTN 6. MML позволяет работать с восемью различными в о л н о в ы м и п а- к е т а м и, или ф о р м а м и в о л н ы. Форма волны определяет пара- метры звука с точки зрения изменения его громкости (амплитуды). Так, при одной форме волны звук, постепенно нарастающий по громкости, внезапно рез- ко обрывается,другой волновой пакет соответствует обратной ситуации. Мож- но также получить с помощью компьютера трели, свист и другие интересные звуковые эффекты. Однако,одновременно допускается пользоваться лишь одной из восьми форм, и разным звуковым каналам не могут соответствовать различ- ные пакеты. К о м а н д а Sk ("Shape"-"форма"), где k - целое число, принадлежащее отрезку [0,15],устанавливает форму вол- ны ("конверта"). Параметр k (цикл модуляции) определяет несущую частоту звукового генератора. По умолчанию k=1. Ниже показаны допустимые формы волновых пакетов. ▲ ▲ ▲ ▲ │ │ │ │ │ │ │ │ └───────────▶ └───────────▶ └───────────▶ └───────────▶ S=0,1,2,3,9 S=4,5,6,7,15 S=8 S=10 ▲ ▲ ▲ ▲ │ │ │ │ │ │ │ │ └───────────▶ └───────────▶ └───────────▶ └───────────▶ S=11 S=12 S=13 S=14 Выполнив следующую программу, Вы услышите особенности звучания каждого из восьми пакетов. П р и м е р [76]. В о с е м ь волновых пакетов ──────────────── 20 CLS:A$="M500O4L4DF#ARAF#D" 40 FOR I=1 TO 8 50 READ S$:PRINT"Волновой пакет";S$:PLAY S$:PLAY A$ 80 FOR J=1 TO 2000:NEXT J 90 NEXT I 100 END 110 DATA s1,s4,s8,s10,s11,s12,s13,s14 Все пакеты можно подразделить на два типа: "н е п р е р ы в н ы е" и "с к а ч к о о б р а з н ы е". В непрерывных пакетах звук изменяется непрерывно. К ним относятся паке- ты 8,10,12,14. В "скачкообразных" пакетах происходит однократная модуляция. При этом всякий раз, когда требуется получить данный звук, необходимо записывать номер пакета в 13-й регистр Программируемого Звукового Генератора. Форма огибающей сбрасывается только оператором BEEP, командой V или ме- няется командой S с другим значением аргумента. Чистые обертоны звучат при S = 1,4,8,10,11,12,13,14. Напомним, что м у з ы к а л ь н ы й з в у к - комплекс основного то- на и гармонических обертонов или частичных тонов. Обертоны звучат слабее основного тона, слитно с ним и на слух не распознаются. Наличие и сила каждого из них определяет окраску или тембр звука. Команда S в основном используется совместно с командой М для создания музыкальных эффектов. К сожалению, нет ни руководств, ни правил, которые можно бы было здесь применить, и все, что можно сделать - это эксперимен- тировать при помощи компьютера! Важным моментом является то, что команда S "сбрасывает" громкость, установленную с помощью команды V. Заметим, что для одного и того же кана- ла синтезатора звуков команды S и M нельзя использовать одновременно с ко- мандой V: или только команды S и M, или только команда V! 7. К о м а н д а Mk ("Modulation"-"модуляция, изменение частоты"), где k - целое число, принадлежащее отрезку [0,65535], позволяет устано- вить несущую частоту звукового генератора (период "конверта", выбранного командой S). По умолчанию k=255. Код периода "конверта" (значение k) можно вычислить по формуле k = 6991.3·Период конверта (в с) Например, команда M13982 устанавливает длительность звука равную 2 с. Действительно, 6991.3·2 ≈ 13982. Из приведенной формулы ясно, что чем меньше значение k, тем меньше дли- тельность звука (выше частота модуляции). Оператор BEEP сбрасывает значение аргумента команды M на значение по умолчанию. П р и м е р ы [76]. ────────────────── 1) 10 ' Изменение частоты 2) 10 ' Звуки (1) 20 A$="S8O4L12CGAO5CDGA" 20 PLAY"T250L4" 30 PLAY"M200":PLAY A$ 30 FOR I=1 TO 4 40 PLAY"M1000":PLAY A$ 40 PLAY"S14M400O4CAB" 50 PLAY"M5000":PLAY A$ 50 PLAY"S8M600O6CO3CO2C" 60 END 60 PLAY"S14M400O4CO5BAO4CA" 70 PLAY"S8M600O4CO2CO3C" 3) 10 'Звуки (2) 80 NEXT I 20 PLAY"T120L2" 90 END 30 PLAY"S13M9000O3F+RGACD" 40 PLAY"S13M9000O3F+RGACO2A" 50 FOR I=1 TO 4 60 PLAY"S1M1500L64O5F+GACO4A" 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"S8M900cdefgab" PLAY"S10M6000cdefgab" . Однако, если значение аргумента команды M становится "слишком большим", то период также возрастает и различие предыдущих операторов исчезает. Попытаемся убедить Вас в этом. Рассмотрим операторы: PLAY"S8M6000cdefg" и PLAY"S10M6000cdefg" . К нашему удивлению, звучит одинаковая "музыка"! Однако, изобразим "конвер- ты", соответствующие каждому оператору: ▲ │ │ S8 M6000 │ │ └─────────────────────────────────▶ ▲ исполняемая музыка │ │ S10 M6000 │ │ └─────────────────────────────────▶ исполняемая музыка ... и "тайное становится явным"! Однако учтите, что длительность исполня- емого фрагмента можно легко изменить командой L. 8. К о м а н д а Rk ("Rest"-"пауза"), где k - целое число, принадлежащее отрезку [1,64], генерирует специальную "молчащую" ноту, п а у з у (звук отсутствует!). По умолчанию k=4. Код длительности паузы равный 1 соответствует целой длительности, 2 - половинной, 4 - четвертной, 8 - восьмой, 16 - шестнадцатой, 32 - тридцать второй, 64 - шестьдесят четвертой. Например, команда R4 установит паузу четвертной длительности. Таким образом: R1 R2 R4 R8 R16 R32 R64 Вы можете модифицировать R таким же образом,как,например,ноту "С" или любую другую ноту: для задания длительности, увеличенной на свою половину, используется код длительности с точкой (допускается любое количество то- чек. Так, код 1. соответствует целой длительности с точкой, код 2. соответствует половинной с точкой, код 4. соответствует четвертной с точкой, код 8. соответствует восьмой с точкой, код 16. соответствует шестнадцатой с точкой, код 32. соответствует тридцать второй с точкой, код 16. соответствует шестьдесят четвертой с точкой. Например, команда R2 установит паузу половинной с точкой длительности. Выдерживая при кодировании полную длительность каждого звука, мы полу- чим исполнение legato. Для исполнения non legato выдерживается 7/8 указанной длительности зву- ка, а 1/8 приходится на паузу. В некоторых случаях выдерживается от 7/8 до 15/16 указанной длительности звука, а от 1/8 до 1/16 приходится на па- узу. Для исполнения staccato выдерживается 3/4 указанной длительности звука, а 1/4 приходится на паузу, например: "C5R16C5R16C5R16" . В приведенной ниже таблице приведены коды основных длительностей, со- ставляющих при исполнении legato указанную длительность, при исполнении non legato - 7/8 и 1/8 указанной длительности, при исполнении staccato - 3/4 и 1/4 указанной длительности. ┌─────────────────────┬─────────┬───────────────────┬───────────────────┐ │ Н а з в а н и е │ legato │ non legato │ staccato │ │ длительности ├─────────┼─────────┬─────────┼─────────┬─────────┤ │ │ 1 дли- │7/8 дли- │1/8 дли- │3/4 дли- │1/4 дли- │ │ │тельности│тельности│тельности│тельности│тельности│ ├─────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┤ │Целая с точкой │ 1+2 │ 1+4+16 │ 8+6 │ 1+8 │ 4+8 │ │Целая │ 1 │ 2+4+8 │ 8 │ 2+4 │ 4 │ │Половинная с точкой │ 2+4 │ 2+8+32 │ 16+32 │ 2+16 │ 8+16 │ │Половинная │ 2 │ 4+8+16 │ 16 │ 4+8 │ 8 │ │Четвертная с точкой │ 4+8 │ 4+16+64│ 32+64 │ 4+32 │ 16+32 │ │Четвертная │ 4 │ 8+16+32│ 32 │ 8+16 │ 16 │ │Восьмая с точкой │ 8+16 │ ── │ ── │ 8+64 │ 32+64 │ │Восьмая │ 8 │ 16+32+64│ 64 │ 16+32 │ 32 │ │Шестнадцатая с точкой│ 16+32 │ ── │ ── │ ── │ ── │ │Шестнадцатая │ 16 │ ── │ ── │ 32+64 │ 64 │ └─────────────────────┴─────────┴─────────┴─────────┴─────────┴─────────┘ Например, чтобы закодировать какую-либо ноту четвертной длительности при исполнении non legato, мы должны установить согласно этой таблице длительность звука равную сумме восьмой, шестнадцатой и тридцать второй (7/8 четвертной длительности) и длительность паузы равную тридцать второй (1/8 четвертной длительности). 9. К о м а н д а XA; (символ ";" обязателен!), где A - строковая переменная, выполняет "подпрограмму" на MML, которая определяется значением строковой переменной. П р и м е р. 10 A$="DCF" ─────────── 20 PLAY "V15XA$;V6XA$;" Подпрограммы могут быть вложенными, что упрощает запись повторяющихся данных. Все повторяющиеся части звуковой партии могут быть записаны в сим- вольных переменных и в случае необходимости вызываются командой Х. В н и м а н и е ! Аргумент команд L, O, V, T, M, S, N можно задавать именем переменной, используя конструкцию вида: К о м а н д а = Имя переменной; (наличие символа ";" обязательно!). Например, команда T=k; установит, в зависимости от значений переменной k (32≤k≤255), разновид- ность темпа от Larghissimo ("очень протяжно") до Prestissimo ("предельно быстро"). Заметим, что это эффективный способ сочинения новых мелодий! В качестве символов-разделителей команд можно использовать либо точку с запятой (для удобства чтения),либо пробелы, либо вообще не разделять ко- манды. Например: "L8;O5;V6" или "L8 O5 V6" или "L8O5V6" . Как уже упоминалось, BEEP (или ошибка в программе) сбрасывает значения аргументов всех команд на значения по умолчанию. Забегая вперед, отметим, что значения аргументов команд M,O,L,T,V хра- нятся в системной области Оперативного Запоминающего Устройства компьюте- ра в ячейках с номерами &HF97A,&HFB50,&HFB51,&HFB52,&HFB53 соответственно. VI.2. O п е р а т о р PLAY. Ф у н к ц и я PLAY. О п е р а т о р BEEP А Вы ноктюрн сыграть могли бы На флейте водосточных труб? В. Маяковский Синтаксис оператора: ┌──────────────────────┐ │ PLAY [А][,B][,C] │ , └──────────────────────┘ где: PLAY("to PLAY"-"играть") - служебное слово; A,B,C - строковые выражения,значения которых содержат команды ММL. Оператор 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" 20 PLAY"L8CC+DD+EFF+GG+AA+B" Будет исполнена гамма до-мажор и хроматический ряд в 4-й октаве. Когда выполняется оператор PLAY, строки,соответствующие каждому голосу (содержащие максимум 255 символов) записываются в трех так называемых о ч е р е д я х. Затем они автоматически исполняются,в то время как основ- ная программа может "заниматься" чем-либо другим.После выполнения команды макроязыка удаляются из очередей. Когда все очереди пусты,музыка прекраща- ется. Далее, может выполняться новый оператор PLAY, но его выполнение, как правило, должно начаться сразу же после считывания из очереди последней команды предыдущего оператора PLAY, и даже в этом случае загрузка новых очередей вызовет задержку. Следующая программа наглядно демонстрирует описанный выше эффект очере- ди. Замысел состоял в том, чтобы последовательное исполнение десяти нот одновременно сопровождать индикацией на дисплее названия ноты. Как легко убедиться, названия нот появляются почти одновременно в виде списка, без всякой связи с их исполнением. П р и м е р. 30 CLS ─────────── 40 PLAY"T255O5L16" 50 FOR I=1 TO 10 60 READ A$:PRINT"Название ноты: ";A$:PLAY A$ 90 NEXT I 100 END 110 DATA C,A,E,F,G,B,D,G,E,C Наиболее простое решение проблемы сводится к организации цикла времен- ной задержки внутри временного основного цикла FOR. Период задержки необ- ходимо согласовать с темпом и длительностью звучания нот. В предложенном примере проблема будет решена, если Вы вставите строку: 85 FOR J=1 TO 100:NEXT В MSX-BASIC имеется функция, выясняющая, имеются данные в очередях или нет. Эту функцию (PLAY) не следует путать с оператором PLAY. Функция PLAY определяет, есть ли еще ждущая в очереди несыгранная музы- ка. Ее общий вид: ┌───────────────────────┐ │ PLAY (г о л о с) │ , └───────────────────────┘ где г о л о с - арифметическое выражение, целая часть значения которого принадлежит отрезку [0,3]. Функция сообщает, есть ли еще музыка в очереди и в процессе игры в качестве фоновой задачи, причем PLAY(0) сообщает,есть ли еще несыгранная музыка, PLAY(1) проверяет только голос А, PLAY(2) - го- лос B, PLAY(3) - голос C. Функция возвращает 0, если музыки в очереди нет, если же в очереди "что-нибудь" есть и играется,то функция возвращает (-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 │ , └────────────┘ где BEEP("бип",звукоподражание) - служебное слово. Оператор BEEP нетрудно моделировать оператором PLAY: PLAY"O6 E64" или PLAY"M225 V8 L64 O6 T120 S1 E" естественно без инициализации синтезатора звука! Таким образом, оператор BEEP можно применять в следующих случаях. Во-первых, оператор BEEP используется для сигнализации о наличии оши- бок в программе пользователя, т.к. любая ошибка,допущенная в программе на языке MSX-BASIC, влечет за собой выполнение 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) 40 'Описание подстрок 50 A$="o5df#ga":B$="o5gbo6cd":C$="o5ao6c#de" 80 D$="xa$;xc$;xb$;xa$;xb$;xc$;" 90 PLAY"v10t120l16" 100 PLAY D$ 110 IF NOT(PLAY(1)) THEN 100 120 'Генерация случайных строк 130 W$="" 140 FOR I=1 TO 5 150 X=INT(RND(1)*26):W$=W$+CHR$(65+X) 170 NEXTI 180 PRINT W$; 190 GOTO 110 Теперь разберем подробнее организацию музыкальной программы и некото- рые о с о б е н н о с т и , которые следует учесть при ее составлении. Оператор BEEP или ошибка в программе останавливают исполнение музыки. Два последовательных оператора PLAY A$:PLAY B$ всегда образуют короткую паузу между концом музыкальных данных первого оператора PLAY и началом музыкальных данных следующего оператора PLAY. Оператор PLAY позволяет исполнять ноты с четкими перерывами между ними - staccato, без перерывов - legato,и с короткими перерывами, вполне доста- точными для того,чтобы отличить звуки друг от друга - non legato. Как уже говорилось, исполнение staccato достигается только за счет того,что выдер- живается 3/4 номинальной длительности ноты и 1/4 оставляется на паузу.Для исполнения legato выдерживается полная длительность каждого звука, в ре- зультате чего создается ощущение,что соседние звуки плавно переходят один в другой. При исполнении non legato выдерживается 7/8 номинальной длитель- ности звука, а 1/8 длительности приходится на паузу: PLAY"L9 C R64 D R64 E R64 F R64" Как уже упоминалось, паузу можно организовывать с помощью специальной "молчащей" ноты R (см.раздел VI.1), только надо помнить, что текущая дли- тельность не влияет на длительность "ноты" R.После R надо указывать ее не- стандартную длительность, например: PLAY"L8 CDEF R8 GAB" . Если после R в данном случае не была бы указана длительность (8),то не- смотря на текущую длительность L8, "нота" R в действительности имела бы длительность по умолчанию (4). Однако, это не лучший способ для игры stac- cato и non legato. Гораздо проще обратиться за помощью к PSG (Программиру- емому Звуковому Генератору) (см. раздел VI.3). Если научиться умело пользоваться командами S и M, то Вам будут доступ- ны любые приемы игры,тембры и разнообразные эффекты. Так,например,если ар- гумент команды S равен 1, то приема staccato можно добиться, использовав диапазон частот 700÷3000. Если же аргумент команды S равен 1, а аргумент команды M находится в диапазоне 3000÷8000, то будет звучать non legato. При значении аргумента команды M, большего 8000,звучание нот переходит на legato. Если же аргумент команды S отличен от 1, то диапазон M,конечно,из- меняется, но не очень сильно. Зато возникают новые эффекты,которыми можно разнообразить Ваше произведение. Приведем ряд примеров: 1) 10 FOR I=4 TO 30 STEP 2:PLAY"SM1000L=I;O4G":NEXT:GOTO10 В этой программе параметр цикла I используется для обозначения длитель- ности звучания ноты G (соль) в третьей октаве,причем с возрастанием I дли- тельность звучания становится все короче.В результате выполнения програм- мы Вы услышите "музыку",напоминающую звук скачущего пластмассового шарика. 2) 5 'Пулеметная очередь! 3) 5 '"Морзянка"! 10 Z=RND(-TIME):FOR I=1TO60 10 Z=RND(-TIME):FOR I=1TO60 20 X=INT(RND(1)*65) 20 X=INT(RND(1)*65) 30 IF X<4 THEN 20 30 IF X<4 THEN 20 40 PLAY"S9M800L=X;O1G":NEXT 40 PLAY"S9M800L=X;O7C":NEXT К тому же имеется возможность использовать трезвучие на 3 различных тембрах, что может придать Вашей мелодии ритмический оттенок, а также по- является возможность уместно использовать фон.Пример использования ритми- ческого оттенка покажем на отрывке мелодии Л.Книппера "Полюшко-поле": 10 A$="sm25000o5l4c2o4ao5co4b2ge":B$="sm2500l4o3aaaagggg" 20 C$="sm2500l4o3eeeeeeee":PLAY A$,B$,C$ Пример использования фона ("Перепелочка",Белорусская народная песня): 10 A$="sm20000l8o5e4ao6co5b4aabo6co5b4a4a4":B$="sm20000l2o4adea" 20 C$="sm20000l2o4efg+e":PLAY A$,B$,C$ Конечно, использование только трех голосов является недостатком PSG,но умелый подбор тембра, нахождение новых обертонов и эффектов компенсируют этот недостаток. Необходимо запомнить и то,что использовав S для различных приемов игры, Вы потеряете весь контроль громкости с помощью V."Перебирая" аргументы ко- манды S при определенной частоте, Вы не всегда сможете услышать заметные отличия тембров. При другой частоте и тех же значениях аргумента команды S эти отличия будут уже явными, поэтому поиск закономерностей для сочета- ния S и М становится похожим на прогнозирование погоды. Но интересующий Вас тембр или эффект звучания можно найти за довольно короткий промежуток времени. Вы и сами заметите, что явно отличных друг от друга звучаний не так уж и много!