Learn more

Number of strings

⚠️ Choosing lots of strings might light your device on fire. Even when the the strings aren't audible, they are always simulating. The number of strings you can simulate without glitches and jank will depend on your device and browser.

Strings per AudioWorklet

This control allows you to get a feel for the overhead introduced by each AudioWorklet node. Using fewer AudioWorklet nodes to simulate the same number of strings is more performant.

Communication channel

There are two options for sending data between the audio rendering thread and the GUI (main) thread: MessagePort (which creates garbage via memory allocations) or using SharedArrayBuffers (which do not necessarily create garbage). When SharedArrayBuffer is selected, this page is using Paul Adenot's lock-free queue library.

⚠️ You need to be using an up-to-date version of Chrome, or Firefox Nightly with the "bypassCOOP_COEP.insecure.enabled" flag flipped on to use SharedArrayBuffers. Make sure you turn the flag back off after viewing this site, and don't turn this flag on in your browser that you use for anything sensitive.

Audio processing language

This control allows you to select the language used for the DSP processing which simulates each string. Using WebAssembly (compiled from Rust) is more performant.

Visualize string state

Check this box to make the strings animate whenever they are plucked. The animation is based on data which is produced in the audio-processing simulation(s). Therefore, turning this off will improve performance, and allow you to potentially simulate more strings.

WebMidi

This browser does not support WebMidi