ZX Forum #04
19 ноября 1997

Мир звуков Спектрума - глава 4: Программирование звука на ассемблере.


    4. Программирование звука в кодах

   Простейший пример воспроизведения  зву-
кового сигнала в кодах был приведен в пре-
дыдущей главе. В принципе, это  единствен-
ный спсоб получения звука, но оформить его
можно  по-разному.  Например, как  универ-
сальную подпрограмму:
1415.
 10            DI                 ; запрет прерываний
 20  BEEP      LD      A,B        ; A=цвет бордюра
 30            SET     4,A        ; бит D4=1
 40            OUT     (254),A    ; вывод A в порт 254
 50            PUSH    HL         ; сохранение HL
 60  LOOP1     DEC     HL         ; HL=HL-1
 70            LD      A,H        ; HL=
 80            OR      L          ;    0 ?
 90            JR      NZ,LOOP1   ; если нет, то цикл
100            POP     HL         ; восстановление HL
110            LD      A,C        ; A=цвет эффекта
120            OUT     (254),A    ; вывод A в порт 254
130            PUSH    HL         ; сохранение HL
140  LOOP2     DEC     HL         ; HL=HL-1
150            LD      A,H        ; HL=
160            OR      L          ;    0 ?
170            JR      NZ,LOOP2   ; если нет, то цикл
180            POP     HL         ; восстановление HL
190            DEC     DE         ; DE=DE-1
200            LD      A,D        ; DE=
210            OR      E          ;    0 ?
220            JR      NZ,BEEP    ; если нет, то цикл
230            EI                 ; разрешение прерываний
240            RET                ; возврат в бейсик
2
   Перед вызовом этой подпрограммы необхо-
димо занести в регистровую пару HL  часто-
ту, в  DE - длительность, в  B - цвет бор-
дюра, а в C - цвет эффекта (если Вы хотите
видеть бордюр  однотонным, то  значение  C
должно быть равно B). Кроме  того, если  к
регистру B  прибавить  8  (установить  бит
D3), то вместе с  динамиком  сигнал  будет
подаваться на магнитофон.
   Можно сделать эту программу универсаль-
ной несколько в другом смысле:
1415.
 10            DI                 ; запрет прерываний
 20            LD      A,(23624)  ; A=
 30            SRL     A          ;   цвет
 40            SRL     A          ;   бор-
 50            SRL     A          ;   дюра
 60  BEEP      XOR     16         ; инвертирование бита D4
 70            OUT     (254),A    ; вывод A в порт 254
 80            LD      C,A        ; сохранение A
 90            PUSH    HL         ; сохранение HL
100  PAUSE     DEC     HL         ; HL=HL-1
110            LD      A,H        ; HL=
120            OR      L          ;    0 ?
130            JR      NZ,PAUSE   ; если нет, то цикл
140            POP     HL         ; восстановление HL
150            DEC     DE         ; DE=DE-1
160            LD      A,D        ; DE=
170            OR      E          ;    0 ?
180            LD      A,C        ; восстановление A
190            JR      NZ,BEEP    ; если DE<>0, то цикл
200            EI                 ; разрешение прерываний
210            RET                ; возврат в бейсик
2
   Этой подпрограмме надо передать  только
частоту в регистре HL и длительность в DE,
а  цвет бордюра  сохраняется  тот, который
был при ее вызове (если только он  не  был
установлен оператором OUT).
   Примерно такая же подпрограмма  имеется
