ZX Forum
#04
19 ноября 1997 |
|
Мир звуков Спектрума - глава 4.2: Программирование звуковых эффектов - Управление громкостью.
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 (увеличение длительности), то у Вас получится интересный эффект с за- тухающей громкостью.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября