TimMikeladze/termenvox

A gesture-controlled theremin in a single HTML file — camera hand tracking, historical temperaments, deep synthesis and MIDI out.

3

stars

7

commits

HTML

primary language

Aug 20, 2026

updated

termenvox.vercel.app
gesture-control
hand-tracking
javascript
mediapipe
microtonal
music
no-build
single-file
synthesizer
theremin
web-audio
web-audio-api
webmidi

README

Termenvox

A gesture-controlled theremin in one HTML file. termenvox.vercel.app

Right hand steers pitch across the field, left hand rides volume — lift to swell, drop to hush (swappable for left-handed play). No camera? Drag in the field, or press K and play the keyboard piano-style. Camera frames are processed on-device and never uploaded.

Features

  • Tuning — 18 scales, 6 temperaments (equal, just, Pythagorean, ¼-comma meantone, Werckmeister III, Kirnberger III), adjustable A₄, transpose, fine tune, and a grid-pull blend between free glissando and locked scale
  • Voice — two oscillators with interval and detune, sub octave, breath noise, drive, filter, vibrato, tremolo, ensemble, ping-pong echo, generated hall
  • Tracking — MediaPipe hands with 1€ smoothing, falling back to a built-in skin-blob tracker, then to pointer and keyboard
  • MIDI out — continuous pitch bend and CC11 expression
  • Recording, 6 presets, JSON export/import, and settings that persist

Every control explains itself: hover a label, tap it on a phone, or press What's this? to pin all the descriptions inline.

Shortcuts

Space hold · K keyboard · M mute · R record · C camera · L latch · F fullscreen · [ ] octave · 16 presets · Esc panic · ? help

Development

npm run dev    # http://localhost:4173 — a server is only needed for camera access
npm test

index.html is the whole application; deploying it is copying one file. The MediaPipe model is the only runtime fetch — without it the blob tracker takes over. The music maths lives in a dependency-free <script id="tvx-core"> block inside the page; test/core.test.mjs extracts that block and runs it under node:test.

Analytics

Optional, and off unless configured. npm run build — the Vercel build command — rewrites the <!-- umami --> block in index.html from the environment:

Variable
UMAMI_WEBSITE_IDEnables analytics. Unset means no script is emitted at all.
UMAMI_SCRIPT_URLInstance base URL or full script.js path. Defaults to https://linesofcode-umami.vercel.app/script.js.
UMAMI_DOMAINSComma-separated hosts to count, so previews and forks stay out of the stats.

Umami is cookieless and collects no personal data. The build is idempotent, so running it without the variables strips the tag back out.

Licence

MIT

Contributors

TimMikeladze

7 commits

TimMikeladze/termenvox

A gesture-controlled theremin in a single HTML file — camera hand tracking, historical temperaments, deep synthesis and MIDI out.

3

stars

7

commits

HTML

primary language

Aug 20, 2026

updated

termenvox.vercel.app
gesture-control
hand-tracking
javascript
mediapipe
microtonal
music
no-build
single-file
synthesizer
theremin
web-audio
web-audio-api
webmidi

README

Termenvox

A gesture-controlled theremin in one HTML file. termenvox.vercel.app

Right hand steers pitch across the field, left hand rides volume — lift to swell, drop to hush (swappable for left-handed play). No camera? Drag in the field, or press K and play the keyboard piano-style. Camera frames are processed on-device and never uploaded.

Features

  • Tuning — 18 scales, 6 temperaments (equal, just, Pythagorean, ¼-comma meantone, Werckmeister III, Kirnberger III), adjustable A₄, transpose, fine tune, and a grid-pull blend between free glissando and locked scale
  • Voice — two oscillators with interval and detune, sub octave, breath noise, drive, filter, vibrato, tremolo, ensemble, ping-pong echo, generated hall
  • Tracking — MediaPipe hands with 1€ smoothing, falling back to a built-in skin-blob tracker, then to pointer and keyboard
  • MIDI out — continuous pitch bend and CC11 expression
  • Recording, 6 presets, JSON export/import, and settings that persist

Every control explains itself: hover a label, tap it on a phone, or press What's this? to pin all the descriptions inline.

Shortcuts

Space hold · K keyboard · M mute · R record · C camera · L latch · F fullscreen · [ ] octave · 16 presets · Esc panic · ? help

Development

npm run dev    # http://localhost:4173 — a server is only needed for camera access
npm test

index.html is the whole application; deploying it is copying one file. The MediaPipe model is the only runtime fetch — without it the blob tracker takes over. The music maths lives in a dependency-free <script id="tvx-core"> block inside the page; test/core.test.mjs extracts that block and runs it under node:test.

Analytics

Optional, and off unless configured. npm run build — the Vercel build command — rewrites the <!-- umami --> block in index.html from the environment:

Variable
UMAMI_WEBSITE_IDEnables analytics. Unset means no script is emitted at all.
UMAMI_SCRIPT_URLInstance base URL or full script.js path. Defaults to https://linesofcode-umami.vercel.app/script.js.
UMAMI_DOMAINSComma-separated hosts to count, so previews and forks stay out of the stats.

Umami is cookieless and collects no personal data. The build is idempotent, so running it without the variables strips the tag back out.

Licence

MIT

Contributors

TimMikeladze

7 commits

Languages

HTML

86.5%

JavaScript

13.5%