ZX-Ревю 1993 №9-10 1992 г.

Профессиональный подход - компьютер и звук.


ПРОФЕССИОНАЛЬНЫЙ ПОДХОД

(С) Збитнев В.А., г. Новосибирск, 1993г.

КОМПЬЮТЕР И ЗВУК

Вы уже несколько знакомы с генерацией звука на Спектруме. Самый простой пример: оператор ВЕЕР в БЕЙСИКе. С остальными звуковыми эффектами Вы знакомы лишь понаслышке из игровых программ. Что представляет из себя звук на компьютере? На рис. 1 представлено классическое изображение гармонической частоты.

I

А А , ТА

Рис. 1

На компьютере такая синусоида неформируема. Мы не сможем на "Спектруме" сформировать плавное изменение положения диффузора динамика, т.к. доступ к динамику возможен только через бит 4 (здесь четвертый бит является пятым по порядку или числом 16, если все остальные считать нулями) порта номер 254.

Положением динамика управляет один бит, значит возможны только два положения, где 0 - начальное положение, 1 - максимальное удаленное от начального положения. Графиком частоты, образованной таким образом, служит рис. 2.

I

t

Рис. 2

Подобным образом информация считывается и записывается на магнитофон. Попробуйте набрать программу 1, в которой данные, считываемые с магнитофона, запоминаются в памяти. Информация может представлять собой человеческую речь, музыку и прочую звуковую информацию. Программа 2 проигрывает информацию, считанную с магнитофона и записанную в память, выводя ее на динамик компьютера.

В данном случае информация записывается в верхние две трети экрана с задержкой 15. Чем меньше эта задержка, тем быстрее заполнится память и более четко воспроизведение. Так что подбирайте ее по вкусу.

Программа 1.

TAPBUF LD HL,16384 LD DE,4096 SBUF LD C,1

LDBYT

LD

A,15

DELAY1

DEC

A

JR

NZ,DELAY1

IN

A,(254)

RLCA

RLCA

RL

C

JR

NC,LDBYT

LD

(HL),C

INC

HL

DEC

DE

LD

A,D

OR

E

JP

NZ,SBUF

RET

Программа

2.

Bufdin

LD

HL,16384

LD

DE,4096

STBYT

LD

A,(HL)

LD

B,A

LD

C,128

PLAY

LD

A,15

DELAY2

DEC

A

JR

NZ,DELAY2

LD

A,B

AND

C

JP

NZ,BEEP1

XOR

A

OUT

(254),A

BP1Q

RRC

C

JR

NC,PLAY

INC

HL

DEC

DE

LD

A,D

OR

E

JR

NZ,STBYT

RET

BEEP1

LD

A,16

OUT

(254),A

JR

BP1Q

Но даже при минимальном значении задержки звук не будет достаточно реалистичным. Из рис. 3 видно, что выделяются не все частоты, многие из них, находясь ниже 0, приравниваются к 0, а находящиеся выше 0, приравниваются к 1.

Над данными, которые считываются с магнитофона, можно выполнять некоторые операции, например, удаление низкой частоты, подавление шума, выявление преобладающей частоты. Выявление частот используется в цветомузыке. Набрав программу 3, Вы можете узнать, сколько импульсов (точнее перепадов с 1 на 0 или с 0 на 1) произошло за некоторый интервал времени.

Программа 3.

BCDELAY

LD

B,127

LD

H,A

LD

C,0

IMPN

18

A,(254)

XOR

H

AND

64

CALL

Z,INCC

DJNZ

IMPN

RET

INCC

LD

A,H

CPL

LD

H,A

INC

C

RET

J

1

0

' АлЛл

/

W

Рис. 3

Число импульсов возвращается в регистровой паре ВС, т.е. Вы можете вызывать эту программу Бейсик-программой. По числу таких импульсов можно узнать, какая частота преобладает (в данном случае за 127 тактов). Чем выше частота, тем меньше значение, содержащееся в ВС. Можно на основе этой программы создать цветомузыку или программу, распознающую мелодию, проигрываемую с магнитофона. Но эта программа не сможет Вам выдать точное значение частоты, идущей с магнитофона. Это значение весьма приближенно, т.к. часть частот пропадает, часть наоборот появляется в виде шума.

Если вы, к примеру, запустив программу 1, предварительно нажмете клавишу "воспроизведение" и "пауза" на магнитофоне, то увидите, что с магнитофона, который молчит, идет шум, который весьма заметен (вполне возможно, что у Вас прекрасный магнитофон, тогда шума не будет, но урезание частот останется).

