HoShiMin

HoShiMin

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

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

BeeSynth - плеер для PC-спикера Rust, Программирование, Музыка, Плеер, Синтезатор, Спикер, Пищалка, Драйвер, Kernel

Хочу представить вам плеер и синтезатор для системного спикера, написанный на 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://zalipaka.icu/story/on_sovsem_pro_menya_zabyil_odni_kora...

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