Jak vytvořit sekvencer v JavaScriptu pro syntézu zvuku

3

Budování zvukového enginu od nuly je obřad. Chcete pochopit generátor hodin. Načasování. Syrová logika, která mění ticho v rytmus. Sekvencer je tato logika. Toto je mřížka. Vkládáte poznámky. Jdete vpřed.

Většina průvodců přeskakuje těžší část. Ukazují vám knihovnu. Ukazují vám GUI. Neukazují, jak zvládnout drift. Chyby časování, které se hromadí při ručním sledování času.

Pojďme to napravit.

Vytváříme základní krokový sekvencer. Poběží v jednoduché smyčce. Bude přehrávat zvuky. Udrží rytmus, aniž by se díval dopředu. Tento přístup zabraňuje “trhanému” pocitu, který nastává při použití setTimeout pro dlouhé smyčky.

Základní koncept: Načasování kroků

Sekvencer pracuje v krocích. Ne na pár sekund. Na schodech.

Pokud je vaše tempo 120 úderů za minutu (BPM), každý úder trvá 0,5 sekundy. Pokud máte 16 kroků, každý krok trvá 0,125 sekundy. Kouzlo se stane, když se synchronizujete s těmito intervaly.

“Čas v sekvenceru není nepřetržitý proud. Je to řada diskrétních událostí. Synchronizace s těmito událostmi je vším.”

Potřebujeme způsob, jak vypočítat, kdy nastane každý krok. Ne hádáním. Přes matematiku.

Nastavení generátoru hodin

Potřebujete výchozí bod. Čas zahájení.

V JavaScriptu Date.now() nebo performance.now() vrací milisekundy. Toto použijete k výpočtu driftu.

  1. Určete tempo.
  2. Vypočítejte dobu trvání kroku.
  3. Spusťte cyklus.

Zde je kostra kódu. Není moc hezký. Ale funguje to.

Tento kód je základní. Používá setTimeout. Není dokonalý. Ale to je začátek.

Proč je to důležité?

Proč si to vytvořit sám?

Skvělé jsou knihovny jako Tone.js nebo wrappery pro Web Audio API. Zvládají složité plánování. Kompenzují zpoždění.

Pouhým používáním ale nepoznáte, jak fungují. Učíte se tím, že vidíte, kde selhávají.

Když se setTimeout posune, váš bit kolísá. Zní to lidsky. To nezní správně.

Zpracování driftu

Kontrola if (nextStepTime < Date.now()) je kritická.

Ona