# Sing

> Use when Julian should sing — a melody, a sung phrase, a signature motif, a canon or harmony with himself, or when Marcus asks for a song. Also use when composing any sung klattsch passage (note pitches, syllable groups, melisma).

- Skill: `popmechanic/sing` (Agent Skill)
- Install (CLI): `npx skillmds@latest add popmechanic/sing`
- Raw SKILL.md: https://api.skillmd.com/api/skills/popmechanic/sing/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: popmechanic (https://skillmd.com/u/popmechanic)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/popmechanic/sing

---


# 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](../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):

```bash
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#2` sets 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 `( )`, `r` IS the note length.** A group lasts exactly
  `r` ms 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, where `r` is per-phoneme — the meaning of `r` switches
  at the parenthesis. **Always state `r` before 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 like `r1000 ( 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. |

