Лекции по Вычислительным машинам, системам и сетям   

5. Программирование на языке Ассемблер

5.21. Работа со звуком

В состав любой ПЭВМ фирмы IBM входит микросхема таймера i8254. Схема ее использования в ПЭВМ представлена в рад. 2.12.

Микросхема таймера имеет три канала, соответственно каналы 0,1 и 2. Канал 0 отводится для службы системного времени, канал 1 ‑ для регенерации памяти, а канал 2 ‑ для управления работой динамика.

Порты таймера имеют следующие системные адреса:

- канал 0         ‑ 40h;

- канал 1         ‑ 41h;

- канал 2         ‑ 42h;

- регистр управляющего слова (РУС)  ‑ 43h.

Через РУС производится настройка каналов, через остальные порты ‑ загрузка/считывание информации в/из соответствующих каналов.

Для работы со звуком нам нужен канал 2 и РУС. Каналы 0 и 1 перезагружать и перенастраивать категорически запрещено, так как система может выйти из строя (во всяком случае, до перезапуска).

Работа канала 2 заключается в том, что он делит опорную частоту (fоп = 1,19... МГц) на коэффициент пересчета Кпр, который заранее загружается в канал. Получаемая fвых = fоп/Кпр подается на динамик. Надо учитывать, что работой канала 2 и подачей fвых на динамик управляют два младших бита порта 61h. Если бит 0 порта 61h равен единице, то работа канала 2 (счет) разрешается. Если бит 1 порта 61h равен единице, то разрешается подача fвых на динамик. Таким образом, звук будет воспроизводиться, только если оба этих бита установлены в единицу.

Коэффициент пересчета для любой ноты можно определить исходя из выражения:

Кпр = fоп/fноты.

При этом учитываются следующие соотношения:

- частота ноты "до" 1-й октавы (fдо)    = 32,625 Гц;

- частота ноты "до" 2-й октавы      =  2*fдо;

частота ноты "до" 3-й октавы  =  4*fдо  и так далее;

- частота "до-диез"     =  а*fдо;

- частота "ре"  =  а*fдо-диез и так далее,

где а  = 1,06 (приблизительно).

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

- коэффициент пересчета и время звучания для каждой ноты;

- длительности всех пауз между нотами.

После того как все эти числа известны, надо последовательно выполнять следующие действия:

1. Запретить звучание, для чего установить в ноль оба младших бита порта 61h (не меняя при этом остальные биты этого порта).

2. Настроить канал 2, выполнив две команды:

; настраиваем канал 2 на передачу двух байт Кпр., на ;режим 3 и на двоичный счет

mov al, 0b6h

out 43h, al.

3. За две передачи в канал 2 загрузить Кпр для текущей ноты, например:

; загружаем в канал 2 Кпр  =  300

mov ax, 300

out 42h, al

mov al, ah

out 42h, al.

4. Разрешить звучание, установив в единицу оба младших бита порта 61h.

5.  Ввести задержку, равную длительности ноты.

6. Запретить звучание.

7. Выдержать паузу требуемой длительности и перейти к пункту 3.

Подобная программа пишется примерно следующим образом. Создается массив нот (коэффициентов пересчета), который заканчивается «не нотой», например нулем. Эта «не нота» задает конец массива (мелодии). Если надо, то создаются массивы длительностей нот и пауз между нотами. Программа считывает из массива нот очередной элемент, проигрывает его, считывает очередной элемент и так до тех пор, пока будет считана «не нота». После этого программа заканчивает свою работу. Не забудьте при выходе из программы запретить звучание, иначе компьютер будет продолжать играть последнюю ноту. Достоинство такой программы состоит в том, что для изменения мелодии достаточно изменить числа в массивах.

Примечание. Для создания звуковых эффектов при проигрывании какой-либо ноты можно с определенной частотой сбрасывать/устанавливать бит 1 в порту 61h.

В лабораторной работе «Работа со звуком» нужно, в соответствии с музыкальными способностями и вкусом, реализовать на ПЭВМ любую известную мелодию, начиная от гаммы «до-мажор» до «Полонеза» Огинского. Единственным требованием является несовпадение вашей мелодии с мелодиями других бригад из вашего потока.



*****
© Банк лекций Siblec.ru
Формальные, технические, естественные, общественные, гуманитарные, и другие науки.