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

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

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

   Хотя в предыдущей главе  я  старательно
доказывал Вам тщетность попыток программи-
рования музыки на ассемблере, Вы  все-таки
должны знать основные принципы этого заня-
тия.
   Сейчас я  опишу  создание  многоголосой
музыки, то есть  музыки, в  которой  может
звучать две или больше ноты одновременно.
   Первым  примером  будет   подпрограмма,
имитирующая двухголосое звучание:
1415.
 10            DI                 ; запрет прерываний
 20            LD      D,200      ; D=частота 1
 30            LD      E,50       ; E=частота 2
 40            LD      H,150      ; H=длительность
 50            XOR     A          ; A=бордюр для голоса 1 (0)
 60            EX      AF,AF'     ; смена регистров A и F на
                                    альтернативные
 70            XOR     A          ; A=бордюр для голоса 2 (0)
 80            LD      C,E        ; C=счетчик 1
 90            LD      B,D        ; B=счетчик 2
100  BEEP      EX      AF,AF'     ; смена регистров A и F
                                    (смена голоса)
110            DEC     C          ; C=C-1
120            JR      NZ,CONT    ; если C<>0, то перейти на
                                    CONT
130            LD      C,E        ; восстановить счетчик 1
140            XOR     16         ; инвертировать бит D4 голоса
                                    1
150  CONT      OUT     (254),A    ; вывести A в порт 254
160            EX      AF,AF'     ; смена регистров A и F
                                    (смена голоса)
170            DEC     B          ; B=B-1
180            JR      NZ,CONT2   ; если B<>0, то перейти на
                                    CONT2
190            LD      B,D        ; восстановить счетчик 2
200            XOR     16         ; инвертировать бит D4 голоса
                                    2
210  CONT2     OUT     (254),A    ; вывести A в порт 254
220            INC     L          ; L=L+1
230            JR      NZ,BEEP    ; если L<>0, то перейти на
                                    BEEP
240            NOP                ; резерв
250            NOP                ; резерв
260            DEC     H          ; H=H-1
270            JR      NZ,BEEP    ; если H<>0, то перейти на
                                    BEEP
280            EI                 ; разрешение прерываний
290            RET                ; возврат
2
Теперь поясню некоторые детали.
   Два альтернативных регистра A использу-
ются первым и вторым голосами для хранения
цвета бордюра и состояния динамика.
   Странная операция с регистром  L  перед
завершением цикла предназначена для  "рас-
тягивания" длительности. Если  ее  убрать,
то звучание этой подпрограммы станет  нас-
только кратковременным, что Вы можете  его
даже не услышать.
   Два байта резерва (операции NOP) Вы мо-
жете использовать  для  изменения  частоты
обоих голосов  во  время  воспроизведения.
Для этого вместо "NOP" нужно вставить  INC
D или DEC D для первого голоса и INC E или
DEC E для второго.
   Эту подпрограмму можно использовать  на
ассемблере (см. предыдущую главу)  или  на
бейсике (в данном  случае  параметры  сле-
дует заносить оператором POKE в  следующие

ячейки : ADDR+2 - частота 1, ADDR+4 - час-
тота 2, ADDR+6 - длительность, где  ADDR -
адрес расположения подпрограммы в памяти).
   Следующие две многоголосые  подпрограм-
мы очень похожи  друг на друга, но  первая
звучит значительно тише и  несколько  чище
второй.
   Вот они:
1415.
 10            DI                 ; запрет прерываний
 20            LD      HL,2000    ; HL=длительность
 30  LOOP1     LD      IX,FRQS    ; IX=адрес таблицы частот
 40            LD      B,5        ; B=число голосов
 50  LOOP2     DEC     (IX+0)     ; байт по адресу IX+0
                                    уменьшить на 1
 60            JR      NZ,NOSIGN  ; если не 0, то перейти на
                                    NOSIGN
 70            LD      A,24       ; A=цвет бордюра + 24
 80            OUT     (254),A    ; вывод A в порт 254
 90            LD      A,(IX+5)   ; обновление счетчика
