🌐 هذه الصفحة لم تُترجم بعد إلى العربية. يتم عرض المرجع البرتغالي (BR). ساعد في الترجمة.
Music (Afinador / Metrônomo / Drums)
App de utilidades musicais. 7 abas que cobrem desde estudar afinação de violão até gerar tom puro pra calibrar headphones, com bateria sintetizada estilo TR-808 no meio.

Diferente da Tablatura: Music é "ferramentas avulsas". Tablatura é editor multitrack. Eles compartilham primitivas de áudio (useAudioContext, drum synth, voices) mas têm UIs e fluxos completamente diferentes.
As 7 abas
| Aba | Função | Cor identidade |
|---|---|---|
| Tuner | Afinador cromático YIN ±1 cent | verde #00d97e |
| Metronome | Metrônomo de alta precisão (scheduler 25ms lookahead) | laranja #ff9500 |
| Frequency | Gerador de tom puro (50Hz–20kHz) + binaural beats | roxo #af52de |
| Drums | Bateria sintetizada (16 pads × 3 kits) + sequencer | vermelho #ff453a |
| Piano | Piano virtual 2 oitavas + sustain pedal | azul #5ac8fa |
| Chords | Reconhecedor + biblioteca de acordes com diagrama | amarelo #ffd60a |
| Scales | Visualizador de escalas (12 raízes × 12 tipos) | turquesa #5ee3ff |
Tuner
Afinador cromático usando YIN (Cheveigne & Kawahara 2002) — ~250 linhas de código, sem dep, precisão ~1 cent. Range 50-2000Hz cobre todos os instrumentos comuns.
3 modos de view:
- Needle (default): ponteiro vintage tipo afinador físico, com gráfico de timing últimos 10s
- Spectrum: FFT bars (estilo afinador clássico de palco)
- VU: VU meter retrô com ballistic damping
Reference A configurável (415-466 Hz, default 440). Útil pra música barroca (415) ou jazz vintage (442).
Recording session: clica "Gravar" → grava até 60s de áudio + timeline { t, freq, cents, note } que vira gráfico no final. Bom pra ver se você desafinou em algum trecho.
Metronome
Scheduler de alta precisão (lookahead 100ms agendando eventos no AudioContext.currentTime). setInterval drifta — esse não.
- BPM: 40-240
- Time signature: 4/4 (default), 3/4, 6/8, 5/4, 7/8, 12/8
- Subdivision: quarter, eighth, triplets, sixteenth
- 4 sons (click / woodblock / cowbell / beep) — cada um tem variante "accent" mais aguda na batida 1
- BPM Detector: pressiona "Detectar BPM", bate o tempo com a câmera/mic. Algoritmo combina onset detection + autocorrelação. Útil pra fazer cover de música sem partitura
- Practice Timer: countdown integrado. Toca metrônomo por X min, pausa junto
Frequency Generator
OscillatorNode puro com 4 waveforms (sine / square / triangle / sawtooth). 50Hz a 20kHz. Slider de volume 0-100% com curva log (não-linear pra match perceptual).
Binaural beats (toggle): toca uma frequência no ouvido esquerdo, outra ligeiramente diferente no direito. O cérebro percebe a diferença (1-30Hz) como uma terceira frequência fantasma. Usado em apps de meditação/concentração. Não substitui orelha clínica, é experimental.
Effects chain (toggle on/off): reverb + delay opcionais. Sem UI de mixer — só toggle + slider de mix.
Drums
16 pads × 3 kits (Acoustic / Electronic / Latin). Cada hit é OscillatorNode + GainNode + BiquadFilterNode envelopados sinteticamente — zero sample files. Som icônico estilo TR-808 sem inflar bundle.
Sequencer: grid step-based, monofônico por step. Cap 4 compassos. Tap "Salvar pattern" salva no Firestore (users/{uid}/roqueos/music.drums.sequencerPattern).
Presets: ~25 grooves curados (rock basic, funk shuffle, bossa nova, jazz swing, latin clave). Aplicar preset substitui o pattern atual — diálogo de confirmação se já tem nota gravada.
iOS quirks importantes
Existe um workaround documentado pra apps Web Audio em iPhone:
- Silent switch bug: o botão físico de silêncio do iPhone silencia Web Audio mesmo com volume alto. Apple Music/Spotify resolvem porque são apps nativos.
- Workaround parcial: app cria um
HTMLAudioElementinvisível complaysInline+MediaSession metadata, dispara no primeiro user gesture. Isso "reivindica" a sessão de áudio comomedia playbackparcialmente. - Resultado: maioria dos casos funciona. Alguns iPhones específicos (modelos antigos, iOS antigo) ainda silenciam.
Banner âmbar aparece automaticamente quando detecta iOS, com botão "Entendi" que persiste dismiss em localStorage. Não é blocker — só explica o comportamento.
Solução definitiva (quando shippar via App Store via Capacitor): plugin nativo Swift configura AVAudioSessionCategoryPlayback antes do WebView montar. Documentado em 87-music-system.md seção "iOS silent switch — limitação atual + futuro Capacitor".
Persistência
Path Firestore: users/{uid}/roqueos/music
Persistido:
{
"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. Não trava UI.
Identidade visual
Cada aba tem --tab-accent (hex) injetado inline como CSS variable. Ambient mesh ::before no root + glow nos componentes via rgba(var(--tab-accent-rgb), alpha).
Resultado: a aba ativa "tinge" o painel inteiro suavemente sem mudar de tela.
Trade-offs aceitos
- Síntese > samples: kit sintetizado tem identidade própria (TR-808). Não é Battery 4. OK pra estudar e fazer beats casual.
- Sequencer monofônico por step: cada step liga ou desliga. Sem velocity/swing. Não é DAW.
- BPM detector tipo onset: bom pra steady tempo (palma, kick). Ruim pra musical complex com syncopation pesada.
- Capo só renomeia acordes: não toca progressão completa transposta. Cobre o caso "tabulei em E, quero ver em D com capo 2".
Referências
- App registrado em
src/config/apps.js(id: 'music') - Componente:
src/components/roqueos/apps/ROSMusic.vue - Composables:
src/composables/useAudioContext.js(singleton),src/composables/useAudioScheduler.js(precision scheduler) - Algoritmo YIN:
src/utils/music/pitchAlgorithms.js - Síntese drums:
src/utils/music/drumSynth.js - Rule completa em
.claude/rules/87-music-system.md - Aplicativo paralelo: Tablatura (editor multitrack) — usa as mesmas primitivas de áudio