Консольный секвенсор и WAV-рендерер на C++20. Описываете музыку в текстовом DSL и получаете .wav файл.
./wavscript score.txt output.wav
wavscript - это маленький аудио-движок, который превращает текстовую партитуру в звук. Вы описываете инструменты, паттерны и ноты в простом DSL, программа синтезирует сигнал и записывает его в стандартный WAV-файл (моно, 44.1 kHz, 16 бит).
Проект реализует полный пайплайн: токенизация 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.