⚠️ 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.
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.
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.
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.
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.
This browser does not support WebMidi