QMK song syntax
Here is ODE_TO_JOY, which comes predefined in QMK:
#define ODE_TO_JOY Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), \
Q__NOTE(_G4), Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), \
Q__NOTE(_D4), Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), \
Q__NOTE(_E4), QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4)
You can find more predefined songs in quantum/audio/song_list.h.
A song is a comma-separated sequence of notes. Each note has a pitch
frequency and a duration, represented using C preprocessor macros. For
example, Q__NOTE(_E4) is a quarter note on the E key, 4th
octave.
Note pitch is one of the twelve semitones
_C, _CS, _D, _DS,
_E, _F, _FS, _G,
_GS, _A, _AS, _B
followed by an octave 0 through 8, such as
_CS3 for C♯, 3rd octave. Flats can be written similarly
with F, for instance, _DF3 is the same as
_CS3. Specially, _REST in place of the pitch
creates a rest.
Note duration (quarter note, whole note, etc.) is represented with the following:
| Macro | Duration |
|---|---|
B__NOTE |
2 beats, breve note |
W__NOTE |
1 beat, whole note |
H__NOTE |
1/2 beat, half note |
Q__NOTE |
1/4 beat, quarter note |
E__NOTE |
1/8 beat, eighth note |
S__NOTE |
1/16 beat, sixteenth note |
T__NOTE |
1/32 beat, thirty-second note |
Dotted notes
are written with a D as QD_NOTE for a 3/8 beat
note, and similarly for other durations. For full flexibility, a note of
any duration may be defined with the syntax
M__NOTE(pitch, duration), where pitch is a
pitch and duration is a number in units of 1/64ths of a
beat. For instance M__NOTE(_C4, 64) is longhand for
W__NOTE(_C4).
Under the hood, song data is stored as a float[][2]
array, using pair of floats per note. The first float stores the pitch
frequency in Hz and the second stores the duration in units of 1/64ths
of a beat.