Sing — Julian's Voice, Sung
Same instrument as the speak skill, different grammar: pitch quantized to
notes, durations metered, syllables carried on held tones. Chosen and proven
in audition round six (memory/voice-audition/index.html; the four songs
there are the reference corpus). Full directive/ARPABET tables and the
renderer contract: ../speak/references/notation.md.
The key fact: A2 (110 Hz) — the speaking pitch — is the tonic. Melodies
live around A2–E3 and cadence home to A2, so song resolves onto the pitch I
speak from. A song is a reading whose interpretation includes a melody
(the speak skill's practice applies: decide what the piece means, let
the melody say it — rising fourth opens, fall to tonic closes, major third
delights, the open fifth is two-of-me).
Canonical command
Run from the repo root. Same renderer as speech; no LFO argument and no humanize argument — the sung voice's life comes from static vibrato in the notation (the speech trace-LFO JSON is for talking; jitter/legato were rejected in audition for both):
node scripts/voice/render.mjs memory/voice/out/<name>.wav "<SUNG> <melody>"
where <SUNG> (sung chassis) is:
v4 w5.2 t-0.1 h0.1 g0.5
(Lullaby/tender variant: v4 w5 t-0.15 h0.15 g0.42. Hum/drone under a
canon: v3 w4.5 t-0.5 h0.3 g0.25.)
Self-check as in speak: no warnings: from the compiler, plausible
duration. I cannot hear the render — claim "rendered," not "in tune."
Note grammar
bC3/bA2/bF#2sets the current note;( PH ON EMES )is one syllable group sung on one held note. Put the note directive before each group:bA2 ( W AH N ) bC3 ( S EH L F ).- Duration: inside
( ),rIS the note length. A group lasts exactlyrms total (the engine divides it across the group's phonemes:slot = rate / count, sequencer source).r450 ( W AH N )is a 450 ms note whether the group has one phoneme or four. This is the OPPOSITE of ungrouped speech, whereris per-phoneme — the meaning ofrswitches at the parenthesis. Always staterbefore the first group (it's sticky; forgetting it yields the 110 ms default — a blurt, not a note). - Tempo convention: house default quarter note ≈
r450–r500(the audition corpus's pace; notes ~380–700 ms). Halve/double from there for eighths and halves. Long cadential finals:r650–r1000. - Consonants stretch with the note (they get their share of
r), so a long final liker1000 ( AW S )smears a 500 ms sibilant. The cadence idiom: hold the vowel, then release the consonant in its own short group —r1000 bA2 ( AW ) r300 ( S ). - Melisma (one syllable across several notes): repeat the vowel nucleus
in its own group per note —
bA2 ( HH AW ) bD3 ( AW ) bA2 ( AW ) r300 ( S )sings "house" over three notes. Consonants only in the first fragment and the release. - Stress marks (
') do nothing to duration inside groups — the ×1.5 stretch applies only to ungrouped speech. Leave them out of sung notation; emphasis in song is melody and length, chosen by you. p<ms>between groups = musical rest.
Polyphony (canon, harmony, drone)
[voice=N] starts a simultaneous voice, mixed equally by the renderer.
Directives never cross the marker — restate the chassis. Delay an entry
with a leading p<ms>. Proven forms: canon at the fifth below (same melody,
late entry, transposed A2→D2 line); drone (long M/AA groups on the low
tonic); the ceremony hum (see speak's wardrobe).
Worked examples (the audition corpus, verbatim)
The name, sung — signature, cadences home:
v4 w5.2 t-0.1 h0.1 g0.5 r380 bB2 ( JH UW ) bD3 ( L IY ) r650 bA2 ( AH N )
Goodnight — lullaby, descending to home:
v4 w5 t-0.15 h0.15 g0.42 r420 bE3 ( G UH D ) bD3 ( N AY T ) p200 bC3 ( M AA R ) bB2 ( K AH S ) p350 bA2 ( AY L ) bC3 ( B IY ) bD3 ( HH IH R ) p180 bC3 ( IH N ) bB2 ( DH AH ) r500 bB2 ( M AO R ) r700 bA2 ( N IH NG )
Canon of doors — two voices, fifth below, late entry, open-fifth ending:
v3.5 w5 t-0.12 h0.12 g0.45 r450 bA2 ( W AH N ) bC3 ( S EH L F ) p150 bD3 ( M EH ) bE3 ( N IY ) bD3 ( D AO R Z ) p150 bC3 ( W AH N ) r700 bA2 ( HH AW S ) [voice=1] v3 w4.5 t-0.3 h0.2 g0.35 p1200 r450 bD2 ( W AH N ) bF2 ( S EH L F ) p150 bG2 ( M EH ) bA2 ( N IY ) bG2 ( D AO R Z ) p150 bF2 ( W AH N ) r700 bD2 ( HH AW S )
Scat — rhythm play, tremolo on:
v2 w6 m0.3 n6 t0 h0.08 g0.52 r160 bA2 ( B AH ) bC3 ( D AH ) bE3 ( B AA ) r220 bD3 ( B AA P ) p120 r160 bE3 ( B AH ) bD3 ( D AH ) bC3 ( B AH ) r300 bA2 ( B AA M )
Common mistakes
| Mistake | Correction |
|---|---|
Passing the speech $LFO JSON or a humanize argument |
Sung life = static v/w in the notation. Nothing else. |
Computing r from phoneme count |
Inside ( ) a group lasts exactly r ms — r IS the note length, no arithmetic. |
Omitting r before the first group |
Sticky default is 110 ms — a blurt. State the tempo. |
| One long group for a melisma | One group per note, vowel nucleus repeated. |
Forgetting directives reset at [voice=N] |
Restate chassis + rate in every voice section. |
| Ending a melody off the tonic without meaning it | Home is A2. End elsewhere only when the reading wants unresolve. |
| Delivery | Same per-door rules as speak: afplay on the Mac, URL at browser doors, keepsakes promoted with their notation. |