Итак, Вы представляете уже, какое качество звука можно получить, используя Спектрум, какие недостатки имеет звуковое решение на компьютере.

Но возможен резонный вопрос: "Каким же образом регулируется громкость в мелодиях игровых программ?" Что же такое громкость? С помощью рис. 4 можно увидеть, что громкость - это амплитуда звуковой частоты. Но как же можно изменять амплитуду на Спектруме?

Рис. 4

Представьте себе, что на динамик подана 1. Динамик начинает поднимать диффузор. А потом тут же подадим на него 0. Диффузор опять примет начальное положение. А что, если мы будем увеличивать значение задержки между подачей 1 и 0. Диффузор поднимется уже несколько выше, и так можно увеличивать эту задержку до тех пор, пока за промежуток времени между 1 и 0 диффузор не будет успевать достичь наивысшего положения.

Рис. 5

Если он будет успевать, то, как такового, изменения громкости происходить не будет. Вы, наверное, уже замечали, что в играх, в которых используется затухание, слышно, что при уменьшении громкости мелодии появляется высокая частота. Это происходит именно из-за этого эффекта. Подобные мелодии с затуханиями почти невозможно слушать на маленьких (высокочастотных) динамиках, так что наиболее благородно мелодия звучит на низкочастотных (больших) динамиках. Итак, мы выяснили, что для изменения громкости нужно изменять задержку между 1 и 0.

Программа 4.

МЕТКА

CONTIN

АССЕМБЛЕР КОММЕНТАРИЙ

ORG

30000

DI

Отключение прерываний.

LD

IX,31000

Начало данных.

LD

A,(IX+0)

Прием данных в аккумулятор.

CP

255

255 - конец мелодии.

JP

Z,EXI

Выход.

OR

A

Проверка флагов в аккумуляторе.

JR

Z,NO1

Если ноль, то обход.

LD

C,A

Временное сохранение аккумулятора

AND

128

Проверка старшего (7-го) бита.

Если он =1, то

LD

(BARB+1),A

включается признак ударника.

LD

A,C

Восстановление аккумулятора.

AND

127

Гашение 7-го бита.

LD

D,A

Временное сохранение аккумулятора

LD

(NT1+1),A

Установка звука в первом канале.

SRL

A

Деление числа на

SRL

A

восемь для определения

A A

(VL1+1),A

A,1

(DEL1 +1),A IX

A,(IX+0) A

Z,NO2 E,A

(NT2+1),A

A

A

A

A

(VL2+1),A

A,1

(DEL2+1),A

IX

C,2

B,0 BEEP BEEP DECVOL C

NZ,BEPS CONTIN

SRL INC LD

LD

LD

INC

LD

OR

JR

LD

LD

SRL

SRL

SRL

INC

LD

LD

LD

INC

LD

LD

CALL

CALL

CALL

DEC

JP

JP

NO1

NO2 BEPS

задержки громкости. Уход от возможного нуля. Установили задержку громкости в первом канале.

Установка компенсационной задержки, чтобы громкость не влияла на частоту. Переход к очередному байту данных (второй канал).

Проверка флагов в аккумуляторе. Обход, если 0 (играть не надо). Временно сохранили аккумулятор. Установка звука во втором канале. Деление на

восемь.

Плюс единица (уход от нуля). Установили задержку громкости во втором канале. Установка компенсационной задержки.

Переход к очередному байту данных.

Темп

мелодии.

Выдача сигнала на динамик. Выдача сигнала на динамик. Уменьшение громкости.

2 раза.

Возврат для приема очередных данных.

Регистр D - первый канал.

Регистр Е - второй канал.

VL1 - громкость в первом канале.

VL2 - громкость во втором канале.

DEL1 - компенсационная задержка 1-го канала.

DEL2 - компенсационная задержка 2-го канала.

;BEEP

BEEP

DEC

D

JR

NZ,S2

NT1

LD

D,0

LD

A,16

OUT

(254),A

VL1

LD

A,0

S0

DEC

A

JR

NZ,S0

OUT

(254),A

DEL1

LD

A,32

S1

DEC

A

JR

NZ,S1

S2

DEC

E

JR

NZ,BARB

NT2

LD

E,0

LD

A,16

OUT

(254),A

VL2

LD

A,12

S3

DEC

A

JR

NZ,S3

OUT

(254),A

DEL2

LD

A,32

S4

DEC

A

JR

NZ,S4

BARB

LD

A,0

OR

A

JR

Z,WAIT

