Как стать автором
Обновить

Комментарии 19

Очень не хватает записи звучания мелодии.

Я чего-то не понимаю? По нотной записи много где звучит 3 ноты одновременно. А по коду одна. А где объяснение того почему и как так получилось? Как выбиралась звучащая нота? Почему остальные можно отбросить? Можно ли было обойти одноголосность?
Как выбиралась звучащая нота?

В таких случаях обычно играют самую верхнюю ноту.
Я описал почему так, но, возможно, не очень понятно. Так как системный динамик может проигрывать только одну ноту за раз, я не могу сыграть две+ ноты одновременно. Для этого, в теории, можно использовать два синхронизированных досбокса. Так же можно попробовать высчитать среднюю частоту между двумя нотами.
Как уже написал infund, в таких случаях и правда выбирают самую верхнюю ноту.
НЛО прилетело и опубликовало эту надпись здесь
Спасибо. Я видел в тексте замечание о том, что две ноты сразу нельзя. Но не увидел пояснения как и почему выбирается звучащая нота. Потому осталось некоторое ощущение недосказанности.

По решению, конечно, есть некоторые вопросы. Конечно, сказать что системный динамик это просто одноголосая пищалка, без возможности регулировки громкости — это самый простой вариант. В реальной жизни все сложнее. Чем более басовая нота извлекается из инструмента, тем она громче звучит при одинаковой силе и скорости нажатия на клавишу или дергании струны. Вопрос как этого добиться на системной пищалке — он очень интересный. Многие демомейкеры в свое время игрались с выводом звука на спикер. И результаты были очень даже впечатляющими. Один из вариантов описан ниже — ШИМ. Что позволяло использовать его как ЦАП, хранить таблицу нот (или генерировать ее при старте) с учетом физиологического ощущения из звучания, и для воспроизведения нескольких нот одновременно вычислять значение на входе ЦАП путем сумирования данных из таблиц.

У Вас реализован метод наименьшего сопротивления. Это не плохо. Это экономит размер кода и данных, тем не менее позволяя решить поставленную задачу. Но только об этом лучше явно писать. Да и упрощенную партитуру неплохо бы привести. А то нотами записано одно, а играется другое.

И да, не смотря на архаичность, подобные решения вполне себе востребованы. Подобного класса «пищалки» сейчас ставят ко многим микроконтроллерам (выход ШИМ, через RC-цепочку). Дешево и сердито. А тут возможность вместо надоедливого и выбешивающего БИП БИИИИП сделать хоть что-то приятное уху. Правда, там чаще всего ставяться не магнито-электрические динамики, а пьезоэлектрические звукоизлучатели. А у них очень не ровная АЧХ. Но, в принципе, даже с этим можно бороться номировав данные в таблицах под конкретную пищалку.

Но это так… На случай, если захотите развивать проект дальше.
Зачем нужно два синхронизированных досбокса? Можно обойтись и одним. Пресловутый Scream Tracker в далёкие 90е годы прекрасно справлялся и в простом DOS, играя немного побольше, чем две ноты одновременно. А досбоксов никаких в те времена ещё не было, даже Windows была только 3.1, «оболочка дешёвая» для того же DOS.
Scream tracker это совсем круто. Хотя бы как в Monotone.
А чего там в этом Monotone урезано по сравнению со Scream Tracker?
В играх управление динамиком было из прерывания по таймеру, который настраивался на срабатывание 8 тыс раз в секунду.
Да, был такой метод — программный ШИМ на динамике.
Позволял даже проигрывать .WAV через встроенный спикер.

см. www.codenet.ru/progr/audio/wavspeak.php

Как известно, с помощью хитрой модуляции спикером можно играть живой звук хреновенького качества. Это использовалось в некоторых играх, и даже есть плеер под dos (называется вроде dss), который может играть спикером mp3. Правда, у меня на Pentium 2 не завелось, а на ноуте с Pentium 1 работало, но адски тормозило.
Драйвер для этого вроде был в WinNT до 2000й (только wave-файлы), и в старых линуксах это было. Но в целом с начала 2000х, когда пошли массовые дешёвые звуковухи, в т.ч. встроенные, все эти приколы со спикером, ковоксом и пр. подзабросили. А жаль.
Я всё мечтаю, что кто-то напишет драйвер под современные винды, превращающий спикер в полноценное системное устройство воспроизведения, да чтоб с настройками для тюнинга (ведь пьезо-пищалка и полноценный динамик на пол-ватта будут звучать по-разному).
Вроде такая простая идея. И хриплый ретро-звук многие оценили бы. Но вот никто не сделал.


Кстати, есть рабочий плеер, хорошо играющий midi через спикер. Правда, требует танцев с бубном. Называется BaWaMi или BaMaWi.

Я всё мечтаю, что кто-то напишет драйвер под современные винды, превращающий спикер в полноценное системное устройство воспроизведения
Не нужно ждать, когда кто-то другой займётся таким творчеством. Творите сами =)
в виндовс х64 отсутствует возможность управлять спикером как факт. системные звуки при попытке вывода на спикер улетают в звуковую карту.
ссылки по теме:
раз
два

можно попробовать писать напрямую в порты, но мне кажется этого винда не даст сделать в целях безопасности… я сам не пробовал.
Речь же шла о написании драйвера. Драйверам можно всё.
я не уверен, но там бяда в том что х64 както использует этот таймер, вот честно,
я подробно не смотремл это вопрос, но там даже в мсдне сказано потря производительности…
там както связанно с адресами… я ещё внимательно почитаю… но там не всё так просто…
так что там драйвером не обойдешься, там что-то на нём завязанно… на этом прерывании…
Я делал полифонию на 8-и битном ПК и без таймера
Алгоритм следующий — определяем максимальное число нот, играющее одновременно.
Мелодия кодируется в виде нативных нот, которые задаются в виде спецсимволов.

За один такт можно передать сигнал на системный динамик (вкл/выкл), следовательно мы разбиваем звучание на блоки тактов, в которые эмулируем звук нот.
Эмуляция заключается в том, что если нота не играет, то сигналы на динамик не поступают. Условно говоря — мы имеем набор колебаний динамика в памяти и указатель, который с каждым тактом считывает блок и передает колебания.

Таким образом, у нас выходит полифония.
Вроде как раньше были программы, позволявшие проигрывать wav-файлы на динамике в системном блоке, а есть ли сейчас такие готовые решения?

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации