HoShiMin

HoShiMin

Пикабушник
132 рейтинг 1 подписчик 1 подписка 2 поста 0 в горячем
Награды:
5 лет на Пикабу
10

BeeSynth - плеер для PC-спикера

BeeSynth - плеер для PC-спикера

Хочу представить вам плеер и синтезатор для системного спикера, написанный на Rust.

Поддерживает воспроизведение MP3, WAV, FLAC, трекерной музыки - и вообще всего, что может быть сконвертировано библиотекой ffmpeg в WAV-PCM. Для улучшения качества звука поддерживает обработку звука с помощью фильтров: например, фильтры высоких и низких частот, а также извлечение из сигнала самых значимых гармоник с помощью преобразования Фурье.

Также поддерживается многоканальное воспроизведение собственной музыки, написанной в текстовом виде в специальном формате.

Ссылка на GitHub: https://github.com/HoShiMin/BeeSynth


Как это работает: доступ к спикеру осуществляется с помощью так называемых портов ввода-вывода - специального интерфейса в процессоре, выделенного для работы с чипсетом и периферийными устройствами. Этот интерфейс сводится к двум машинным инструкциям: in и out, которые обычно доступны только в режиме ядра (Ring0) - в привилегированном режиме, к которому у пользовательских программ доступа нет. А значит, нам нужен драйвер, который или откроет для нашей программы доступ к портам в пользовательский режим (юзермод, он же Ring3), или будет служить «мостиком» между Ring3 и Ring0, позволяя юзермоду отправлять запросы в ядро и работать с портами оттуда.

В проекте поддерживаются оба способа при использовании драйвера InpOut:
1. Отправляем ему запросы на работу с портами.
2. С его помощью патчим уровень привилегий, с которым наш поток может работать с портами, с Ring0 на Ring3 - таким образом, поток получает возможность работать с портами из юзермода напрямую - без необходимости запрашивать драйвер.

Научились работать со спикером: теперь необходимо понять, что играть. Самый удобный формат для воспроизведения - WAV, т.к. представляет собой массив сэмплов фиксированной длительности. Каждый сэмпл - амплитуда сигнала в момент времени, соответствующий номеру сэмпла в массиве. Поэтому все музыкальные форматы мы предварительно конвертируем в WAV с помощью библиотеки ffmpeg.

Спикер имеет только два состояния: напряжение приложено (мембрана поднята вверх) и напряжение снято (мембрана опущена). Таким образом, мы можем воспроизводить звук с глубиной дискретизации всего в 1 бит, в отличие от типовых WAV-файлов с глубиной дискретизации в 16 бит, поэтому нужен такой алгоритм ресэмплинга, который позволит добиться приемлемого качества звука. И здесь возможны варианты: можно использовать широтно-импульсную модуляцию (PWM), чтобы научить мембрану занимать промежуточные положения между 0 и 1, настолько быстро подавая и снимая напряжение, чтобы мембрана не успевала доходить до граничных положений, но сделать это очень сложно из-за различий в физических свойствах разных спикеров в разных компьютерах. Поэтому в проекте реализован другой подход: положение переключается на каждый амплитудный пик или на каждую амплитудную впадину в сигнале, что даёт уверенное качество звука и хорошую громкость.

Остался последний штрих: можно улучшить качество звука, отрезав самые низы, которые спикер не воспроизведёт, и верхи, которые приводят к шуму. Сделать это можно, используя фильтры низких и высоких частот.

В итоге мы можем воспроизводить любой звук в относительно хорошем качестве. Технические детали и более подробное описание можно найти в README на страничке проекта на гитхабе.

Показать полностью
14

Играем на компьютерной пищалке

Приветствую, Пикабу! В своём первом посте хочу поделиться каверами на саундтреки из визуальной новеллы Бесконечное Лето для системной пищалки.

Несмотря на тематику сообществ программистов и БЛ, думаю, послушать интересно будет всем.

Расскажу немного о процессе создания (без технических подробностей - всё-таки, статья не о том, а исходные коды вы всегда сможете посмотреть по ссылке внизу).

Написал их далёким летом 2015го под впечатлением от визуальной новеллы Бесконечное Лето.

В качестве языка и среды разработки выбрал Delphi - на тот момент мой основной инструмент.

Управление пищалкой осуществляется через порты ввода-вывода, доступ к которым для простых приложений закрыт - нужен драйвер. Выбор пал на подписанный и свободный WinRing0 с готовым функционалом для чтения\записи портов ввод-вывода. Итог - простенький синтезатор-клавиатура:

Извлечение звука - процесс нехитрый: направить вывод тактового генератора на пищалку, задать генератору делитель базовой частоты и включить звук - за это отвечают три порта с номерами 0x61, 0x42 и 0x43. Но как передать нотный текст, не тратя часы на подгонку таймингов и частот? Было решено написать синтезатор, переводящий понятные человеку текстовые нотные обозначения в частоты и паузы.


В итоге получился синтезатор, позволяющий играть стаккато, легато и нон-легато, играть триоли и квинтоли, а также эмулировать форшлаги и морденты - в простой и удобной текстовой записи в формате "AA:BB", где AA - модификатор (длительность и стиль), BB - нота.

Пример: "!E:D3 E:0 E3:C1 E3:D1 E3:C1" - стаккато Ми третьей октавы, восьмая пауза и триоль из восьмых До-Ми-До первой октавы.


Одноголосный синтезатор - хорошо, но можно ли на монофонической пищалке играть аккорды? Можно. Для этого сделаем интересный трюк: если очень-очень быстро переключать ноты - для слушателя это будет очень похоже на аккорд, и чем выше частота переключения - тем "однороднее" звук. На этом этапе столкнулся с необходимостью жёстко выдерживать тайминги, засекать время и выдерживать паузы с точностью до наносекунд. Так как системный Sleep начинает плыть уже на единицах миллисекунд (спасибо планировщику), пришлось писать свою реализацию задержек на ассемблере. Собрав всё вместе, получил многоканальный синтезатор, где в каждом канале идёт своя линейка нот, и синтезатор очень быстро переключается между ними.


Синтезатор готов. Осталось "всего ничего" - перевести саундтрек в ноты. Часть треков удалось найти нотами для Guitar Pro (часть из них пришлось переписать), часть подбирал на слух, и вот результат:

То, что получилось, предлагаю оценить и вам.


Оригинальные треки:

Between August and December - Blow With The Fires

Between August and December - Lightness

Between August and December - Sayonara Cruel World

Sergey Eybog - A Promise From Distant Days

Sergey Eybog - Everlasting Summer

Sergey Eybog - Forest Maiden

Sergey Eybog - I Don't Blame You

Sergey Eybog - Let's Be Friends (Lena Theme)

Sergey Eybog - Memories

Sergey Eybog - Mystery Girl

Sergey Eybog - Trapped In Dreams


Ссылки:

Готовые бинарники ([1ch] - одноканальные версии, [2ch] - двухканальные): https://www.dropbox.com/s/1y8zx7ug7jv7u2v/%5BBeeSynth%5D%20E...

Исходники: https://www.dropbox.com/s/dlr3862gfdmcd2o/%5BBeeSynth%5D%20S...

Синтезатор-клавиатура и его исходники: https://www.dropbox.com/s/2bje6sd49ennzif/Beeper%20Synthesiz...

Исходники WinRing0: https://www.dropbox.com/s/t9z7u6ovm3v9yj7/WinRing0.zip?dl=0


Если кого-то заинтересует техническая сторона - рад буду обсудить в комментариях или в вк: https://vk.com/id23507301


И, если пост и тема понравятся, в следующий раз напишу про воспроизведение на пищалке настоящей музыки - WAV-файлов.

P.S.: Первая картинка взята из этого поста: https://pikabu.ru/story/on_sovsem_pro_menya_zabyil_odni_kora...

Показать полностью 3
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества