RTTTL.com
RTTTL field guide · reviewed August 2026

A tiny music format
with a long afterlife.

RTTTL turns a monophonic melody into one readable line of text. This guide separates direct RTTTL support from Nokia-era Composer workflows and firmware-added playback, then shows how to use the format on real hardware.

01

What RTTTL is

Ring Tone Text Transfer Language is a compact, plain-text description of one melodic line. A ringtone contains a name, three useful defaults and a comma-separated series of notes or rests. It contains no sampled audio, chords, lyrics or instruments. That deliberate simplicity makes it easy to store in flash memory, send through an API, inspect by eye and implement on a small processor.

RTTTL grew around Nokia's monophonic ringtone ecosystem. The surviving 1998 text grammar credits John Mostelo; a 1999 revision says it was aligned with Nokia Smart Messaging 2.0. Nokia handsets used closely related Composer and Smart Messaging note commands, but a textual .rtttl file and a binary over-the-air Smart Message are not the same transport format.

RTTTL, RTTL, RTX and Nokring

These names are used inconsistently in old tools and archives. RTTTL is the spelling used on this site. RTX often adds non-standard controls such as loop count or articulation style, so an RTX string may require a parser that explicitly supports those extensions.

How this guide treats evidence

Device claims below link to a manufacturer manual, vendor documentation or a project’s own documentation. “Direct,” “related” and “firmware” support are kept separate so a converter’s claim is not mistaken for a phone feature.

02

Anatomy of a string

Scale:d=4,o=5,b=120:c,d,e,f,g,a,b,c6
Name

A label before the first colon. Ten ASCII characters are the safest choice for classic implementations.

Defaults

d is duration, o octave and b tempo. Omitted values fall back to parser defaults.

Notes

A monophonic sequence. Any token may override the default duration or octave.

SettingMeaningClassic defaultExample
dDefault note denominator4d=8 for eighth notes
oDefault octave6o=5
bQuarter-note tempo63 BPMb=120

The defaults section may contain the settings in any order. For maximum interoperability, include all three explicitly and keep the entire ringtone on one line.

03

Notes, rests and exact timing

