Инструменты пользователя

Инструменты сайта


msx:basic_dialogue_programming_language:files:diff_006

Глава VI

@@ -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
+
msx/basic_dialogue_programming_language/files/diff_006.txt · Последние изменения: 2022-09-10 12:56 — GreyWolf