100            LD      (IX+0),A   ;   текущего канала
110            XOR     A          ; A=цвет бордюра (0)
120            OUT     (254),A    ; вывод A в порт 254
130  NOSIGN    INC     IX         ; IX=IX+1
140            DJNZ    LOOP2      ; цикл
150            DEC     HL         ; HL=HL-1
160            LD      A,H        ; HL=
170            OR      L          ;    0 ?
180            JR      NZ,LOOP1   ; если нет, то цикл
190            EI                 ; разрешение прерываний
200            RET                ; возврат
210  FRQS      DEFB    1,1,1,1,1  ; счетчики для 5 каналов
220            DEFB    10,20,30   ; частоты для
230            DEFB    40,50      ;    5 каналов

 10            DI                 ; запрет прерываний
 20            LD      HL,2000    ; HL=длительность
 30  LOOP1     LD      IX,FRQS    ; IX=адрес таблицы частот
 40            LD      B,5        ; B=число голосов
 50  LOOP2     DEC     (IX+0)     ; байт по адресу IX+0
                                    уменьшить на 1
 60            JR      NZ,NOSIGN  ; если не 0, то перейти на
                                    NOSIGN
 70            LD      A,(IX+5)   ; A=содержимое IX+5
 80            XOR     1          ; инвертирование бита D0
 90            LD      (IX+5),A   ; содержимое IX+5=A
100            LD      A,0        ; A=цвет бордюра
110            JR      Z,NOSIGN   ; если D0 содер. IX+5=0, то
                                    перейти на NOSIGN
120            OR      24         ; установить в 1 биты D3 и
                                    D4 регистра A
130            OUT     (254),A    ; вывод A в порт 254
140            LD      A,(IX+10)  ; обновление счетчика
150            LD      (IX+0),A   ;   текущего канала
160  NOSIGN    INC     IX         ; IX=IX+1
170            DJNZ    LOOP2      ; цикл
180            DEC     HL         ; HL=HL-1
190            LD      A,H        ; HL=
200            OR      L          ;    0 ?
210            JR      NZ,LOOP1   ; если нет, то цикл
220            EI                 ; разрешение прерываний
230            RET                ; возврат
240  FRQS      DEFB    1,1,1,1,1  ; счетчики для 5 каналов
250            DEFB    0,0,0,0,0  ; буферы для 5 каналов
260            DEFB    10,20,30   ; частоты для
270            DEFB    40,50      ;  5 каналов
2
   Эти подпрограммы заводят  счетчики  для
каждого из каналов  и  последовательно  их
уменьшают. Если  какой-либо  из  счетчиков
становится равным 0, на динамик  выводится
сигнал, а в данный счетчик заносится  час-
тота из таблицы.
   В  данных  примерах  подпрограммы  вос-
производят по пять  голосов, но  Вы  може-
те легко изменить их  число, модифицировав
значения в строках 40 и 90 для первой под-
программы или 40,70,90 и 140 (в строку 140
надо вставить число голосов, умноженное на
2) - для второй. При этом надо также скор-
ректировать таблицы частот.
   Хотя голосов может быть  довольно  мно-
го (до 85), увлекаться  их количеством  не
стоит, так как чем их больше, тем хуже ка-
чество. Впрочем, вряд ли  найдется  гений,
способный написать мелодию на 85 голосов.
   Если Вы хотите использовать  многоголо-
сие, но в конкретный  момент  времени  Вам
надо воспроизвести меньшее число  голосов,
чем задано, то неиспользуемым голосам  на-
до присвоить частоты, совпадающие с часто-
тами используемых голосов.




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

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'а, советы по использованию ассемблера.


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

Похожие статьи:
News - Новости, старости: Chaos Construction 2001 состоялся, Pussy стала freeware, новое бумажное издание на спектруме, Raver покинул ряды Phantasy, новая версия эмулятора спектрума Real Speccy, Assembly 2001, новый коммандер Real Commander 2.0, Delirium Tremens уходят со спектрума...
История - О раннесредневековой архитектуре в свете "новой хронологии" академика А.Т.Фоменко
Реклама - текстовая реклама и обьявления.
Фенечки - говорят дети.
Розыск - Разыскиваются: CYRUS-2 128 & FINAL FIGHT.

В этот день...   21 ноября