Çevrimiçi Metronom (Tempo Yakala)
Örnek-doğru zamanlamalı, ölçü başına vuruş sayısı ayarlanabilen, aksanlı görsel nabız gösteren ve BPM'i kulaktan bulmak için Tempo Yakala düğmesi içeren ücretsiz çevrimiçi metronom.
220 görüntülenme
Ritme göre tıklayın — en az 2 tıklama gerekir
Örnek-doğru zamanlama için Web Audio API'nin look-ahead zamanlayıcısını (AudioContext.currentTime) kullanır — basit bir setInterval değildir, bu yüzden sayfa yoğun çalışsa bile kayma olmaz.
Basit setInterval Metronomları Neden Zamanla Kayar
JavaScript'te metronom yapmanın akla ilk gelen yolu setInterval(sesÇal, 60000 / bpm) yazmaktır: vuruşlar arası milisaniyeyi hesaplayıp bu programda bir geri çağırma tetiklemek. Birkaç saniye çalışır — sonra çalışmaz olur. setInterval yalnızca bir geri çağırmanın istenen gecikmeden daha erken tetiklenmeyeceğini garanti eder; gerçekte ne kadar daha geç tetiklenebileceği konusunda hiçbir garanti vermez. JavaScript ana iş parçacığı tek bir iş parçacığıdır ve sayfanın yaptığı her şeyle paylaşılır: DOM güncellemeleri, düzen (layout) yeniden hesaplamaları, çöp toplama (garbage collection) duraklamaları, hatta ilgisiz bir başka sekmedeki etkinlik bile bekleyen bir zamanlayıcıyı onlarca milisaniye geciktirebilir. Çoğu arayüz kodu için bu görünmezdir. Bir metronom için ise ölümcüldür — bu vuruşta 40ms geç gelen, bir sonrakinde 10ms geç gelen bir tık yalnızca "biraz yanlış" değildir; kulakla fark edilir şekilde kayar, ve kayan bir nabza karşı çalışan bir müzisyen kendi zamanlaması hakkında aktif olarak yanıltılmış olur.
Bu teorik bir kaygı değildir. Müzisyenler bir metronoma tam olarak şu nedenle güvenir: insan algısı, dışarıdan bir referans olmadan sabit zamanı güvenilir biçimde takip edemez — cihazın, ister akustik ister dijital olsun, 1815'te Johann Maelzel'in kurmalı versiyonunu patentlemesinden bu yana tüm amacı budur. Kendisi kayan bir yazılım metronomu, kendi amacını boşa çıkarır. Çözüm daha zeki bir JavaScript zamanlayıcısı değildir; requestAnimationFrame dahil her JS zamanlayıcısı aynı ana-iş-parçacığı darboğazını paylaşır. Çözüm, JavaScript'ten sesi doğru anda üretmesini istemekten tamamen vazgeçmektir.
Look-Ahead Scheduling: Bu Metronom Nasıl Doğru Kalıyor
Bu araç, eski Google Chrome Web Audio ekibinden mühendis Chris Wilson'ın çok referans verilen "A Tale of Two Clocks" makalesiyle popülerleştirdiği deseni kullanır. Fikir, zamanlama mantığını ile ses zamanlamasını tamamen birbirinden ayırmaktır. Web Audio API'nin AudioContext'i kendi yüksek öncelikli ses iş parçacığında, örnek-doğru bir saatle çalışır ve bu saat JavaScript'e AudioContext.currentTime olarak sunulur. Kritik nokta şu: bir osilatör oluşturup bu saatten gelecekteki bir zaman damgasıyla osc.start(t) çağırdığınızda, ses motoru onu tam olarak t anında çalar — o anda ana iş parçacığının ne yaptığından tamamen bağımsız olarak. Vuruş tam olarak gerekirken tarayıcı sekmesi bir düzeni yeniden çiziyor olabilir, ve tık yine de zamanında gelir; çünkü JS iş parçacığının bunu gerçekleştirmek için tam vuruş anında "uyanması" hiç gerekmemiştir.
Ana iş parçacığının tek işi artık defter tutmaktır: yaklaşık her 25 milisaniyede bir çalışan bir zamanlayıcı fonksiyonu, önümüzdeki 100ms'lik pencerede düşen vuruş olup olmadığını kontrol eder ve varsa her biri için kesin gelecek currentTime değeriyle osc.start() çağırır. Bu 25ms'lik yoklama aralığının yalnızca yaklaşık olarak zamanında olması gerektiğinden — vuruşun kendisinin değil — sıradan setInterval titremesi 20-30ms bile olsa hiçbir duyulabilir soruna yol açmaz; gerçek ses, ses iş parçacığının saatinde örnek-doğru hassasiyetle zaten planlanmıştır. Buradaki her tık, kısa (~30 milisaniye) bir osilatör darbesidir; ölçünün ilk vuruşunda frekans değişir — "bir" vuruşunun göz atıldığında bile fark edilmesi için ölçünün birinci vuruşunda daha tiz, diğerlerinde daha pes — ve aynı şekilde yanıp sönen bir görsel nabızla eşleştirilir, böylece ses kapalıyken bile vuruş kesinlikle belirgin kalır.
Tempo Yakala ise farklı, oldukça pratik bir soruna çözüm getirir: elinizde okuyacak bir nota, akor şeması veya meta veri yokken çalınan bir parçanın ya da kendi çaldığınız bir ritmin BPM'ini bulmak. Duyduğunuz veya hissettiğiniz vuruşla eş zamanlı olarak düğmeye tıklayın; araç ardışık tıklamalar arasındaki aralığı milisaniye cinsinden ölçer ve bunu 60000 / ortalamaAralıkMs ile tempoya çevirir. Tek bir tıklama bir tempo tanımlayamaz — henüz bir aralık yoktur — bu yüzden en az iki tıklama gerekir, ve son birkaç tıklamanın ortalaması, tek bir aralığın yapabileceğinden daha iyi biçimde küçük insan zamanlama hatalarını yumuşatır. İki saniyeden uzun bir tıklama arası, ortalamaya dahil edilmek yerine yeni bir denemenin başlangıcı sayılır; çünkü bu kadar uzun bir duraklama neredeyse her zaman ritmi kaybettiğiniz veya durduğunuz anlamına gelir, olağandışı yavaş bir tempoya tıklamıyor olduğunuz anlamına değil.
Sıkça Sorulan Sorular
Basit bir setInterval metronomu neden zamanla düzensiz duyulur?
JavaScript'in setInterval'i yalnızca bir geri çağırmanın istenen gecikmeden daha erken tetiklenmeyeceğini garanti eder — tek ana iş parçacığı düzen hesaplama, çöp toplama veya başka sekme etkinliğiyle meşgulken çok daha geç tetiklenebilir. Bu küçük, düzensiz gecikmeler vuruş üstüne vuruş birikir, böylece tık sabit bir tempoya kilitli kalmak yerine kulakla fark edilir şekilde kayar. Bu araç, sesin gerçek zamanlamasını JS zamanlayıcısının doğru anda tetiklenmesine güvenmek yerine Web Audio API'nin kendi ses-iş-parçacığı saatine devrederek sorunu tamamen ortadan kaldırır.
"Look-ahead scheduling" nedir ve kaymayı nasıl çözer?
JavaScript'in bir sesi tam gerektiği anda çalmaya hiç çalışmadığı bir desendir. Bunun yerine, yaklaşık her 25ms'de bir çalışan bir döngü, önümüzdeki 100ms içinde düşen vuruş olup olmadığını kontrol eder ve her biri için AudioContext.currentTime artı kesin ofset kullanarak, osc.start(kesinGelecekZaman) ile önceden bir osilatör planlar. Ses motoru bu osilatörü kendi iş parçacığında örnek-doğru hassasiyetle tetikler; bu, o anda ana iş parçacığının ne yaptığından tamamen bağımsızdır — böylece zamanlama döngüsü gevşek olabilirken gerçek vuruş kesin kalır.
Tempo Yakala BPM'i nasıl hesaplıyor?
Tempo Yakala düğmesindeki her tıklama bir zaman damgası kaydeder. İkinci tıklamadan itibaren araç, önceki tıklamadan bu yana geçen aralığı ölçer, son aralıkların kısa bir listesini tutar ve ortalamalarını 60000'i ortalama aralığa (milisaniye) bölerek tempoya çevirir. Herhangi bir aralık üretmek için en az iki tıklama gerekir, ve iki saniyeyi aşan bir boşluk diziyi sıfırlar; çünkü bu neredeyse her zaman aşırı yavaş bir tempoya devam etmek yerine tıklamanın durduğu anlamına gelir.
Her ölçünün ilk vuruşu neden farklı bir tonda?
Bu, hem mekanik hem dijital metronomlarda standart olan bir aksandır: ölçünün birinci vuruşu (downbeat), ölçüdeki diğer vuruşlardan daha yüksek bir frekansta çalar ve farklı renkte bir görsel nabızla eşleştirilir. Bu sayede 3/4 veya 6/8 gibi bir kalıpta "bir"in nereye düştüğü tek bakışta veya kulakla anlaşılabilir; bu, özellikle her vuruşun aksi halde birbirinin aynısı duyulacağı daha az yaygın ölçülerde ölçüleri doğru saymak için önemlidir.
Bu metronom hangi BPM aralığını kapsıyor ve BPM ne anlama gelir?
BPM, dakikadaki vuruş sayısı (beats per minute) anlamına gelir — altmış saniyede kaç nabız gerçekleştiği. Bu araç 30'dan 300'e kadar BPM destekler ve yazılı müzikte kullanılan aralığın neredeyse tamamını kapsar: Grave işareti yaklaşık 25-45 BPM civarındadır, Andante yürüyüş tempo yaklaşık 76-108, Presto veya daha hızlı pasajlar 200 BPM'i aşabilir. 120 BPM varsayılan olarak kullanılır çünkü hem yaygın, rahat bir pratik temposudur hem de klasik Moderato işaretidir.
Benzer Araçlar
Sorun Bildir
Çevrimiçi Metronom (Tempo Yakala)
Yorumlar
Henüz yorum yok — ilk yorumu siz yazın!