Air Harp

Fifteen strings of light. Pluck them with either hand — or both at once — in front of your webcam, or drag across them.

Camera off Key C major MIDI Off Last note —
Moving — silent · pinch either hand to play
Sustain off
Left hand · L
Not seen
Index selects — silent · pinch to pluck
Right hand · R
Not seen
Index selects — silent · pinch to pluck
Play
Harmony
Scale
Sound
Strings look

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.

MIDI out — play Bitwig with the harp

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.

Sound goes to

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.

1 · Make a virtual port

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.

2 · Connect this page

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.

3 · Pick it up in Bitwig

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).

4 · Play & re-route

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.

Playing with the camera

  • Sit about an arm's length back so both hands fit the frame, with light in front of you, not behind.
  • Move freely — it's silent. With no pinch held, each hand's index fingertip selects on its own: it pre-lights the string nearest it, but crossing strings makes no sound. Both hands' selections show at once, marked L and R so you can see which hand is aiming where. Your other fingers never trigger anything, so either hand can travel across the whole harp to get into position without playing a note.
  • Pinch to play — with either hand, or both. Hold a thumb-to-index pinch on a hand and that hand's pinch point becomes its own pick (an amber puck marked L or R). While you pinch, sweeping that pick across a string plucks it — faster crossing = louder pluck. Each hand has its own pick, so both hands can pluck at the same time: two notes — or, in Chord mode, two chords — can sound in the same moment. Release a hand's pinch and that hand is silent again instantly, free to reposition, while the other hand keeps playing.
  • The badge at the stage's top-left always shows which state you're in: Moving — silent, one hand pinching, or Both hands pinching — playing. A string has to be re-crossed by the same pick to sound again — no machine-gun retriggering, and each pick keeps its own cooldown.
  • Harmony comes from whichever hand is not pinching. On a free (non-pinching) hand, hold an open palm for major or make a fist for minor; the strings retune once the shape settles. A pinching hand is busy plucking, so its pose is not read for harmony — the last major/minor holds while it plays. If both hands are pinching, the key simply holds until a hand frees up. Raising or lowering a free hand brightens or darkens the tone; if both hands pinch, the brightness holds too.
  • Sustain is a latch now — pinch no longer sustains. Hold an open palm still for about 1.2 seconds on a free hand to switch sustain on; hold a still open palm again to switch it off. The Sustain indicator on the stage shows the state, and counts the hold while you keep the palm still. Making a fist (minor) does not clear the latch.
  • Chord mode (Play toggle below): crossing a string with a pinch held plays the whole chord built on that string's degree instead of one note — and each hand's pick triggers its own chord.
  • Mouse / touch: moving without pressing is silent selection, exactly like an un-pinched hand; press and drag is a pinch — crossings fire while pressed. Two touch points pressed at once act as two picks.
  • Strings look (toggle in the controls): Particles — the original dotted particle strings, the default. Glowing Columns — each string becomes a soft beam of light with a glowing core and feathered edges that flares where you pluck it. Sparks — strings shrink to faint guide lines and each pluck bursts a spray of sparks from the pluck point. Ribbons — each string flows like a ribbon of light, and a pluck sends a bright pulse travelling along it. Switch any time, even mid-play: only the rendering changes — the strings, selection, pinch clutch, chords and sound stay exactly the same, and switching fires no notes.

Why it stays in key

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.

How the pluck is detected

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.