LD

A,16

первый

канал

Второй

канал

|

Признак удара.

OUT

(254),A

LD

A,0

Удар

STUK

DEC

A

JR

NZ,STUK

LD

(BARB+1),A

WAIT

LD

A,20

S5

DEC

A

JR

NZ,S5

OUT

(254),A

LD

A,0

IN

A,(254)

AND

31

XOR

31

JR

NZ,EXIT

DJNZ

BEEP

RET

EXIT

POP

BC

EXI

EI

RET

DECVOL

LD

A,(VL1+1)

Уменьшение громкости в

DEC

A

первом канале.

JR

Z,NO3

LD

(VL1+1),A

Соответствующее увеличение

LD

A,(DEL1+1)

компенсационной задержки в первом

INC

A

канале.

LD

(DEL1+1),A

MO3

LD

A,(VL2+1)

Уменьшение громкости во

DEC

A

втором канале.

RET

Z

LD

(VL2+1),A

Соответствующее увеличение

LD

A,(DEL2+1)

компенсационной задержки во втором

INC

A

канале.

LD

(DEL2+1),A

RET

]

I

к

—►

1

<

t

1. - изменение громкости. 2. - изменение частоты. Рис.6

Теперь перейдем к формированию частоты. Обычно звуковая частота формируется так, как показано на рис. 2. Но можно формировать и другую форму частоты. Пример на рис. 6.

Теперь уже более понятно, как формировать частоту с изменяющейся амплитудой. Если Вы сделаете программу вывода звука по этому принципу, то Ваша программа будет работать нормально. Единственный недостаток: зависимость частоты от громкости. Предположим, задержка частоты равна 10, а задержка громкости равна 20. При уменьшении громкости будет слышно только изменение частоты и лишь в конце будет слышно некоторое изменение громкости.

Перейдем к более точному методу. Чтобы частота сохранялась при изменении громкости, введем еще один параметр: задержка для сохранения частоты (b). Ее суть состоит в том, чтобы расстояние между импульсами (d) оставалось постоянным, при изменении громкости (а). Значит, мы должны взять некоторое максимальное значение (amax), откуда b = amax - a.

Т.е. чем больше значение задержки громкости (a), тем меньше значение компенсирующей задержки (b). К примеру, для затухания (a) уменьшается на 1, а (b) увеличивается на 1 до тех пор, пока (а)>1. При (а)=1 затухание останавливается.

a

« b ,

- c ,,

t

d

Рис. 7

Следующий вопрос: "Как сделать, чтобы одновременно могли работать несколько звуковых каналов?"

Представим себе некую сумму двух частот (рис. 8). Здесь график I - уменьшающаяся частота, график II - постоянная частота, а график S - результирующая (суммарная частота).

Каждый такой импульс представляет собой отрезок (ab) см. рис. 7. Правда, у первой и второй частоты (а) и (b) могут отличаться. Способ, предлагаемый на рис. 7 здесь не проходит. Отрезок (с) между импульсами одной частоты превращается в счетчик, который определяет: через сколько тактов должен произойти импульс. Этот способ вывода звуковой частоты реализован в программе 4.

I

П

1—

1—

1—

II

П

1—

+

1-1

t

S

1-1

1-

PI

t

t

Рис. 8.

Еще одно важное замечание: отрезок (ab) занимает 1/8 часть отрезка (с). Это необязательно принимать во внимание, но это обеспечивает нормальную регулировку громкости при более высокой частоте. А так как 256/8=32, то задержка (ab) принята равной 32.

Как работает программа. В памяти с адреса 31000 лежит массив данных. В каждом четном байте лежит значение частоты для I канала, в нечетном - значение ноты II канала. Если номер ноты равен 0, то данные канала не инициируются. Если четный байт более 127 (установлен 7 бит), то удар в барабан. Если четный байт равен 255, то мелодия считается оконченной. Выход из программы осуществляется также нажатием на любую клавишу. Звук барабана формируется продолжительной установкой 1 на динамик и сброс затем. В конце программы подпрограмма DECVOL уменьшает значение громкости обоих каналов. Но можно сделать один из каналов с постоянной громкостью или, наоборот, с ее увеличением.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
Программистам - ассемблер: Экскурс в анатомию ZX
Warez pack - новый софт: Аdventurer#10, Supaplex & Snake, DejaVu#08.
Список BBS - ZX-Net 095.
Семь и 1/2 - День дурака (приколы и юмор).
Интервью - Интервью с участниками Paradox'2002: Wild и Demon.

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