♫ BeeSynth Project Powered by science BeeSynth - всеядный плеер и многоканальный синтезатор для системного спикера, написанный на Rust. GitHub: https://github.com/HoShiMin/BeeSynth Возможности: Воспроизведение mp3, wav, flac, трекерной музыки и других форматов, которые можно сконвертировать в wav. Многоканальный синтезатор, позволяющий писать и воспроизводить музыку в специальной музыкальной нотации. Цифровая обработка звука: фильтры низких и высоких частот, извлечение гармоник из спектра, подбор ближайших нот. Сверхнизкие задержки при работе со спикером благодаря повышению EFLAGS.IOPL до Ring3 и работе с портами из юзермода. Использует FFmpeg для конвертации музыки в подходящий для воспроизведения WAV PCM. Проект логически разделён на два компонента: BeeWave - плеер для воспроизведения музыки. BeeSynth - многоканальный синтезатор, использующий собственную музыкальную нотацию для описания нот. Для воспроизведения использует BeeWave в качестве бэкенда. Поддерживает два режима воспроизведения: Ресэмплинг исходного сигнала в сигнал с глубиной дискретизации 1 бит (диффузор поднят и диффузор опущен) и ручное управление мембраной. Извлечение наиболее значимых гармоник (частот) в каждый момент времени и воспроизведение их с использованием таймера PIT, что снимает с нас необходимость вручную формировать сигнал. Для общения с пищалкой используются два бэкенда: IOCTL-based - для каждого изменения состояния спикера драйверу посылается DeviceIoControl. Этот способ не требует времени на инициализацию, но обеспечивает намного более высокие задержки при работе с пищалкой. IOPL-based - находит и патчит EFLAGS.IOPL у рабочего потока, чтобы тот имел возможность исполнять привилегированные инструкции in/out в юзермоде, таким образом избавившись от необходимости постоянно отправлять DeviceIoControl, что обеспечивает минимально возможные задержки. Требует время на инициализацию, в зависимости от количества RAM (~6 секунд на i9-9900k с 16 Гб RAM). Сборка: Code (Text): cargo build --release Запуск (требует права администратора для установки драйвера): Code (Text): beesynth.exe music.mp3 Список всех аргументов командной строки можно найти в инструкции к BeeWave или во встроенном хелпе: Code (Text): beesynth.exe --help Пример с применением различных фильтров: Code (Text): beesynth.exe --iopl --high-pass=300 --low-pass=4000 music.mp3 beesynth.exe --extract-freq=min=300,max=4000,channels=2 --note-matcher music.mp3 Пишем музыку сами: BeeSynth поддерживает специальный формат для описания нот: Code (Text): #!/bin/beesynth ; Необходимый shebang на первой строчке ; Необходимые атрибуты: @bpm: 120 ; Количество четвертных нот в минуту @channels: ch1 ch2 ; Каналы, которые будут воспроизводиться ; Описание каналов: @ch1: Q:E3 ~E:A4b !Q:A3# Q:0 ... ... ; Всё ещё ch1 @ch2: W:A2 ~E:A4b !Q:A3# Q:0 ... ... ; Всё ещё ch2 @ch1: ... ; Продолжаем ch1 ... Каналы воспроизводятся параллельно (в примере выше ch1 и ch2 начинают одновременно). Формат нот: [Стиль]Длительность:Нота[Модификатор]. Стили: Отсутствие стиля - нон-легато ~ - легато. ! - стаккато. . - увеличение длительности в 1.5 раза. Длительности: W (Whole) - целая нота. H (Half) - половинная. Q (Quarter) - четверть. E (Eighth) - восьмая. S (Sixtinth) - шестнадцатая. T (Thirty-second) - тридцать-вторая. X (Sixty-fourth) - шестьдесят-четвёртая. Ноты: Cn, Dn, En, Fn, Gn, An, Bn - ноты n-й октавы (например, A4). 0 - пауза (нет звука). Модификаторы: #, s или ♯ - диез. b или ♭ - бемоль. Пример: ~Q:C4# - четвертная нота "До-диез" четвёртой октавы, залигованная со следующей нотой. Воспроизведение нотных листингов не отличается от воспроизведения звуковых файлов: Code (Text): beesynth.exe notes.txt Поддерживаются два флага: --iopl - использовать IOPL-бэкенд. --switch-interval=N - переключать каналы каждые N наносекунд, имитируя полифонию (например, --switch-interval=25000000 - переключать каждые 25 миллисекунд). Пример: Code (Text): beesynth.exe --iopl --switch-interval=10000000 notes.txt
Насколько я понял, из трекерной музыки воспроизводится только .XM? Любопытно было бы узнать детали реализации этой задумки, т.к. сам давно хотел сделать статик библиотеку для 4 наиболее популярных форматов трекерной музыки (.xm, .mod, .it, .s3m, по типу mfmplayer'а), однако знаний и сорцев на эту тему пока что не хватает.
Не совсем. Воспроизводится всё, что сможет сконвертить ffmpeg. Изначально была задумка разобрать XM, вытащить оттуда ноты и их воспроизводить: например, 4 канала в XM, в каждом лежат какие-то ноты. Мы задаём частоту PIT-таймера равной частоте ноты и быстро-быстро переключаем каналы, чтобы получилась полифония. Но оказалось, что это не работает: т.к. мы не можем управлять громкостью, каналы звучат одинаково, заглушая друг друга. Так как у нас все каналы в виде прямоугольного сигнала, каналы ударных звучат как полноценные инструменты. В общем, получается плохо. Чтобы было хорошо, надо не просто вытаскивать ноты, а собирать сигнал из сэмплов, которые зашиты в XM. Но в этом случае мы упираемся в необходимость их как-то склеить в один канал, и получится тот же подход, которым мы играем mp3 и wav. Поэтому парсер XM сейчас в коде хоть и есть, но нигде не используется, а вместо этого любая трекерная музыка сначала ffmpeg'ом перегоняется в wav и дальше воспроизводится.
Понял. Я тоже реализацию видел 2я способами: через парсинг форматов и воспроизведение, либо через использование аудиокодеков. По всей видимости, о подходе №1 лучше забыть, дабы не изобретать велосипед с квадратными колёсами. Тогда буду смотреть в сторону имеющихся аудиокодеков и пытаться их заюзать. Благодарю.
HESH, есть вот это https://sourceforge.net/projects/uf... Win32/1.25.2/ufmod-1.25.2a-win32.7z/download
Я в курсе про эту поделку. Она более свежая, чем mfmplayer, однако как и он воспроизводит только .xm формат. Мне бы хотелось сделать нечто более универсальное (для начала: .xm, .mod, .it, .s3m). Как и mfmplayer, ufmod основывается на WINMM. Принципиальной разницы для себя между ними не вижу.