Таймер и музыка через порты спикера(asm)
Добавил: | DMT |
Дата создания: | 24 января 2008, 1:32 |
Дата обновления: | 24 января 2008, 1:32 |
Просмотров: | 17702 последний сегодня, 22:20 |
Комментариев: | 0 |
Таймер и музыка Одно из наиболее распространенных применений таймера - ге-нерация звуковых сигналов и воспроизведение музыки. Таймер позволяет воспроизводить музыку в фоновом режиме, т. е. во время работы программы может звучать музыка (в самом простом виде ее воспроизведения). Как мы уже говорили, канал 2 микросхемы 8254 связан с гро-мкоговорителем компьютера. Однако громкоговоритель не просто соединен с выходом OUT канала 2. Порт вывода 6Ih также ис-пользуется для управления громкоговорителем. Младший бит по-рта 61h подключен ко входу GATE канала 2 таймера. Этот бит при установке в 1 разрешает работу канала, т. е. генерацию им-пульсов для громкоговорителя. Дополнительно для управления громкоговорителем используется бит 1 порта 61h. Если этот бит установлен в 1, импульсы от канала 2 таймера смогут проходить на громкоговоритель. Таким образом, для включения звука надо выполнить следую-щие действия: запрограммировать канал 2 таймера на нужную частоту (т. е. загрузить регистр счетчика канала нужным значе-нием) ; для включения звука установить в 1 два младших бита порта 61h. Так как остальные б битов порта 61h используются для других целей, установка младших битов должна выполняться таким об-разом, чтобы значения остальных битов не были изменены. Для этого вначале надо считать байт из порта 61h в рабочую ячейку памяти, установить там нужные биты, затем вывести новое зна-чение байта в порт 61h. Очевидно, что для выключения звука надо сбросить два млад-ших бита порта 61h в 0 (при этом нельзя изменять значение ос-тальных битов этого порта). Мелодия (одноголосая), как известно, состоит из нот, разде-ленных или не разделенных паузами. При проигрывании мелодии необходимо для каждой ноты программировать соответствующим образом канал 2 таймера и включать громкоговоритель (с помо-щью порта 61h) на определенное время, равное длительности ноты. Затем программа должна выключить динамик и выдержать паузу, если требуется, перед проигрыванием следующей ноты. Программа может генерировать звуки и другим способом, не используя таймер. Для этого нужно сбросить младший бит порта 61h и, управляя битом 1 этого порта, формировать импульсы для громкоговорителя, т. е. программа должна устанавливать этот бит то в 0, то в 1 с некоторым периодом. Высота генерируемого звука будет соответствовать этому периоду. Можно также комбинировать эти два способа, получая разно-образные звуковые эффекты. Для проигрывания мелодии в фоновом режиме можно предло-жить следующий способ, основанный на использовании периоди-ческого прерывания от канала 0 таймера. Основная идея заключается в использовании прерывания 1Ch, которое вырабатывается таймером с частотой примерно 18,2 Гц. Ваш обработчик этого прерывания осуществляет контроль за вы-боркой нот из массива, содержащего мелодию, и программирова-ние микросхемы 8254. Например, один раз в полсекунды обработ-чик проверяет, не пора ли прекратить звучание одной ноты и на-чать проигрывание следующей ноты. Если пора, он выключает громкоговоритель и перепрограммирует канал 8254 на новую час-тоту, соответствующую следующей ноте. Основное преимущество использования таймера для проигры-вания мелодии - независимость констант, используемых для программирования канала таймера от производительности системы. Ва-ша мелодия будет звучать одинаково и на медленной IBM XT, и на Super - AT с процессором 80486, но при условии, что Вы будете использовать таймер и для организации задержек при исполнении мелодии. Для определения значения, которое должно быть записано в регистр счетчика канала 2 таймера, надо разделить 1193180 на требуемую частоту в герцах. В таблице ниже приведены частоты нот для второй октавы. При повышении (понижении) тона на октаву частота соответствующей ноты умножается (делится) на два. Нота Частота, Гц До 261,7 До-диез 277,2 Ре 293,7 Ре-диез 311,1 Ми 329,6 Фа 349,2 Фа-диез 370,0 Соль 392,0 Соль-диез 415,3 Ля 440,0 Ля-диез 466,2 Си 493,9 Текст программы
|