Online Metronoom (Tik Tempo)
Een gratis online metronoom met sample-nauwkeurige timing, instelbare tellen per maat, een geaccentueerde visuele puls en een tik-tempoknop om elk BPM op het gehoor te vinden.
224 weergaven
Tik in het ritme — minimaal 2 tikken nodig
Gebruikt de look-ahead-scheduler van de Web Audio API (AudioContext.currentTime) voor sample-nauwkeurige timing — geen eenvoudige setInterval, dus er is geen drift, zelfs niet bij een zwaar belaste pagina.
Waarom de Meeste Browsermetronomen Wegdrijven
De voor de hand liggende manier om een metronoom in JavaScript te bouwen is setInterval(playClick, 60000 / bpm). Het werkt een paar seconden — daarna niet meer. setInterval garandeert alleen dat een callback niet eerder dan de gevraagde vertraging afgaat, nooit hoeveel later hij daadwerkelijk kan lopen. De hoofdthread van JS wordt gedeeld met alles wat de pagina doet — DOM-updates, layout, garbage collection — en elk daarvan kan een wachtende timer met tientallen milliseconden vertragen. Voor de meeste UI-code is dat onzichtbaar; voor een metronoom is het fataal, want een klik die deze tel 40ms te laat komt en de volgende 10ms te laat, drijft hoorbaar weg in plaats van slechts net niet goed te klinken, en misleidt actief een muzikant die ermee oefent.
Muzikanten vertrouwen op een metronoom juist omdat de menselijke waarneming van gelijkmatige tijd onbetrouwbaar is zonder externe referentie — het hele doel van het apparaat sinds Johann Maelzel in 1815 de opwindbare versie patenteerde. Een softwaremetronoom die zelf wegdrijft ondermijnt dat doel, en de oplossing is geen slimmere timer: elke JS-timer, inclusief requestAnimationFrame, deelt hetzelfde knelpunt van de hoofdthread. De echte oplossing is om JavaScript helemaal niet meer te vragen het geluid op het juiste moment te produceren.
Look-Ahead Scheduling: Hoe Deze Metronoom Nauwkeurig Blijft
Deze tool gebruikt het patroon dat populair werd gemaakt door Chris Wilson, voorheen van het Web Audio-team van Google Chrome, in zijn veelgeciteerde artikel "A Tale of Two Clocks": scheid de planningslogica volledig van de geluidstiming. De AudioContext van de Web Audio API draait op zijn eigen audiothread met een sample-nauwkeurige klok, die aan JavaScript wordt blootgesteld als AudioContext.currentTime. Het aanroepen van osc.start(t) met een toekomstig tijdstempel van die klok laat de audio-engine het precies op t afspelen, ongeacht wat de hoofdthread op dat moment doet — hij hoefde nooit precies op de tel "wakker te worden" om dat te laten gebeuren.
De enige taak van de hoofdthread is boekhouding: ongeveer elke 25ms controleert een planner op tellen binnen de volgende 100ms en roept voor elk osc.start() aan met zijn exacte toekomstige currentTime. Omdat die lus alleen bij benadering op tijd hoeft te zijn, veroorzaakt gewone jitter geen hoorbaar probleem — het geluid wordt nog steeds met sample-nauwkeurige precisie ingepland. Elke klik is een oscillatorstoot van ~30ms, hoger van toonhoogte op de eerste tel van elke maat voor een hoorbaar accent, gesynchroniseerd met een bijpassende visuele puls.
Tik Tempo lost een ander probleem op: het BPM van muziek vinden zonder bladmuziek om het van af te lezen. Tik mee op het ritme van de tel; de tool meet het interval tussen tikken en zet het om met 60000 / gemiddeldeIntervalMs. Er zijn minstens twee tikken nodig, en het middelen van recente tikken vlakt kleine timingfouten af. Een pauze van meer dan twee seconden reset de reeks, omdat dat meestal betekent dat de tel is kwijtgeraakt in plaats van drastisch vertraagd.
Veelgestelde vragen
Waarom klinkt een eenvoudige setInterval-metronoom na verloop van tijd ongelijkmatig?
setInterval belooft alleen dat een callback niet eerder afgaat dan de gevraagde vertraging — hij kan later afgaan wanneer de hoofdthread bezig is met layout, garbage collection of andere tabactiviteit. Die kleine, onregelmatige vertragingen stapelen zich op, tel na tel, waardoor de klik hoorbaar wegdrijft in plaats van vergrendeld te blijven op tempo. Deze tool voorkomt dat door de daadwerkelijke geluidstiming over te dragen aan de eigen audiothread-klok van de Web Audio API, in plaats van te vertrouwen op de JS-timer die op het juiste moment afgaat.
Wat is "look-ahead scheduling" en waarom lost het de vertraging op?
Het is een patroon waarbij JavaScript nooit probeert een geluid precies op het moment dat het verschuldigd is af te spelen. Een lus controleert ongeveer elke 25ms of er tellen binnen de volgende 100ms vallen en plant voor elk vooraf een oscillator in met AudioContext.currentTime plus de exacte offset, via osc.start(preciezeToekomstigeTijd). De audio-engine laat die oscillator met sample-nauwkeurige precisie afgaan op zijn eigen thread, onafhankelijk van de hoofdthread — zo mag de planningslus slordig zijn terwijl de daadwerkelijke tel exact blijft.
Hoe berekent Tik Tempo de BPM?
Elke klik op de Tik Tempo-knop legt een tijdstempel vast. Vanaf de tweede tik meet de tool het interval sinds de vorige tik, houdt een korte lopende geschiedenis van recente intervallen bij en zet het gemiddelde daarvan om in een tempo door 60000 te delen door het gemiddelde interval in milliseconden. Er zijn minstens twee tikken nodig, en een pauze van meer dan twee seconden reset de reeks, omdat dat vrijwel altijd betekent dat het tikken is gestopt in plaats van voortgezet in een extreem laag tempo.
Waarom heeft de eerste tel van elke maat een andere toonhoogte?
Dat is een accent, standaard op zowel mechanische als digitale metronomen: de eerste tel (downbeat) klinkt op een hogere frequentie dan de rest, gecombineerd met een visuele puls in een andere kleur. Daardoor is in één oogopslag of op het gehoor te zien waar de "één" valt in een 3/4- of 6/8-patroon, wat belangrijk is om maten correct te tellen, vooral bij maatsoorten waarin elke tel anders identiek zou klinken.
Welk BPM-bereik dekt deze metronoom, en wat betekent BPM?
BPM staat voor beats per minute (tellen per minuut) — hoeveel pulsen er in zestig seconden plaatsvinden. Deze tool ondersteunt 30 tot 300 BPM, wat het volledige bereik dekt dat in geschreven muziek wordt gebruikt: een Grave-aanduiding ligt rond 25-45 BPM, het wandeltempo Andante rond 76-108, en Presto-passages kunnen 200 BPM overschrijden. 120 BPM is de standaard omdat het een gangbaar, comfortabel oefentempo is en de klassieke Moderato-aanduiding.
Vergelijkbare tools
Probleem melden
Online Metronoom (Tik Tempo)
Reacties
Nog geen reacties — schrijf de eerste!