sonoglyph

beep boop beep = hello, world?

Sonoglyph

Watch sound become symbols.

A browser-first, extensible signal recognition framework: a reusable DSP pipeline — microphone to spectrum to detected features — and a plugin architecture that turns those features into glyphs, symbolic representations of recognized signals.

FIG. 1 — DUAL-TONE DECODERengine: @sonoglyph/dsp · recognizer: plugin-dtmf · 48 kHz

(1) keypad

press a key · ♪

(2) scope · time domain

(3) spectrum · 0–1.7 kHz

(4) glyph

?

awaiting signal

(1) a key press synthesizes its two tones — row + column · (2) the raw samples, exactly what a microphone would hear · (3) FFT magnitudes; the two peaks are the key’s coordinates · (4) the recognized glyph, with its confidence and measured frequencies

Theory of operation

The core never knows what a signal means; plugins do. A DTMF key, a Morse dash, a musical chord, and a syllable of an alien language are all glyphs — one abstraction, any structured signal system. And every stage of the pipeline is observable, because the project is as much about teaching signal processing as performing it. Inspired by the translator in Project Hail Mary.

5dtmfmorseAmchorderidian

Specifications

unitfunction
packages/coreShared contracts — Glyph, FeatureFrame, RecognizerPlugin, DspEngine, AudioSource. Types only, zero dependencies.
packages/dspThe TypeScript reference DSP engine: windowing, radix-2 FFT, spectral peaks, envelope, and the pipeline runner.
packages/browserBrowser audio: microphone capture via a dumb AudioWorklet, ring buffer, WAV codec, streaming buffer source.
packages/plugin-sdkdefineRecognizer(...) and friends — per-frame classifiers get debouncing and segmentation for free.
plugins/dtmfThe reference recognizer: all 16 DTMF keys from spectral peak pairs — FFT and Goertzel strategies, side by side.
plugins/morseTime-domain recognition off the envelope stream: dots, dashes, letters — and a translator that gives them meaning.

in progress: a hosted playground and a Learn section — interactive articles grown from the playground’s embedded explainers. until then: clone the repo, pnpm dev.