Music (Тюнер / Метроном / Drums)
Приложение музыкальных утилит. 7 вкладок, охватывающих от изучения настройки гитары до генерации чистого тона для калибровки наушников, с синтезированной ударной установкой в стиле TR-808 посередине.

Отличие от Tablatura: Music — это "отдельные инструменты". Tablatura — мультитрек-редактор. Они разделяют аудио-примитивы (useAudioContext, drum synth, voices), но имеют совершенно разные UI и потоки.
7 вкладок
| Вкладка | Функция | Цвет идентичности |
|---|---|---|
| Tuner | Хроматический тюнер YIN ±1 cent | зелёный #00d97e |
| Metronome | Высокоточный метроном (планировщик с lookahead 25ms) | оранжевый #ff9500 |
| Frequency | Генератор чистого тона (50Hz–20kHz) + бинауральные биения | фиолетовый #af52de |
| Drums | Синтезированная ударная установка (16 pads × 3 kits) + секвенсор | красный #ff453a |
| Piano | Виртуальное пианино 2 октавы + педаль сустейна | голубой #5ac8fa |
| Chords | Распознаватель + библиотека аккордов с диаграммой | жёлтый #ffd60a |
| Scales | Визуализатор гамм (12 тоник × 12 типов) | бирюзовый #5ee3ff |
Tuner
Хроматический тюнер с использованием YIN (Cheveigne & Kawahara 2002) — ~250 строк кода, без зависимостей, точность ~1 cent. Диапазон 50-2000Hz покрывает все распространённые инструменты.
3 режима view:
- Needle (по умолчанию): винтажный указатель в стиле физического тюнера, с графиком timing последних 10s
- Spectrum: FFT bars (стиль классического сценического тюнера)
- VU: ретро VU meter с ballistic damping
Reference A настраиваемый (415-466 Hz, по умолчанию 440). Полезно для барочной музыки (415) или винтажного джаза (442).
Recording session: кликаешь "Записать" → записывает до 60с аудио + timeline { t, freq, cents, note }, который в конце превращается в график. Хорошо для проверки, не расстроился ли ты где-то.
Metronome
Высокоточный планировщик (lookahead 100ms, планирующий события в AudioContext.currentTime). setInterval дрейфует — этот нет.
- BPM: 40-240
- Размер: 4/4 (по умолчанию), 3/4, 6/8, 5/4, 7/8, 12/8
- Subdivision: quarter, eighth, triplets, sixteenth
- 4 звука (click / woodblock / cowbell / beep) — у каждого есть вариант "accent" более высокий на первом такте
- BPM Detector: нажми "Определить BPM", отбей tempo камерой/микрофоном. Алгоритм комбинирует onset detection + autocorrelation. Полезно для cover музыки без партитуры
- Practice Timer: интегрированный countdown. Играет метроном X мин, паузируется вместе
Frequency Generator
Чистый OscillatorNode с 4 waveforms (sine / square / triangle / sawtooth). От 50Hz до 20kHz. Слайдер громкости 0-100% с log-кривой (нелинейный для perceptual match).
Бинауральные биения (тогл): играет одну частоту в левом ухе, немного другую в правом. Мозг воспринимает разницу (1-30Hz) как третью фантомную частоту. Используется в приложениях медитации/концентрации. Не заменяет клиническое ухо, экспериментальное.
Effects chain (on/off тогл): опциональные reverb + delay. Без UI миксера — только тогл + слайдер mix.
Drums
16 pads × 3 kits (Acoustic / Electronic / Latin). Каждый hit — это OscillatorNode + GainNode + BiquadFilterNode, синтетически envelоped — ноль sample файлов. Иконический звук в стиле TR-808 без раздувания бандла.
Sequencer: grid step-based, монофонический по шагам. Cap 4 такта. Tap "Сохранить pattern" сохраняет в Firestore (users/{uid}/roqueos/music.drums.sequencerPattern).
Presets: ~25 кураторских грувов (rock basic, funk shuffle, bossa nova, jazz swing, latin clave). Применение preset заменяет текущий pattern — диалог подтверждения, если уже записаны ноты.
Важные iOS quirks
Существует документированный workaround для Web Audio приложений на iPhone:
- Silent switch bug: физическая кнопка silent на iPhone заглушает Web Audio даже с высокой громкостью. Apple Music/Spotify решают, потому что это нативные приложения.
- Частичный workaround: приложение создаёт невидимый
HTMLAudioElementсplaysInline+MediaSession metadata, запускает на первом user gesture. Это частично "претендует" на аудио-сессию какmedia playback. - Результат: большинство случаев работает. Некоторые конкретные iPhone (старые модели, старая iOS) всё ещё заглушают.
Янтарный баннер появляется автоматически при обнаружении iOS, с кнопкой "Понял", которая сохраняет dismiss в localStorage. Не блокер — только объясняет поведение.
Окончательное решение (при отгрузке через App Store через Capacitor): нативный Swift плагин конфигурирует AVAudioSessionCategoryPlayback до монтирования WebView. Документировано в 87-music-system.md разделе "iOS silent switch — текущее ограничение + будущий Capacitor".
Персистентность
Путь Firestore: users/{uid}/roqueos/music
Персистируется:
{
"tuner": { "referenceA": 440, "viewMode": "needle" },
"metronome": { "lastBPM": 120, "lastTimeSignature": "4/4", "practiceTimerMinutes": 15 },
"frequency": { "lastHz": 440, "lastWave": "sine", "binauralEnabled": false, "delayEnabled": false },
"drums": { "lastKit": "acoustic", "masterVolume": 0.8, "sequencerPattern": {...} },
"scales": { "lastRoot": "C", "lastType": "major" },
"chords": { "capoFret": 0 }
}Debounced save 800ms. Не блокирует UI.
Визуальная идентичность
Каждая вкладка имеет --tab-accent (hex), внедрённый inline как CSS variable. Ambient mesh ::before в root + glow в компонентах через rgba(var(--tab-accent-rgb), alpha).
Результат: активная вкладка "красит" всю панель мягко без смены экрана.
Принятые компромиссы
- Синтез > samples: синтезированный kit имеет собственную идентичность (TR-808). Не Battery 4. OK для обучения и casual создания битов.
- Sequencer моно по шагу: каждый шаг on или off. Без velocity/swing. Не DAW.
- BPM detector типа onset: хорошо для steady tempo (хлопок, kick). Плохо для musical complex с тяжёлой syncopation.
- Capo только переименовывает аккорды: не играет полное transposed progression. Покрывает случай "затабил в E, хочу видеть в D с capo 2".
Ссылки
- Приложение зарегистрировано в
src/config/apps.js(id: 'music') - Компонент:
src/components/roqueos/apps/ROSMusic.vue - Composables:
src/composables/useAudioContext.js(singleton),src/composables/useAudioScheduler.js(precision scheduler) - Алгоритм YIN:
src/utils/music/pitchAlgorithms.js - Синтез drums:
src/utils/music/drumSynth.js - Полное правило в
.claude/rules/87-music-system.md - Параллельное приложение: Tablatura (мультитрек редактор) — использует те же аудио-примитивы