Fifteen strings of light. Pluck them with either hand — or both at once — in front of your webcam, or drag across them.
Sound starts on your first pluck or camera start. No camera? Move over the strings to select silently, press and drag to pluck, or play keys 1–9 0 Q W E R T.
Every pluck can also leave this page as a real MIDI note. Send it to a virtual MIDI port, pick that port up inside Bitwig, and Bitwig can play — and re-route — any instrument, effect or hardware you like.
MIDI is off. Web MIDI works in Chrome or Edge on desktop, on an https page or localhost. No notes leave the page until you enable it and choose an output.
Mac: open Audio MIDI Setup → Window → Show MIDI Studio, open the IAC Driver, tick “Device is online” and keep Bus 1. Windows: install loopMIDI and create a port named Air Harp. A hardware MIDI interface plugged in also works — it appears as an output directly.
Click Enable MIDI above, allow the browser’s MIDI permission prompt, then choose that port in the Output list — IAC Driver Bus 1 on Mac, Air Harp on Windows. Press Test note C4: nothing sounds yet — the note has only been sent.
In Bitwig Studio: Settings → Controllers, add a generic MIDI keyboard/controller and set its input to the same virtual port. Then add an Instrument track, set its MIDI input to that controller/port, and arm the track (record-enable / monitor on).
Pluck here — hands, mouse or keys — and Bitwig plays the armed track. From there it’s ordinary Bitwig routing: change the instrument, layer tracks, or send the track’s MIDI on to another device or out to hardware. Set Sound goes to → MIDI only to silence this page’s own synth so you hear Bitwig alone; the log under the controls shows every note and CC as it’s sent. In Chord mode each pick sends the whole chord as MIDI notes; the sustain latch sends pedal CC 64.
Every string is a scale degree, never a chromatic note, so a wild strum is an arpeggio in key instead of a mess. Pentatonic is the default — five safe notes per octave, the layout projects like AetherPlay use so any combination still sounds good.
Switch to Full scale for all seven degrees, and flip Major/Minor to hear the same strings retune — in minor, the third, sixth and seventh degrees drop, exactly as diatonic harmony says they should.
Adapted from Gesture Synth's engineering write-up: a hit is a plucking point's path segment crossing the string — not just pointing at it — with velocity taken from crossing speed, an 80 ms cooldown per string, and a ~100 ms pose-stability rule before a hand shape commits, so chords and modes don't flicker.
Each hand's plucking point is gated by its own pinch clutch: un-pinched, that hand's index fingertip only selects and nothing it crosses can sound; pinched, its thumb–index midpoint becomes that hand's pick. The two picks are fully independent — separate crossing state, cooldowns, and re-arm — so both can fire in the same frame. While a hand pinches, its pose is ignored for harmony: major/minor and filter brightness are read from the non-pinching hand only, and hold their last values when both hands pinch. Sustain is separate from the pinch entirely: a still open palm held for ~1.2 s toggles the sustain latch. The strings themselves are fixed in place — a pluck only sets a string vibrating around its home position, capped well inside the gap to its neighbours, so strings never drag, wander, or overlap.
The string sound is a Karplus-Strong plucked-string model (the family behind Tone.js's PluckSynth), generated note by note in your browser.