Aurora Piano
Полифонический синтезатор для Aurora OS (Sailfish OS).
C++ бэкенд (QAudioOutput pull-based) + QML интерфейс (Sailfish Silica).
Архитектура
24-голосный синтезатор с обработкой в реальном времени.
Аудио-движок: QIODevice → QAudioOutput, буфер 4096 байт (92 мс).
Генерация сэмпла:
Voice → Unison → Mix /24 → SVF Filter → Reverb → Distortion → Delay → Chorus → Flanger → Volume → Record
Управление
Main Page
| Секция | Элементы |
|---|---|
| Presets | 8 сцен (Pad, Bass, Lead, Organ, Pluck, Strings, Brass, FX Noise) |
| Waveform | Sin, Saw, Square, Triangle, SuperSaw (7 detuned saws), Noise, FM |
| ADSR | Attack (0–2s), Decay (0–2s), Sustain (0–100%), Release (0–3s) |
| Oscilloscope | Визуализация формы волны (Canvas, 256 точек, 33 мс обновление) |
| Filter | Cutoff (0–100%), Resonance (0–100%) — ZDF SVF, unconditionally stable |
| LFO | Rate (0–20 Hz), Depth (0–100%), Target (Pitch/Amp/Filter), Waveform (Sin/Triangle/Saw/Square) |
| Volume / Reverb | Громкость, реверберация (delay line 100 мс, feedback 0.5) |
| Octave | −3…+3, кнопки − / + |
| Sustain | Hold (педаль, включает release при выкл) |
| Scale | Key (12 тональностей) + Mode (Major/Minor/Pentatonic/Blues) — подсветка нот на клавиатуре |
| FX | Dist Drive (tanh waveshaping), Delay (0–500ms, feedback), Chorus (mod delay 9±4.5ms), Flanger (mod delay 0.2–4ms, feedback 0.5) |
| Tuning | A4 = 400–880 Hz |
| Unison | 3-голосный детюн (0–30 центов), утолщение звука |
| Portamento | Glide (слайд высоты между нотами) |
| Arpeggiator | ON/OFF, Rate (0.1–20 Hz), Pattern (Up/Down/Up-Down) |
| Record | Запись WAV (Documents/piano_recording.wav) |
| Keyboard | 2.5 октавы (белые: C3–B5, чёрные: 20 шт), pitch-bend вертикальным свайпом |
Staff Page (PullDown Menu → Staff View)
- Скрипичный + басовый ключи
- Отображение активных нот на нотном стане
- Ledger lines для нот вне стана
- Тап по стану → играет нота (draggable glissando)
C++ синтезатор
Параметры голоса (Voice)
| Поле | Описание |
|---|---|
midiNote |
raw MIDI (без октавного сдвига) |
phase |
фаза осциллятора (0–1) |
fmPhase |
фаза FM-модулятора |
frequency |
базовая частота |
currentFreq |
текущая частота (portamento) |
targetFreq |
целевая частота |
pitchBend |
изгиб (−1…+1) |
stage |
0=attack, 1=decay, 2=sustain, 3=release, 4=done |
level |
текущий уровень огибающей |
active |
занят ли голос |
Стадии ADSR
Attack: level += 1/(attack * 22050 + 1) → stage 1 при level≥0.99
Decay: level -= 1/(decay * 22050 + 1) → stage 2 при sustainLevel
Sustain: level = sustainLevel → stage 3 по noteOff
Release: level -= 1/(release * 22050 + 1) → stage 4 при level<0.001
Формы волн
| # | Название | Описание |
|---|---|---|
| 0 | Sin | sin(2π·p) |
| 1 | Saw | 2(p − floor(p+0.5)) |
| 2 | Square | p < 0.5 ? 1 : -1 |
| 3 | Triangle | 1 − 2p |
| 4 | SuperSaw | 7 detuned saws (±0, 4, 8, 12 центов) |
| 5 | Noise | rand() * 2 − 1 |
| 6 | FM | sin(2π(p + mod·0.5)), mod=sin(2π·fmPhase) |
Фильтр (ZDF State-Variable Filter)
f = 0.01 + 0.99 * cutoff²
g = tan(π · f) // ограничено f ≤ 0.49
R = 1 − resonance · 0.98
hp = (input − LP − R·BP) / (1 + g·(g + R))
BP = BP + g · hp
LP = LP + g · bp
Безусловно устойчив (trapezoidal integration).
Эффекты
Distortion: tanh(sample · (1 + drive·30))
Delay: циклический буфер 44100 сэмплов, линейная интерполяция, feedback
Chorus: модулированная задержка 400±200 сэмплов (@ chorusRate), mix
Flanger: модулированная задержка 10±180 сэмплов (@ flangerRate), feedback 0.5
Сохранение пресетов
- JSON в
~/.config/ru.yurasov.AuroraPiano/user_presets/*.json - Сохраняется: волна + ADSR + фильтр + LFO + эффекты + Unison + Portamento + Tuning
Зависимости
- Qt 5 (Core, Qml, Quick, Multimedia)
- Sailfish Silica
- Aurora OS SDK 5.2.1.110 (сборка)
Сборка
Проект собирается через Aurora OS SDK. Авторитетная сборка — target x86_64 в Docker-движке SDK (запускать из корня проекта):
docker run --rm --user "$(id -u):$(id -g)" \
-v "$PWD":/workspace -w /workspace aurora-build-tools-leo:5.2.1.110 \
bash -lc 'mkdir -p build/aurora-x64 && cd build/aurora-x64 && \
qmake /workspace/ru.yurasov.AuroraPiano.pro && make -j4'
Результат: build/aurora-x64/ru.yurasov.AuroraPiano (ELF x86-64).
Обычная сборка на хосте (qmake && make) не работает: src/main.cpp включает <QtQuick> и <auroraapp.h>, а заголовки QtQuick/QML и Aurora (CONFIG += auroraapp) доступны только внутри SDK-движка.
Файлы проекта
| Файл | Назначение |
|---|---|
src/synthesizer.h |
Заголовок синтезатора (Q_PROPERTY, Voice, PresetDef) |
src/synthesizer.cpp |
Реализация (audio I/O, voice mgmt, эффекты) |
src/main.cpp |
Entry point, экспорт synth в QML |
qml/pages/MainPage.qml |
Главный экран (все controls + клавиатура) |
qml/pages/StaffPage.qml |
Нотный стан (отображение + touch-play) |
qml/pages/AboutPage.qml |
О программе |
ru.yurasov.AuroraPiano.pro |
qmake проект |