♫ BeeSynth Project

Тема в разделе "WASM.PROJECTS", создана пользователем HoShiMin, 9 июл 2023.

  1. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.427
    Адрес:
    Россия, Нижний Новгород
    ♫ 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).
    Сборка:
    Код (Text):
    1. cargo build --release
    Запуск (требует права администратора для установки драйвера):
    Код (Text):
    1. beesynth.exe music.mp3
    Список всех аргументов командной строки можно найти в инструкции к BeeWave или во встроенном хелпе:
    Код (Text):
    1. beesynth.exe --help
    Пример с применением различных фильтров:
    Код (Text):
    1. beesynth.exe --iopl --high-pass=300 --low-pass=4000 music.mp3
    2. beesynth.exe --extract-freq=min=300,max=4000,channels=2 --note-matcher music.mp3
    Пишем музыку сами:
    BeeSynth поддерживает специальный формат для описания нот:
    Код (Text):
    1. #!/bin/beesynth  ; Необходимый shebang на первой строчке
    2.  
    3. ; Необходимые атрибуты:
    4. @bpm: 120  ; Количество четвертных нот в минуту
    5. @channels: ch1 ch2  ; Каналы, которые будут воспроизводиться
    6.  
    7. ; Описание каналов:
    8. @ch1: Q:E3 ~E:A4b !Q:A3# Q:0 ...
    9. ...  ; Всё ещё ch1
    10.  
    11. @ch2: W:A2 ~E:A4b !Q:A3# Q:0 ...
    12. ... ; Всё ещё ch2
    13.  
    14. @ch1: ... ; Продолжаем ch1
    15.  
    16. ...
    Каналы воспроизводятся параллельно (в примере выше 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# - четвертная нота "До-диез" четвёртой октавы, залигованная со следующей нотой.

    Воспроизведение нотных листингов не отличается от воспроизведения звуковых файлов:
    Код (Text):
    1. beesynth.exe notes.txt
    Поддерживаются два флага:
    --iopl - использовать IOPL-бэкенд.
    --switch-interval=N - переключать каналы каждые N наносекунд, имитируя полифонию (например, --switch-interval=25000000 - переключать каждые 25 миллисекунд).

    Пример:
    Код (Text):
    1. beesynth.exe --iopl --switch-interval=10000000 notes.txt
     
    Последнее редактирование: 9 июл 2023
    Thetrik, UbIvItS, Alikberov и 2 другим нравится это.
  2. HESH

    HESH Active Member

    Публикаций:
    2
    Регистрация:
    20 мар 2008
    Сообщения:
    143
    Насколько я понял, из трекерной музыки воспроизводится только .XM? Любопытно было бы узнать детали реализации этой задумки, т.к. сам давно хотел сделать статик библиотеку для 4 наиболее популярных форматов трекерной музыки (.xm, .mod, .it, .s3m, по типу mfmplayer'а), однако знаний и сорцев на эту тему пока что не хватает.
     
  3. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.427
    Адрес:
    Россия, Нижний Новгород
    Не совсем. Воспроизводится всё, что сможет сконвертить ffmpeg.
    Изначально была задумка разобрать XM, вытащить оттуда ноты и их воспроизводить: например, 4 канала в XM, в каждом лежат какие-то ноты. Мы задаём частоту PIT-таймера равной частоте ноты и быстро-быстро переключаем каналы, чтобы получилась полифония.
    Но оказалось, что это не работает: т.к. мы не можем управлять громкостью, каналы звучат одинаково, заглушая друг друга. Так как у нас все каналы в виде прямоугольного сигнала, каналы ударных звучат как полноценные инструменты. В общем, получается плохо.
    Чтобы было хорошо, надо не просто вытаскивать ноты, а собирать сигнал из сэмплов, которые зашиты в XM. Но в этом случае мы упираемся в необходимость их как-то склеить в один канал, и получится тот же подход, которым мы играем mp3 и wav.
    Поэтому парсер XM сейчас в коде хоть и есть, но нигде не используется, а вместо этого любая трекерная музыка сначала ffmpeg'ом перегоняется в wav и дальше воспроизводится.
     
    HESH и Mikl___ нравится это.
  4. HESH

    HESH Active Member

    Публикаций:
    2
    Регистрация:
    20 мар 2008
    Сообщения:
    143
    Понял. Я тоже реализацию видел 2я способами: через парсинг форматов и воспроизведение, либо через использование аудиокодеков. По всей видимости, о подходе №1 лучше забыть, дабы не изобретать велосипед с квадратными колёсами. Тогда буду смотреть в сторону имеющихся аудиокодеков и пытаться их заюзать. Благодарю.
     
  5. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
  6. HESH

    HESH Active Member

    Публикаций:
    2
    Регистрация:
    20 мар 2008
    Сообщения:
    143
    Я в курсе про эту поделку. Она более свежая, чем mfmplayer, однако как и он воспроизводит только .xm формат. Мне бы хотелось сделать нечто более универсальное (для начала: .xm, .mod, .it, .s3m). Как и mfmplayer, ufmod основывается на WINMM. Принципиальной разницы для себя между ними не вижу.