Try it across the room: open Signal Lab on two devices. Start the microphone on one, then transmit from the other.
UTF-843 / 8,192 bytes
Transmission settings Balanced · 1 copy
Start here for short transfers between nearby devices.
≋
The receiver expects one copy and checks its CRC-32 checksum.
One tone, keyed into dots and dashes. Letters travel as rhythm.
A–Z, É, 0–9 and supported punctuation. Text is sent in uppercase; spaces separate words.
Tone700 HzDot 80 ms · Dash 240 ms
Dots and dashes
·−
Match Morse receive speed to the sender (15 WPM by default). This mode has no copy plan or checksum. Custom data supports arbitrary UTF-8 and files.
EAS tones are regulated
In the U.S., FCC rules restrict transmitting EAS codes and attention signals, including recordings and simulations. A test label or disclaimer does not authorize transmission. Do not broadcast, stream, publish, or feed these tones into alerting equipment unless the use is authorized under applicable rules.
Signal Lab is an educational tool, not certified alert equipment. Local playback, recording and sharing may also raise legal or safety issues. Rules may differ outside the U.S.; consult the relevant rules and qualified counsel for your use.
Specific Area Message Encoding carries alert metadata; a separate announcement carries the voice. Build a header below, then use Test in decoder to inspect it silently. The test processes the generated signal on this device without playing it through speakers.
The six digits: P · SS · CCC
PCounty partition
0 means all or unspecified portions. Non-zero digits identify locally defined parts of a county.
SSState identifier
The two-digit FIPS state or equivalent territory code. 06 is California.
CCCCounty identifier
The three-digit FIPS county or equivalent area code within that state. 037 is Los Angeles County.
FIPS stands for Federal Information Processing Standards. A SAME location code adds a partition digit to the five-digit state/county identifier. It is not a ZIP code or a telephone area code.
The field’s technical name is the Geographical Area block (PSSCCC). A header can address up to 31 areas. These can include counties, parishes, independent cities, territories, or designated marine areas.
Partitions 1–9 conventionally correspond to NW, N, NE, W, central, E, SW, S, SE. Their actual boundaries must be locally defined; do not assume every county uses all nine.
Validity is the alert’s purge time (HHMM). Station identification is an eight-character field, padded with spaces.
On the wire: JJJHHMM — three-digit UTC day of year, then hour and minute.
Encoded header
Announcement & attention signal
Recorded audio and browser speech are for playback only. EAS WAV export is unavailable.
≋
SAME always uses 3 header bursts and 3 end bursts. The decoder counts distinct bursts and compares their content.
Duration—
Message—
EAS WAV export is unavailable. Prefer the silent decoder test. Before playing tones, make sure they cannot frighten or mislead others, enter a broadcast or livestream, or reach alert equipment. Play EAS tones only when authorized under applicable law; a test label is not authorization. Review the U.S. rule ↗
Use your device’s media volume while transmitting. Processing stays local.
Decoder
Listen for a signal from another device, or open a recording.
Idle
Receiver settings Normal sensitivity · 15 WPM Morse
For 700 Hz Morse, match the sender’s WPM. Data and SAME rates are detected automatically.
Receiving Morse? in receiver settings.
Start once; listen for multiple messages until you press Stop.
Waiting for microphone samples−∞ dBFS
Start listening, then play a short message from the other device.
DecoderWaiting for a signal
Waiting for transfer header0 / 0
Each copy is checked independently, then compared.
Listening starts here.
Play a signal nearby or import a recording. Custom data, SAME and 700 Hz Morse are detected automatically.
Data · SAME · Morse
Audio diagnostics Browser capabilities
Secure origin
—
Microphone API
—
Capture engine
Not started
Audio context
Not started
Audio session
Not started
Screen wake lock
Off
Input processing
Not reported
Sample rate
—
Input
—
If the input stays quiet, move the devices closer and check the playback volume. If tones arrive without a decoded header, try Resilient with a short message. Some embedded browsers limit microphone access. The standalone HTTPS app can also be opened in Safari, Chrome, Firefox, or Edge.
Captured audio stays on this device. Save a failed attempt to inspect or import it later.
A modem changes a carrier signal to carry data. Signal Lab uses binary frequency-shift keying (BFSK): a low tone for 0 and a high tone for 1. Changing between them turns a sequence of bits into an audible signal.
1,200 Hz
2,400 Hz
Tap either bit to hear its tone for half a second.
Why do emoji work?
Text becomes UTF-8 bytes, which become bits. Emoji use several bytes, so the byte count can be larger than the character count. Files already consist of bytes; their type does not matter to the modem.
Speed is a trade-off.
At 300 bit/s, each symbol lasts about 3.33 milliseconds. At 100 bit/s, it lasts 10 milliseconds, giving the receiver more time to distinguish the tones. A slower transfer takes longer but is often easier to decode. File sizes matter: 8 KiB takes several minutes even before repeated copies.
What actually travels?
PreambleSyncCopy planMetadataPayloadCRC-32
The preamble gives the receiver time to find the bit clock. The sync word marks a packet. The header declares the transfer ID, total copies, and copy number. Metadata describes the payload; the final checksum checks the whole frame.
Received is not always verified.
The custom protocol includes a transfer ID, a total copy count (1, 2, or 3), and a copy index in its opening header. That header has its own CRC-32 checksum, so the receiver can read the declared plan before the payload finishes arriving.
✓Copy 1✓Copy 2…Copy 3
2 of 3 copies received
Both received frames passed their checksum. The complete transfer is still pending.
Each copy has to earn its check.
First, its full frame must pass CRC-32, an error-detection checksum. Next, its metadata and payload bytes must match the other copies of that transfer. Only distinct copy indices count; the receiver’s multiple timing candidates cannot accidentally count as extra copies.
1×: one checksum-valid copy. 2×: two checksum-valid, matching copies. 3×: three checksum-valid, matching copies. A missing copy leaves the transfer incomplete. A differing copy produces a conflict. Valid bytes may still be downloaded from an incomplete transfer, with that status shown.
What a checksum cannot tell you.
CRC-32 detects accidental corruption; it does not authenticate the sender or encrypt the message. Repetition adds independent consistency checks, but neither repetition nor a checksum proves who sent a message. This is a one-way experiment, without automatic acknowledgements or retries.
SAME is different.
SAME’s existing format sends three header bursts and has no CRC-32 field. Signal Lab counts physical bursts and compares the complete parsed header. It reports matching copies and missing bursts separately, without adding custom fields to SAME audio.
A small header with a very specific job.
The U.S. Emergency Alert System (EAS) uses Specific Area Message Encoding (SAME) to label alerts: who originated them, what kind of event they describe, where they apply, and how long they remain valid. The spoken announcement is a separate audio segment.
Header × 3→Attention signal→Voice→End × 3
Read a header.
ZCZC-EAS-RWT-006037+0015-2990547-LABTEST -
ZCZC
Start-of-header marker.
EAS
Originator. EAS = broadcast station or cable system; WXR = National Weather Service; CIV = civil authorities; PEP = Primary Entry Point system.
RWT
Event code: Required Weekly Test. This classifies the message; it is not the announcement’s text.
006037
Geographical Area block (PSSCCC): all/unspecified portions of Los Angeles County, California. 0 = partition, 06 = state identifier, 037 = county identifier.
0015
Purge time: valid for 00 hours and 15 minutes.
2990547
Issue time (JJJHHMM): day 299 of the year at 05:47 UTC. The year is not carried in the header.
LABTEST
Eight-character station identification field. Here it contains a padded study identifier.
NNNN
End-of-message marker, transmitted in three bursts after the announcement.
Location codes are not ZIP codes.
The six-digit SAME location code uses PSSCCC. SS and CCC are FIPS state/equivalent territory and county/equivalent area identifiers. FIPS expands to Federal Information Processing Standards. P adds a county-partition selector to that five-digit identifier.
A leading 0 covers all or unspecified portions. Non-zero values select locally defined partitions, conventionally numbered 1–9 from northwest to southeast. These are not Census county-subdivision codes; boundaries and which values are valid depend on local alerting plans. The encoder’s place search uses a bundled NOAA directory and explains every digit of your selected codes.
The sound of SAME.
The data rate is about 520.83 bit/s. A 0 uses 1,562.5 Hz; a 1 uses 2,083⅓ Hz. Each burst begins with sixteen 0xAB preamble bytes. Bytes travel least significant bit first. Identical headers are sent three times, with one-second gaps between bursts; the same repetition is used for end markers.
The optional EAS attention signal combines 853 and 960 Hz. NOAA Weather Radio uses a 1,050 Hz attention tone. They share SAME metadata encoding but use different attention signals.
Signal Lab is an educational instrument, independent of emergency alert networks. Its SAME decoder is experimental and does not transcribe speech. In the U.S., 47 CFR § 11.45 restricts transmission of EAS codes and attention signals, including simulations and recordings. A disclaimer does not authorize their use. Review the FCC rule before playback or distribution.
Morse keys a single tone on and off. In radio this is often called CW (continuous wave). Signal Lab uses a 700 Hz audio tone: a dot is a short mark; a dash lasts three dots. The tables below use International Morse characters from ITU-R M.1677-1.
·Dot · 1 unit−Dash · 3 units1 / 3 / 7Element / letter / word gaps
Every silence counts.
Marks within a letter have a one-unit gap. Letters have three units between them; words have seven. In the written preview, spaces separate letters and / separates words. A literal slash in your text is itself encoded as −··−·.
Tap a character to hear it at 15 WPM. WPM means words per minute, conventionally based on the 50-unit word PARIS. At 15 WPM, a dot is 80 milliseconds. These tables cover this app’s supported characters, including É and punctuation.
Try it across the room.
Choose Encoder → Morse and start with HELLO at 15 WPM.
On the receiver, set Morse receive speed → 15 WPM, start the microphone and wait until it is ready.
Transmit. Letters appear as gaps arrive. A longer quiet gap ends the message; the microphone keeps listening.
The decoder targets a 700 Hz tone at the selected speed. It is experimental; irregular hand keying, other pitches, interference and mismatched speed can change letters. Unknown patterns appear as �. A decoded result has no checksum; review the text. For files, emoji or checked copies, use Custom data.
Open the app on two devices. Choose Decoder → Start microphone on one; allow microphone access.
On the other, choose Encoder, type a short message, and transmit at moderate volume.
Keep devices nearby and the receiving tab in the foreground. Loud playback can distort, while quiet playback can disappear into background noise.
If reception fails, use Resilient (100 bit/s). Try moving the devices closer and reducing room noise.
For a controlled experiment, use Test in decoder to decode the generated waveform silently. Custom data and Morse can also be exported as WAV and imported in Decoder.
Playback volume on iPhone.
On supporting browsers, Signal Lab declares media playback so transmitting can use media volume even with Ring/Silent enabled. Before playback, iPhone may show ringtone volume; that indicator alone does not prove media playback is muted. Adjust your device’s volume while the signal plays; Signal Lab uses your system media volume, with no separate app volume control. During microphone use, the app requests a recording-capable session. Older or embedded browsers may still impose their own audio routing.
Microphone access.
Microphone capture requires a secure origin (HTTPS or localhost) and permission. Embedded browsers may impose extra limits. The receiver shows the actual input level in dBFS and whether it detects custom or SAME tone energy. The waveform automatically zooms quiet audio for visibility; this does not amplify the audio sent to the decoder. Diagnostics also show the audio-context state, capture engine, processing settings, input device, and sample rate.
Signal Lab first uses AudioWorklet, loaded from its bundled source. If that is blocked, it can use a compatibility capture engine. The microphone is never played back through the speaker, avoiding a monitoring feedback loop. Listening continues between messages and after verified or incomplete results. Each transfer has its own log entry. While listening, the app requests screen wake lock where available; iOS can still interrupt background or locked-screen capture. Stop closes the microphone’s dedicated audio context and releases the wake lock.
Sensitivity and startup.
Wait for Microphone ready before transmitting. The first custom copy begins with about 1.8 seconds of training tones so the input and tone-level estimates can settle. Repeated copies use a shorter 0.32–0.64 second lead. Normal sensitivity allows one damaged sync bit after a recognizable preamble; Higher lowers the detection floor and allows two. Lower requires exact sync. These settings change acquisition, not the CRC check, and cannot recover audio that was never captured.
Reading an incomplete result.
A result marked 1 / 3 means the header declared three copies and only one checksum-valid copy arrived. Each copy slot names its outcome: Not detected, Header only, CRC failed, or Verified. A copy can be audible yet fail data checks. The app will not silently call that a fully verified transfer. Import processing reports incomplete results at end of file; live capture also watches the expected transfer window.
Import supports recordings up to five minutes and 50 MB; uncompressed WAV is the most predictable format. No audio or payload is uploaded by this app. Receptions stay in this tab’s memory until cleared or reloaded.