в ПЗУ ZX-Spectrum. Она расположена с адре-
са 949 (#03B5).  Параметры,как  и  раньше,
передаются в регистрах HL и DE. Их  значе-
ния можно рассчитать  по  следующим форму-
лам:

       HL=INT(437500/f-30.125+.5)
       DE=INT(f*t+.5)

где f - частота в Гц, а t - время в сек.
   Частоту  нот  для  пятой  октавы  можно
взять из таблицы 2.  Чтобы  ноту  повысить
или понизить  на октаву, ее  частоту  надо
соответственно умножить или  разделить  на
2. Причем, при делении значения получаются
немного точнее, чем при умножении.
   При генерации  звука  всеми  способами,
приведенными  выше, необходимо  учитывать,
что чем выше тон, тем  короче  будет  дли-
тельность.
   Если  Вы  хотите  при  программировании
звука в кодах использовать привычные пара-
метры оператора BEEP, то  Вы  можете  вос-
пользоваться  подпрограммой  ПЗУ, располо-
женной по адресу  1016 (#03F8).  Правда, с
ней связаны некоторые трудности.
   Дело в том, что параметры ей передаются
через стек калькулятора, а  засунуть  туда
дробное или отрицательное число не  так-то
просто.
   Чтобы обойти это неудобство, существует
три основных способа. Первый - хранить не-
обходимые значения в стандартной  пятибай-
товой форме и помещать их в стек с помощью
специальной  подпрограммы  ПЗУ.  Второй  -
хранить эти значения в символьной форме  и
помещать их в стек с помощью  другой  спе-
циальной подпрограммы ПЗУ.  И третий - не-
множко изменить систему параметров  и  за-
няться вычислениями.
   Первый способ не годится из-за  слишком
большого объема  расходуемой памяти.  Вто-
рой - по той же причине, плюс слишком мед-
ленная его работа. Остается третий способ.
Он вполне подходит и его можно легко  осу-
ществить.
   Пусть длительности задаются в сотых до-
лях секунды, а  высоты нот, как  раньше, в
полутонах выше или ниже ДО первой  октавы.
Такая система параметров  позволяет  полу-
чать ноты длительностью до 2,55  секунд  с
частотами в диапазоне от -60 до 69 (как  в
бейсике). Длительность  ноты  будет  зада-
ваться в регистре C, а высота - в регистре
B.
   Вот  подпрограмма,  осуществляющая  все
вышеописанное:
1412.
 10         PUSH    BC         ; сохранение BC
 20         LD      A,C        ; A=C (длительность)
 30         CALL    11560      ; поместить A в стек калькулятора
 40         LD      A,100      ; A=100
 50         CALL    11560      ; поместить A в стек калькулятора
 60         RST     40         ; вызов калькулятора
 70         DEFB    5,56       ; деление длительности на 100
 80         POP     BC         ; восстановление BC
 90         LD      A,B        ; A=B (частота)
100         BIT     7,A        ; A - отрицательное ?
110         JR      NZ,MINUS   ; если да, то перейти на MINUS
120         CALL    11560      ; иначе поместить A в стек каль-
                                 кулятора
130         JP      1016       ; вызов подпрограммы воспроизве-
                                 дения
140  MINUS  NEG                ; в A - абсолютное значение
150         CALL    11560      ; поместить A в стек калькулятора
160         RST     40         ; вызов калькулятора
170         DEFB    27,56      ; изменение знака
180         JP      1016       ; вызов подпрограммы воспроизве-
                                 дения

   Если Ваш  ассемблер  не  "переваривает"
отрицательные числа (бывают  такие  "штуч-
ки"), то необходимые значения  можно  рас-
считать по следующей формуле: n=256-x, где
x - абсолютная  величина  значения, а  n -
результат.



Другие статьи номера:

Help - Описание оболочки электронного издания "ZX-FORUM 4".

Секреты успешного дизайна - глава для книги "Дизайн Ваших программ"

Экранные эффекты - Бегущая строка из R-Type.

Экранные эффекты - гашения экрана из Zynaps.

Экранные эффекты - "сворачивание" экрана из Comando Tracer.

Экранные эффекты - плавное "затухание" экрана из Сommando Tracer.

Экранные эффекты - модификация символьного набора для получения оригинального стилизованного шрифта из игры Rockstar.

Экранные эффекты - "выбегающая строка" из игры Rockstar.

Экранные эффекты - "наливающийся" экран из игры Rockstar.

Экранные эффекты - сложный многоступенчатый эффект из игры Bubbler.

Новые 40 лучших процедур - скроллинг экрана, слияние двух картинок, инвертирование экрана, поворот символов, замена атрибутов, заливка замкнутого контура, вычисление адресов в экране, копирование части экрана и т.д.

Технология спрайтов - часть 1: введение.

Технология спрайтов - часть 2: охота на спрайты (поиск и выдирание).

Технология спрайтов - часть 3: форматы спрайтов.

Технология спрайтов - часть 4: форматы спрайтов с маской.

Технология спрайтов - часть 5: структура спрайтовых блоков (как уживаются в памяти спрайт и маска, какие данные помогают нам оперативно находить адрес спрайта в памяти и многое другое.)

Технология спрайтов - часть 6: подготовка данных к печати.

Технология спрайтов - часть 8: печать спрайтов (координаты заданы в знакоместах).

Технология спрайтов - часть 9: печать спрайтов (координаты заданы в пикселях).

Технология спрайтов - часть 10: обзор программ для работы со спрайтами и графикой.

Мир звуков Спектрума - глава 1: Физика звука.

Мир звуков Спектрума - глава 2: Оператор BEEP, Создание эффектов на BEEPе, Создание музыки на BEEPе.

Мир звуков Спектрума - глава 3: Как получается звук (устройство BEEP'ра и способы звукоизвлечения).

Мир звуков Спектрума - глава 4: Программирование звука на ассемблере.

Мир звуков Спектрума - глава 4.1: Программирование звуковых эффектов - Тон, Шум, Комплексы эффектов.

Мир звуков Спектрума - глава 4.2: Программирование звуковых эффектов - Управление громкостью.

Мир звуков Спектрума - глава 4.3: Программирование звуковых эффектов - Управление тембром.

Мир звуков Спектрума - глава 4.4: Программирование звуковых эффектов - Программирование музыки.

Мир звуков Спектрума - глава 4.5: Программирование звуковых эффектов - Многоголосые мелодии (полифония).

Мир звуков Спектрума - глава 4.6: Обработка внешних сигналов - оцифровка.

Мир звуков Спектрума - глава 4.7: Обработка внешних сигналов - Реверберация.

Мир звуков Спектрума - глава 4.8: Синтезирование речи.

Мир звуков Спектрума - глава 4.9: воспроизведение звука на прерываниях.

Мир звуков Спектрума - глава 5: Оператор PLAY для музыкального сопроцессора AY- 3-8910 (AY-3-8912).

Мир звуков Спектрума - глава 5.1: Создание эффектов оператором PLAY.

Мир звуков Спектрума - глава 5.2: Создание музыки на PLAYе.

Мир звуков Спектрума - глава 6.1: описание регистров музыкального сопроцессора AY- 3-8910 (AY-3-8912).

Мир звуков Спектрума - глава 6.2: Программирование эффектов и музыки под музыкальный сопроцессор AY- 3-8910 (AY-3-8912).

Мир звуков Спектрума - глава 7: Обзор программного обеспечения ZX-Spectrum для создания звуков и музыки.

Мир звуков Спектрума - глава 7.1: Редактор звуковых эффектов SUPER SOUND.

Мир звуков Спектрума - глава 7.2: Музыкальный редактор Wham the Music Box.

Мир звуков Спектрума - приложения 1, 2: листинги звуковых эффектов SUPER SOUND'а, советы по использованию ассемблера.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Introduction - Несколько авторских слов.
Oбзoр экcтрemaльнoй myзыкИ - CRАDLE OF FILТН, KING DIАMOND, PАNТERА, SАDISТ, SIХ FEEТ UNDER, CRYPТOPSY, SOULFLY, OPERА IХ, MYSТIC CIRCLE, DYSАNCНELY, ТНERION, BUТТERFLY ТEMPLE, СEВEPНЫE ВPАТА, IMMORТАL.
Игры - В марте я играл в следующие игры...

В этот день...   18 августа