Таймер и музыка через порты спикера для ОС Unix/Linux/FreeBSD .. на C++,CPP,Си
Добавил: | DMT |
Дата создания: | 5 апреля 2008, 22:55 |
Дата обновления: | 5 апреля 2008, 22:57 |
Просмотров: | 8834 последний 26 сентября, 5:24 |
Комментариев: | 0 |
Таймер и музыка Когда-то давно, учась в университете нам дали задание - заставить спикер пищать под Unix. Не большое количество человек справились с этим заданием. Вообще работа с портами, что под Windows, что под Unix - практически одинакава, но в Unixовых есть такая заморочка - необходимо открыть доступ к используемым портам, в Windows порты спикера открыты, в здесь нет, да и открыть лоступ можно только под правами админа. Я, DMT накатал исходник и делюсь им с Вами, вдруг кому пригодится. Да и всем делюсь!!! Смотрите все исходники!!! :)) Надо было же, я искал - что же мне на спикере то проиграть!?? Не мог же я - при своих навыках ))) смеюсь - придти к преподавателю и запустить какой-нибудь сташный звук, типа: бип бип брр хрр. Не я хотел большего!!! :) Расковырял несколько досовских(DOS) игр - поиграв в них сперва - оценив звуки, потом проанализировал код одной - понравившейся, нашел данные за кодом в непонятном формате. Разобрал логику и накатал прогу на pascale для выгрузки этой мелодии!! )) глупо )) но мелодию писать самому мне не хотелось ). Вот и получился прошлый гимн нашей РОДИНЫ. Я патриот - поэтому считаю его совершенством. Далее Общее вступления для того, чтобы Вы нашли исходник и сам исходник. Одно из наиболее распространенных применений таймера - генерация звуковых сигналов и воспроизведение музыки. Таймер позволяет воспроизводить музыку в фоновом режиме, т. е. во время работы программы может звучать музыка (в самом простом виде ее воспроизведения). Как мы уже говорили, канал 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 Текст программы
|