Skip to content

🌐 Esta página aún no está traducida al español. Mostrando referencia en portugués (BR). Ayúdanos a traducir.

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.

Music app — 7 abas em painel único

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

AbaFunçãoCor identidade
TunerAfinador cromático YIN ±1 centverde #00d97e
MetronomeMetrônomo de alta precisão (scheduler 25ms lookahead)laranja #ff9500
FrequencyGerador de tom puro (50Hz–20kHz) + binaural beatsroxo #af52de
DrumsBateria sintetizada (16 pads × 3 kits) + sequencervermelho #ff453a
PianoPiano virtual 2 oitavas + sustain pedalazul #5ac8fa
ChordsReconhecedor + biblioteca de acordes com diagramaamarelo #ffd60a
ScalesVisualizador 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 HTMLAudioElement invisível com playsInline + MediaSession metadata, dispara no primeiro user gesture. Isso "reivindica" a sessão de áudio como media playback parcialmente.
  • 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:

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. 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