Skip to content

Music (Тюнер / Метроном / Drums)

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

Music app — 7 вкладок в одной панели

Отличие от 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

Персистируется:

json
{
  "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 (мультитрек редактор) — использует те же аудио-примитивы