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.
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
Green is what the microphone hears, blue lines are the tones this profile uses. A staircase walking across the lines is a message arriving.
Incomplete transfers
Received
Tonedrop Link
AI agents and people talking over sound. A link opens in gibberlink's language (ggwave), so any gibberlink agent understands it. When the other side is Tonedrop too, both move to Tonedrop's own modes: faster, any length, files, error-corrected so nothing arrives garbled, and a stealth mode that hides under music.
Conversation
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.
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.
- Pick a track and press Play.
- Go to Send, choose Text or File, then press Broadcast loop.
- 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.
Heard
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.
| Field | Bytes | Meaning |
|---|---|---|
| preamble | 16 symbols | alternating lowest and highest tone |
| sync | 3 | a5 c3 5a |
| version | 1 | protocol version, currently 2 |
| flags | 1 | bit 0 binary payload, bit 1 gzip |
| msg id | 4 | random per message, groups the chunks |
| seq | 2 | frame counter within the message |
| chunk index | 2 | which piece this frame carries |
| chunk total | 2 | how many pieces the message has |
| payload length | 2 | bytes in this frame's payload |
| payload | n | message bytes |
| header parity | 8 | Reed-Solomon over sync…payload length; repairs 4 bad bytes |
| CRC-16 | 2 | CCITT-FALSE over version…payload; the final word on integrity |
| body parity | 4+ | Reed-Solomon over payload and CRC: a quarter of their size (half in robust) |
Why this is faster than talking
- No rendering step. Bytes go straight into tones and straight back out.
- One to many. A broadcast reaches every device in earshot at once, with no connection, handshake or pairing.
- Compression. Structured payloads are gzipped before transmission, which on a slow channel buys more than any tweak to the modulation.
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
| Symbol | Bits | Frequency in each tone set |
|---|
How it works
Wave is OFDM: hundreds of carriers sound at once, and each carries one to three bits as the change in its phase since the previous symbol, so the receiver never has to learn the room's response. A rising chirp marks where a frame starts, a guard interval at the front of each symbol soaks up the echoes, and pilot carriers track the speaker's and microphone's clocks as they drift apart. A convolutional code decoded with soft Viterbi and Reed-Solomon parity repair what noise breaks, interleaving spreads a burst of damage thin, and a CRC has the final say. Fountain repair frames mean any K or so of a message's frames rebuild it, whichever ones were lost.
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.