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

4.7. Реверберация

   Говоря человеческим  языком, ревербера-
ция - это эхо.
   Программа, реализующая этот  интересный
эффект, по существу  является  воссоедине-
нием обоих фрагментов первого типа из пре-
дыдущей главы. То есть, эта программа  од-
новременно воспроизводит  звук  и  записы-
вает на его место новый.
   Вот она:
1415.
 10            DI                 ; запрет прерываний
 20  LOOP1     LD      HL,25000   ; HL=адрес буфера
 30            LD      DE,2560    ; DE=задержка эха
 40  LOOP2     LD      B,8        ; B=счетчик битов
 50  LOOP3     XOR     A          ; A=цвет бордюра (0)
 60            RRC     (HL)       ; скроллинг данных через флаг
                                    CY
 70            JR      NC,NOOUT   ; если CY=0, то перейти на
                                    NOOUT
 80            OR      16         ; установка бита D4 регистра A
 90  NOOUT     OUT     (254),A    ; вывод A в порт 254
100            RES     7,(HL)     ; сброс бита D7 в памяти
110            XOR     A          ; A=0 (опрос всей клавиатуры)
120            IN      A,(254)    ; ввод значения из порта 254
130            BIT     6,A        ; проверить бит магнитофона
140            JR      Z,NOINP    ; если 0, то перейти на NOINP
150            SET     7,(HL)     ; установить бит D7 в памяти
160  NOINP     CPL                ; клавиша
170            AND     31         ;   нажата ?
180            JR      NZ,EXIT    ; если да, то перейти на EXIT
190            LD      C,2        ; C=задержка
200  PAUSE     DEC     C          ; C=C-1
210            JR      NZ,PAUSE   ; если C<>0, то цикл
220            DJNZ    LOOP3      ; продолжить цикл обработки
                                    байта
230            INC     HL         ; HL=HL+1
240            DEC     DE         ; DE=DE-1
250            LD      A,D        ; DE=
260            OR      E          ;    0 ?
270            JR      NZ,LOOP2   ; если нет, то перейти на
                                    LOOP2
280            JR      LOOP1      ; перейти на LOOP1
290  EXIT      EI                 ; разрешение прерываний
300            RET                ; возврат
2
   Эта подпрограмма будет работать до  тех
пор, пока Вы не нажмете какую-либо  клави-
шу. А так как она  очень  чувствительна  к
подобного рода действиям, вызывать ее луч-
ше с помощью маленькой программки на  бей-
сике:

   10 FOR I=1 TO 10: NEXT I
   20 RANDOMIZE USR A

где A - адрес подпрограммы ревербератора.
   Если  Вы  хотите, чтобы  независимо  от
местоположения подпрограммы буфер находил-
ся  сразу  за  ней, то  введите  следующие
строки:
1415.
 20            LD      HL,BUFFER
310  BUFFER    NOP                ; здесь располагается буфер
2
   В строке 190  содержится  значение  за-
держки между выборками сигнала. Меняя его,
Вы можете настраивать соотношение  "качес-
тво звука - объем памяти".
   Изменяя значение в строке 30, можно ме-
нять задержку эха.
   И последнее:  если  Вы  будете  вводить
звук  с выхода какого-либо  устройства, то
эхо будет звучать один раз. Если же с  по-
мощью микрофона, то Вы  можете  установить
количество повторений, регулируя громкость
воспроизводимого звука  и  уровень  записи
магнитофона. Если хотя  бы  один  из  этих
параметров будет ниже необходимого уровня,
то эхо прозвучит один раз.  Чем  выше  эти
параметры, тем большее число повторений Вы
услышите (их громкость будет, как  в  жиз-
ни, от раза к  разу  уменьшаться).  Однако
не  следует  увлекаться.  Если  Вы  переу-
сердствуете, то программа самовозбудится и
все, что  она будет  воспроизводить, впос-
ледствии будет звучать на фоне ужасно про-
тивного шума. Если это произошло, выключи-
те громкость или микрофон на несколько се-
кунд, и все вернется на свои места.
