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

ZX Forum #04
       4.2. Управление громкостью

   Вообще-то,  ZX-Spectrum  абсолютно   не
приспособлен для управления громкостью, но
ее  все-таки  можно  изменять  в   неболь-
ших пределах благодаря относительно  высо-
кой тактовой частоте  микропроцессора  Z80
(около 3,5 мГц).
   Как уже говорилось в главе 2, когда  Вы
посылаете сигнал на динамик, его  мембрана
изменяет свое положение. Если во время  ее
движения послать  обратный сигнал, то  она
вернется  в исходное  положение, не  прой-
дя нужного пути.  Таким образом, амплитуда
(соответственно и громкость) будет  меньше
обычной. Для примера сравните звучание та-
ких двух практически одинаковых программ:
1415.
 10  PROG1     DI                 ; запрет прерываний
 20            LD      B,255      ; B=частота
 30            LD      C,255      ; C=длительность
 40            XOR     A          ; A=цвет бордюра (0)
 50  LOOP1     XOR     16         ; инвертирование бита D4
 60            OUT     (254),A    ; вывод A в порт 254
 70            PUSH    BC         ; сохранение BC
 80  LOOP2     DJNZ    LOOP2      ; задержка
 90            POP     BC         ; восстановление BC
100            DEC     C          ; C=C-1
110            JR      NZ,LOOP1   ; если C<>0, то цикл
120            EI                 ; разрешение прерываний
130            RET                ; возврат в бейсик

 10  PROG2     DI                 ;
 20            LD      B,255      ;
 30            LD      C,255      ;
 40            XOR     A          ;
 50  LOOP1     XOR     16         ; все
 60            OUT     (254),A    ;
 70            XOR     16         ; (кроме этих двух строк,
 80            OUT     (254),A    ; повторяющих предыдущие)
 90            PUSH    BC         ;
100  LOOP2     DJNZ    LOOP2      ; аналогично
110            POP     BC         ;
120            DEC     C          ; предыдущему
130            JR      NZ,LOOP1   ;
140            EI                 ; примеру !
150            RET                ;
2
   Когда Вы их наберете  на  ассемблере  и
запустите,  Вы  сильно  удивитесь.  Однако
против фактов не попрешь - вторая подпрог-
рамма будет звучать в несколько  раз  тише
первой!
   Приведу текст более универсальной  под-
программы:
1415.
 10            DI                 ; запрет прерываний
 20            LD      B,50       ; B=громкость
 30            LD      C,50       ; C=частота
 40            LD      D,15       ; D=длительность
 50            LD      E,50       ; E=количество нот
 60            XOR     A          ; A=цвет бордюра (0)
 70  LOOP1     PUSH    DE         ; сохранение DE
 80  LOOP2     PUSH    BC         ; сохранение BC
 90            XOR     16         ; инвертирование бита D4
100            OUT     (254),A    ; вывод A в порт 254
110  LOOP3     DJNZ    LOOP3      ; задержка (громкость)
120            XOR     16         ; инвертирование бита D4
130            OUT     (254),A    ; вывод A в порт 254
140            LD      B,C        ; B=C
150  LOOP4     DJNZ    LOOP4      ; задержка (частота)
160            POP     BC         ; восстановление BC
170            DEC     D          ; D=D-1
180            JR      NZ,LOOP2   ; если D<>0, то цикл
190            POP     DE         ; восстановление DE
200            NOP                ; резерв
210            NOP                ; резерв
220            NOP                ; резерв
230            DEC     E          ; E=E-1
240            JR      NZ,LOOP1   ; если E<>0, то цикл
250            EI                 ; разрешение прерываний
260            RET                ; возврат в бейсик
2
   В этом эффекте Вы можете подобрать нуж-
ную громкость. Но  не  очень  увлекайтесь:
при  значениях  больших, чем  40-50, гром-
кость уже не увеличивается. Необходимо за-
метить, что  при  изменении  громкости  во
время воспроизведения меняется и  частота.
Поэтому надо предусмотреть ее компенсацию.
   Теперь о трех байтах  резерва  (команды
NOP).  Они  предназначены  для   изменения
громкости (регистр B), частоты (регистр C)
и длительности (регистр D). Если Вы  заме-
ните эти три NOPа на команды DEC B (умень-
шение громкости), INC C (компенсация  час-
тоты) и INC D  (увеличение  длительности),
то у Вас получится интересный эффект с за-
тухающей громкостью.