Комментарии 19
Очень не хватает записи звучания мелодии.
Как выбиралась звучащая нота?
В таких случаях обычно играют самую верхнюю ноту.
Как уже написал infund, в таких случаях и правда выбирают самую верхнюю ноту.
По решению, конечно, есть некоторые вопросы. Конечно, сказать что системный динамик это просто одноголосая пищалка, без возможности регулировки громкости — это самый простой вариант. В реальной жизни все сложнее. Чем более басовая нота извлекается из инструмента, тем она громче звучит при одинаковой силе и скорости нажатия на клавишу или дергании струны. Вопрос как этого добиться на системной пищалке — он очень интересный. Многие демомейкеры в свое время игрались с выводом звука на спикер. И результаты были очень даже впечатляющими. Один из вариантов описан ниже — ШИМ. Что позволяло использовать его как ЦАП, хранить таблицу нот (или генерировать ее при старте) с учетом физиологического ощущения из звучания, и для воспроизведения нескольких нот одновременно вычислять значение на входе ЦАП путем сумирования данных из таблиц.
У Вас реализован метод наименьшего сопротивления. Это не плохо. Это экономит размер кода и данных, тем не менее позволяя решить поставленную задачу. Но только об этом лучше явно писать. Да и упрощенную партитуру неплохо бы привести. А то нотами записано одно, а играется другое.
И да, не смотря на архаичность, подобные решения вполне себе востребованы. Подобного класса «пищалки» сейчас ставят ко многим микроконтроллерам (выход ШИМ, через RC-цепочку). Дешево и сердито. А тут возможность вместо надоедливого и выбешивающего БИП БИИИИП сделать хоть что-то приятное уху. Правда, там чаще всего ставяться не магнито-электрические динамики, а пьезоэлектрические звукоизлучатели. А у них очень не ровная АЧХ. Но, в принципе, даже с этим можно бороться номировав данные в таблицах под конкретную пищалку.
Но это так… На случай, если захотите развивать проект дальше.
Позволял даже проигрывать .WAV через встроенный спикер.
см. www.codenet.ru/progr/audio/wavspeak.php
Как известно, с помощью хитрой модуляции спикером можно играть живой звук хреновенького качества. Это использовалось в некоторых играх, и даже есть плеер под dos (называется вроде dss), который может играть спикером mp3. Правда, у меня на Pentium 2 не завелось, а на ноуте с Pentium 1 работало, но адски тормозило.
Драйвер для этого вроде был в WinNT до 2000й (только wave-файлы), и в старых линуксах это было. Но в целом с начала 2000х, когда пошли массовые дешёвые звуковухи, в т.ч. встроенные, все эти приколы со спикером, ковоксом и пр. подзабросили. А жаль.
Я всё мечтаю, что кто-то напишет драйвер под современные винды, превращающий спикер в полноценное системное устройство воспроизведения, да чтоб с настройками для тюнинга (ведь пьезо-пищалка и полноценный динамик на пол-ватта будут звучать по-разному).
Вроде такая простая идея. И хриплый ретро-звук многие оценили бы. Но вот никто не сделал.
Кстати, есть рабочий плеер, хорошо играющий midi через спикер. Правда, требует танцев с бубном. Называется BaWaMi или BaMaWi.
Я всё мечтаю, что кто-то напишет драйвер под современные винды, превращающий спикер в полноценное системное устройство воспроизведенияНе нужно ждать, когда кто-то другой займётся таким творчеством. Творите сами =)
я подробно не смотремл это вопрос, но там даже в мсдне сказано потря производительности…
там както связанно с адресами… я ещё внимательно почитаю… но там не всё так просто…
так что там драйвером не обойдешься, там что-то на нём завязанно… на этом прерывании…
Алгоритм следующий — определяем максимальное число нот, играющее одновременно.
Мелодия кодируется в виде нативных нот, которые задаются в виде спецсимволов.
За один такт можно передать сигнал на системный динамик (вкл/выкл), следовательно мы разбиваем звучание на блоки тактов, в которые эмулируем звук нот.
Эмуляция заключается в том, что если нота не играет, то сигналы на динамик не поступают. Условно говоря — мы имеем набор колебаний динамика в памяти и указатель, который с каждым тактом считывает блок и передает колебания.
Таким образом, у нас выходит полифония.
Играем музыку из Mario на системном динамике