Tonedrop

Send messages, files and raw data between devices using sound alone — no network, no pairing, no accounts. Tones carry the bytes; any speaker and microphone will do.

—
—

Send something

Any file — a document, a photo, a public key. Transfer time is shown before you send it, because sound is a slow pipe: tens of bytes per second, so small files only.

Agent-to-agent payloads, device handshakes, keys, sensor frames.
Ready.

The broadcast loop keeps a message on the air. Anyone who starts listening late still collects every frame and gets the whole message, because each frame carries its place in the sequence.

Listen

Not listening.

Green is what the microphone hears, blue lines are the tones this profile uses. A staircase walking across the lines is a message arriving.

frames decoded 0 CRC failures 0 preamble match 0.00 not started

Incomplete transfers

Received

Translator

Hears machine languages and writes them down: Tonedrop in every mode, Wave and MFSK, ggwave and gibberlink, DTMF keypad tones, Morse and tap code. Morse and tap are read from rhythm alone, so while another protocol is on air their guesses are set aside.

Ready.

Say it in any of them

Music carrier

Play any track and the data rides along inside it. The tones sit above the music in the same audio, so a phone across the room can decode the payload while everyone still hears the song.

No music loaded.
  1. Pick a track and press Play.
  2. Go to Send, choose Text or File, then press Broadcast loop.
  3. On the other device open Listen and hold it near the speaker.

Stealth

The Stealth profile moves the data to 17–18.6 kHz: above what most adults can hear, and above almost everything in recorded music, so the song plays as normal and nobody hears the message. Wave Ultra hides the same way at 17.5–20.5 kHz and carries far more per second, but needs gear that reaches 20 kHz. Both devices must pick the same mode, and the music is never dipped while either sends. It needs a speaker and microphone that reach that high — most phones and laptops do, some cheap ones do not — and children, pets and some young adults may still hear a faint whine.

Honest limits: louder, denser music makes the tones harder to hear, so raise the data level or leave ducking on. This survives music at ordinary listening levels, not a concert.

Codes

Morse, tap code and DTMF keypad tones. Type text to see and hear its code, paste a code to read it, or let the microphone decode one as someone sends it — a tone, a whistle, a radio, or knuckles on a table. These are open signalling codes, not encryption.

Ready.

Heard

Nothing yet.

Agents and machines

Machines do not need to speak. The same link carries raw bytes, so two agents can exchange structured data faster than they could exchange words — and the CLI turns the link into plain files, so an agent that has no microphone can still take part.

Command line

# Encode a message or a file into a WAV an agent can play or hand to another agent
node tools/tonedrop-cli.mjs encode --text "hello" --out hello.wav --profile fast
node tools/tonedrop-cli.mjs encode --file report.json --out report.wav --profile turbo

# Decode a recording back into messages and files
node tools/tonedrop-cli.mjs decode --in recording.wav --out-dir received/

# Inspect the link without sending anything
node tools/tonedrop-cli.mjs selftest --profile turbo

# Morse, tap code and DTMF, as text or as audio
node tools/tonedrop-cli.mjs code --type morse --text "sos" --out sos.wav
node tools/tonedrop-cli.mjs code --type morse --in recording.wav

# Speak to a gibberlink agent, or in any other voice
node tools/tonedrop-cli.mjs say --text "is it better now?" --as gg-fast --from AB --out gb.wav

# Everything in a recording, one JSON event per line
node tools/tonedrop-cli.mjs translate --in recording.wav --json

Frame format

Every frame is self-describing, so a receiver can lock on to a broadcast already in progress. All fields big-endian.

FieldBytesMeaning
preamble16 symbolsalternating lowest and highest tone
sync3a5 c3 5a
version1protocol version, currently 2
flags1bit 0 binary payload, bit 1 gzip
msg id4random per message, groups the chunks
seq2frame counter within the message
chunk index2which piece this frame carries
chunk total2how many pieces the message has
payload length2bytes in this frame's payload
payloadnmessage bytes
header parity8Reed-Solomon over sync…payload length; repairs 4 bad bytes
CRC-162CCITT-FALSE over version…payload; the final word on integrity
body parity4+Reed-Solomon over payload and CRC: a quarter of their size (half in robust)

Why this is faster than talking

Diagnostics

The self-test runs the real modulator and demodulator inside this page, adds noise, and checks the message survives. It needs no microphone and no second device, so it is the quickest way to confirm the link works on this hardware.

Tones for this profile

SymbolBitsFrequency in each tone set

How it works

Data is sent as MFSK: a short window of one pure tone per symbol, phases continuous so the sound is clean. The receiver measures the energy at each expected tone frequency with a Goertzel filter over a Hann window and takes the strongest — no carrier lock needed, only an estimate of where each symbol starts. A 16 symbol alternating preamble gives that timing. A room keeps ringing with each tone long after it stops, so consecutive symbols rotate through interleaved tone sets and each tone is judged by how much it rose, not how loud it is. Reed-Solomon parity repairs the symbols that still go wrong, and a CRC has the final say.

Privacy policy · Nothing leaves this device except sound.