A note token follows [duration][pitch][#][octave][.]. Pitch names are c d e f g a b; add # for a sharp and use p for a pause. A leading duration is a denominator, not milliseconds. A trailing dot makes a note 1.5 times as long.

cdefault-duration C
8g#6eighth-note G♯6
2a.dotted half-note A
16psixteenth rest

The classic-safe subset

  • Durations: 1, 2, 4, 8, 16, 32, optionally dotted.
  • Pitches: natural notes and sharps only; flats must be rewritten enharmonically, such as B♭ → A♯.
  • Octaves: target 4–7 unless the exact device documentation says otherwise.
  • Name: no colon; keep it to 10 simple ASCII characters for vintage compatibility.
  • Melody: one note at a time. Simultaneous MIDI notes must be reduced before conversion.

Duration formula

At tempo b, one quarter note lasts 60,000 / b milliseconds. A token with denominator d lasts (60,000 / b) × (4 / d); multiply by 1.5 when dotted. At 120 BPM, 8c lasts 250 ms and 8c. lasts 375 ms.

Extensions are useful, but not universally portable.

RTTTL.com accepts duration 64, octaves outside 4–7 and names up to 64 characters so modern editing and MIDI conversion are practical. The PlayRtttl library also understands RTX loop/style options. Export the classic-safe subset when the destination is unknown.

Hear a valid exampleExample:d=8,o=5,b=132:c,e,g,c6,4p,g,e,2c

04

Where RTTTL really works

Support is not one binary yes/no. Use the support class and transfer path below before choosing an export profile.

Direct

Accepts an RTTTL string or file without converting it first.

Related

Uses Nokia Composer or Smart Messaging tone commands, not necessarily a text file.

Firmware

Playback is supplied by installed firmware, a library or a toolchain.

Device or platformSupportTransfer or playback pathImportant limitEvidence
Nokia 3310 / 3330RelatedEnter or edit notes in Composer; the 3330 manual also documents sending a composed tone to a compatible phone.Do not assume that renaming text to .rtttl makes it directly importable.3310 manual · 3330 manual
Nokia 5210 / 6310 / 7650Related5210: Composer plus OTA receive/send. 6310: receive by OTA or infrared. 7650: save a ringing-tone Smart Message to Composer.Transfer methods and saved-tone capacity vary by model.5210 manual · 6310 manual · 7650 manual
innovaphone IP110, IP200, IP230, IP240, IP240-1000, IP241, IP222, IP232DirectManufacturer feature matrix explicitly lists import of RTTTL and MIDI files for adjustable ringing tones.The cited matrix applies to V7–V10. Check the exact phone firmware or its release notes for later deployments.innovaphone feature list
Hak5 WiFi Pineapple PagerDirectPlace one ringtone per .rtttl file in /root/ringtones; test a file or full string with RINGTONE.Requires file transfer or shell access to the Pager.Hak5 documentation
ESP8266 / ESP32 with ESPHomeFirmwarertttl.play drives a passive buzzer through PWM or an ESPHome speaker component; strings can be supplied by a Home Assistant action.Hardware alone is not RTTTL-native. The documented PWM paths are ESP8266 software PWM and ESP32 LEDC.ESPHome RTTTL component
Apollo TEMP-1, TEMP_PRO-1, PLT-1 and R_PRO-1FirmwareReady-made ESPHome sensors expose buzzers for beeps and RTTTL alerts, including temperature-range warnings.Behavior follows the installed ESPHome configuration.TEMP-1 · TEMP_PRO-1 · PLT-1 · R_PRO-1
M5Stack Dial with ESPHomeFirmwareM5Stack’s Home Assistant guide configures the onboard GPIO3 buzzer as an ESPHome RTTTL player.The example depends on the ESPHome configuration, not factory file association.M5Stack guide
Tasmota on ESP32 with I²S audioFirmwareThe I2SRtttl command plays a supplied string.Requires a custom build with USE_I2S_AUDIO and USE_I2S_RTTTL; I²S audio is not in the normal precompiled binaries.Tasmota I²S Audio
PICAXE chips and Programming EditorToolchainPaste or import RTTTL into Tune Wizard, then generate a monophonic PICAXE tune command.This is an import-and-compile workflow rather than general runtime .rtttl file loading.PICAXE tune command
Modern browsers / RTTTL.comSoftwareParse and synthesize the melody with Web Audio, or convert it to MIDI before using other music software.Browsers do not register RTTTL as an operating-system ringtone format.Open the player · Convert to MIDI
A familiar model number is not enough.

Current reissues such as the modern Nokia 3310, 3210 and 6310 are different products. Their current user guides document choosing installed tones, not the original Composer/Smart Messaging workflow. Verify the generation, firmware and import path—not only the badge on the case.

05

Who RTTTL is useful for now

01

Retro phones and preservation

Recreate a period-correct monophonic tone, transcribe a printed Composer sequence, archive a melody as readable text or prepare it for a model-specific OTA tool.

02

Enterprise telephony

Give teams, queues or sites distinct rings on supported innovaphone generations. A tiny text asset is easy to review, version and distribute alongside phone configuration.

03

Smart-home notifications

Use different motifs for a front door, garage, completed appliance cycle, alarm state or acknowledged automation instead of one ambiguous beep.

04

Environmental and plant sensing

Temperature, humidity, freezer, pool, greenhouse and soil-moisture devices can map thresholds to recognizable local alerts—even when a phone is elsewhere.

05

Industrial and local HMI feedback

Encode startup, success, warning and fault states on a low-cost panel or relay controller without storing WAV files or adding an audio codec.

06

Security and field devices

A portable device such as the WiFi Pineapple Pager can identify event classes through short, user-replaceable ringtone files.

07

Education, games and props

Teach pitch, rhythm, parsing and state machines; add tiny themes to puzzles, toys, escape-room props, badges and tabletop electronics.

08

Low-bandwidth products and APIs

Store a melody in a database, QR code, configuration file or MQTT payload, then render it in a browser or at the edge.

Good alert design is a vocabulary.

Reserve short, distinct patterns for stable meanings: rising = success, falling = failure, alternating = attention, repeated low notes = persistent fault. Keep critical alerts multimodal; RTTTL audio should complement, not replace, visual or safety-certified signaling.

06

Phone deployment workflows

Classic Nokia: Composer or OTA, not a guessed file copy

  1. Identify the exact model and manual.Look for Composer, “receiving a ringing tone,” Smart Messaging, OTA or infrared. Absence from the manual is a reason to stop and verify.
  2. Prepare a conservative melody.Use a ≤10-character name, octaves 4–7, durations through 32, moderate tempo and a short note count.
  3. Choose the documented route.For Composer, use the phone’s keypad controls for note, duration, octave, sharp and rest. For OTA/IR, use a tool that explicitly produces Nokia Smart Messaging ringing-tone data.
  4. Test before distributing.Confirm pitch range, tempo, truncation and the number of custom-tone slots on the physical phone.
Do not paste RTTTL into an SMS and assume it becomes a Smart Message.

A plain text SMS can be read by a person and manually transcribed, but Nokia OTA ringing tones use structured Smart Messaging data. The phone manual’s “receive ringing tone” feature does not prove direct parsing of textual RTTTL.

innovaphone: verify firmware, then import

  1. Match the model.The manufacturer’s V7–V10 matrix names IP110, IP200, IP230, IP240, IP240-1000, IP241, IP222 and IP232.
  2. Match the firmware.For V11 and later, consult the exact release notes or current model documentation because the historical matrix is no longer maintained.
  3. Export a portable RTTTL file.Start with the classic-safe subset and one melody per file. Keep a MIDI conversion available as the documented alternative.
  4. Import through the phone’s documented ringtone configuration.Web-interface paths differ across firmware. Select the imported tone, place a test call and confirm volume and looping behavior.

Hak5 WiFi Pineapple Pager

  1. Create one .rtttl file per tone.The file contains one complete RTTTL string.
  2. Copy it to /root/ringtones.Hak5 documents scp, sftp or editing directly on the device.
  3. Test it from the shell.Run RINGTONE filename, or pass a complete quoted RTTTL string to RINGTONE.
07

Arduino tutorial: passive piezo + PlayRtttl

This route stores the melody in program flash and uses Arduino’s tone() facility to generate a square wave. The PlayRtttl project provides blocking and non-blocking APIs and currently tests examples on Arduino AVR boards, ESP8266, ESP32 and STM32.

1. Parts and wiring

  • An Arduino-compatible board.
  • A passive piezo transducer. An active buzzer with its own oscillator cannot reproduce arbitrary pitches.
  • A current-limiting/driver circuit appropriate to the transducer and board. Never connect a low-impedance loudspeaker directly to a GPIO; follow the component datasheet and board current limits.
  • For the example, connect the signal path to digital pin 11 and the return to ground. Change TONE_PIN when using another supported pin.

2. Install and play once

  1. Install the library.Arduino IDE → Library Manager → search for PlayRtttl → Install.
  2. Create a new sketch.Paste the example below and select the correct board and port.
  3. Upload and listen.The blocking function plays the complete melody during setup().
Arduino C++ · blocking
#include <PlayRtttl.h>

constexpr uint8_t TONE_PIN = 11;
const char melody[] PROGMEM =
  "Signal:d=8,o=5,b=132:c,e,g,c6,4p,g,e,2c";

void setup() {
  playRtttlBlockingPGM(TONE_PIN, melody);
}

void loop() {
}

3. Keep buttons, sensors and networking responsive

For an interactive product, start playback once and call updatePlayRtttl() on every loop. Avoid long delay() calls because the player and your other tasks share the loop.

Arduino C++ · non-blocking
#include <PlayRtttl.h>

constexpr uint8_t TONE_PIN = 11;
const char melody[] PROGMEM =
  "Ready:d=16,o=5,b=140:c,e,g,8c6";

void setup() {
  startPlayRtttlPGM(TONE_PIN, melody);
}

void loop() {
  updatePlayRtttl();

  // Read buttons, update sensors, service networking, etc.
  // Call stopPlayRtttl() when an event should cancel the tone.
}

Troubleshooting

SymptomLikely causeCheck
One fixed buzzActive buzzerUse a passive piezo or suitable speaker driver.
No soundWrong pin, polarity, wiring or unsupported timer pathTest a single tone(TONE_PIN, 440, 500) first.
Playback stallsupdatePlayRtttl() is not called frequentlyRemove blocking delays and service the player every loop.
PWM/servo conflictAnother library uses the same hardware timerConsult the board core and library notes; move pins or choose a different playback backend.
Vintage target sounds wrongModern extensions or unsupported pitch rangeRe-export with durations ≤32, octaves 4–7 and a moderate BPM.

Alternative Arduino libraries

AnyRtttl provides blocking and non-blocking modes, custom timing/tone callbacks and PROGMEM support. NonBlockingRTTTL focuses on keeping I/O responsive. TinyRTTTL is a compact tone()-based class documented for Uno, ESP8266 and ATtiny85. Choose based on board support, timer use, maintenance and license—not only API size.

08

ESPHome + Home Assistant tutorial

ESPHome’s RTTTL component can drive a passive buzzer from ESP8266 software PWM or ESP32 LEDC, and it can alternatively render through an ESPHome speaker component. The RTTTL string is templatable, so Home Assistant can send a melody at runtime.

ESP32 example

  1. Wire a passive buzzer safely.The example uses GPIO25. Use the correct driver circuit and a pin suitable for your board.
  2. Add the output and RTTTL component.gain controls the component output level; actual loudness also depends on the hardware.
  3. Expose an API action.Home Assistant can then supply any validated RTTTL string as song.
ESPHome YAML
esphome:
  name: hallway_chime

esp32:
  board: esp32dev

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

logger:

output:
  - platform: ledc
    pin: GPIO25
    id: buzzer_output

rtttl:
  output: buzzer_output
  id: rtttl_player
  gain: 60%
  on_finished_playback:
    - logger.log: "RTTTL playback finished"

api:
  actions:
    - action: play_rtttl
      variables:
        song: string
      then:
        - rtttl.stop
        - rtttl.play:
            rtttl: !lambda 'return song;'

After the node is connected to Home Assistant, open Developer Tools → Actions and select the generated ESPHome action for hallway_chime. Supply, for example:

Action data
song: "Door:d=8,o=5,b=140:c,e,g,4c6"

Practical smart-home mappings

OK:d=16,o=6,b=160:c,e,g,c7Automation completed
Door:d=8,o=5,b=140:c,e,g,4c6Front door or visitor
Warn:d=8,o=5,b=110:a,p,a,p,aThreshold warning
Fault:d=8,o=4,b=90:g,e,c,2cPersistent fault

Ready-made examples make the audience broader than DIY boards: the ESPHome device repository documents Apollo temperature, plant and PoE multisensors with RTTTL-capable buzzers, while M5Stack publishes an ESPHome/Home Assistant RTTTL setup for the M5Dial’s onboard buzzer.

Tasmota: optional I²S RTTTL

Tasmota documents I2SRtttl for ESP32 audio builds. This is an advanced path: compile firmware with USE_I2S_AUDIO and USE_I2S_RTTTL, configure the I²S output, then issue a console, HTTP or MQTT-backed command such as:

Tasmota console
I2SRtttl Signal:d=8,o=5,b=132:c,e,g,c6,4p,g,e,2c

The ordinary Tasmota Buzzer command is a beep/silence pattern with a bitmask; it is not the same as RTTTL. Use I2SRtttl only when the audio build and RTTTL option are present.

PICAXE: convert at development time

  1. Open PICAXE Tune Wizard.In Programming Editor, choose PICAXE → Wizard → Tune Wizard.
  2. Paste or import RTTTL.Use Edit → Paste Ringtone for copied text or File → Import Ringtone for a saved file.
  3. Preview and generate.Test the monophonic tune, optionally select flashing outputs, then insert the generated tune command into the BASIC program.
09

Ways to implement RTTTL

Smallest runtime

Precompile notes

Parse RTTTL during the build or on a server and store frequency/duration pairs. The device needs no text parser, but melodies are less editable after deployment.

Best for embedded products

Parse from flash

Store RTTTL strings in program memory and parse one token at a time. This preserves readable assets with modest RAM use.

Best for smart home

Send at runtime

Validate centrally, then deliver a string over a local API or MQTT. One device can play different event themes without reflashing.

Best for the web

Synthesize in browser

Parse to frequency and duration, schedule oscillators with Web Audio, and visualize the same parsed note model in a piano roll.

Best for interoperability

Convert to MIDI

Map pitches and durations to one MIDI track. Quantize or select a melody first because RTTTL cannot preserve chords, velocity, instruments or controller data.

Best for archives

Store text + metadata

Keep the original string, a normalized form, title, composer, ringtone creator, source, rights, tags and a compatibility profile. Do not hide authorship inside the ten-character RTTTL name.

Minimal parser algorithm

  1. Split exactly twice on :.Validate a non-empty name, defaults section and notes section.
  2. Parse defaults.Accept d, o and b; reject duplicates and out-of-range integers.
  3. Tokenize notes on commas.For each token, read optional duration, pitch/rest, optional sharp, optional octave and optional dot.
  4. Resolve timing and pitch.Apply defaults, calculate duration, then convert pitch and octave to frequency or MIDI note number.
  5. Schedule sequentially.A rest advances time without sounding. Never overlap notes in a strict RTTTL renderer.
  6. Return warnings separately.A long name or wide octave may be valid for a modern parser but unsafe for vintage hardware.

Production checklist

  • Bound input length and maximum note count.
  • Normalize whitespace and letter case.
  • Reject malformed tokens with a position.
  • Cap total playback time and frequency range.
  • Stop a current melody before replacing it.
  • Keep playback non-blocking where other I/O matters.
  • Separate classic warnings from syntax errors.
  • Preserve the original alongside normalized output.
  • Test rests, dots, sharps and default overrides.
  • Document timer, pin and amplifier constraints.