Skip to content

Xx5830/wavscript

Repository files navigation

wavscript

Консольный секвенсор и WAV-рендерер на C++20. Описываете музыку в текстовом DSL и получаете .wav файл.

./wavscript score.txt output.wav

Что это

wavscript - это маленький аудио-движок, который превращает текстовую партитуру в звук. Вы описываете инструменты, паттерны и ноты в простом DSL, программа синтезирует сигнал и записывает его в стандартный WAV-файл (моно, 44.1 kHz, 16 бит).

Проект реализует полный пайплайн: токенизация DSL -> построение модели трека -> синтез сигнала -> микширование -> запись.

DSL

bpm 140

instrument lead square
    duty=30
    attack=0.01
    release=0.08
    effect tremolo freq=6 depth=0.3
end

pattern main resolution 8
    00 lead C5  2 80
    02 lead E5  2 80
    04 lead G5  4 80
end

Комментарии начинаются с #. Пробелы и переносы строк не влияют на результат.

Инструменты

Тип Описание
square Прямоугольный осциллятор с настраиваемым duty cycle
sine Синусоидальный осциллятор
triangle Треугольный осциллятор
sampler Воспроизводит WAV-файл с ресэмплингом и опциональным луп-регионом

Все инструменты поддерживают полифонию и огибающую attack/release.

Для снижения алиасинга осцилляторы используют PolyBLEP.

Эффекты

Тип Описание
gain Умножение сигнала на коэффициент
echo Эхо: y(t) = x(t) + decay * x(t - delay)
tremolo Модуляция амплитуды по синусоидальному закону

Несколько эффектов на один инструмент применяются последовательно.

Паттерны и время

Паттерны b именованные блоки нот, аналог функций. Паттерн main - это точка входа.

pattern fill resolution 8
    00 drum C2 1 100
    04 drum C2 1 80
end

pattern main resolution 4
    00 @fill        # вставить fill с начала
    04 @fill        # и ещё раз через такт
end

Время измеряется в юнитах: 1 unit = 1 beat / resolution, 1 beat = 60s / bpm.

Нота: <старт> <инструмент> <нота> <длительность> <громкость 0–100>

Примеры

Готовые партитуры в папке examples/:

Файл Что внутри
lick.txt Классический джазовый лик (саксофон)
sweden.txt Мелодия Sweden из Minecraft
badapple.txt Bad Apple!! (тема из Touhou)
ghoul.txt Unravel из Tokyo Ghoul
once.txt For Once in My Life (Stevie Wonder)

Стек

  • C++20 - std::unique_ptr, structured bindings, inline переменные
  • CMake + Ninja - сборка через пресеты (debug / release)
  • just - удобные команды (just build, just fmt, just example)
  • clang-format / clang-tidy - единый стиль и статический анализ

Сборка

just build          # release по умолчанию
just build debug    # debug с санитайзерами

just example        # собрать и запустить на examples/lick.txt

Требования: CMake ≥ 3.24, компилятор с поддержкой C++20, Ninja, just.

About

Консольный секвенсор и WAV-рендерер на C++20

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Contributors