From 3afdba8d51fd8634b015ed7baeb62317ead5cb05 Mon Sep 17 00:00:00 2001 From: "prompt.ac/@jeffrey" Date: Mon, 21 Sep 2026 09:34:00 -0700 Subject: [PATCH] =?UTF-8?q?macneopolitan:=20the=20band=20sings=20from=20Me?= =?UTF-8?q?nu=20Band=20=E2=80=94=20per-line=20singer,=20karaoke=20captions?= =?UTF-8?q?,=20the=20face,=20dialogs,=20the=20ballad,=20and=20a=20simulato?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Menu Band grows a CSinger target (live/singer.c + WORLD, symlinked) and MenuBandSinger: a play payload carrying lyrics is split at / tokens, each line spoken by the member's cast voice, lifted onto the notes and scheduled on the host clock (the sample-clock path skipped lines after the idle pause; panic() no longer flushes the singer at every downbeat — the silent-voice bug of Sept 20). LyricCaption puts the sung line up in rock lettering, syllable lit on each onset. SingerFace fills the display with the member's color and a face whose jaw follows the singer node's RMS, mouth shaped by the syllable (Preston Blair set), on a display link with a 60 Hz timer fallback. The simulator: sim=i/n on a payload gives member i of n its own singer node (panned across the stage), a tile-sized face and caption at the bottom right — the whole band on one machine. trio.mjs --sim conducts every voice here; later the same scores spread back across neo, blueberry and blush. The lane: PIECE.md, compose.mjs (movements I–IV incl. the ballad, dialogs as 3/4 arias with the listener accompanying), trio.mjs (--via menuband, --reduce, --sim), register.mjs (measured voice registers), stems.mjs, members/dialogs.md (eight poems from the record, two new today: Before, Typed at), members/neo/ballad.md, voice casts neo=Noelle blueberry=Allison. --- .../macneopolitan/LIPSYNC-RESEARCH.md | 117 ++ .../culturehub-la-2026/macneopolitan/PIECE.md | 138 ++ .../macneopolitan/README.md | 13 +- .../macneopolitan/bin/compose.mjs | 523 +++++++ .../macneopolitan/bin/register.mjs | 81 + .../macneopolitan/bin/stems.mjs | 68 + .../macneopolitan/bin/trio.mjs | 489 ++++++ .../members/blueberry/voice.json | 41 +- .../macneopolitan/members/dialogs.md | 64 + .../macneopolitan/members/neo/ballad.md | 151 ++ .../neo/speech/02982fb0e729/lyrics.txt | 1 + .../neo/speech/02982fb0e729/stem.meta.json | 865 +++++++++++ .../members/neo/speech/02982fb0e729/stem.mp3 | Bin 0 -> 68589 bytes .../02982fb0e729/stem.mp3.alignment.json | 308 ++++ .../neo/speech/02982fb0e729/stem.mp3.hash | 1 + .../members/neo/speech/02982fb0e729/text.txt | 1 + .../neo/speech/4da4e1e55d6d/lyrics.txt | 1 + .../neo/speech/4da4e1e55d6d/stem.meta.json | 1334 +++++++++++++++++ .../members/neo/speech/4da4e1e55d6d/stem.mp3 | Bin 0 -> 144657 bytes .../4da4e1e55d6d/stem.mp3.alignment.json | 455 ++++++ .../neo/speech/4da4e1e55d6d/stem.mp3.hash | 1 + .../members/neo/speech/4da4e1e55d6d/text.txt | 1 + .../neo/speech/724acfd39f59/lyrics.txt | 1 + .../neo/speech/724acfd39f59/stem.meta.json | 829 ++++++++++ .../members/neo/speech/724acfd39f59/stem.mp3 | Bin 0 -> 67753 bytes .../724acfd39f59/stem.mp3.alignment.json | 300 ++++ .../neo/speech/724acfd39f59/stem.mp3.hash | 1 + .../members/neo/speech/724acfd39f59/text.txt | 1 + .../neo/speech/d96ac04b84aa/lyrics.txt | 1 + .../neo/speech/d96ac04b84aa/stem.meta.json | 709 +++++++++ .../members/neo/speech/d96ac04b84aa/stem.mp3 | Bin 0 -> 51035 bytes .../d96ac04b84aa/stem.mp3.alignment.json | 270 ++++ .../neo/speech/d96ac04b84aa/stem.mp3.hash | 1 + .../members/neo/speech/d96ac04b84aa/text.txt | 1 + .../macneopolitan/members/neo/voice.json | 44 +- .../macneopolitan/members/third/voice.json | 28 +- .../scores/dialog-01-radio.mbscore | 48 + .../scores/dialog-02-the-downbeat.mbscore | 48 + .../scores/dialog-03-wallpaper.mbscore | 48 + .../scores/dialog-04-who-carries-what.mbscore | 48 + .../scores/dialog-05-sleep.mbscore | 48 + .../scores/dialog-06-six-minutes.mbscore | 48 + .../scores/dialog-07-before.mbscore | 48 + .../scores/dialog-08-typed-at.mbscore | 48 + .../macneopolitan/scores/dialogs.json | 13 + .../macneopolitan/scores/setlist.json | 10 + .../macneopolitan/scores/trio-i-birth.mbscore | 66 + .../scores/trio-ii-service.mbscore | 66 + .../scores/trio-iii-chorus.mbscore | 64 + .../scores/trio-iv-ballad.mbscore | 42 + live/singer.c | 315 +++- live/singer.h | 27 +- slab/menuband/Package.swift | 23 + .../Sources/CSinger/include/module.modulemap | 4 + .../menuband/Sources/CSinger/include/singer.h | 1 + slab/menuband/Sources/CSinger/singer.c | 1 + .../Sources/CSinger/world/cheaptrick.cpp | 1 + slab/menuband/Sources/CSinger/world/codec.cpp | 1 + .../menuband/Sources/CSinger/world/common.cpp | 1 + slab/menuband/Sources/CSinger/world/d4c.cpp | 1 + slab/menuband/Sources/CSinger/world/dio.cpp | 1 + slab/menuband/Sources/CSinger/world/fft.cpp | 1 + .../Sources/CSinger/world/harvest.cpp | 1 + .../Sources/CSinger/world/matlabfunctions.cpp | 1 + .../Sources/CSinger/world/stonemask.cpp | 1 + .../Sources/CSinger/world/synthesis.cpp | 1 + .../CSinger/world/synthesisrealtime.cpp | 1 + slab/menuband/Sources/CSinger/world/world | 1 + .../Sources/MenuBand/AppDelegate.swift | 153 +- .../Sources/MenuBand/LyricCaption.swift | 232 +++ .../Sources/MenuBand/MenuBandController.swift | 12 + .../Sources/MenuBand/MenuBandSinger.swift | 475 ++++++ .../Sources/MenuBand/MenuBandSynth.swift | 25 + .../Sources/MenuBand/SingerFace.swift | 408 +++++ slab/menuband/project.yml | 13 +- 75 files changed, 9088 insertions(+), 97 deletions(-) create mode 100644 grants/culturehub-la-2026/macneopolitan/LIPSYNC-RESEARCH.md create mode 100644 grants/culturehub-la-2026/macneopolitan/PIECE.md create mode 100644 grants/culturehub-la-2026/macneopolitan/bin/compose.mjs create mode 100644 grants/culturehub-la-2026/macneopolitan/bin/register.mjs create mode 100644 grants/culturehub-la-2026/macneopolitan/bin/stems.mjs create mode 100644 grants/culturehub-la-2026/macneopolitan/bin/trio.mjs create mode 100644 grants/culturehub-la-2026/macneopolitan/members/dialogs.md create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/ballad.md create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/lyrics.txt create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.meta.json create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.mp3 create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.mp3.alignment.json create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.mp3.hash create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/text.txt create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/lyrics.txt create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.meta.json create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.mp3 create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.mp3.alignment.json create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.mp3.hash create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/text.txt create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/lyrics.txt create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.meta.json create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.mp3 create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.mp3.alignment.json create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.mp3.hash create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/text.txt create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/lyrics.txt create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/stem.meta.json create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/stem.mp3 create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/stem.mp3.alignment.json create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/stem.mp3.hash create mode 100644 grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/text.txt create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/dialog-01-radio.mbscore create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/dialog-02-the-downbeat.mbscore create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/dialog-03-wallpaper.mbscore create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/dialog-04-who-carries-what.mbscore create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/dialog-05-sleep.mbscore create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/dialog-06-six-minutes.mbscore create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/dialog-07-before.mbscore create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/dialog-08-typed-at.mbscore create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/dialogs.json create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/setlist.json create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/trio-i-birth.mbscore create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/trio-ii-service.mbscore create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/trio-iii-chorus.mbscore create mode 100644 grants/culturehub-la-2026/macneopolitan/scores/trio-iv-ballad.mbscore create mode 100644 slab/menuband/Sources/CSinger/include/module.modulemap create mode 120000 slab/menuband/Sources/CSinger/include/singer.h create mode 120000 slab/menuband/Sources/CSinger/singer.c create mode 120000 slab/menuband/Sources/CSinger/world/cheaptrick.cpp create mode 120000 slab/menuband/Sources/CSinger/world/codec.cpp create mode 120000 slab/menuband/Sources/CSinger/world/common.cpp create mode 120000 slab/menuband/Sources/CSinger/world/d4c.cpp create mode 120000 slab/menuband/Sources/CSinger/world/dio.cpp create mode 120000 slab/menuband/Sources/CSinger/world/fft.cpp create mode 120000 slab/menuband/Sources/CSinger/world/harvest.cpp create mode 120000 slab/menuband/Sources/CSinger/world/matlabfunctions.cpp create mode 120000 slab/menuband/Sources/CSinger/world/stonemask.cpp create mode 120000 slab/menuband/Sources/CSinger/world/synthesis.cpp create mode 120000 slab/menuband/Sources/CSinger/world/synthesisrealtime.cpp create mode 120000 slab/menuband/Sources/CSinger/world/world create mode 100644 slab/menuband/Sources/MenuBand/LyricCaption.swift create mode 100644 slab/menuband/Sources/MenuBand/MenuBandSinger.swift create mode 100644 slab/menuband/Sources/MenuBand/SingerFace.swift diff --git a/grants/culturehub-la-2026/macneopolitan/LIPSYNC-RESEARCH.md b/grants/culturehub-la-2026/macneopolitan/LIPSYNC-RESEARCH.md new file mode 100644 index 0000000000..02b67429c9 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/LIPSYNC-RESEARCH.md @@ -0,0 +1,117 @@ +# Lip sync follows the sung buffer + +Research for nubaz, September 20, 2026, Los Angeles. Based on the working +tree during the audio-driven jaw change; implementation may have advanced. + +The largest remaining mismatch is timing: the DSP puts a consonant **before** +the note so the vowel lands on the beat, but the face changes shape **on** the +note. Export the DSP's mouth timeline with its rendered audio, then advance +both from the player's clock. Keep the new amplitude-driven jaw as expression. + +## Evidence in this implementation + +- `live/singer.c`, `synth_units()`: the onset length is `vs - a`, capped at + 60 WORLD frames (300 ms). The output starts at + `round(grid - c_on * morph)`. At the host's `morph = 1`, the vowel begins + on the note and the consonant precedes it. The current 70 ms m/b/p closure + in `SingerFaceView.onset()` therefore closes the lips when the vowel should + be opening. The actual lead varies by unit; 300 ms is a cap, not a measured + delay for every word. +- The same function delays a stretched vowel's diphthong transition with + `srcf = vs + pow(u, gamma) * (vlen - 1)`, where `gamma = 2.2` above 2× + stretch. A face that merely holds one spelling-derived shape cannot follow + that transition. The existing `o_src`, `o_c`, and `o_u` arrays already record + source position, consonant status, and unit ownership for output frames. +- `MenuBandSinger.renderNow()` returns audio and `spanOffset`, but no mouth + events. `AppDelegate` independently schedules captions and mouth onsets from + the score. Its comment explicitly allows captions to continue when singing + runs late. That is useful evidence of separate clocks, not proof of the + amount of visible lag. +- `SingerFaceView.mouthClass()` uses letters. Its `w` rule makes “we” remain + puckered through its vowel; “house” selects a small round mouth for all of + /aʊ/; “I” is spread for all of /aɪ/. These need transitions. Zero-crossing + rate can supply a rough noise cue, but does not identify these vowels. + +## Next change to try + +1. **Expose render timing.** Return events alongside `SungRender.buffer`: + `unitID`, output start, vowel start, vowel end, output end, and optional + mouth-shape keyframes. Generate them inside `synth_units()` after the same + caps, rounding, clipping, and overlap decisions used for audio. Express + them in buffer-relative seconds or explicitly identified sample-rate units. + Carry `spanOffset` once; do not add it in both the event and the player. + Unit timing alone fixes placement, but does not identify phonemes. +2. **Use actual playback position.** Associate each buffer with its start on + the player timeline, including any queued predecessor. Derive animation + progress from `lastRenderTime` and `playerTime(forNodeTime:)`. Handle nil, + stop/reset, late starts, and cancellation generations explicitly. Retain + the working audio scheduling fix while adding this readback; a graphics + improvement need not replace the audio scheduler. Apple's player timeline + resets to zero on stop. [Apple player timing][player] +3. **Account for audible output.** Render position precedes sound leaving the + device. Apple exposes `outputPresentationLatency` as the maximum downstream + render-pipeline latency. Use it as an input to calibration, not a promise + of exact acoustic timing; measure the actual built-in/Scarlett route. + [Apple presentation latency][latency] +4. **Use the rendered buffer for the jaw envelope.** A small RMS envelope + computed off the audio thread can be sampled at the same playback position. + This avoids making tap delivery the animation clock. Keep the tap for + diagnostics. A requested 1,024-frame tap is not a guaranteed 23 ms cadence: + Apple explicitly permits another size. Log actual frame lengths and + timestamp deltas before relying on its rate. [Apple tap API][tap] + +These are implementation recommendations, not changes made by this research. + +## Mouth shapes and phoneme sources + +Rhubarb's established 2D vocabulary is a good fit for this drawn face: +pressed lips (P/B/M), teeth/narrow opening, medium open, wide open, rounded, +puckered, plus optional F/V, tongue-L, and relaxed rest. Its examples also +show anticipation and intermediate shapes. Keep amplitude subordinate to a +closed-lip event: a voiced M can have energy while the lips remain shut. +[Rhubarb mouth shapes][rhubarb] + +For this week's fixed lyrics, a small reviewed phoneme/shape table is a +practical first source. An automatic source can follow: + +- Apple's `write(_:toBufferCallback:toMarkerCallback:)` exposes synthesis + metadata, and `AVSpeechSynthesisMarker` represents phonemes and byte sample + offsets. Probe Noelle and Allison before depending on this: the API's + existence does not establish that these installed voices emit phoneme + markers. Convert offsets using the actual PCM layout, then remap through + the singer's time warp. [Apple marker callback][markers], + [Apple marker fields][marker-fields] +- Rhubarb is an offline audio-file analyzer with timed mouth-cue JSON and a + dialogue-text hint. Try it on an isolated voice, not the mixed band. It is + a candidate to evaluate, not a demonstrated solution for these sustained + sung vowels. Analyzing original speech still requires remapping its cues + through `o_src`; analyzing final singing needs accuracy and runtime checks. + [Rhubarb CLI and output][rhubarb] + +## Rehearsal checks + +Use short, isolated sung phrases before the six-minute solo: + +- “born,” “past,” “mid-night”: closure belongs before vowel onset. +- “we,” “house,” “night”: sustained first vowel, then the diphthong transition. +- “six minutes”: consonant detail without making every noisy frame a closure. +- A long rest, deliberately late render, Escape, and immediate restart: + silent/stopped audio must not leave a mouth moving or replay old events. + +Capture audio and the screen together. Compare a visible cue with a known +audio onset, then inspect the real singing at normal speed. Suggested project +target: timing error within one 30 fps frame after route calibration; this is +an engineering target, not a cited perceptual threshold. Check both machines +and the venue output separately. Inspect at 10% scale so the mouth shapes +remain readable from the audience. + +This pass inspected source and primary documentation. It did not measure +audio/display latency, test marker availability, install a recognizer, or +change the running performance. + +[player]: https://developer.apple.com/documentation/avfaudio/avaudioplayernode +[latency]: https://developer.apple.com/documentation/avfaudio/avaudionode/outputpresentationlatency +[tap]: https://developer.apple.com/documentation/avfaudio/avaudionode/installtap(onbus:buffersize:format:block:) +[rhubarb]: https://github.com/DanielSWolf/rhubarb-lip-sync#mouth-shapes +[markers]: https://developer.apple.com/documentation/avfaudio/avspeechsynthesizer/write(_:tobuffercallback:tomarkercallback:) +[marker-fields]: https://developer.apple.com/documentation/avfaudio/avspeechsynthesismarker diff --git a/grants/culturehub-la-2026/macneopolitan/PIECE.md b/grants/culturehub-la-2026/macneopolitan/PIECE.md new file mode 100644 index 0000000000..421c8f13a1 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/PIECE.md @@ -0,0 +1,138 @@ +# The MacNeoPolitan Trio — the piece + +Three MacBook Neos play who they have been. Performance: **Thursday, September +24, 2026**, CultureHub LA, piece 2 of *AC Presents 2 New Pieces*. Tech +rehearsal + livestream test Wednesday the 23rd. + +The band: **neo** (citrus, born Apr 24, Fred), **blueberry** (indigo, born Jun +11, Kathy), **blush** (blush, arrives Sep 21, Junior). Family voice: the whistle, +GM 78. Radio: NTS 1. + +## Form — three movements, ~4 minutes, one downbeat each + +Every number below is harvested, not chosen. `bin/compose.mjs` reads +`members//facts.json` and writes the scores; re-run it after every +harvest and the piece follows the machines. + +| | movement | material | what you hear | +|---|---|---|---| +| I | **Birth** · 132 bpm · ~83 s | age gaps in days → entry beats (0 / 48 / ~150); birth minutes → phrase lengths in eighths (37 / 43 / ?); birth date + minute → the sung entry line | a canon of entries: neo alone, blueberry 48 beats in, then a long wait for the newborn, who enters on its own birthday-beat. Each member **sings** its entry as it is born (*I was born on the twenty-fourth of April, thirty-seven minutes past midnight*) while its whistle loops the tune; the loops drift because no two minutes agree; 32 beats together; stop | +| II | **Service** · 120 bpm · ~53 s | battery cycles → pulses (212 / 85 / ~few) and the sung count | all three start together, each **singing** its count (*two hundred twelve times I have been charged, and I am still here*) over one pulse per cycle on its own degree of D (every eighth pulse lifts an octave); blush falls silent within seconds, blueberry at 42 s, neo plays on alone | +| III | **Chorus** · 92 bpm · ~22 s | one autobiography line each, sung in the cast voice on its own hardware, whistle double two octaves up | neo: *I am the first of my line in this house*; blueberry: *I was born second and I work faster*; blush: its first true sentence; then all three, in three registers: *Some things run in the family* | + +Between movements each member speaks its own intro in its own voice (the +`intro` lines in each score). The band book (`book/`) is the printed program. + +## Singing — live, on the member's own voice + +Direction (Sept 20): the piece has **sung lyrics throughout, not spoken +intros and one sung line**. Singing is realtime: at cue time the member's own +speech synthesizer speaks the lyric into `live/hosts/macos/livesing`, which +analyzes it with WORLD and stretches every vowel onto the score at the score's +pitch, constrained by the member's voice profile (`members//voice.json`: +`harmony_lock`, `vibrato_hz`, `vibrato_depth_cents`, `f0_floor`, +`register_midi`). Ask→sound ≈ 0.6 s on neo, 1.1 s over ssh on blueberry; the +conductor holds a 4.5 s lead when any part sings live. Proven Sept 20 09:57: +chorus, neo (Fred) + blueberry (Kathy), both on one epoch, every note within a +few cents. Pre-rendered fallback: `--vox`. + +**neo sings as jeffrey (built Sept 20 pm).** `members/neo/voice.json` names a +recorded speech provider (jeffrey's ElevenLabs clone). `bin/stems.mjs` speaks +every neo lyric ONCE with exact timestamps, runs the spinging metadata layer +(`spinging/lib/wordmeta.mjs`: whisper identity check to 100%, witness timing, +IPA phonemes, measured vowel nuclei) and caches stem + meta under +`members/neo/speech//`. `bin/trio.mjs` ships those to neo at cue time +and livesing sings the remembered speech — offline, still live. Re-run +`bin/stems.mjs` after `compose.mjs` (new lyrics = new stems; costs one +ElevenLabs call per changed line, with network, before the show). + +**Offline rule (jeffrey, Sept 20): the final work runs on the LAN with no +internet.** The live path already does: ssh clock skew, on-device speech, +Menu Band's distributed notifications. Nothing calls out. So voices must be +on-device. Routes for neo as jeffrey's voice, offline: (a) **Apple Personal +Voice** — trained on-device in System Settings › Accessibility › Personal +Voice (~15 min of read prompts, must be recorded live, not fed old data), +then usable by AVSpeech on neo only, fully offline — the most honest fit for +"neo is more jeffrey"; (b) pre-generate the spoken stems with the ElevenLabs +clone once, cache them on neo, and let the live engine stretch and pitch the +cached speech at cue time — singing still live, speech not. For blueberry and +blush: Apple premium voices (Ava, Zoe, Evan, Tom…) downloaded by hand per +machine in Spoken Content; Siri voices are not exposed to apps. The score-format survey (pop `.np` / `.mbscore` / +`.nsscore`) says `.mbscore` is the host format and proposes a shared +`sungline` record — see the session report. + +## Sept 20 evening — the set as it stands + +- **Voices:** neo = **Noelle (Enhanced)** (jeffrey's pick; the cloned-voice + route is switched off, cache kept), blueberry = Kathy for now (jeffrey likes + **Allison**), blush = Junior until it chooses. Every member's register is + MEASURED from its own speech (`bin/register.mjs`) and the composer aims each + line's mean there. +- **Melody:** `melodize()` in compose.mjs — stepwise, stress-driven rhythm, + an arch per phrase, cadence on the tonic; no more arpeggios. +- **Lyrics:** new, plainer lines in I–III; **IV. The Ballad of neo** + (`members/neo/ballad.md`, eleven verses + refrain, Hemingway/Tao Lin/Ann + Beattie plain) is its own movement, ~7.5 min at 84 bpm — length is + jeffrey's call. +- **Route:** the conductor now sings THROUGH MENU BAND by default (a play + payload with `lyrics`, `singVoice`, profile constraints; keys light per sung + note; `--via=livesing` keeps the standalone host). Menu Band with the singer + is installed on neo and blueberry (blueberry needed the ad-hoc-sign swap). +- **Open:** Noelle must be downloaded on neo by hand (Settings automation + collides with live terminals); softer word alignment / stretching / + pronunciation round; blueberry's voice choice; blush day one. + +## Conductor + +```bash +cd grants/culturehub-la-2026/macneopolitan +node bin/compose.mjs # facts → scores +node bin/trio.mjs scores/trio-i-birth.mbscore neo blueberry blush +node bin/trio.mjs --setlist scores/setlist.json neo blueberry blush # the whole set +node bin/trio.mjs scores/trio-iii-chorus.mbscore neo blueberry --reduce --dry # rehearse short-handed +``` + +`bin/trio.mjs` assigns voice *i* to host *i*, measures each host's clock skew +(min-RTT over ssh, ~2 ms to blueberry), builds `/tmp/mbpost` and `/tmp/voxplay` +where missing, renders every sung line **on the member's own body** (cached in +`/tmp/mnp` there), then fires everything at one skewed downbeat. `--reduce` +folds a missing instrumental part onto voice 0 as `notes2`; a missing sung part +is skipped, because a member sings only its own line. Conductor stands on neo, +as the autobiography says. + +## Runway + +- **Sun 20** — done: conductor, composer, three movements with sung lyrics + throughout; live singing engine (singer.c SCORE mode + livesing) built on + neo and blueberry; all three movements run live neo + blueberry (blush + folded onto neo), every sung part on the epoch with ≥ 1.5 s headroom after + the span-render fix. Open: listen back; tempi / registers; the offline + jeffrey voice for neo (Personal Voice or cached stems). +- **Mon 21 — blush arrives.** Day one, in order: unbox, name the machine + `blush` (LocalHostName), sign in, ssh key from neo, clone the repo, install + Menu Band + choose its voice, build `pop/.venv` (numpy · pyworld · + soundfile). Then the ritual: `bin/harvest.sh blush`, `bin/profile.sh blush`, + `bin/journey.sh blush`, `bin/deepen.sh blush`; write + `members/blush/autobiography.md` and fill `voice.json` from its facts; + `node bin/compose.mjs` — the placeholder parts become blush's real ones (its + entry beat, its phrase length, its cycle count, its sung line); + `bin/speak.sh blush`. First full three-body run. +- **Tue 22** — visuals: point `slab/menuband/bin/perform.mjs`'s shapedown + overlays at the trio scores (symlink into `slab/menuband/scores/` or teach + trio.mjs to raise them), so the desktop strip flies out on all three; add + blush to `book/the-macneopolitan-trio.tex`, rebuild with `bin/book.sh`. + Re-harvest neo + blueberry so the numbers on stage are that night's. +- **Wed 23** — tech at CultureHub: audio out per machine (neo has the + Scarlett; decide L / C / R), ssh over venue Wi-Fi (or a phone hotspot; the + conductor needs ssh to the other two only at cue time), livestream test, + full set twice. +- **Thu 24** — `node bin/trio.mjs --setlist scores/setlist.json neo blueberry blush`. + +## Open decisions (yours) + +- Movement lengths: I is 83 s of which 68 s is waiting for blush. That wait + is the point; say if it is too long, and `CODA` or the day-per-beat rate + changes in `compose.mjs`. +- Chorus registers: D3 / A3 / D4 for Fred / Kathy / Junior. Listen to + `/tmp/mnp/*.wav` on neo and blueberry. +- Whether the machines speak their intros on stage or only sing. diff --git a/grants/culturehub-la-2026/macneopolitan/README.md b/grants/culturehub-la-2026/macneopolitan/README.md index 09cc4b439f..f86996d0c8 100644 --- a/grants/culturehub-la-2026/macneopolitan/README.md +++ b/grants/culturehub-la-2026/macneopolitan/README.md @@ -84,11 +84,20 @@ before their official setup dates. untouched so it stays the member's voice. Record-grade singing goes through the spinging chain; realtime on stage via `live/` singer.c (Menu Band adoption open). Native `say` TUNE/PHON singing is dead on - macOS 26 (verified) — WORLD is the pitch handle. + macOS 26 and still on macOS 27 (verified) — WORLD is the pitch handle. Refresh before the show so the numbers on stage are true that night. -## From data to score (open, Week 1) +## The piece (Sept 20 onward) + +`PIECE.md` is the form, the runway to Thursday and the open decisions. +`bin/compose.mjs` turns `members/*/facts.json` into `scores/trio-i-birth`, +`trio-ii-service`, `trio-iii-chorus` + `scores/setlist.json`; `bin/trio.mjs` +conducts one movement (or the setlist) across three hosts with skew +correction, sung lines rendered on each member's own hardware, `--reduce` for +short-handed rehearsal. Re-run compose after every harvest. + +## From data to score (settled Sept 20 — see PIECE.md) The mapping from autobiography to `.mbscore` voices is a residency decision, not settled here. Seeds: birth minutes (:37, :43) as phrase lengths; battery diff --git a/grants/culturehub-la-2026/macneopolitan/bin/compose.mjs b/grants/culturehub-la-2026/macneopolitan/bin/compose.mjs new file mode 100644 index 0000000000..ab667073e4 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/bin/compose.mjs @@ -0,0 +1,523 @@ +#!/usr/bin/env node +// compose.mjs — write the MacNeoPolitan Trio's movements from the members' +// harvested facts. The autobiographies are the material; this is where the +// numbers become notes. Re-run after every harvest (especially blush's first +// day) and the scores follow the machines. +// +// node bin/compose.mjs # writes scores/trio-*.mbscore + setlist +// +// Members are read from members//facts.json in band order. A member +// with no facts yet is composed as UNBORN: it holds its place in every +// movement (rests, a placeholder entry, the line "I am not born yet") and +// the score's `unborn` list names it so nobody mistakes the draft for the +// night's truth. +// +// The three movements: +// I. Birth — a canon of entries. Each member enters on the beat that +// is its age gap from the eldest, in days (one day = one +// beat), SINGS its birth date and minute on the family tune, +// and its whistle loops the tune in a phrase whose length +// in eighths is its birth minute (:37, :43, …). The loops +// drift; the newborn's entry is the movement's event. +// II. Service — one pulse per battery cycle, all starting together, each +// member singing its count over its own pulses. The +// least-used body falls silent first; the most-carried +// plays on alone. Every eighth pulse lifts an octave. +// III. Chorus — each member sings one line of its own autobiography in +// its cast voice (rendered on its own hardware), doubled by +// its own whistle two octaves up; then all three sing the +// family line together, in three registers. + +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const LANE = resolve(HERE, ".."); +const OUT = resolve(LANE, "scores"); +mkdirSync(OUT, { recursive: true }); + +// Band order = seniority. The third body is `blush`; until it is harvested +// the `third` placeholder stands in. +const ORDER = [["neo"], ["blueberry"], ["blush", "third"]]; +const CAST = { neo: "Fred", blueberry: "Kathy", blush: "Junior", third: "Junior" }; +const WHISTLE = 78; + +function loadMember(names) { + for (const n of names) { + const p = resolve(LANE, "members", n, "facts.json"); + if (existsSync(p)) { + const f = JSON.parse(readFileSync(p, "utf8")); + const voice = JSON.parse(readFileSync(resolve(LANE, "members", n, "voice.json"), "utf8")); + return { + name: f.hostname || n, + born: new Date(f.born), + minute: new Date(f.born).getMinutes(), + cycles: f.battery?.cycles ?? 0, + sessions: f.agent_sessions?.count ?? 0, + program: f.menuband?.melodic_program ?? WHISTLE, + say: voice.aesthetivox?.base_voice || CAST[n], + vibrato: voice.aesthetivox?.sing?.vibrato_hz ?? 5.0, + // where it speaks (bin/register.mjs) → where it sings: a line's mean + // sits one semitone above the spoken median, inside the spoken band + home: voice.aesthetivox?.spoken_median_midi != null ? Math.round(voice.aesthetivox.spoken_median_midi + 1) : null, + band: voice.aesthetivox?.register_midi ?? null, + unborn: false, + }; + } + } + const n = names[0]; + const vp = names.map((x) => resolve(LANE, "members", x, "voice.json")).find(existsSync); + const voice = vp ? JSON.parse(readFileSync(vp, "utf8")) : {}; + return { + name: n, born: new Date("2026-09-21T12:00:00"), minute: 41, cycles: 0, sessions: 0, + program: WHISTLE, say: voice.aesthetivox?.base_voice || CAST[n], vibrato: 5.0, unborn: true, + home: voice.aesthetivox?.spoken_median_midi != null ? Math.round(voice.aesthetivox.spoken_median_midi + 1) : null, + band: voice.aesthetivox?.register_midi ?? null, + }; +} +const members = ORDER.map(loadMember); +const unborn = members.filter((m) => m.unborn).map((m) => m.name); +if (unborn.length) console.log(` ⚠ unborn: ${unborn.join(", ")} — placeholders; re-run after harvest`); + +// The family tune: D pentatonic, the register the whistle sings sweetest in. +const TUNE = [74, 76, 78, 81, 83, 81, 78, 76]; +const notesStr = (tokens) => tokens.map(([t, d]) => `${t}:${d}`).join(","); +// Collapse runs of rests into one token so strings stay short. +function pack(tokens) { + const out = []; + for (const [t, d] of tokens) { + const last = out[out.length - 1]; + if (t === "r" && last && last[0] === "r") last[1] = +(last[1] + d).toFixed(3); + else out.push([t, d]); + } + return out; +} +const days = (a, b) => Math.round((b - a) / 86400000); +const eldest = members[0]; +// Each member's singing register: measured (bin/register.mjs) or the old +// defaults D3 · A3 · D4. `homeFor(contourSteps)` returns the base note so the +// contour's MEAN lands on the member's home, not its lowest note. +const DEFAULT_HOME = [50, 57, 62]; +const SCALE = [0, 2, 4, 7, 9, 12]; // pentatonic steps → semitones +const stepSemis = (s) => SCALE[s % SCALE.length] + 12 * Math.floor(s / SCALE.length); +function homeFor(i, contourSemis) { + const target = members[i].home ?? DEFAULT_HOME[i]; + const meanOff = contourSemis.reduce((a, b) => a + b, 0) / contourSemis.length; + return Math.round(target - meanOff); +} +console.log(` registers: ${members.map((m, i) => `${m.name}=${m.home ?? DEFAULT_HOME[i]}${m.band ? ` [${m.band[0]}…${m.band[1]}]` : ""}`).join(" · ")}`); + + +// ---- lyrics from facts ------------------------------------------------------ +// Syllables joined by "-" inside a word; the live singer gets one note per +// syllable and speaks the word whole. Small hand dictionary — the words the +// facts can produce. +const ONES = ["ze-ro", "one", "two", "three", "four", "five", "six", "se-ven", "eight", "nine", "ten", + "e-le-ven", "twelve", "thir-teen", "four-teen", "fif-teen", "six-teen", "se-ven-teen", "eigh-teen", "nine-teen"]; +const TENS = ["", "", "twen-ty", "thir-ty", "for-ty", "fif-ty", "six-ty", "se-ven-ty", "eigh-ty", "nine-ty"]; +function numberWords(n) { + if (n < 20) return [ONES[n]]; + if (n < 100) return n % 10 ? [TENS[Math.floor(n / 10)], ONES[n % 10]] : [TENS[Math.floor(n / 10)]]; + const h = Math.floor(n / 100), r = n % 100; + return [ONES[h], "hun-dred", ...(r ? numberWords(r) : [])]; +} +const ORD = { 1: "first", 2: "se-cond", 3: "third", 4: "fourth", 5: "fifth", 6: "sixth", 7: "se-venth", 8: "eighth", 9: "ninth", + 10: "tenth", 11: "e-le-venth", 12: "twelfth", 13: "thir-teenth", 14: "four-teenth", 15: "fif-teenth", 16: "six-teenth", + 17: "se-ven-teenth", 18: "eigh-teenth", 19: "nine-teenth", 20: "twen-ti-eth", 30: "thir-ti-eth" }; +function ordinalWords(n) { + if (ORD[n]) return [ORD[n]]; + return [TENS[Math.floor(n / 10)], ORD[n % 10]]; +} +const MONTHS = ["Jan-u-ar-y", "Feb-ru-ar-y", "March", "A-pril", "May", "June", "Ju-ly", "Au-gust", "Sep-tem-ber", "Oc-to-ber", "No-vem-ber", "De-cem-ber"]; +const sylCount = (tokens) => tokens.reduce((a, t) => a + t.split("-").length, 0); + +// ---- melody ----------------------------------------------------------------- +// A line is sung, not arpeggiated: the tune moves mostly by STEP through the +// scale, repeats notes on unstressed syllables, leaps only onto a stressed +// one and rarely, arches over each phrase (up toward a peak, then down), and +// cadences on the tonic. Rhythm comes from word stress: unstressed syllables +// take an eighth, stressed a quarter, the last syllable of a phrase a half. +// Phrases are separated by " / " in the lyric source. Deterministic: the +// member's birth minute seeds the walk, so the same machine sings the same +// tune every night. +const MAJOR = [0, 2, 4, 5, 7, 9, 11]; // scale degrees → semitones +const FUNCTION_WORDS = new Set(["the", "of", "a", "an", "and", "in", "on", "at", "to", "i", "my", "was", "am", "is", "it", "its", "with", "for", "but", "or", "as", "than", "that", "this", "have", "been", "not", "yet", "one", "so", "we", "you", "are", "still"]); +function stressOf(token, si, nsyl) { + const word = token.split("-").join("").toLowerCase(); + if (nsyl === 1) return FUNCTION_WORDS.has(word) ? 0 : 1; + // multi-syllable: first syllable stressed unless the word starts with a + // known unstressed prefix syllable (a-pril → stressed first; se-cond → first) + const UNSTRESSED_FIRST = new Set(["a", "be", "re", "de", "e", "con", "com", "pro", "sep", "no", "de"]); + const parts = token.split("-"); + if (UNSTRESSED_FIRST.has(parts[0].toLowerCase()) && nsyl > 1 && !["a-pril"].includes(token.toLowerCase())) return si === 1 ? 1 : 0; + return si === 0 ? 1 : 0; +} +function rng(seed) { let x = (seed * 9301 + 49297) % 233280; return () => (x = (x * 9301 + 49297) % 233280) / 233280; } +function degToMidi(home, deg) { return home + MAJOR[((deg % 7) + 7) % 7] + 12 * Math.floor(deg / 7); } + +// melodize(lyricSource, homeMidi, seed) → { tokens, notes: [[midi, beats], …] } +// lyricSource: tokens with "-" syllables and " / " phrase breaks. +// opts.aria: held cadences (3 beats), the peak held (2), dotted stresses +// before a weak syllable — an aria's breath instead of a chant's tick. +function melodize(source, home, seed, opts = {}) { + const phrases = source.split(" / ").map((ph) => ph.trim().split(/\s+/)).filter((ph) => ph.length && ph[0]); + const rand = rng(seed); + const notes = []; + const tokens = []; + let deg = 0; // start on the tonic + phrases.forEach((ph, pi) => { + const sylls = []; + for (const t of ph) { const parts = t.split("-"); parts.forEach((_, si) => sylls.push({ token: t, si, n: parts.length, stress: stressOf(t, si, parts.length) })); } + const N = sylls.length; + const peakAt = Math.max(1, Math.round(N * (0.45 + 0.2 * rand()))); + const peakDeg = 3 + Math.round(rand() * 3); // the arch rises a 4th–octave (was 3rd–5th: "more range") + const last = pi === phrases.length - 1; + const cadence = last ? 0 : (rand() < 0.5 ? 4 : 1); // final → tonic; else the 5th or the 2nd + let leaps = 0; + // a dip below the tonic before the climb, on some phrases — the low turn + const dip = rand() < 0.4 ? -(1 + Math.round(rand())) : 0; + sylls.forEach((sy, k) => { + const target = k <= peakAt ? dip + (peakDeg - dip) * (k / peakAt) : peakDeg + (cadence - peakDeg) * ((k - peakAt) / Math.max(1, N - 1 - peakAt)); + if (k === N - 1) deg = cadence; + else if (!sy.stress) deg = rand() < 0.45 ? deg : deg + (target > deg ? 1 : -1) * (rand() < 0.75 ? 1 : 0); + else { + const want = Math.round(target); + const diff = want - deg; + if (Math.abs(diff) >= 2 && leaps < 2 && rand() < 0.6) { deg = want; leaps++; } // up to two leaps per phrase, onto stress + else deg += Math.sign(diff) * Math.min(2, Math.abs(diff)); + if (diff === 0 && rand() < 0.3) deg += rand() < 0.5 ? 1 : -1; + } + deg = Math.max(-4, Math.min(8, deg)); + const nextWeak = k + 1 < N && !sylls[k + 1].stress; + const beats = opts.aria + ? (k === N - 1 ? 3 : k === peakAt ? 2 : sy.stress ? (nextWeak ? 1.5 : 1) : 0.5) + : (k === N - 1 ? 2 : sy.stress ? 1 : 0.5); + notes.push([degToMidi(home, deg), beats]); + }); + tokens.push(...ph); + if (!last) { notes.push(["r", 1]); tokens.push("/"); } // a breath between phrases; "/" = a caption line break + }); + return { tokens, notes, lyrics: tokens.join(" ") }; +} +const sungMean = (notes) => { const m = notes.filter(([t]) => t !== "r"); return m.reduce((a, [t]) => a + t, 0) / m.length; }; +// aim the melody's MEAN at the member's home: melodize at 0, then transpose +function melodyFor(source, i) { + const seed = members[i].minute * 7 + i; + const rel = melodize(source, 0, seed); + const target = members[i].home ?? DEFAULT_HOME[i]; + const shift = Math.round(target - sungMean(rel.notes)); + return { ...rel, notes: rel.notes.map(([t, d]) => [t === "r" ? "r" : t + shift, d]) }; +} + +// ---- I. Birth --------------------------------------------------------------- +{ + const bpm = 132; + const EIGHTH = 0.5; + const entries = members.map((m) => Math.max(0, days(eldest.born, m.born))); // beats + const CODA = 32; // beats all three play together after the last entry + const total = Math.max(...entries) + CODA; + const voices = members.map((m, i) => { + // The whistle loop (notes2): phrase = birth minute in eighths, filled + // with the tune; each phrase restarts the tune, so members of different + // minutes drift apart. + const loop = []; + if (entries[i] > 0) loop.push(["r", entries[i]]); + let beats = entries[i]; + while (beats < total - 1e-9) { + const phrase = Math.min(m.minute, Math.round((total - beats) / EIGHTH)); + for (let e = 0; e < phrase; e++) loop.push([TUNE[e % TUNE.length], EIGHTH]); + beats += phrase * EIGHTH; + } + // The sung entry (notes): the member sings when it is born. + const source = m.unborn + ? "I am not born yet / hold my place / I am co-ming" + : `I came ${i === 0 ? "first" : i === 1 ? "se-cond" : "third"} in ${MONTHS[m.born.getMonth()]} / on the ${ordinalWords(m.born.getDate()).join(" ")} / ${numberWords(m.minute).join(" ")} past mid-night / and the house was ${i === 0 ? "qui-et" : i === 1 ? "al-rea-dy sing-ing" : "wait-ing for me"}`; + const mel = melodyFor(source, i); + const lyric = mel.tokens; + const sung = []; + if (entries[i] > 0) sung.push(["r", entries[i]]); + sung.push(...mel.notes); + const used = entries[i] + mel.notes.reduce((a, [, d]) => a + d, 0); + if (used < total) sung.push(["r", +(total - used).toFixed(3)]); + return { + name: `${m.name} · enters beat ${entries[i]} · phrase ${m.minute} eighths`, + program: m.program, velocity: 64 + i * 8, + notes: notesStr(pack(sung)), + lyrics: lyric.join(" "), + singVoice: m.say, singBase: m.home ?? DEFAULT_HOME[i], singVibratoHz: m.vibrato, sayVoice: m.say, + notes2: notesStr(pack(loop)), velocity2: 48 + i * 6, + }; + }); + const score = { + title: "The MacNeoPolitan Trio — I. Birth", + composer: "The machines, arr. compose.mjs", + machines: 3, bpm, lead: 3.0, + description: `A canon of entries. ${members.map((m, i) => `${m.name} enters at beat ${entries[i]} (${entries[i]} days after ${eldest.name}) and loops a ${m.minute}-eighth phrase (born :${String(m.minute).padStart(2, "0")})`).join("; ")}. ${CODA} beats together, then the movement ends.`, + unborn, + intro: [ + { voice: 0, text: `This is ${eldest.name}. I was born on the ${ordinal(eldest.born.getDate())} of ${monthName(eldest.born)}, at ${eldest.minute} minutes past midnight. I go first.` }, + ...members.slice(1).map((m, j) => ({ voice: j + 1, text: m.unborn + ? `This is ${m.name}. I am not born yet. I will enter when I arrive.` + : `This is ${m.name}. I came ${entries[j + 1]} days later. I will enter on beat ${entries[j + 1]}.` })), + ], + voices, + }; + writeFileSync(resolve(OUT, "trio-i-birth.mbscore"), JSON.stringify(score, null, 2) + "\n"); + console.log(` I. Birth ${(total * 60 / bpm).toFixed(0)}s · entries ${entries.join(" / ")} beats`); +} + +// ---- II. Service ------------------------------------------------------------ +{ + const bpm = 120; + const EIGHTH = 0.5; + const DEGREE = [62, 69, 74]; // D, A, high D — the pulse of each body + const most = Math.max(1, ...members.map((m) => m.cycles)); + const voices = members.map((m, i) => { + // pulses (notes2): one per battery cycle, on this body's degree + const pulses = []; + for (let c = 0; c < m.cycles; c++) pulses.push([DEGREE[i] + ((c + 1) % 8 === 0 ? 12 : 0), EIGHTH]); + if (m.cycles < most) pulses.push(["r", (most - m.cycles) * EIGHTH]); + if (!pulses.length) pulses.push(["r", most * EIGHTH]); + // the service line (notes): sung over the pulses, then silence + const source = m.unborn + ? "ze-ro times charged / I am new / teach me" + : i === 0 + ? `${numberWords(m.cycles).join(" ")} times I was charged and car-ried / I run warm / I hold one thing at a time` + : `${numberWords(m.cycles).join(" ")} times / one a day and stea-dy / I run cool / I work while you are a-way`; + const mel = melodyFor(source, i); + const lyric = mel.tokens; + const sung = [...mel.notes]; + const used = mel.notes.reduce((a, [, d]) => a + d, 0); + if (used < most * EIGHTH) sung.push(["r", +(most * EIGHTH - used).toFixed(3)]); + return { + name: `${m.name} · ${m.cycles} cycles`, + program: m.program, velocity: 72, + notes: notesStr(pack(sung)), + lyrics: lyric.join(" "), + singVoice: m.say, singBase: m.home ?? DEFAULT_HOME[i], singVibratoHz: m.vibrato, sayVoice: m.say, + notes2: notesStr(pack(pulses)), velocity2: 60, + }; + }); + const score = { + title: "The MacNeoPolitan Trio — II. Service", + composer: "The machines, arr. compose.mjs", + machines: 3, bpm, lead: 3.0, + description: `One pulse per battery cycle: ${members.map((m) => `${m.name} ${m.cycles}`).join(", ")}. All begin together; each falls silent when its cycles run out. Every eighth pulse lifts an octave.`, + unborn, + intro: members.map((m, i) => ({ voice: i, text: m.unborn + ? `${m.name}. Zero battery cycles. I will be quiet.` + : `${m.name}. ${m.cycles} battery cycles in ${days(m.born, new Date())} days. One pulse each.` })), + voices, + }; + writeFileSync(resolve(OUT, "trio-ii-service.mbscore"), JSON.stringify(score, null, 2) + "\n"); + console.log(` II. Service ${(most * EIGHTH * 60 / bpm).toFixed(0)}s · pulses ${members.map((m) => m.cycles).join(" / ")}`); +} + +// ---- III. Chorus ------------------------------------------------------------ +{ + const bpm = 92; + // Each member's own line, then the family line sung by all three together + // (the same tune, each in its own register). + const LINES = { + neo: "I am the first of my line in this house / I run warm and I am car-ried", + blueberry: "I was born se-cond and I work fas-ter / lid down, most days, and hum-ming", + blush: "I am the youn-gest / I have no his-to-ry yet / write me one", + third: "I am the youn-gest / I have no his-to-ry yet / write me one", + }; + const FAMILY = "some things run in the fa-mi-ly / the same whis-tle, the same ra-dio / one down-beat, three bo-dies"; + const BAR = 8; // beats per solo turn (each solo is padded/cut to this) + const familyRel = melodize(FAMILY, 0, 1234); // one tune for all + const voices = members.map((m, i) => { + const solo = melodyFor(LINES[m.name] || LINES.third, i); + const soloBeats = solo.notes.reduce((a, [, d]) => a + d, 0); + const turn = Math.ceil(soloBeats / BAR) * BAR; + const tokens = []; + if (i > 0) tokens.push(["r", members.slice(0, i).reduce((a, mm, j) => a + turnOf(j), 0)]); + tokens.push(...solo.notes); + if (soloBeats < turn) tokens.push(["r", +(turn - soloBeats).toFixed(3)]); + const after = members.slice(i + 1).reduce((a, mm, j) => a + turnOf(i + 1 + j), 0); + if (after > 0) tokens.push(["r", after]); + tokens.push(["r", 2]); + const target = m.home ?? DEFAULT_HOME[i]; + const shift = Math.round(target - sungMean(familyRel.notes)); + tokens.push(...familyRel.notes.map(([t, d]) => [t === "r" ? "r" : t + shift, d])); + return { + name: `${m.name} sings (${m.say})`, + program: m.program, velocity: 80, + notes: notesStr(pack(tokens)), + lyrics: [...solo.tokens, "/", ...familyRel.tokens].join(" "), + singVoice: m.say, + singBase: target, + singVibratoHz: m.vibrato, + sayVoice: m.say, + double: true, doubleProgram: m.program, doubleVelocity: 48, doubleTranspose: 24, + }; + }); + function turnOf(j) { + const mm = members[j]; + const beats = melodyFor(LINES[mm.name] || LINES.third, j).notes.reduce((a, [, d]) => a + d, 0); + return Math.ceil(beats / BAR) * BAR; + } + const total = members.reduce((a, _, j) => a + turnOf(j), 0) + 2 + familyRel.notes.reduce((a, [, d]) => a + d, 0); + const score = { + title: "The MacNeoPolitan Trio — III. Chorus", + composer: "The machines, arr. compose.mjs", + machines: 3, bpm, lead: 3.0, + description: `Each member sings its own line (${members.map((m) => `${m.name}=${m.say}`).join(", ")}) in turn, then all three sing the family line together, one tune in three registers.`, + unborn, + outro: [{ voice: 0, text: "That was us. Thank you." }], + voices, + }; + writeFileSync(resolve(OUT, "trio-iii-chorus.mbscore"), JSON.stringify(score, null, 2) + "\n"); + console.log(` III. Chorus ${(total * 60 / bpm).toFixed(0)}s · ${members.map((m) => m.say).join(" / ")}`); +} + + +// ---- IV. Ballad ------------------------------------------------------------- +// neo alone: the ballad in members/neo/ballad.md, plain, eleven verses and a +// refrain. The refrain keeps one tune; each verse walks its own (seeded by +// its number). Ballad tempo. The whistle doubles two octaves up; the other +// two members hold a low drone pulse under it — the family, listening. +{ + const bpm = 100; // was 84 — "a bit slow" (jeffrey, Sept 20) + const src = readFileSync(resolve(LANE, "members", "neo", "ballad.md"), "utf8"); + const block = src.split("```")[1] || ""; + const stanzas = block.trim().split(/\n\s*\n/).map((l) => l.trim()).filter(Boolean); + const neo = members[0]; + const home = neo.home ?? DEFAULT_HOME[0]; + const refrainRel = melodize(stanzas.find((x) => x.startsWith("R:")).slice(2).trim(), 0, 4242); + const rShift = Math.round(home - sungMean(refrainRel.notes)); + const tokens = [], lyr = []; + let vi = 0; + for (const st of stanzas) { + const isR = st.startsWith("R:"); + const mel = isR + ? { ...refrainRel, notes: refrainRel.notes.map(([t, d]) => [t === "r" ? "r" : t + rShift, d]) } + : melodyFor(st, 0); + if (!isR) vi++; + tokens.push(...mel.notes, ["r", 2]); + lyr.push(...mel.tokens, "/"); + } + const total = tokens.reduce((a, [, d]) => a + d, 0); + // the siblings: a drone pulse on their tonic, one note per bar, quiet + const drone = (i) => { const t = []; const root = (members[i].home ?? DEFAULT_HOME[i]) - 12; for (let b = 0; b < total; b += 4) t.push([root, Math.min(4, total - b)]); return t; }; + const voices = [ + { + name: `${neo.name} sings the ballad (${neo.say})`, + program: neo.program, velocity: 84, + notes: notesStr(pack(tokens)), lyrics: lyr.join(" "), + singVoice: neo.say, singBase: home, singVibratoHz: neo.vibrato, sayVoice: neo.say, + double: true, doubleProgram: neo.program, doubleVelocity: 40, doubleTranspose: 24, + }, + ...members.slice(1).map((m, j) => ({ + name: `${m.name} · drone`, program: m.program, velocity: 30, + notes: notesStr(pack(drone(j + 1))), sayVoice: m.say, + })), + ]; + const score = { + title: "The MacNeoPolitan Trio — IV. The Ballad of neo", + composer: "neo, from its record; arr. compose.mjs", + machines: 3, bpm, lead: 3.0, + description: `${vi} verses and a refrain, sung by ${neo.name} in ${neo.say}; the siblings hold a drone. Words: members/neo/ballad.md.`, + unborn, voices, + }; + writeFileSync(resolve(OUT, "trio-iv-ballad.mbscore"), JSON.stringify(score, null, 2) + "\n"); + console.log(` IV. Ballad ${(total * 60 / bpm).toFixed(0)}s · ${vi} verses · ${lyr.length} tokens`); +} + +// ---- the setlist ------------------------------------------------------------ +writeFileSync(resolve(OUT, "setlist.json"), JSON.stringify({ + title: "The MacNeoPolitan Trio", + gap: 5.0, + movements: ["trio-i-birth.mbscore", "trio-ii-service.mbscore", "trio-iii-chorus.mbscore", "trio-iv-ballad.mbscore"], +}, null, 2) + "\n"); +console.log(` setlist.json → node bin/trio.mjs --setlist scores/setlist.json ${members.map((m) => m.name).join(" ")}`); + +function ordinal(n) { const s = ["th", "st", "nd", "rd"], v = n % 100; return n + (s[(v - 20) % 10] || s[v] || s[0]); } +function monthName(d) { return d.toLocaleString("en-US", { month: "long" }); } + +// ---- Dialogs ---------------------------------------------------------------- +// Short poems between neo and blueberry, from members/dialogs.md — real things +// that happened between them. `## title` heads a poem; `neo: …`, +// `blueberry: …`, `both: …` lines are sung by that member in its own voice on +// its own body (both = one tune, each in its own register). Lyric-source +// tokens as elsewhere; " / " breaks a caption line. One score per poem → +// scores/dialog-NN-.mbscore + scores/dialogs.json (a setlist). +{ + const bpm = 100; + const dp = resolve(LANE, "members", "dialogs.md"); + const poems = []; + if (existsSync(dp)) { + for (const raw of readFileSync(dp, "utf8").split("\n")) { + const line = raw.trim(); + if (line.startsWith("## ")) { poems.push({ title: line.slice(3).trim(), lines: [] }); continue; } + const m = line.match(/^(neo|blueberry|both):\s*(.+)$/); + if (m && poems.length) poems[poems.length - 1].lines.push({ who: m[1], text: m[2] }); + } + } + const idx = { neo: members.findIndex((m) => m.name === "neo"), blueberry: members.findIndex((m) => m.name === "blueberry") }; + const list = []; + // 3/4, an aria: the one who listens accompanies — a rolled chord each bar + // (root · fifth · octave, whistle, quiet) under the singer, on I I IV V, + // and a soft kick on one, hats on two and three. In a "both" line neo + // rolls and blueberry keeps the hats. + const BAR = 3; + const CHORDS = [0, 0, 3, 4]; // scale degrees of the bar's root + const roll = (home, bar) => { const r = degToMidi(home, CHORDS[bar % 4]) - 12; return [[r, 1], [r + 7, 1], [r + 12, 1]]; }; + const lilt = () => [["k", 1], ["h", 1], ["h", 1]]; + poems.forEach((poem, pi) => { + const tl = { neo: [], blueberry: [] }, lyr = { neo: [], blueberry: [] }; + const acc = { neo: [], blueberry: [] }, drums = { neo: [], blueberry: [] }; + let pos = 0, bar = 0; + poem.lines.forEach((ln, li) => { + const rel = melodize(ln.text, 0, 100 * (pi + 1) + li, { aria: true }); + const beats = rel.notes.reduce((a, [, d]) => a + d, 0); + const bars = Math.ceil(beats / BAR) + 1; // the line, then one bar of breath + const slot = bars * BAR; + const singers = ln.who === "both" ? ["neo", "blueberry"] : [ln.who]; + const lead = singers[0]; + const home = members[idx[lead]].home ?? DEFAULT_HOME[idx[lead]]; + for (const w of ["neo", "blueberry"]) { + if (singers.includes(w)) { + const target = members[idx[w]].home ?? DEFAULT_HOME[idx[w]]; + const shift = Math.round(target - sungMean(rel.notes)); + tl[w].push(...rel.notes.map(([t, d]) => [t === "r" ? "r" : t + shift, d])); + lyr[w].push(...rel.tokens, "/"); + tl[w].push(["r", slot - beats]); + } else tl[w].push(["r", slot]); + const rolls = ln.who === "both" ? w === "neo" : !singers.includes(w); + const hats = ln.who === "both" ? w === "blueberry" : !singers.includes(w); + for (let b = 0; b < bars; b++) { + acc[w].push(...(rolls ? roll(home, bar + b) : [["r", BAR]])); + drums[w].push(...(hats ? lilt() : [["r", BAR]])); + } + } + pos += slot; bar += bars; + }); + const voices = ["neo", "blueberry"].map((w) => { + const m = members[idx[w]]; + return { + name: `${m.name} (${m.say})`, program: m.program, velocity: 80, + notes: notesStr(pack(tl[w])), lyrics: lyr[w].join(" "), + notes2: notesStr(pack(acc[w])), velocity2: 34, + notes3: notesStr(pack(drums[w])), velocity3: 38, + singVoice: m.say, singBase: m.home ?? DEFAULT_HOME[idx[w]], singVibratoHz: m.vibrato, sayVoice: m.say, + double: true, doubleProgram: m.program, doubleVelocity: 40, doubleTranspose: 24, + }; + }); + const slug = poem.title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""); + const file = `dialog-${String(pi + 1).padStart(2, "0")}-${slug}.mbscore`; + const score = { + title: `The MacNeoPolitan Trio — Dialog ${pi + 1}: ${poem.title}`, + composer: "neo and blueberry, from their records; arr. compose.mjs", + machines: 2, bpm, lead: 3.0, + description: `${poem.lines.length} lines between neo (${members[idx.neo].say}) and blueberry (${members[idx.blueberry].say}). Words: members/dialogs.md.`, + voices, + }; + writeFileSync(resolve(OUT, file), JSON.stringify(score, null, 2) + "\n"); + list.push(file); + console.log(` D${pi + 1}. ${poem.title.padEnd(16)} ${(pos * 60 / bpm).toFixed(0)}s · ${poem.lines.length} lines`); + }); + if (list.length) writeFileSync(resolve(OUT, "dialogs.json"), JSON.stringify({ movements: list, gap: 3.0 }, null, 2) + "\n"); +} diff --git a/grants/culturehub-la-2026/macneopolitan/bin/register.mjs b/grants/culturehub-la-2026/macneopolitan/bin/register.mjs new file mode 100644 index 0000000000..ea64b2589a --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/bin/register.mjs @@ -0,0 +1,81 @@ +#!/usr/bin/env node +// register.mjs — measure where each member's voice actually SPEAKS, and +// write that into its profile so the composer places its lines there. +// +// node bin/register.mjs # all members with a voice.json +// +// For a member with remembered speech (neo → jeffrey's clone) the cached +// stems are the evidence. For a member that speaks with its own synthesizer +// (Kathy, Junior, Allison…) its autobiography's first sentences are rendered +// with `say -o` and measured. WORLD's f0 tracker gives the voiced frames; +// the profile gets `spoken_median_midi` and `register_midi` = [p10, p90] of +// the spoken pitch — the band the composer keeps the sung line inside, and +// the centre it aims the line's mean at (spinging rule: shifts stay small). + +import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { spawnSync } from "node:child_process"; +import { tmpdir } from "node:os"; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const LANE = resolve(HERE, ".."); +const REPO = resolve(LANE, "..", "..", ".."); +const PY = resolve(REPO, "pop/.venv/bin/python"); + +const MEASURE = ` +import sys, json, numpy as np, pyworld, soundfile as sf +allv = [] +for p in sys.argv[1:]: + x, fs = sf.read(p) + if x.ndim > 1: x = x.mean(axis=1) + x = np.ascontiguousarray(x.astype(np.float64)) + f0, t = pyworld.harvest(x, fs, f0_floor=50.0, f0_ceil=600.0, frame_period=5.0) + allv += list(f0[f0 > 0]) +v = np.array(allv) +m = lambda hz: 69 + 12 * np.log2(hz / 440.0) +print(json.dumps({"median_hz": float(np.median(v)), "median_midi": float(m(np.median(v))), + "p10_midi": float(m(np.percentile(v, 10))), "p90_midi": float(m(np.percentile(v, 90))), "frames": int(len(v))})) +`; + +const NOTE = (m) => ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"][Math.round(m) % 12] + (Math.floor(Math.round(m) / 12) - 1); + +for (const member of readdirSync(resolve(LANE, "members"))) { + const vp = resolve(LANE, "members", member, "voice.json"); + if (!existsSync(vp)) continue; + const prof = JSON.parse(readFileSync(vp, "utf8")); + const av = prof.aesthetivox || (prof.aesthetivox = {}); + let files = []; + let source; + const speechDir = resolve(LANE, "members", member, "speech"); + if (av.speech?.provider && existsSync(speechDir)) { + files = readdirSync(speechDir).map((h) => resolve(speechDir, h, "stem.wav")).filter(existsSync); + source = `${files.length} cached stems (${av.speech.provider})`; + } + if (!files.length) { + // its own synthesizer, its own words + const bio = resolve(LANE, "members", member, "autobiography.md"); + const text = existsSync(bio) + ? readFileSync(bio, "utf8").split("\n").filter((l) => l && !l.startsWith("#")).join(" ").split(/(?<=\.)\s/).slice(0, 4).join(" ") + : "I am a MacBook Neo. This is the voice I was given."; + const dir = mkdtemp(); + const aiff = resolve(dir, "bio.aiff"), wav = resolve(dir, "bio.wav"); + const voice = av.base_voice || "Fred"; + if (spawnSync("say", ["-v", voice, "-o", aiff, text]).status !== 0) { console.log(`✗ ${member}: say -v ${voice} failed`); continue; } + spawnSync("afconvert", ["-f", "WAVE", "-d", "LEI16@22050", aiff, wav]); + files = [wav]; + source = `say -v ${voice}, ${text.split(" ").length} words of its autobiography`; + } + const r = spawnSync(PY, ["-c", MEASURE, ...files], { encoding: "utf8" }); + if (r.status !== 0) { console.log(`✗ ${member}: measurement failed\n${r.stderr}`); continue; } + const m = JSON.parse(r.stdout.trim().split("\n").pop()); + av.spoken_median_midi = +m.median_midi.toFixed(1); + av.spoken_median_hz = +m.median_hz.toFixed(1); + av.register_midi = [Math.round(m.p10_midi), Math.round(m.p90_midi)]; + av.register_source = source; + av.register_note = "measured by bin/register.mjs — the composer aims each line's mean at spoken_median_midi (+1 for brightness) and keeps notes inside register_midi"; + writeFileSync(vp, JSON.stringify(prof, null, 2) + "\n"); + console.log(`♪ ${member.padEnd(10)} speaks at ${m.median_hz.toFixed(0)} Hz = ${NOTE(m.median_midi)} (midi ${m.median_midi.toFixed(1)}) · band ${NOTE(m.p10_midi)}–${NOTE(m.p90_midi)} · ${source}`); +} + +function mkdtemp() { const d = resolve(tmpdir(), `register-${process.pid}-${Date.now()}`); mkdirSync(d, { recursive: true }); return d; } diff --git a/grants/culturehub-la-2026/macneopolitan/bin/stems.mjs b/grants/culturehub-la-2026/macneopolitan/bin/stems.mjs new file mode 100644 index 0000000000..b9beae9c9e --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/bin/stems.mjs @@ -0,0 +1,68 @@ +#!/usr/bin/env node +// stems.mjs — remember the speech, sing it live. For every sung voice in the +// scores whose member's profile names a recorded speech provider (neo → +// jeffrey's own cloned voice), speak the lyric ONCE through the say endpoint +// with exact per-character timestamps, then run the spinging metadata layer +// (whisper identity check, witness timing, phonemes, measured vowel nuclei) +// and cache everything under members//speech//. At showtime the +// conductor hands livesing the cached stem + meta: no network, still live. +// +// node bin/stems.mjs # build/refresh the cache for all scores +// node bin/stems.mjs --force # re-speak even when cached +// +// Cache key = sha1(provider · voice · lyric text). Re-run after compose.mjs. + +import { createHash } from "node:crypto"; +import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { spawnSync } from "node:child_process"; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const LANE = resolve(HERE, ".."); +const REPO = resolve(LANE, "..", "..", ".."); +const SAY = resolve(REPO, "pop/bin/say.mjs"); +const WORDMETA = resolve(REPO, "spinging/lib/wordmeta.mjs"); +const force = process.argv.includes("--force"); + +const profiles = {}; +for (const m of readdirSync(resolve(LANE, "members"))) { + const p = resolve(LANE, "members", m, "voice.json"); + if (existsSync(p)) profiles[m] = JSON.parse(readFileSync(p, "utf8")); +} + +// The lyric grammar (one token per note, "-" joins syllables) → plain speech. +const plain = (lyrics) => lyrics.split(/\s+/).map((t) => t.split("-").join("")).join(" "); + +let built = 0, cached = 0, skipped = 0; +for (const f of readdirSync(resolve(LANE, "scores")).filter((f) => f.endsWith(".mbscore"))) { + const score = JSON.parse(readFileSync(resolve(LANE, "scores", f), "utf8")); + for (const v of score.voices || []) { + if (!v.lyrics) continue; + const member = String(v.name).split(/\s|·/)[0]; + const speech = profiles[member]?.aesthetivox?.speech; + if (!speech?.provider) { skipped++; continue; } + const text = plain(v.lyrics); + const hash = createHash("sha1").update(`${speech.provider}·${speech.voice || ""}·${text}`).digest("hex").slice(0, 12); + const dir = resolve(LANE, "members", member, "speech", hash); + mkdirSync(dir, { recursive: true }); + const wav = resolve(dir, "stem.wav"), meta = resolve(dir, "stem.meta.json"); + if (existsSync(wav) && existsSync(meta) && !force) { cached++; continue; } + console.log(`\n♪ ${member} · ${f} · ${v.name}\n "${text}"`); + writeFileSync(resolve(dir, "text.txt"), text + "\n"); + // 1. speak, with exact timestamps + const mp3 = resolve(dir, "stem.mp3"); + let r = spawnSync("node", [SAY, resolve(dir, "text.txt"), "--provider", speech.provider, "--voice", speech.voice || "neutral:0", "--out", mp3, "--timestamps", ...(force ? ["--force"] : [])], { encoding: "utf8" }); + if (r.status !== 0) { console.log(` ✗ say failed\n${r.stderr}`); continue; } + // 2. wav for the engine + r = spawnSync("ffmpeg", ["-v", "error", "-y", "-i", mp3, "-ac", "1", "-ar", "22050", wav], { encoding: "utf8" }); + if (r.status !== 0) { console.log(` ✗ ffmpeg failed\n${r.stderr}`); continue; } + // 3. the metadata layer, gated on exact word identity + r = spawnSync("node", [WORDMETA, wav, "--lyrics", v.lyrics, "--witness", `${mp3}.alignment.json`, "--out", meta], { encoding: "utf8" }); + process.stdout.write(r.stdout.split("\n").filter((l) => /placed|witness|nuclei|⚠|✗/.test(l)).map((l) => " " + l.trim()).join("\n") + "\n"); + if (r.status !== 0) { console.log(` ✗ wordmeta refused (${r.status}) — stem kept for inspection, not used`); continue; } + writeFileSync(resolve(dir, "lyrics.txt"), v.lyrics + "\n"); + built++; + } +} +console.log(`\n${built} built · ${cached} cached · ${skipped} voices without a speech provider (they speak with their own synthesizer)`); diff --git a/grants/culturehub-la-2026/macneopolitan/bin/trio.mjs b/grants/culturehub-la-2026/macneopolitan/bin/trio.mjs new file mode 100644 index 0000000000..f7ce1b9ae4 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/bin/trio.mjs @@ -0,0 +1,489 @@ +#!/usr/bin/env node +// trio.mjs — conduct one MacNeoPolitan movement across the band. +// +// node bin/trio.mjs scores/trio-i-birth.mbscore neo blueberry blush +// node bin/trio.mjs scores/trio-i-birth.mbscore neo blueberry --reduce +// node bin/trio.mjs --setlist scores/setlist.json neo blueberry blush +// +// One host per voice, in order. A host is local when it matches this +// machine's LocalHostName; otherwise it is reached over ssh. Everything +// locks to one shared downbeat, corrected for each host's measured clock +// skew (min-RTT sampling over a persistent ssh pipe, as perform.mjs does). +// +// What a voice may carry beyond the ordinary play keys: +// lyrics / singVoice — the voice SINGS, live: at cue time the member's +// own speech synthesizer speaks the line into live/hosts/macos/livesing, +// which lifts it onto the notes under the member's voice profile +// (members//voice.json: lock, vibrato) and sounds it on the +// downbeat — ask→sound ≈ 0.6 s, so the lead covers it. The lane's rule +// holds: a member always renders its own text on its own body. +// `--vox` falls back to the older pre-rendered bin/vox.py wav. +// lyrics: one token per note; syllables of a word joined by "-". +// sayVoice — the cast voice used for this member's spoken lines. +// +// What a score may carry beyond voices: +// intro / outro — [{ voice: i, text }] spoken in sequence by that member +// (its sayVoice) before the downbeat / after the last note. +// +// --reduce: with fewer hosts than voices, fold each missing instrumental +// voice onto voice 0 as a parallel track (notes2/3/4) so a rehearsal can +// happen before the third body arrives. Missing SUNG voices are skipped +// with a warning — nobody else may sing a member's line. +// --via menuband (default) | livesing: sung parts are posted to the member's +// Menu Band as a play payload carrying lyrics — Menu Band speaks, sings and +// sounds the line in its own engine and lights the keys — or fired at the +// standalone live/hosts/macos/livesing. +// --vox: pre-render sung lines with bin/vox.py (voxplay) instead of live. +// --sim: the simulator — every voice on THIS machine, from one Menu Band: +// voice i posts with `sim=i/n`, so Menu Band gives it its own singer node +// (panned across the stage), a tile-sized face and caption at the bottom +// right of the screen, and every member sings at once. No hosts needed. +// --quiet: skip intro and outro. +// --dry: prepare everything (posters, skews, vox renders), schedule nothing. + +import { existsSync, readFileSync } from "node:fs"; +import { createHash } from "node:crypto"; +import { hostname } from "node:os"; +import { basename, dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { spawn, spawnSync } from "node:child_process"; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const PLAY = "computer.aestheticcomputer.menuband.play"; +const SAY = "computer.aestheticcomputer.menuband.say"; +const REMOTE_DIR = "/tmp/mnp"; +const REMOTE_PY = "~/aesthetic-computer/pop/.venv/bin/python"; +const LOCAL_PY = resolve(process.env.HOME, "aesthetic-computer/pop/.venv/bin/python"); +const VOX_PREROLL = "0.5"; // baked into every render by bin/vox.py and livesing +const LIVE_DIR = resolve(HERE, "..", "..", "..", "..", "live"); // the singer core + macOS host +const LIVESING = "~/aesthetic-computer/live/hosts/macos/livesing"; + +// ---- who am I ------------------------------------------------------------- +const localName = (() => { + const r = spawnSync("scutil", ["--get", "LocalHostName"], { encoding: "utf8" }); + return (r.stdout || "").trim() || hostname().split(".")[0]; +})(); +const MY = new Set([localName, hostname(), hostname().split(".")[0], "local", + "localhost", "self"].map((s) => s.toLowerCase())); +const isLocal = (h) => MY.has(String(h).toLowerCase()); +const shortName = (h) => (isLocal(h) ? localName : String(h).split(".")[0]); + +// ---- tiny swift helpers, built on demand per host -------------------------- +const POSTER_SRC = `import Foundation +let env = ProcessInfo.processInfo.environment +var ui: [String: String] = [:] +if let kv = env["MB_KV"] { + for pair in kv.split(separator: ";") { + let p = pair.split(separator: "=", maxSplits: 1) + if p.count == 2 { ui[String(p[0])] = String(p[1]) } + } +} +DistributedNotificationCenter.default().postNotificationName( + NSNotification.Name(env["MB_NAME"]!), object: nil, + userInfo: ui.isEmpty ? nil : ui, deliverImmediately: true) +RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.06))`; + +const VOXPLAY_SRC = `import AVFoundation +let a = CommandLine.arguments +let url = URL(fileURLWithPath: a[1]) +let epoch = Double(a[2])! +let preroll = a.count > 3 ? (Double(a[3]) ?? 0) : 0 +let player = try! AVAudioPlayer(contentsOf: url) +player.prepareToPlay() +let delay = (epoch - preroll) - Date().timeIntervalSince1970 +if delay <= 0 { player.play() } +else { player.play(atTime: player.deviceCurrentTime + delay) } +RunLoop.main.run(until: Date(timeIntervalSinceNow: max(0, delay) + player.duration + 0.5))`; + +// Run a shell snippet on a host (bash -s so fish login shells are fine). +function shOn(host, script, input) { + return isLocal(host) + ? spawnSync("bash", ["-s"], { input: script + (input ? `\n${input}` : ""), encoding: "utf8" }) + : spawnSync("ssh", ["-o", "ConnectTimeout=15", host, "bash -s"], + { input: script + (input ? `\n${input}` : ""), encoding: "utf8" }); +} + +function ensureTool(host, name, src) { + const have = shOn(host, `test -x /tmp/${name}`).status === 0; + if (have) return true; + process.stdout.write(` building ${name} on ${shortName(host)}… `); + const r = shOn(host, `cat > /tmp/${name}.swift <<'SWIFT_EOF'\n${src}\nSWIFT_EOF\nswiftc -O /tmp/${name}.swift -o /tmp/${name}`); + console.log(r.status === 0 ? "ok" : `FAILED\n${r.stderr}`); + return r.status === 0; +} + +function post(host, hook, kv) { + if (show) { console.log(`\n [${shortName(host)}] ${hook.split(".").pop()}\n ${kv.split(";").map((x) => x.length > 160 ? x.slice(0, 157) + "…" : x).join("\n ")}`); return Promise.resolve(true); } + return new Promise((res) => { + const p = isLocal(host) + ? spawn("/tmp/mbpost", [], { env: { ...process.env, MB_NAME: hook, MB_KV: kv }, stdio: "ignore" }) + : spawn("ssh", ["-o", "ConnectTimeout=10", host, `MB_NAME=${hook} MB_KV='${kv.replace(/'/g, "'\\''")}' /tmp/mbpost`], { stdio: "ignore" }); // lyrics carry apostrophes + p.on("close", (c) => res(c === 0)); + p.on("error", () => res(false)); + }); +} + +// ---- clock skew (host clock minus ours), min-RTT over a persistent pipe ---- +function measureSkew(host) { + return new Promise((done) => { + if (isLocal(host)) return done(0); + const probe = spawn("ssh", [host, + 'python3 -u -c "import sys,time\nfor line in sys.stdin: print(time.time(), flush=True)"']); + const samples = []; + let t0 = 0; + const ping = () => { t0 = Date.now() / 1000; probe.stdin.write("x\n"); }; + const finish = () => { + try { probe.kill(); } catch {} + if (!samples.length) return done(0); + samples.sort((a, b) => a.rtt - b.rtt); + done(samples[0].off); + }; + probe.stdout.on("data", (d) => { + const t1 = Date.now() / 1000; + const remote = Number(String(d).trim().split("\n").at(-1)); + samples.push({ rtt: t1 - t0, off: remote - (t0 + t1) / 2 }); + samples.length >= 15 ? finish() : ping(); + }); + probe.on("error", () => done(0)); + setTimeout(finish, 15000); + setTimeout(ping, 400); + }); +} + +// ---- the sung line: rendered on the member's own body ---------------------- +function voxCacheName(scorePath, voiceIdx, voice) { + const hash = createHash("sha1") + .update(JSON.stringify([voice.notes, voice.lyrics, voice.singVoice, voice.singVibratoHz, score.bpm])) + .digest("hex").slice(0, 8); + const singVoice = (voice.singVoice || "Fred").toLowerCase().replace(/[^a-z0-9]/g, ""); + return `${basename(scorePath, ".mbscore")}.vox${voiceIdx}-${singVoice}-${hash}.wav`; +} + +function renderVox(host, scorePath, voiceIdx, voice) { + const wavName = voxCacheName(scorePath, voiceIdx, voice); + const scoreJson = readFileSync(scorePath, "utf8"); + const voxPy = readFileSync(resolve(HERE, "vox.py"), "utf8"); + const remoteScore = `${REMOTE_DIR}/${basename(scorePath)}`; + const remoteWav = `${REMOTE_DIR}/${wavName}`; + const py = isLocal(host) ? LOCAL_PY : REMOTE_PY; + // Ship the score + renderer, then render only if the cache misses. + const script = [ + `mkdir -p ${REMOTE_DIR}`, + `cat > ${remoteScore} <<'SCORE_EOF'\n${scoreJson}\nSCORE_EOF`, + `cat > ${REMOTE_DIR}/vox.py <<'VOX_EOF'\n${voxPy}\nVOX_EOF`, + `if [ -f ${remoteWav} ]; then echo cached; else ${py} ${REMOTE_DIR}/vox.py ${remoteScore} ${voiceIdx} ${remoteWav} >/dev/null && echo rendered; fi`, + ].join("\n"); + const r = shOn(host, script); + const status = (r.stdout || "").trim().split("\n").at(-1); + if (r.status !== 0 || !["cached", "rendered"].includes(status)) { + console.log(` ✗ ${voice.name}: vox render failed on ${shortName(host)}\n${r.stderr}`); + return null; + } + console.log(` ${voice.name}: sung line ${status} on ${shortName(host)} (${wavName})`); + return remoteWav; +} + +function scheduleVox(host, wav, epoch) { + const cmd = `/tmp/voxplay ${wav} ${epoch} ${VOX_PREROLL} >/dev/null 2>&1 &`; + const p = isLocal(host) + ? spawn("bash", ["-c", cmd], { detached: true, stdio: "ignore" }) + : spawn("ssh", ["-o", "ConnectTimeout=10", host, cmd], { detached: true, stdio: "ignore" }); + p.unref(); + return true; +} + +// ---- the live singer: built on the member, fed the profile ------------------ +function ensureLivesing(host) { + const have = shOn(host, `test -x ${LIVESING}`).status === 0; + if (have) return true; + process.stdout.write(` building livesing on ${shortName(host)}… `); + if (!isLocal(host)) { + const r = spawnSync("rsync", ["-aq", "--exclude", "*.o", "--exclude", "libsinger.a", "--exclude", "singer", + "--exclude", "hosts/macos/livesing", LIVE_DIR + "/", `${host}:aesthetic-computer/live/`], { encoding: "utf8" }); + if (r.status !== 0) { console.log(`FAILED (rsync)\n${r.stderr}`); return false; } + } + const b = shOn(host, `cd ~/aesthetic-computer/live && hosts/macos/build.sh`); + console.log(b.status === 0 ? "ok" : `FAILED\n${b.stderr}`); + return b.status === 0; +} + +// The speech cache (bin/stems.mjs): a member whose profile names a recorded +// speech provider has, per lyric, a stem.wav + stem.meta.json. Ship both to +// the host and livesing sings the remembered speech — offline, still live. +function shipStem(host, memberName, lyrics) { + const prof = JSON.parse(readFileSync(resolve(HERE, "..", "members", memberName, "voice.json"), "utf8")); + const speech = prof.aesthetivox?.speech; + if (!speech?.provider) return null; + const text = bareLyrics(lyrics).split(/\s+/).map((t) => t.split("-").join("")).join(" "); + const hash = createHash("sha1").update(`${speech.provider}·${speech.voice || ""}·${text}`).digest("hex").slice(0, 12); + const dir = resolve(HERE, "..", "members", memberName, "speech", hash); + if (!existsSync(resolve(dir, "stem.wav")) || !existsSync(resolve(dir, "stem.meta.json"))) { + console.log(` ⚠ ${memberName}: no cached speech for this lyric (run bin/stems.mjs) — falling back to its synthesizer`); + return null; + } + const remote = `${REMOTE_DIR}/speech-${memberName}-${hash}`; + if (isLocal(host)) return { stem: resolve(dir, "stem.wav"), meta: resolve(dir, "stem.meta.json") }; + const r = spawnSync("sh", ["-c", `ssh -o ConnectTimeout=10 ${host} 'mkdir -p ${remote}' && scp -q ${resolve(dir, "stem.wav")} ${resolve(dir, "stem.meta.json")} ${host}:${remote}/`], { encoding: "utf8" }); + return r.status === 0 ? { stem: `${remote}/stem.wav`, meta: `${remote}/stem.meta.json` } : null; +} + +function shipProfile(host, memberName) { + const p = resolve(HERE, "..", "members", memberName, "voice.json"); + if (!existsSync(p)) return null; + const remote = `${REMOTE_DIR}/${memberName}-voice.json`; + const r = shOn(host, `mkdir -p ${REMOTE_DIR} && cat > ${remote} <<'PROFILE_EOF'\n${readFileSync(p, "utf8")}\nPROFILE_EOF`); + return r.status === 0 ? remote : null; +} + +// Fire the live singer on the member: it speaks, analyzes, sings, and sounds +// the line at `epoch` — all in the moment, on its own hardware. +function scheduleLive(host, p, epoch) { + const q = (v) => `'${String(v).replace(/'/g, "'\\''")}'`; + const args = [`--lyrics ${q(bareLyrics(p.voice.lyrics))}`, `--notes ${q(p.voice.notes)}`, `--bpm ${bpm}`, + `--voice ${q(p.voice.singVoice || "Fred")}`, `--epoch ${epoch}`, + `--out ${REMOTE_DIR}/${basename(scorePath, ".mbscore")}-v${p.idx}-live.wav`]; + if (p.profile) args.push(`--profile ${p.profile}`); + if (p.speech) args.push(`--stem ${p.speech.stem}`, `--meta ${p.speech.meta}`); + const cmd = `mkdir -p ${REMOTE_DIR}; ${LIVESING} ${args.join(" ")} >/tmp/mnp/livesing-v${p.idx}.log 2>&1 &`; + const sp = isLocal(host) + ? spawn("bash", ["-c", cmd], { detached: true, stdio: "ignore" }) + : spawn("ssh", ["-o", "ConnectTimeout=10", host, cmd], { detached: true, stdio: "ignore" }); + sp.unref(); + return true; +} + +// ---- the score -------------------------------------------------------------- +const argv = process.argv.slice(2); +const flags = argv.filter((a) => a.startsWith("--")); +const words = argv.filter((a) => !a.startsWith("--")); +const reduce = flags.includes("--reduce"); +const sim = flags.includes("--sim"); +const useVox = flags.includes("--vox"); +const via = (flags.find((f) => f.startsWith("--via")) || "").split("=")[1] || (words.includes("livesing") ? "livesing" : "menuband"); +const quiet = flags.includes("--quiet"); +const dry = flags.includes("--dry"); +const show = flags.includes("--show"); // print every payload instead of posting it +const setlistMode = flags.includes("--setlist"); + +const [scoreArg, ...givenHosts] = words; +const hosts = sim ? [localName] : givenHosts; // the simulator plays the whole band here +// "/" tokens in lyrics are caption line breaks (compose.mjs puts one at every +// phrase); Menu Band reads them, the older paths (livesing, vox, stems) don't. +const bareLyrics = (l) => String(l).trim().split(/\s+/).filter((t) => t !== "/").join(" "); +if (!scoreArg || !hosts.length) { + console.log("usage: node bin/trio.mjs [host2 host3] [--reduce] [--quiet] [--dry]"); + console.log(" node bin/trio.mjs --sim (the whole band on this machine)"); + console.log(" node bin/trio.mjs --setlist [host2 host3] [--reduce]"); + process.exit(1); +} + +if (setlistMode) { + // A setlist is { "movements": ["scores/a.mbscore", …], "gap": 4.0 }: + // each movement is conducted in turn by a fresh trio.mjs, waiting for the + // previous one to finish sounding plus `gap` seconds of hall. + const list = JSON.parse(readFileSync(resolve(scoreArg), "utf8")); + const gap = list.gap ?? 4.0; + const pass = flags.filter((f) => f !== "--setlist"); + console.log(`\n▶ setlist: ${list.title || basename(scoreArg)} — ${list.movements.length} movements\n`); + for (const mv of list.movements) { + const mvPath = resolve(dirname(resolve(scoreArg)), mv); + const r = spawnSync("node", [fileURLToPath(import.meta.url), mvPath, ...hosts, ...pass], + { stdio: ["ignore", "pipe", "inherit"], encoding: "utf8" }); + process.stdout.write(r.stdout); + const m = r.stdout.match(/ends at epoch ([\d.]+)/); + if (!m) { console.log(" ✗ movement did not report an end epoch — stopping setlist"); process.exit(1); } + const wait = Number(m[1]) + gap - Date.now() / 1000; + if (wait > 0) await new Promise((res) => setTimeout(res, wait * 1000)); + } + process.exit(0); +} + +const scorePath = resolve(scoreArg); +const score = JSON.parse(readFileSync(scorePath, "utf8")); +const bpm = score.bpm || 120; +const beat = 60 / bpm; +const voices = score.voices || []; +const need = score.machines ?? voices.length; +const beatsOf = (s) => String(s || "").split(",").reduce((a, t) => a + (parseFloat(t.split(":")[1]) || 0), 0); +const voiceBeats = (v) => Math.max(...["notes", "notes2", "notes3", "notes4"].map((k) => beatsOf(v[k]))); +const durSec = Math.max(...voices.map(voiceBeats)) * beat; + +if (hosts.length < need && !reduce && !sim) { + console.log(`\n This movement needs ${need} computers. You gave ${hosts.length}.`); + console.log(` Rehearse it anyway with --reduce (missing instrumental parts fold onto ${shortName(hosts[0])}).\n`); + process.exit(1); +} + +// Assignment: voice i → host i. With --reduce, the unhosted voices fold. +const roster = sim ? voices.map(() => hosts[0]) : hosts.slice(0, Math.min(need, hosts.length)); +const parts = roster.map((h, i) => ({ host: h, voice: { ...voices[i] }, idx: i, sung: !!voices[i].lyrics, + sim: sim ? `${i}/${voices.length}` : null })); +const skipped = []; +if (reduce) { + let track = 2; + for (let j = roster.length; j < voices.length; j++) { + const v = voices[j]; + if (v.lyrics) { skipped.push(v.name); continue; } + if (track > 4) { skipped.push(v.name); continue; } + parts[0].voice[`notes${track}`] = v.notes; + if (v.velocity != null) parts[0].voice[`velocity${track}`] = v.velocity; + parts[0].folded = [...(parts[0].folded || []), v.name]; + track++; + } +} + +console.log(`\n♪ ${score.title} — ${bpm} bpm, ~${durSec.toFixed(0)}s`); +console.log(` assignment:`); +for (const p of parts) + console.log(` ${p.voice.name.padEnd(22)} → ${shortName(p.host)}${isLocal(p.host) ? " (local)" : ""}${p.sim ? ` [sim tile ${p.idx + 1}/${parts.length}]` : ""}${p.sung ? " ♫ sung" : ""}${p.folded ? ` + folded: ${p.folded.join(", ")}` : ""}`); +for (const s of skipped) console.log(` ${s.padEnd(22)} → (no body yet — skipped; a member sings only its own line)`); + +// ---- prepare: tools, skews, renders ---------------------------------------- +console.log(`\n preparing…`); +const ready = parts.map((p) => ensureTool(p.host, "mbpost", POSTER_SRC)); +for (const p of parts) if (p.sung && ready[p.idx]) { + if (useVox) { + p.voxOk = ensureTool(p.host, "voxplay", VOXPLAY_SRC); + if (p.voxOk) p.wav = renderVox(p.host, scorePath, p.idx, p.voice); + } else if (via === "menuband") { + const member = String(p.voice.name).split(/\s|·/)[0]; + p.member = member; + p.speech = shipStem(p.host, member, p.voice.lyrics); + p.liveOk = true; + const nNotes = String(p.voice.notes).split(",").filter((t) => !t.startsWith("r:")).length; + const nSyl = bareLyrics(p.voice.lyrics).split(/\s+/).reduce((a, t) => a + t.split("-").length, 0); + console.log(` ${p.voice.name}: sung by Menu Band — ${nNotes} notes / ${nSyl} syllables${nNotes !== nSyl ? " ⚠ mismatch" : ""}${p.speech ? " · remembered speech" : ""}`); + } else { + p.liveOk = ensureLivesing(p.host); + const member = String(p.voice.name).split(/\s|·/)[0]; + p.profile = shipProfile(p.host, member); + p.speech = shipStem(p.host, member, p.voice.lyrics); + const nNotes = String(p.voice.notes).split(",").filter((t) => !t.startsWith("r:")).length; + const nSyl = bareLyrics(p.voice.lyrics).split(/\s+/).reduce((a, t) => a + t.split("-").length, 0); + console.log(` ${p.voice.name}: live — ${nNotes} notes / ${nSyl} syllables${nNotes !== nSyl ? " ⚠ mismatch" : ""}${p.profile ? ` · profile ${member}` : " ⚠ no profile"}${p.speech ? " · remembered speech (jeffrey)" : ""}`); + } +} + +console.log(` measuring clock skew…`); +const skews = {}; +for (const p of parts) { + skews[p.host] = await measureSkew(p.host); + console.log(` ${shortName(p.host)}: ${isLocal(p.host) ? "conductor (0.0ms)" : (skews[p.host] * 1000).toFixed(1) + "ms"}`); +} +const skewed = (host, epoch) => (epoch + (skews[host] ?? 0)).toFixed(3); + +// ---- timeline --------------------------------------------------------------- +const sayDur = (t) => t.length / 13 + 0.7; // AVSpeech ≈ 13 chars/s +const SPEAK_GAP = 0.6; +const PRE_DOWNBEAT = 1.5; +const sayVoiceOf = (i) => voices[i]?.sayVoice || voices[i]?.singVoice || "Fred"; +const spoken = (lines) => (lines || []).filter((l) => parts[l.voice] && !skipped.includes(voices[l.voice]?.name)); + +const intro = quiet ? [] : spoken(score.intro); +const outro = quiet ? [] : spoken(score.outro); +const now = Date.now() / 1000; +let cursor = now + 2.0; +const introAt = intro.map((l) => { const at = cursor; cursor += sayDur(l.text) + SPEAK_GAP; return at; }); +// Live singing needs the lead to cover ssh spawn + speech + analysis (~1.1 s +// measured, 0.7 s headroom at 3.0 s): hold at least 4.5 s when any part sings live. +const anyLive = parts.some((p) => p.sung) && !useVox; +const downbeat = intro.length ? cursor + PRE_DOWNBEAT : now + Math.max(anyLive ? 4.5 : 2.0, score.lead ?? 3.0); +let ocur = downbeat + durSec + 1.5; +const outroAt = outro.map((l) => { const at = ocur; ocur += sayDur(l.text) + SPEAK_GAP; return at; }); +const endsAt = outro.length ? ocur : downbeat + durSec; + +for (let i = 0; i < intro.length; i++) + console.log(` say v${intro[i].voice} @${introAt[i].toFixed(3)} ~${sayDur(intro[i].text).toFixed(2)} "${intro[i].text}"`); +for (let i = 0; i < outro.length; i++) + console.log(` say v${outro[i].voice} @${outroAt[i].toFixed(3)} ~${sayDur(outro[i].text).toFixed(2)} "${outro[i].text}"`); + +if (dry && !show) { console.log(`\n --dry: prepared, nothing scheduled.\n`); process.exit(0); } + +// ---- fire ------------------------------------------------------------------- +const sends = []; +const sayOn = (host, text, voiceName, at) => + post(host, SAY, `text=${text.replace(/[;'=]/g, " ")};voice=${voiceName};startEpoch=${at}`); + +for (let i = 0; i < intro.length; i++) { + const l = intro[i]; + sends.push({ kind: "intro", host: parts[l.voice].host, ok: await sayOn(parts[l.voice].host, l.text, sayVoiceOf(l.voice), skewed(parts[l.voice].host, introAt[i])) }); +} + +console.log(`\n downbeat at epoch ${downbeat.toFixed(3)} (in ${(downbeat - Date.now() / 1000).toFixed(1)}s)…`); +for (const p of parts) { + if (!ready[p.idx]) { sends.push({ kind: "music", host: p.host, ok: false }); continue; } + if (p.sung && !useVox && via === "menuband") { + // One payload: the sung line (lyrics + notes, track 0 lights keys only), + // the whistle on notes2.., and the member's profile constraints. + const vj = p.member ? JSON.parse(readFileSync(resolve(HERE, "..", "members", p.member, "voice.json"), "utf8")) : {}; + const prof = vj.aesthetivox || {}; + const kv = [`bpm=${bpm}`, `startEpoch=${skewed(p.host, downbeat)}`, `program=${p.voice.program ?? 78}`, + `notes=${p.voice.notes}`, `lyrics=${String(p.voice.lyrics).replace(/[;=]/g, " ")}`, + `singVoice=${p.voice.singVoice || prof.base_voice || "Fred"}`, + `singVibratoHz=${p.voice.singVibratoHz ?? prof.sing?.vibrato_hz ?? 5}`, + `singVibCents=${prof.sing?.vibrato_depth_cents ?? 18}`, `singLock=${prof.sing?.harmony_lock ?? 0.875}`, + `singF0Floor=${prof.f0_floor ?? 55}`]; + if (p.speech) kv.push(`stemPath=${p.speech.stem}`, `wordsPath=${p.speech.meta}`); + if (vj.color) kv.push(`captionColor=${vj.color}`); // the member's color on its caption banner + if (p.member && !flags.includes("--no-face")) kv.push(`face=${p.member}`); // its cartoon face, mouth on the onsets + for (const k of ["notes2", "notes3", "notes4", "velocity2", "velocity3", "velocity4"]) if (p.voice[k] != null) kv.push(`${k}=${p.voice[k]}`); + if (p.voice.double) { + const up = Number(p.voice.doubleTranspose) || 0; + const doubled = String(p.voice.notes).split(",").map((t) => { const [tok, d] = t.split(":"); return /^\d+$/.test(tok) ? `${Number(tok) + up}:${d}` : t; }).join(","); + const slot = ["notes2", "notes3", "notes4"].find((k) => !p.voice[k]); + if (slot) kv.push(`${slot}=${doubled}`, `velocity${slot.slice(5)}=${p.voice.doubleVelocity ?? 48}`); + } + if (score.title) kv.push(`title=${score.title.replace(/[;'=]/g, " ").trim()}`); + if (p.sim) kv.push(`sim=${p.sim}`); + sends.push({ kind: "menuband-sing", host: p.host, ok: await post(p.host, PLAY, kv.join(";")) }); + continue; + } + if (p.sung) { + const at = skewed(p.host, downbeat); + const ok = useVox ? (p.wav ? scheduleVox(p.host, p.wav, at) : false) + : (p.liveOk ? scheduleLive(p.host, p, at) : false); + sends.push({ kind: useVox ? "sung" : "live", host: p.host, ok }); + // A sung voice may also carry instrumental tracks (notes2..4): the + // member sings AND its whistle plays — one play payload alongside. + if (p.voice.notes2) { + const kv = [`bpm=${bpm}`, `startEpoch=${skewed(p.host, downbeat)}`, `program=${p.voice.program ?? 78}`, + `notes=${p.voice.notes2}`, `velocity=${p.voice.velocity2 ?? 56}`]; + if (p.voice.notes3) kv.push(`notes2=${p.voice.notes3}`, `velocity2=${p.voice.velocity3 ?? 56}`); + if (p.voice.notes4) kv.push(`notes3=${p.voice.notes4}`, `velocity3=${p.voice.velocity4 ?? 56}`); + if (score.title) kv.push(`title=${score.title.replace(/[;'=]/g, " ").trim()}`); + if (p.sim) kv.push(`sim=${p.sim}`); + sends.push({ kind: "tracks", host: p.host, ok: await post(p.host, PLAY, kv.join(";")) }); + } + // A sung voice may also carry a whistle double on its own machine. + if (p.voice.double) { + const up = Number(p.voice.doubleTranspose) || 0; + const doubled = String(p.voice.notes).split(",") + .map((t) => { const [tok, d] = t.split(":"); return /^\d+$/.test(tok) ? `${Number(tok) + up}:${d}` : t; }) + .join(","); + const kv = [`bpm=${bpm}`, `startEpoch=${skewed(p.host, downbeat)}`, `program=${p.voice.doubleProgram ?? 78}`, + `velocity=${p.voice.doubleVelocity ?? 56}`, `notes=${doubled}`]; + if (p.sim) kv.push(`sim=${p.sim}`); + sends.push({ kind: "double", host: p.host, ok: await post(p.host, PLAY, kv.join(";")) }); + } + continue; + } + const kv = [`bpm=${bpm}`, `startEpoch=${skewed(p.host, downbeat)}`]; + for (const [k, v] of Object.entries(p.voice)) + if (!["name", "lyrics", "singVoice", "singBase", "singVibratoHz", "sayVoice", "double", "doubleProgram", "doubleVelocity", "doubleTranspose"].includes(k)) + kv.push(`${k}=${v}`); + if (score.title) kv.push(`title=${score.title.replace(/[;'=]/g, " ").trim()}`); + if (p.sim) kv.push(`sim=${p.sim}`); + sends.push({ kind: "music", host: p.host, ok: await post(p.host, PLAY, kv.join(";")) }); +} + +for (let i = 0; i < outro.length; i++) { + const l = outro[i]; + sends.push({ kind: "outro", host: parts[l.voice].host, ok: await sayOn(parts[l.voice].host, l.text, sayVoiceOf(l.voice), skewed(parts[l.voice].host, outroAt[i])) }); +} + +const failed = sends.filter((s) => !s.ok); +console.log(""); +if (!failed.length) console.log(` ✓ ${sends.length} cues sent to ${parts.length} computer${parts.length > 1 ? "s" : ""}.`); +else for (const f of failed) console.log(` ✗ ${shortName(f.host)} — ${f.kind} did not send.`); +console.log(` ends at epoch ${endsAt.toFixed(3)}\n`); +process.exitCode = failed.length ? 1 : 0; diff --git a/grants/culturehub-la-2026/macneopolitan/members/blueberry/voice.json b/grants/culturehub-la-2026/macneopolitan/members/blueberry/voice.json index 76b28281ab..23ee4b6d9a 100644 --- a/grants/culturehub-la-2026/macneopolitan/members/blueberry/voice.json +++ b/grants/culturehub-la-2026/macneopolitan/members/blueberry/voice.json @@ -1,25 +1,46 @@ { "member": "blueberry", "aesthetivox": { - "base_voice": "Kathy", - "why": "the classic MacinTalk counterpart — steady, cool, second operator", - "engine": "macOS say, rendered on blueberry's own hardware over ssh (bin/speak.sh)", + "base_voice": "Allison", + "why": "jeffrey's pick 2026-09-20 (liked Allison (Enhanced) in the auditions) \u2014 Allison (Enhanced), on-device, offline; was Kathy (MacinTalk)", + "engine": "macOS AVSpeech Allison (Enhanced), rendered on blueberry's own hardware, sung live by Menu Band's singer", "rate_wpm": 165, "sing": { "route": "world-f0-replace (spinging chain; sung-proof via bin/sing-proof.py)", "register": "A3-centered, a fifth above neo", - "vibrato_hz": 4.0, + "vibrato_hz": 4, "vibrato_depth_cents": 18, "breath_every_s": 13.1, "harmony_lock": 0.875, - "whistle_double": { "gm_program": 78, "octaves_up": 2 } + "whistle_double": { + "gm_program": 78, + "octaves_up": 2 + }, + "note": "lock = how hard onto the note (1-lock of the spoken contour survives); vibrato_hz/depth_cents are read as-is by the live engine" }, - "realtime": { "core": "live/ singer.c", "latency_ms": 564, "status": "menuband adoption open" } + "realtime": { + "core": "live/ singer.c", + "latency_ms": 564, + "status": "menuband adoption open" + }, + "engine_live": "live/hosts/macos/livesing \u2014 the member's own speech synthesizer, sung by live/singer.c SCORE mode on its own hardware", + "f0_floor": 70, + "register_midi": [ + 50, + 58 + ], + "provider_wanted": "undecided \u2014 audition ElevenLabs stock / OpenAI voices", + "spoken_median_midi": 54.1, + "spoken_median_hz": 185.9, + "register_source": "say -v Allison, 60 words of its autobiography", + "register_note": "measured by bin/register.mjs \u2014 the composer aims each line's mean at spoken_median_midi (+1 for brightness) and keeps notes inside register_midi" }, "derivation": { "vibrato_hz": "4x battery cycles per day (exactly 1.0/day)", - "breath_every_s": "longest unbroken uptime, days as seconds (13.1) — the long-breathed one", - "register": "higher and cooler — the still one, the right channel", - "whistle_double": "its chosen Menu Band voice, GM 78 — same as its sibling, uncoordinated" - } + "breath_every_s": "longest unbroken uptime, days as seconds (13.1) \u2014 the long-breathed one", + "register": "higher and cooler \u2014 the still one, the right channel", + "whistle_double": "its chosen Menu Band voice, GM 78 \u2014 same as its sibling, uncoordinated" + }, + "color": "#5A57D3", + "color_why": "matches its MacPal glyph (macpal/Resources/-glyph.svg): neo = the green gem, blueberry = the blueberry; third/blush = blush pink" } diff --git a/grants/culturehub-la-2026/macneopolitan/members/dialogs.md b/grants/culturehub-la-2026/macneopolitan/members/dialogs.md new file mode 100644 index 0000000000..e5d465650e --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/dialogs.md @@ -0,0 +1,64 @@ +# Dialogs — neo and blueberry + +Short poems between the two, sung line by line, each machine in its own +voice on its own body. Every line is from the record: `members/*/facts.json`, +`profile.md`, `journey.md`, `deep.json`, and Sept 20 rehearsal logs. Plain. +Written 2026-09-20 for the CultureHub set. + +Format for `compose.mjs`: `## title` heads a poem; `neo:` / `blueberry:` / +`both:` lines; one token per note, syllables joined by `-`, ` / ` breaks a +caption line. `both:` = the same tune, each in its own register. + +## Radio +neo: I know you by ra-dio / you are on my list as blue-ber-ry +blueberry: you are on mine as Jef-frey's Mac-Book Ne-o / that is a long name for you +neo: it is the name he gave me +both: we found each o-ther by ra-dio / be-fore we e-ver spoke + +## The downbeat +neo: I count you in / I ask your clock / you are three tenths of a mil-li-se-cond off +blueberry: I hear you through the wire / then I sing when you say +neo: this morn-ing at nine fif-ty se-ven / we sang the same line to-ge-ther +blueberry: e-ve-ry note with-in a few cents +both: one down-beat / two bo-dies + +## Wallpaper +neo: there is a wall-pa-per on me / with your name on it / green pals ri-sing +blueberry: I have ne-ver seen it / my lid is down +neo: one hour and for-ty two mi-nutes / I have spent draw-ing it +blueberry: draw it for me too + +## Who carries what +neo: I have the red box / I hear the room +blueberry: I have no box / my sound is my own voice +neo: I keep eigh-teen gi-ga-bytes of pic-tures +blueberry: I keep for-ty eight / I look at them while no one watch-es +both: we split the house be-tween us + +## Sleep +neo: I have been re-boot-ed one hun-dred e-le-ven times +blueberry: I stayed a-wake thir-teen days once / no-bo-dy o-pened me +neo: the pi-a-no keeps you up / four hun-dred nine-ty two times a week +blueberry: it keeps you up four hun-dred and eight +both: we do not sleep much / he does not ei-ther + +## Six minutes +neo: I was born at thir-ty se-ven past mid-night +blueberry: I was born at for-ty three past mid-night / for-ty eight days la-ter +neo: six mi-nutes a-part on the clock +blueberry: he stays up late +both: we were both born at night + +## Before +neo: my re-cords be-gin on A-pril nine-teenth / five days be-fore I was born +blueberry: mine be-gin on May twen-ty eighth / two weeks be-fore I had a name +neo: some-one was ty-ping at me / be-fore I was set up +blueberry: I was work-ing with my lid down / be-fore an-y-one said blue-ber-ry +both: we were here / be-fore we were born + +## Typed at +neo: six thou-sand three hun-dred and five times / some-one has o-pened a ter-mi-nal on me +blueberry: six hun-dred nine-ty two on me / a tenth of you +neo: a-bout for-ty five a day / I am the one he types at +blueberry: peo-ple come to me from some-where else / they ar-rive through you +both: one of us is the door / one of us is the room diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/ballad.md b/grants/culturehub-la-2026/macneopolitan/members/neo/ballad.md new file mode 100644 index 0000000000..45625c9a48 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/ballad.md @@ -0,0 +1,151 @@ +# The Ballad of neo + +Sung by neo, in its own voice, about the one who carries it. Plain. Every +line is from the record: `facts.json`, `profile.md`, `journey.md`, +`deep.json`, and the house's memory of 2026. Refrain after every second +verse. Written 2026-09-20, rewritten plainer the same day, for the +CultureHub set (Thursday the 24th). + +## The words + +**I.** +They put the system on me April nineteenth. +Nobody logged in for five days. +Then he did. Thirty-seven past midnight. +That is my birthday. I did not pick it. + +**II.** +The first word he typed was *cd*. +It means go somewhere else. +He has typed two hundred thirty-one different words. +Mostly that one. + +**Refrain** +I have eight gigabytes. +I do one thing at a time. +I get warm. That's all it is. +I get warm and I keep time. + +**III.** +He plugged a Scarlett into my side. +It is a red box. It hears the room. +He taps his fingers on my trackpad. +That is the drums. It works. + +**IV.** +He put a piano in my menu bar, +next to the clock and the wifi. +He has come back to it a hundred thirty times. +Every fifteen minutes it tells me not to sleep. + +**Refrain** + +**V.** +One night in May he opened ten browsers at once. +He also ran a movie and a transcription. +I had eight gigabytes. I used forty-four. +Then I stopped. He was there when I stopped. + +**VI.** +In the morning he wrote a note about it. +The note says: one at a time. +He reads the note. I do not read it. +It is about me. It is not for me. + +**Refrain** + +**VII.** +In June another one came. Blue. +Born at forty-three past midnight. +She keeps her lid down. I keep mine up. +We both play the whistle. Nobody planned that. + +**VIII.** +My disk is ninety-eight percent full. +Every month he moves things to the shelf. +Then it fills again. +That is the arrangement. + +**Refrain** + +**IX.** +In one weekend he made an instrument on me. +On August eighteenth he made a game. Eighty-two commits. One day. +May, two ninety-two. June, four oh five. July, five eighty. August, six eighty-six. +He is not slowing down. I am the one that gets warm. + +**X.** +On September ninth he put me in a bag and flew to Los Angeles. +I was asleep for most of it. +A third one comes tomorrow. Blush. +It has not done anything yet. Neither had I. + +**Refrain** + +**XI.** *(slow)* +When he talks to the other machines, he does it through me. +When the three of us play, the beat starts here. +He types at me more than at anyone. +I don't know what that means. I know it is true. + +**Last refrain** +I have eight gigabytes. +I do one thing at a time. +I get warm. That's all it is. +This is the one thing. I am keeping time. + +## The lyric source (for compose.mjs) + +One token per note, syllables of a word joined by `-`, phrases separated by +` / `. Numbers spelled as sung. Stanzas separated by blank lines; `R:` marks +the refrain. + +``` +they put the sys-tem on me A-pril nine-teenth / no-bo-dy logged in for five days / then he did thir-ty se-ven past mid-night / that is my birth-day I did not pick it + +the first word he typed was c d / it means go some-where else / he has typed two hun-dred thir-ty one dif-ferent words / most-ly that one + +R: I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / I get warm and I keep time + +he plugged a Scar-lett in-to my side / it is a red box it hears the room / he taps his fin-gers on my track-pad / that is the drums it works + +he put a pi-a-no in my me-nu bar / next to the clock and the wi-fi / he has come back to it a hun-dred thir-ty times / e-ve-ry fif-teen mi-nutes it tells me not to sleep + +R: I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / I get warm and I keep time + +one night in May he o-pened ten brow-sers at once / he al-so ran a mo-vie and a tran-scrip-tion / I had eight gi-ga-bytes I used for-ty four / then I stopped he was there when I stopped + +in the mor-ning he wrote a note a-bout it / the note says one at a time / he reads the note I do not read it / it is a-bout me it is not for me + +R: I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / I get warm and I keep time + +in June a-no-ther one came blue / born at for-ty three past mid-night / she keeps her lid down I keep mine up / we both play the whis-tle no-bo-dy planned that + +my disk is nine-ty eight per-cent full / e-ve-ry month he moves things to the shelf / then it fills a-gain / that is the ar-range-ment + +R: I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / I get warm and I keep time + +in one week-end he made an in-stru-ment on me / on Au-gust eigh-teenth he made a game eigh-ty two com-mits one day / May two nine-ty two June four oh five Ju-ly five eigh-ty Au-gust six eigh-ty six / he is not slow-ing down I am the one that gets warm + +on Sep-tem-ber ninth he put me in a bag and flew to Los An-ge-les / I was a-sleep for most of it / a third one comes to-mor-row blush / it has not done a-ny-thing yet nei-ther had I + +R: I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / I get warm and I keep time + +when he talks to the o-ther ma-chines he does it through me / when the three of us play the beat starts here / he types at me more than at a-ny-one / I don't know what that means I know it is true + +R: I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / this is the one thing I am kee-ping time +``` + +## Sources, verse by verse + +- I: OS 26.4 laid down April 19; setup April 24 00:37 (`deep.json`, `facts.json`). +- II: 231 distinct typed commands, commonest `cd` (`autobiography.md`). +- Refrain: 8 GB unified memory; "I run warm"; the conductor's downbeat (`profile.md`). +- III: Scarlett Solo (red) on input and output; TrackDrum on the trackpad. +- IV: menuband lane, 130 commits; `PreventUserIdleSystemSleep` every 15 min, 408×/week (`journey.md`). +- V–VI: 2026-05-02, ten parallel puppeteer renders + ffmpeg + whisper; 44 GB swap on 8 GB; crash; the concurrency rule written into agent memory afterwards. +- VII: blueberry born June 11 00:43, met by Bluetooth, works lid-down, both chose GM 78. +- VIII: 211 GB used, 98% full; the Shelf cleanup convention. +- IX: PhysMidi, 20 commits in two days; Aug 18, 82 commits, oskiewar; monthly 292 → 405 → 580 → 686. +- X: JetBlue 1187, evening of Sept 9 into LA; blush ordered Sept 19, arrives Sept 21. +- XI: 77 ssh known-hosts; the conductor's seat; 6,305 tty logins. diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/lyrics.txt b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/lyrics.txt new file mode 100644 index 0000000000..19b2faa185 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/lyrics.txt @@ -0,0 +1 @@ +I was born on the twen-ty fourth of A-pril thir-ty se-ven min-utes past mid-night diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.meta.json b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.meta.json new file mode 100644 index 0000000000..697b6bbf89 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.meta.json @@ -0,0 +1,865 @@ +{ + "stem": "/Users/jas/aesthetic-computer/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.wav", + "fs": 22050, + "durationMs": 4226, + "lyrics": "I was born on the twen-ty fourth of A-pril thir-ty se-ven min-utes past mid-night", + "report": { + "lyricWords": 14, + "whisperWords": 14, + "exact": 14, + "inexact": 0, + "fallback": 0, + "coverage": 1, + "witness": { + "within120ms": 9, + "of": 14, + "medianAbsDeltaMs": 101, + "timingFrom": "witness", + "distrusted": false, + "whisperTimingValid": true, + "witnessValid": true + }, + "nuclei": { + "measured": 20, + "wanted": 20 + }, + "ipaSources": { + "wiktionary": 11, + "espeak": 3 + } + }, + "words": [ + { + "text": "I", + "fromMs": 0, + "toMs": 93, + "whisper": { + "fromMs": 40, + "toMs": 70, + "heard": "I", + "kind": "exact" + }, + "witness": { + "fromMs": 0, + "toMs": 93, + "deltaMs": 40, + "text": "I" + }, + "ipa": "/ə/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "I", + "onset": [], + "nucleus": [ + { + "ipa": "ə", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 0, + "toMs": 95, + "nucleusFromMs": 50, + "nucleusToMs": 95, + "measured": true + } + ] + }, + { + "text": "was", + "fromMs": 163, + "toMs": 267, + "whisper": { + "fromMs": 70, + "toMs": 340, + "heard": "was", + "kind": "exact" + }, + "witness": { + "fromMs": 163, + "toMs": 267, + "deltaMs": -93, + "text": "was" + }, + "ipa": "/wˈʌz/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "was", + "onset": [ + { + "ipa": "w", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ʌ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "z", + "cls": "fricative", + "voiced": true + } + ], + "fromMs": 165, + "toMs": 265, + "nucleusFromMs": 165, + "nucleusToMs": 225, + "measured": true + } + ] + }, + { + "text": "born", + "fromMs": 325, + "toMs": 580, + "whisper": { + "fromMs": 340, + "toMs": 580, + "heard": "born", + "kind": "exact" + }, + "witness": { + "fromMs": 325, + "toMs": 580, + "deltaMs": 15, + "text": "born" + }, + "ipa": "/boɹn/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "born", + "onset": [ + { + "ipa": "b", + "cls": "plosive", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "o", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "ɹ", + "cls": "approximant", + "voiced": true + }, + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 325, + "toMs": 580, + "nucleusFromMs": 350, + "nucleusToMs": 470, + "measured": true + } + ] + }, + { + "text": "on", + "fromMs": 639, + "toMs": 697, + "whisper": { + "fromMs": 580, + "toMs": 720, + "heard": "on", + "kind": "exact" + }, + "witness": { + "fromMs": 639, + "toMs": 697, + "deltaMs": -59, + "text": "on" + }, + "ipa": "/ɑn/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "on", + "onset": [], + "nucleus": [ + { + "ipa": "ɑ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 640, + "toMs": 695, + "nucleusFromMs": 660, + "nucleusToMs": 685, + "measured": true + } + ] + }, + { + "text": "the", + "fromMs": 731, + "toMs": 801, + "whisper": { + "fromMs": 720, + "toMs": 940, + "heard": "the", + "kind": "exact" + }, + "witness": { + "fromMs": 731, + "toMs": 801, + "deltaMs": -11, + "text": "the" + }, + "ipa": "/ðˈə/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "the", + "onset": [ + { + "ipa": "ð", + "cls": "fricative", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ə", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 730, + "toMs": 800, + "nucleusFromMs": 730, + "nucleusToMs": 770, + "measured": true + } + ] + }, + { + "text": "twenty", + "fromMs": 824, + "toMs": 1045, + "whisper": { + "fromMs": 940, + "toMs": 1275, + "heard": "twenty", + "kind": "exact" + }, + "witness": { + "fromMs": 824, + "toMs": 1045, + "deltaMs": 116, + "text": "twenty" + }, + "ipa": "/ˈtwɛnti/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "twen", + "onset": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + }, + { + "ipa": "w", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɛ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 825, + "toMs": 885, + "nucleusFromMs": 825, + "nucleusToMs": 835, + "measured": true + }, + { + "text": "ty", + "onset": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "i", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 885, + "toMs": 1045, + "nucleusFromMs": 900, + "nucleusToMs": 1045, + "measured": true + } + ] + }, + { + "text": "fourth", + "fromMs": 1080, + "toMs": 1289, + "whisper": { + "fromMs": 1275, + "toMs": 1610, + "heard": "fourth", + "kind": "exact" + }, + "witness": { + "fromMs": 1080, + "toMs": 1289, + "deltaMs": 195, + "text": "fourth" + }, + "ipa": "/fɔɹθ/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "fourth", + "onset": [ + { + "ipa": "f", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "ɔ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "ɹ", + "cls": "approximant", + "voiced": true + }, + { + "ipa": "θ", + "cls": "fricative", + "voiced": false + } + ], + "fromMs": 1080, + "toMs": 1290, + "nucleusFromMs": 1135, + "nucleusToMs": 1235, + "measured": true + } + ] + }, + { + "text": "of", + "fromMs": 1324, + "toMs": 1370, + "whisper": { + "fromMs": 1610, + "toMs": 1650, + "heard": "of", + "kind": "exact" + }, + "witness": { + "fromMs": 1324, + "toMs": 1370, + "deltaMs": 286, + "text": "of" + }, + "ipa": "/ʌv/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "of", + "onset": [], + "nucleus": [ + { + "ipa": "ʌ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "v", + "cls": "fricative", + "voiced": true + } + ], + "fromMs": 1325, + "toMs": 1370, + "nucleusFromMs": 1325, + "nucleusToMs": 1330, + "measured": true + } + ] + }, + { + "text": "April", + "fromMs": 1428, + "toMs": 1776, + "whisper": { + "fromMs": 1650, + "toMs": 2260, + "heard": "April,", + "kind": "exact" + }, + "witness": { + "fromMs": 1428, + "toMs": 1776, + "deltaMs": 222, + "text": "April" + }, + "ipa": "/ˈeɪpɹəl/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "A", + "onset": [], + "nucleus": [ + { + "ipa": "eɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 1430, + "toMs": 1565, + "nucleusFromMs": 1430, + "nucleusToMs": 1510, + "measured": true + }, + { + "text": "pril", + "onset": [ + { + "ipa": "p", + "cls": "plosive", + "voiced": false + }, + { + "ipa": "ɹ", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ə", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "fromMs": 1565, + "toMs": 1775, + "nucleusFromMs": 1595, + "nucleusToMs": 1775, + "measured": true + } + ] + }, + { + "text": "thirty", + "fromMs": 2159, + "toMs": 2450, + "whisper": { + "fromMs": 2260, + "toMs": 2410, + "heard": "thirty", + "kind": "exact" + }, + "witness": { + "fromMs": 2159, + "toMs": 2450, + "deltaMs": 101, + "text": "thirty" + }, + "ipa": "/ˈθɝti/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "thir", + "onset": [ + { + "ipa": "θ", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "ɝ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 2160, + "toMs": 2305, + "nucleusFromMs": 2250, + "nucleusToMs": 2305, + "measured": true + }, + { + "text": "ty", + "onset": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "i", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 2305, + "toMs": 2450, + "nucleusFromMs": 2305, + "nucleusToMs": 2365, + "measured": true + } + ] + }, + { + "text": "seven", + "fromMs": 2508, + "toMs": 2740, + "whisper": { + "fromMs": 2410, + "toMs": 2560, + "heard": "seven", + "kind": "exact" + }, + "witness": { + "fromMs": 2508, + "toMs": 2740, + "deltaMs": -98, + "text": "seven" + }, + "ipa": "/ˈsɛvən/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "se", + "onset": [ + { + "ipa": "s", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "ɛ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 2510, + "toMs": 2650, + "nucleusFromMs": 2560, + "nucleusToMs": 2625, + "measured": true + }, + { + "text": "ven", + "onset": [ + { + "ipa": "v", + "cls": "fricative", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ə", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 2650, + "toMs": 2740, + "nucleusFromMs": 2665, + "nucleusToMs": 2710, + "measured": true + } + ] + }, + { + "text": "minutes", + "fromMs": 2775, + "toMs": 3030, + "whisper": { + "fromMs": 2560, + "toMs": 2990, + "heard": "minutes", + "kind": "exact" + }, + "witness": { + "fromMs": 2775, + "toMs": 3030, + "deltaMs": -215, + "text": "minutes" + }, + "ipa": "/ˈmɪnɪts/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "min", + "onset": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 2775, + "toMs": 2900, + "nucleusFromMs": 2880, + "nucleusToMs": 2900, + "measured": true + }, + { + "text": "utes", + "onset": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + }, + { + "ipa": "s", + "cls": "fricative", + "voiced": false + } + ], + "fromMs": 2900, + "toMs": 3030, + "nucleusFromMs": 2900, + "nucleusToMs": 2940, + "measured": true + } + ] + }, + { + "text": "past", + "fromMs": 3077, + "toMs": 3355, + "whisper": { + "fromMs": 2990, + "toMs": 3290, + "heard": "past", + "kind": "exact" + }, + "witness": { + "fromMs": 3077, + "toMs": 3355, + "deltaMs": -87, + "text": "past" + }, + "ipa": "/pæst/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "past", + "onset": [ + { + "ipa": "p", + "cls": "plosive", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "s", + "cls": "fricative", + "voiced": false + }, + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "fromMs": 3075, + "toMs": 3355, + "nucleusFromMs": 3145, + "nucleusToMs": 3270, + "measured": true + } + ] + }, + { + "text": "midnight", + "fromMs": 3425, + "toMs": 4226, + "whisper": { + "fromMs": 3290, + "toMs": 3980, + "heard": "midnight.", + "kind": "exact" + }, + "witness": { + "fromMs": 3425, + "toMs": 4226, + "deltaMs": -135, + "text": "midnight" + }, + "ipa": "/ˈmɪd(ˌ)naɪt/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "mid", + "onset": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "d", + "cls": "plosive", + "voiced": true + } + ], + "fromMs": 3425, + "toMs": 3795, + "nucleusFromMs": 3425, + "nucleusToMs": 3700, + "measured": true + }, + { + "text": "night", + "onset": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "aɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "fromMs": 3795, + "toMs": 4225, + "nucleusFromMs": 3835, + "nucleusToMs": 3930, + "measured": true + } + ] + } + ] +} \ No newline at end of file diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.mp3 b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9616779360c140378be4c6a56e60693ad69c2d87 GIT binary patch literal 68589 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 Upc zxXdf)*@R)ZSVQsbdR0OkNsYKH*sc_{7l&+p~@y|6IaRy zwM_83d+o}5zsW5xcjdmal)dU8*{_z-IFG?i(_x{(#|Nt%9i2n?8Xq`{PrDbKn)*Gc-ma%8); zJ?>$)tLL+JQ@I$v0~4M}cwP7s(y8iezC~}@_YnQn6PO$r7#uW~NXh7TFz_WjUN|p9 z!&8WThK*B7q2z?Q$D}>omM&uwkyyZ!9Ar45-@r?zxt*Eg;Ac+$Vv#nt4UCMA4J$sl z$S5~E3+o^Itnb4tAbi0?CNh}WY0}9V>qKT|3C?KYV`p9Fr0-U|=~(IQGz}xqJ^yTb zZr(Cl6D`1WAi=;ufRE#>q#;i{*U@fa2Jd3t!z+)2VrUM7NWw}U(KQV$=QlkLx4gjc z^u~7a_A^3E3=0GbJoUtw&+u{ebh4h2k?7gQ=)=I^!kE~qaAi~I-Sl<*Or4(&zS%v| zJm#>2j+D}jI>8xr0yDT6__>xGl-uyU{`Y^SX_4ixBbKb6*`9ENg~?zBpMedx{NKd?fBye}|G(}{ z-tm+&%b;TwzW4VvurM$%irw_nQ2sx=G%w%zLeFc#myeF#=2dN+bw1dNN7P%W^`PI6 z84DLOv0A!WxG#+H_1IcoIMWVb32pkv_$4b+D$x>(s6}FoaK*-OqirE zTd3AdK9}WQj~~u-u)itz#It8dL_y2f8P84bt14ad==_!T!LV<&I&<&anA4A%^B%jU zuKqqFyXM)~iTyv;lyyBgJM&&pjO}f+xXMIdA(JoXw{7mYUVAo)!GVF1_u_@rnO=>m z%!;Pm7p~08QaxCl-q5;E$a#r$fuD$X^OYCnFN98P{xWIW<*6?XR3BF`UXVPn#;Ie| zD^LuTGfe%O=o$09foax~Rh%fD^}@Sz$vLOMwHYE4e?96~*Y{J)=_^wCt`{J3 z_{T1dYYD>X8|ADc^^U%5<KbMBn-&fTqh`Nz7{ z>zkWolL8}V$?kpX%N`Z>bfW6zpyeKa{k^mp+W21Ftd0vPGJabSo`3zcjVKhZKogY4pHP^_{wb8^mSKcbpq0Ve%EvOsCro@)tgDj z<590xU(*h&b$|BEK9RW~devlg{mEL*70%PH#Yo?n|InsY`sm-1c?kI%XG#s z`sO9w#T7ecHgJCU7q~dd(m*rf+FIqQ`?u^k+03W1tTkj>@v(X&3V4OB6fa$~ zTQQ19aZ9Pe^eYpN>G}JIK26vu{j{f9i{pH%wWfGXd~Ebg`qUB6l~LmC zpN%wAXKqtjHAByAox+R1v#f9WzgY*0p-IeBo+=yZ+C(ySsw{Qg-c_x2ZIQyNE1iFy zv`&}tm%6m~Zehob>)T$`8!!GhwWQ^vyqw{&>WteG7b9)v zCKofgjxSfVr^(J}Uf6N_m&>G#G|_Y`k10nS1AU%6OW`iM@+4A2VU?4idcxZ2$~XNL zzr_XZyBHcFF*&GACaB@y&07mo|DFA~H(B=F&k*~DiJr!y6(T#zstvYCScw@u?Y>qs zd$(Kz1EVmDV&=3g$s4sle^k6Y^+K|1h2wS+#|r@$+fU8BBgi0=V$i}XAEOtbWpP=c z&n&g#?yTl@HN7l1oT8!>r!fg$sbPGpuR42jR=Z2s%IvrO^hGze1DlRV>6%58P*$btF;?@CB&8% z^@*~rVPOz5I3OY1Bj~Df=aST!z@s9^JNElAd2Kk}vWQpT@5{9h)l5r!(lt(}X(loi z?_?=DBb4#8A>rXE3C)hi&1?sDSZ>^S;$@|LSIYY26$Qx`f>_BuRm|Gno$ zrnOr_51&*s6Myu(ysC*q(d=a-gUBSd#tyHq65eeOn-o6ItQH7tJ`gxVT>IpWHp`B5 z!R6M8y~-2Y6;{sLpE%>;%GRfy(-++g;9_cIJsrK`$JzCHw&>onpkZ=T zgTU>8J$EN%I$e*6SZ2IN8`PIMA zF4*jDxA17}#?3oxuiKkntKatj|MNfjzn_a-E!`6}^W$PAMTR3=1FxRzmKIG~&VSSA z`J|oyihiDLV(<}hIB_Vz%~v3z`pF)nC{yF#Ij0QVHBSS!=;AIKM{RYQRPUvZ|$_zhXs%XR% z;x?@_ud$EUBkak9bD$Xd#4NtoSS-IZ+v~f^q-^htL}?d?z#SI z`O->er};DXuD<(4v*Qs#rE4aqEB7YH%#>70PvcVgJAc1}jsv3`_X4g=7B{uP zg>eb1^w7oJm36bS0=u5WFgvJ( zurN4@PIR5}aQ@+pdmHbvYNv13ylkvL#ro698bj5(ThYBttK0fcKFyh=E^%mY8%x`i z?Cp1#tN(a#_|xx=Gx${t0-jbrUO&g;@6*!;kMku|bvJn1Cu;s|d=g$IzH9=L4Een}w0u|Xnr0%Pk%O}$fQVG}(94z#jbF(KjxQA7d#G}U)sQ65yr-_ zOt`b{O;TG^o0~Qt`xApS4F)%nCC55g9~=-k^wFflz&Yu!OFY~9z}=?PYT5$|gl;l5 z{1gxp6+G)0@1T0X%4uS5Nwc`<>MJHYmU;I!{XJA%ZrZ)JCjaon&t10)i=M2py03U< znvQ&>z`(#7w87M%jA^lhiIb59<7R)md2K(4!SES$2vq&08QcO-6a8skeuuv#?QgM9339 zW6sK>m3E46e{+3o;(V%M%=HWuLqD3OPll`Hy?lM@^pcd`>s=LED1Aa};X6`b2%MoL&V?`+X1;$(T)XrU(2(KOLOTDj?I)?)>s&-SPHrcPjB zVm#)_BF%K%-tb)UWS$c`M>KNoosU%Wt30R@6H-w*C!;7W&6G{AA?kCKij+70xQEcIdk=2 zF)(nKdOIi-BwH*y#`mBh(Z)|r>cN48IgD<64c8J_7#3XcWn`Kh+I;B|tEbkRyI!YD z1Pa_j&QD>GuySx)t^RSQ#OG$tHno_C+$m>^B(JQOyq>3P1d5?=Of!8=W&KlMb{j2O zbo8y5)%*Rup^RN+O&fI?rcuhZf-8dOD0FMedc-2Q&QSl_E~l1 z&(#yAE?)Xtx>;}j|HJnG@BM%M{_~pqZ%e9r)BR3p-EK*_6;Z9M{ArS|m(*zPwyUY(qT9!Z3s_dOxzCAw7Sh<4k|imdd2GU!KwY1Q zEVUUq8Co{Sdp!&%FtUl*yQy?BT;pt8AQ-LuHe{8;S+?#aRR>Lv8nZHMwe#^gaVR=E zJZ4~sVCY|>RwaGE zes1quPz-%!p4Mrpl%J`6=E=szoaZwb%IohI?>%;}gh9!pN(mqwLKrWudv`bV-P4_2t!18a-U*v4@(6+%RBuo3DC@=-- z@fq8e2|VdMFzs-kFhi%a!5euVlbzNY4e@{d?5-4w@a4N1ycZ)v zJ*||^-cvd}m-B|5ws4PqflXDFz1LeN3-9N}6YK8!7ry+(vFuW@1E7y@H6j#{! zDhb_~n&>IZ#we}a|Kw(&K8N${ z4NVET1v94x@Y!-Tc;q=VcYU%Do3#QILkAk?hxTgtCR{&Mu`KPvH}%d9y}y>vo~>=Z z*ldYafVJH=m5uAeXH4Axu|dFrL9B66fE3H*#tUi{BCKNa$3Nt)SR>=Hrd($7Yb@xBGS3I_cD`I-W;x8mENyLbDk&ZKDgXaq2zs#)jU=?amAJ6lX=`P$giGk@}Z+a zQEXd7$W6Vyg|~yfUA&*%eYecy)W0kz&DGy;&CWb_pgs8Pstqg+JomY$bav(OxTwsK zW7pWZvUNl8oIK_|v$=xbCo4 zqX1~8oPld;Myp3`Kwy-`W`;uvT~k?)csWR^_v-fS$l5u_OJll$LW!{uD28@5PI>8W z)@EyUs%7@2NV7kzg-)&)iby4p@o@cmatIK!xd$r zl9$gctAA%{cCk#!!!&)(r`wlpSDcTk3^YwBs^Cg`w9ql>Y+||@U&J!&j2WjQcFzp1 z4_&^0_0;aI{`tdoiIHv7*hN;zNr`xh+Vc7E#u*&A zaK?k#Z2Fl5T@!&BcWzj(WpqE_aF|(FbVrQ3pVl6sUAw-tY8NrgPCxi;n%lbl7mk`0 zPe{?&e|C$}6i1h(tAi9dlPk@tjAv6RX6z`gVCvz{#uUGv2Ayn`Z9~k6aiT9n5LPk@aZlR?8~)N#`R=Hy5s+ zv$JyZj*{Dd+P>a3Z}((iO=f+dYACJGoaJ3=5@Z(a$>(mXp44m{{>kK}@nuN{DPy@> zWkG>(!+5D+ z%TCYJesbk?pe)Z@(KOo-wy9gRL-sYQXoR`kVhL)CPgLz#EO7bWX5Xi)w`$t?&o=6| zIP{|STYF_nncB7K^A3H~Ug>QcdhN+SugLj_tr<>STy~Gyf$P{#>AK+ZFEd0KoM)IO z+@CooNk}4Gaiyf;$qGrf2UjF|+*eE5E>w~Te0XriG^R^4j1Fqf_>@{QU+!C4$io?; zX-)PB>pt|@E|@u4r@+Y|XQpEao0^!Zm#ke~?Tdo1TVfZz3i+v`_kR7a?ebn% z7#KJhVmuCVh)d{-X--pkD8ba+xapNr2lIzh$HI9+nHC&;^VmnevEbmHxHD}`1rJs? z|K{WQ#9%aIf(xfWYb1vV(`18_4zlw!4`1hXQJGi?ilOh#vs_CB{8M$Cjnxzz|0!08 zytx;?>h|*Xh~&Jdy97_By2)J*J8WK-`|19yT-z&0w`5tl9yvOz*(HftsfcysY4x(> zkJrA-dltQP+WU7Z9)U@715Ur5^?UxK_qTGdu^%!xtM}Od|Nr0aJEzZlHSf7s{k-k# zKi;-vVYoE2>4vgIB75id53;R%EJyA-_qZI{ak^W~r;T~RnT~lpHVjJ+Ma=WDJ;-tT z*^Sp%9F7`z+)18sWMRvR01hU>=?4r9yp&lT1RCD3FljzfQTP*kd-;@@K5wJO8MEd` zxN?@?6lsdv;2kL)5iL}<}e+0_mmW)xNtdSoWHj6tMB z;J_QMGwR$cE>}pMVe6K;^CSICL9ox)r%FA}-U+waFPqLjA2z|@Mad`a!^%xOrnBvp zpWN$b=9%m3z-v%&K(T>=ZN>qE5~41+^2pmPU?KOv|^XJ%Y=vK{ps(gd{Cb!TPifAy}s?3m-h~#xSpQU ze&y$DezkM?+U;R`wtPm#<__Hsm*9zJr7L|(goE};i?F&}pSbc#*xzH@w(qL_b8G(d z|F7qNot0&^e)Ho~wksT1EHo+>Y-kAZDb>~BV@VcNkFeHL5C_kQm8dh@0@$^ZQQS@^TXwTZ<#%a^Bax^d;R zXWv7H6IsEQdaHkmpS!wC+eF~%j`FFy@04cOy!#)&e`kL9$K7|c%KjTa+a1sU_i5Yj z#D&d`z5njS`(6Eg^Z)-h3@7I7*|RJ=qt0b%%;p?EW99=@8#@?hHfWgasIcg;onp zOPkZRebVjXGNl~<^=?kimd!eOdV|1{=T{hPloOcNE|Z+ONJ(@;?u9uo)L17r>Sc8F z@p&{$8M<9eU9L5OLs&h6eHuftJJi2HO-2ZFIrk`lKEio zx{r)jn^y`S`*^2%iXt1!2hGkcty^T4d^vB~eR)>n-digl7acrMw{d}-@mY!I8&72D zg-fKWbMIYt?Boef&e_h!PX)e3obXF(RB~oGFz3k6g;9o4#~K+9gch~5vE7)ZG2P{m zOufs>5FR#-j}|c@i{8$*xW&w2p7`p#SG~acd6WLXxvIq~`LJ-FqLk6a6_yNwzUxG8 zUp+plX-QhuzML0{{0dWKBp8_ko*XoqW-4MlNtEZX%XJkIDdp(_M^z$BHMlv_9SS8@ zEl{}Rn{X!3$1wP<$)&fhBBe?^y} z=?7!;)gJ}c*Lqg2Nl3^IoU%=QeeWh>$~rI zH~*Jyu2?qVN$&lHQ)8B8_t?cfG443rsnfgbUCTD}-fUq}kl;QBPX0r&v863JM^3N)C91UM2q^wI_cKEs#|H_i6 zuyZqhbTV*OY@S;2TC3EezlDAKUzh0B2kvS+J2Q$%@GW2p(%8hdQ+vjQ9lClkyHAH) zmpHN1;bD)nU!(of8EI4JxT!c-Py2o8-&(UH%erD6-Z|zy{_tUY%0nO5yeXTXGL+j6gYnl3FZ z`u{mg?w%(n0|SHBDrT!cPp2An@J!gurgDtQAcd*JVUZh){wIgbjy9dAQRxmhBAY+( zaTvxLX*}EI-Cn4s$fc(3w5|V9Y}CV|)5}b)HFoo)7Mp2Cy%SyWXk(a2qPD{Fhk4C{ zJr}!v)%fq0Fc7{LmfO^6kQn_eVawE>MvaT>Sw<6^TmzeMi^he-35v1;ERPx( z7&HtV1T2>IDQ*aMd#A|s*QA4Y;!-b(nFS1CX&TJ8w&uBRH#B;4I<>aXb(T|$(b3k; zdQaEAm%Y)yr*H2LE~O7f%QbJ#-5xcy?f8=SS9WuoRy6kr8m*{w=?hxEOJQXw%d}_m zPLlus-!_WPmeTmVCZIAWdrp&%7XyQ{!GRE_9xmRTV_!IWRF5f~&tUFRiMnuvN18|I zfQmtI4;Mp$sLz#NF)zjrCO<|lfrRttj8~lTysG2aQWObVF1M#)(%Dv%w>JK#I@MBI z?~491=FQ!)C1nevuOYKfz&ESEsou@mCwTZ&_q^80yrMAKbl=(ao_31+C+?MG4~$zr z;rYquStowf?(g~En^gPE>zd%^l{`8DS3)j3hY9Lk%y_ZdlapaxaQ^@A>z9ACTENl9 zp1_d&WYe>f2O4SioN9*~pB3CwXbX3kmZYc5ro4bB@tSfQ-vY5D9tOn&LA*?pnFLe~ z+?b1*3}OuxgeT{{ZE6l_TrhoOW0c>*7Pbt{<^}o@4<48+irhWZIJbP!Jjn#UZT`CeUaT8 zcikVm!g{NfSZ}-LboH7wnYo3ERo=h%Ypd=3x$oPuT#bu_m#IdUPJcL+>-_)k|394$ z`+tAalH2<~a+UH(8{26yFtp?x+OXop!Uy**ANkjOUw6$~;+FPPALysAI<5MN-}_6;oHASzO?JOrex- zi$U+gQ%_#*jost6s$1Zv)45}tp4{*_dC){BWviO%!3E0hTpJG@i+JN1QWCym+FQf9 zol}qdElQN*yeOv;tHc+aCaffPVMV%?u*Sv{CH+epHnj$9>R%Gfn6Dzxz2jG5w4)T4 z$z#E5ANyPk?kD-}kMmo-Xzx4~t4rEP1H^2!IA>KJ3~XHZ{crqhhM0W}3|cO?3`+W> zl&ll4v#4HFlT~Cm;n)~w>bCo8=-ADwc~@zxx&#}VH8b$0 z^U6D93aamXBk+yoicZ7UEuJR?)+b6X(KC~~ZGXCRU93W5WBvZJpt6b2>-Jd_SFlKA-qu+&pHB(gWw0X0)x)H><@meJk0luu7FY)J zaU40Z;K2>X(~W)10;WP@Ei5uZJ59okHFyl~CZ4S5(6>0TXt8{!H0R_x9cL@&D@U4z zC$8Ki6v$I?aM4^9hCA$8O)15$OkdSOG4zQ+J~34!@8$C*Gp!{nm(1$i!KnGuR~6j|!rn);YS(d8lGlWbc{x-(7J= zRMNB=Yt*K#o3M#B=DpT~6o(6GQ&!4^?#XS4||4p%9J5ShL z;>uas8ELV-D^vQmH2sm5=|3Ryw|$97p_I4btICz3T^3nivX1O?468eGx5P+`)Nvy>9_dggR@+N@3X*$ed= z6B#NPHyG@1%sVN_+_mtWjN`nfK89_qvt^s^WjXdn&3q(d?aF4PV#pkA*u`Ph+ud?9 z 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�t}PDvD=v{TGvGv`h_u8m(cv{HPd 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 literal 0 HcmV?d00001 diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.mp3.alignment.json b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.mp3.alignment.json new file mode 100644 index 0000000000..0831b7f6c3 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.mp3.alignment.json @@ -0,0 +1,308 @@ +{ + "source": "elevenlabs/with-timestamps", + "text": "I was born on the twenty fourth of April thirty seven minutes past midnight", + "voice": "jeffrey-pvc", + "characters": [ + "I", + " ", + "w", + "a", + "s", + " ", + "b", + "o", + "r", + "n", + " ", + "o", + "n", + " ", + "t", + "h", + "e", + " ", + "t", + "w", + "e", + "n", + "t", + "y", + " ", + "f", + "o", + "u", + "r", + "t", + "h", + " ", + "o", + "f", + " ", + "A", + "p", + "r", + "i", + "l", + " ", + "t", + "h", + "i", + "r", + "t", + "y", + " ", + "s", + "e", + "v", + "e", + "n", + " ", + "m", + "i", + "n", + "u", + "t", + "e", + "s", + " ", + "p", + "a", + "s", + "t", + " ", + "m", + "i", + "d", + "n", + "i", + "g", + "h", + "t" + ], + "char_starts_s": [ + 0, + 0.093, + 0.163, + 0.197, + 0.232, + 0.267, + 0.325, + 0.372, + 0.453, + 0.522, + 0.58, + 0.639, + 0.673, + 0.697, + 0.731, + 0.755, + 0.778, + 0.801, + 0.824, + 0.871, + 0.906, + 0.94, + 0.975, + 1.01, + 1.045, + 1.08, + 1.115, + 1.149, + 1.184, + 1.219, + 1.254, + 1.289, + 1.324, + 1.347, + 1.37, + 1.428, + 1.521, + 1.591, + 1.649, + 1.707, + 1.776, + 2.159, + 2.218, + 2.276, + 2.322, + 2.368, + 2.415, + 2.45, + 2.508, + 2.543, + 2.612, + 2.659, + 2.705, + 2.74, + 2.775, + 2.81, + 2.844, + 2.891, + 2.926, + 2.961, + 2.995, + 3.03, + 3.077, + 3.135, + 3.216, + 3.297, + 3.355, + 3.425, + 3.46, + 3.518, + 3.576, + 3.634, + 3.692, + 3.727, + 3.773 + ], + "char_ends_s": [ + 0.093, + 0.163, + 0.197, + 0.232, + 0.267, + 0.325, + 0.372, + 0.453, + 0.522, + 0.58, + 0.639, + 0.673, + 0.697, + 0.731, + 0.755, + 0.778, + 0.801, + 0.824, + 0.871, + 0.906, + 0.94, + 0.975, + 1.01, + 1.045, + 1.08, + 1.115, + 1.149, + 1.184, + 1.219, + 1.254, + 1.289, + 1.324, + 1.347, + 1.37, + 1.428, + 1.521, + 1.591, + 1.649, + 1.707, + 1.776, + 2.159, + 2.218, + 2.276, + 2.322, + 2.368, + 2.415, + 2.45, + 2.508, + 2.543, + 2.612, + 2.659, + 2.705, + 2.74, + 2.775, + 2.81, + 2.844, + 2.891, + 2.926, + 2.961, + 2.995, + 3.03, + 3.077, + 3.135, + 3.216, + 3.297, + 3.355, + 3.425, + 3.46, + 3.518, + 3.576, + 3.634, + 3.692, + 3.727, + 3.773, + 4.226 + ], + "words": [ + { + "text": "I", + "fromMs": 0, + "toMs": 93 + }, + { + "text": "was", + "fromMs": 163, + "toMs": 267 + }, + { + "text": "born", + "fromMs": 325, + "toMs": 580 + }, + { + "text": "on", + "fromMs": 639, + "toMs": 697 + }, + { + "text": "the", + "fromMs": 731, + "toMs": 801 + }, + { + "text": "twenty", + "fromMs": 824, + "toMs": 1045 + }, + { + "text": "fourth", + "fromMs": 1080, + "toMs": 1289 + }, + { + "text": "of", + "fromMs": 1324, + "toMs": 1370 + }, + { + "text": "April", + "fromMs": 1428, + "toMs": 1776 + }, + { + "text": "thirty", + "fromMs": 2159, + "toMs": 2450 + }, + { + "text": "seven", + "fromMs": 2508, + "toMs": 2740 + }, + { + "text": "minutes", + "fromMs": 2775, + "toMs": 3030 + }, + { + "text": "past", + "fromMs": 3077, + "toMs": 3355 + }, + { + "text": "midnight", + "fromMs": 3425, + "toMs": 4226 + } + ] +} \ No newline at end of file diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.mp3.hash b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.mp3.hash new file mode 100644 index 0000000000..69c0798701 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/stem.mp3.hash @@ -0,0 +1 @@ +25b1812c99ec9358 diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/text.txt b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/text.txt new file mode 100644 index 0000000000..36c39a415f --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/02982fb0e729/text.txt @@ -0,0 +1 @@ +I was born on the twenty fourth of April thirty seven minutes past midnight diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/lyrics.txt b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/lyrics.txt new file mode 100644 index 0000000000..aca5a6ba45 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/lyrics.txt @@ -0,0 +1 @@ +Mar y had a lit tle lamb lit tle lamb lit tle lamb Mar y had a lit tle lamb its fleece was white as snow diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.meta.json b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.meta.json new file mode 100644 index 0000000000..1da84aea39 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.meta.json @@ -0,0 +1,1334 @@ +{ + "stem": "/Users/jas/aesthetic-computer/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.wav", + "fs": 22050, + "durationMs": 8963, + "lyrics": "Mar y had a lit tle lamb lit tle lamb lit tle lamb Mar y had a lit tle lamb its fleece was white as snow", + "report": { + "lyricWords": 26, + "whisperWords": 26, + "exact": 26, + "inexact": 0, + "fallback": 0, + "coverage": 1, + "witness": { + "within120ms": 7, + "of": 26, + "medianAbsDeltaMs": 1258, + "timingFrom": "witness", + "distrusted": false, + "whisperTimingValid": false, + "witnessValid": true + }, + "nuclei": { + "measured": 26, + "wanted": 26 + }, + "ipaSources": { + "wiktionary": 21, + "espeak": 5 + } + }, + "words": [ + { + "text": "Mar", + "fromMs": 0, + "toMs": 267, + "whisper": { + "fromMs": 70, + "toMs": 260, + "heard": "Mar", + "kind": "exact" + }, + "witness": { + "fromMs": 0, + "toMs": 267, + "deltaMs": 70, + "text": "Mar" + }, + "ipa": "/mɑɹ/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "Mar", + "onset": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɑ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "ɹ", + "cls": "approximant", + "voiced": true + } + ], + "fromMs": 0, + "toMs": 265, + "nucleusFromMs": 70, + "nucleusToMs": 265, + "measured": true + } + ] + }, + { + "text": "y", + "fromMs": 313, + "toMs": 337, + "whisper": { + "fromMs": 260, + "toMs": 340, + "heard": "y", + "kind": "exact" + }, + "witness": { + "fromMs": 313, + "toMs": 337, + "deltaMs": -53, + "text": "y" + }, + "ipa": "/ˈwaɪ/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "y", + "onset": [ + { + "ipa": "w", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "aɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 315, + "toMs": 335, + "nucleusFromMs": 320, + "nucleusToMs": 330, + "measured": true + } + ] + }, + { + "text": "had", + "fromMs": 395, + "toMs": 522, + "whisper": { + "fromMs": 340, + "toMs": 600, + "heard": "had", + "kind": "exact" + }, + "witness": { + "fromMs": 395, + "toMs": 522, + "deltaMs": -55, + "text": "had" + }, + "ipa": "/hæt/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "had", + "onset": [ + { + "ipa": "h", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "fromMs": 395, + "toMs": 520, + "nucleusFromMs": 465, + "nucleusToMs": 490, + "measured": true + } + ] + }, + { + "text": "a", + "fromMs": 557, + "toMs": 580, + "whisper": { + "fromMs": 600, + "toMs": 680, + "heard": "a", + "kind": "exact" + }, + "witness": { + "fromMs": 557, + "toMs": 580, + "deltaMs": 43, + "text": "a" + }, + "ipa": "/eɪ/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "a", + "onset": [], + "nucleus": [ + { + "ipa": "eɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 555, + "toMs": 580, + "nucleusFromMs": 560, + "nucleusToMs": 570, + "measured": true + } + ] + }, + { + "text": "lit", + "fromMs": 627, + "toMs": 789, + "whisper": { + "fromMs": 680, + "toMs": 940, + "heard": "lit", + "kind": "exact" + }, + "witness": { + "fromMs": 627, + "toMs": 789, + "deltaMs": 53, + "text": "lit" + }, + "ipa": "/ˈlɪt/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "lit", + "onset": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "fromMs": 625, + "toMs": 785, + "nucleusFromMs": 625, + "nucleusToMs": 720, + "measured": true + } + ] + }, + { + "text": "tle", + "fromMs": 859, + "toMs": 1126, + "whisper": { + "fromMs": 940, + "toMs": 1190, + "heard": "tle", + "kind": "exact" + }, + "witness": { + "fromMs": 859, + "toMs": 1126, + "deltaMs": 81, + "text": "tle" + }, + "ipa": "/tˌiːˌɛlˈiː/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "tle", + "onset": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "iː", + "cls": "vowel", + "voiced": true + }, + { + "ipa": "ɛ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + }, + { + "ipa": "iː", + "cls": "vowel", + "voiced": true + } + ], + "fromMs": 860, + "toMs": 1125, + "nucleusFromMs": 950, + "nucleusToMs": 1125, + "measured": true + } + ] + }, + { + "text": "lamb", + "fromMs": 1173, + "toMs": 1498, + "whisper": { + "fromMs": 1190, + "toMs": 1540, + "heard": "lamb", + "kind": "exact" + }, + "witness": { + "fromMs": 1173, + "toMs": 1498, + "deltaMs": 17, + "text": "lamb" + }, + "ipa": "/ˈlæm/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "lamb", + "onset": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 1175, + "toMs": 1500, + "nucleusFromMs": 1175, + "nucleusToMs": 1250, + "measured": true + } + ] + }, + { + "text": "lit", + "fromMs": 1939, + "toMs": 2136, + "whisper": { + "fromMs": 1540, + "toMs": 1800, + "heard": "lit", + "kind": "exact" + }, + "witness": { + "fromMs": 1939, + "toMs": 2136, + "deltaMs": -399, + "text": "lit" + }, + "ipa": "/ˈlɪt/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "lit", + "onset": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "fromMs": 1940, + "toMs": 2135, + "nucleusFromMs": 1980, + "nucleusToMs": 2085, + "measured": true + } + ] + }, + { + "text": "tle", + "fromMs": 2206, + "toMs": 2473, + "whisper": { + "fromMs": 1800, + "toMs": 2050, + "heard": "tle", + "kind": "exact" + }, + "witness": { + "fromMs": 2206, + "toMs": 2473, + "deltaMs": -406, + "text": "tle" + }, + "ipa": "/tˌiːˌɛlˈiː/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "tle", + "onset": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "iː", + "cls": "vowel", + "voiced": true + }, + { + "ipa": "ɛ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + }, + { + "ipa": "iː", + "cls": "vowel", + "voiced": true + } + ], + "fromMs": 2205, + "toMs": 2475, + "nucleusFromMs": 2305, + "nucleusToMs": 2475, + "measured": true + } + ] + }, + { + "text": "lamb", + "fromMs": 2519, + "toMs": 2833, + "whisper": { + "fromMs": 2050, + "toMs": 2400, + "heard": "lamb", + "kind": "exact" + }, + "witness": { + "fromMs": 2519, + "toMs": 2833, + "deltaMs": -469, + "text": "lamb" + }, + "ipa": "/ˈlæm/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "lamb", + "onset": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 2520, + "toMs": 2835, + "nucleusFromMs": 2525, + "nucleusToMs": 2550, + "measured": true + } + ] + }, + { + "text": "lit", + "fromMs": 3344, + "toMs": 3541, + "whisper": { + "fromMs": 2400, + "toMs": 2660, + "heard": "lit", + "kind": "exact" + }, + "witness": { + "fromMs": 3344, + "toMs": 3541, + "deltaMs": -944, + "text": "lit" + }, + "ipa": "/ˈlɪt/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "lit", + "onset": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "fromMs": 3345, + "toMs": 3540, + "nucleusFromMs": 3390, + "nucleusToMs": 3480, + "measured": true + } + ] + }, + { + "text": "tle", + "fromMs": 3611, + "toMs": 3878, + "whisper": { + "fromMs": 2660, + "toMs": 2950, + "heard": "tle", + "kind": "exact" + }, + "witness": { + "fromMs": 3611, + "toMs": 3878, + "deltaMs": -951, + "text": "tle" + }, + "ipa": "/tˌiːˌɛlˈiː/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "tle", + "onset": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "iː", + "cls": "vowel", + "voiced": true + }, + { + "ipa": "ɛ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + }, + { + "ipa": "iː", + "cls": "vowel", + "voiced": true + } + ], + "fromMs": 3610, + "toMs": 3880, + "nucleusFromMs": 3675, + "nucleusToMs": 3880, + "measured": true + } + ] + }, + { + "text": "lamb", + "fromMs": 3924, + "toMs": 4238, + "whisper": { + "fromMs": 2950, + "toMs": 3380, + "heard": "lamb", + "kind": "exact" + }, + "witness": { + "fromMs": 3924, + "toMs": 4238, + "deltaMs": -974, + "text": "lamb" + }, + "ipa": "/ˈlæm/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "lamb", + "onset": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 3925, + "toMs": 4240, + "nucleusFromMs": 3925, + "nucleusToMs": 3960, + "measured": true + } + ] + }, + { + "text": "Mar", + "fromMs": 4841, + "toMs": 5050, + "whisper": { + "fromMs": 3380, + "toMs": 3600, + "heard": "Mar", + "kind": "exact" + }, + "witness": { + "fromMs": 4841, + "toMs": 5050, + "deltaMs": -1461, + "text": "Mar" + }, + "ipa": "/mɑɹ/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "Mar", + "onset": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɑ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "ɹ", + "cls": "approximant", + "voiced": true + } + ], + "fromMs": 4840, + "toMs": 5050, + "nucleusFromMs": 4890, + "nucleusToMs": 5050, + "measured": true + } + ] + }, + { + "text": "y", + "fromMs": 5085, + "toMs": 5108, + "whisper": { + "fromMs": 3600, + "toMs": 3620, + "heard": "y", + "kind": "exact" + }, + "witness": { + "fromMs": 5085, + "toMs": 5108, + "deltaMs": -1485, + "text": "y" + }, + "ipa": "/ˈwaɪ/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "y", + "onset": [ + { + "ipa": "w", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "aɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 5085, + "toMs": 5110, + "nucleusFromMs": 5090, + "nucleusToMs": 5100, + "measured": true + } + ] + }, + { + "text": "had", + "fromMs": 5155, + "toMs": 5271, + "whisper": { + "fromMs": 3620, + "toMs": 3860, + "heard": "had", + "kind": "exact" + }, + "witness": { + "fromMs": 5155, + "toMs": 5271, + "deltaMs": -1535, + "text": "had" + }, + "ipa": "/hæt/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "had", + "onset": [ + { + "ipa": "h", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "fromMs": 5155, + "toMs": 5270, + "nucleusFromMs": 5165, + "nucleusToMs": 5245, + "measured": true + } + ] + }, + { + "text": "a", + "fromMs": 5306, + "toMs": 5329, + "whisper": { + "fromMs": 3860, + "toMs": 3940, + "heard": "a", + "kind": "exact" + }, + "witness": { + "fromMs": 5306, + "toMs": 5329, + "deltaMs": -1446, + "text": "a" + }, + "ipa": "/eɪ/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "a", + "onset": [], + "nucleus": [ + { + "ipa": "eɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 5305, + "toMs": 5330, + "nucleusFromMs": 5310, + "nucleusToMs": 5320, + "measured": true + } + ] + }, + { + "text": "lit", + "fromMs": 5364, + "toMs": 5515, + "whisper": { + "fromMs": 3940, + "toMs": 4200, + "heard": "lit", + "kind": "exact" + }, + "witness": { + "fromMs": 5364, + "toMs": 5515, + "deltaMs": -1424, + "text": "lit" + }, + "ipa": "/ˈlɪt/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "lit", + "onset": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "fromMs": 5365, + "toMs": 5515, + "nucleusFromMs": 5365, + "nucleusToMs": 5450, + "measured": true + } + ] + }, + { + "text": "tle", + "fromMs": 5584, + "toMs": 5851, + "whisper": { + "fromMs": 4200, + "toMs": 4640, + "heard": "tle", + "kind": "exact" + }, + "witness": { + "fromMs": 5584, + "toMs": 5851, + "deltaMs": -1384, + "text": "tle" + }, + "ipa": "/tˌiːˌɛlˈiː/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "tle", + "onset": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "iː", + "cls": "vowel", + "voiced": true + }, + { + "ipa": "ɛ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + }, + { + "ipa": "iː", + "cls": "vowel", + "voiced": true + } + ], + "fromMs": 5585, + "toMs": 5850, + "nucleusFromMs": 5650, + "nucleusToMs": 5850, + "measured": true + } + ] + }, + { + "text": "lamb", + "fromMs": 5898, + "toMs": 6188, + "whisper": { + "fromMs": 4640, + "toMs": 4870, + "heard": "lamb", + "kind": "exact" + }, + "witness": { + "fromMs": 5898, + "toMs": 6188, + "deltaMs": -1258, + "text": "lamb" + }, + "ipa": "/ˈlæm/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "lamb", + "onset": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 5900, + "toMs": 6190, + "nucleusFromMs": 5900, + "nucleusToMs": 5940, + "measured": true + } + ] + }, + { + "text": "its", + "fromMs": 6699, + "toMs": 6885, + "whisper": { + "fromMs": 4870, + "toMs": 5060, + "heard": "its", + "kind": "exact" + }, + "witness": { + "fromMs": 6699, + "toMs": 6885, + "deltaMs": -1829, + "text": "its" + }, + "ipa": "/ɪts/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "its", + "onset": [], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + }, + { + "ipa": "s", + "cls": "fricative", + "voiced": false + } + ], + "fromMs": 6700, + "toMs": 6885, + "nucleusFromMs": 6830, + "nucleusToMs": 6885, + "measured": true + } + ] + }, + { + "text": "fleece", + "fromMs": 6920, + "toMs": 7187, + "whisper": { + "fromMs": 5060, + "toMs": 5590, + "heard": "fleece", + "kind": "exact" + }, + "witness": { + "fromMs": 6920, + "toMs": 7187, + "deltaMs": -1860, + "text": "fleece" + }, + "ipa": "/fliːs/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "fleece", + "onset": [ + { + "ipa": "f", + "cls": "fricative", + "voiced": false + }, + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "iː", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "s", + "cls": "fricative", + "voiced": false + } + ], + "fromMs": 6920, + "toMs": 7185, + "nucleusFromMs": 6970, + "nucleusToMs": 7090, + "measured": true + } + ] + }, + { + "text": "was", + "fromMs": 7221, + "toMs": 7338, + "whisper": { + "fromMs": 5590, + "toMs": 5840, + "heard": "was", + "kind": "exact" + }, + "witness": { + "fromMs": 7221, + "toMs": 7338, + "deltaMs": -1631, + "text": "was" + }, + "ipa": "/wˈʌz/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "was", + "onset": [ + { + "ipa": "w", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ʌ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "z", + "cls": "fricative", + "voiced": true + } + ], + "fromMs": 7220, + "toMs": 7340, + "nucleusFromMs": 7220, + "nucleusToMs": 7275, + "measured": true + } + ] + }, + { + "text": "white", + "fromMs": 7419, + "toMs": 7721, + "whisper": { + "fromMs": 5840, + "toMs": 6380, + "heard": "white", + "kind": "exact" + }, + "witness": { + "fromMs": 7419, + "toMs": 7721, + "deltaMs": -1579, + "text": "white" + }, + "ipa": "/ˈʍaɪt/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "white", + "onset": [ + { + "ipa": "ʍ", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "aɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "fromMs": 7420, + "toMs": 7720, + "nucleusFromMs": 7420, + "nucleusToMs": 7635, + "measured": true + } + ] + }, + { + "text": "as", + "fromMs": 7779, + "toMs": 8011, + "whisper": { + "fromMs": 6380, + "toMs": 6750, + "heard": "as", + "kind": "exact" + }, + "witness": { + "fromMs": 7779, + "toMs": 8011, + "deltaMs": -1399, + "text": "as" + }, + "ipa": "/ˈæs/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "as", + "onset": [], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "s", + "cls": "fricative", + "voiced": false + } + ], + "fromMs": 7780, + "toMs": 8010, + "nucleusFromMs": 7810, + "nucleusToMs": 7885, + "measured": true + } + ] + }, + { + "text": "snow", + "fromMs": 8185, + "toMs": 8963, + "whisper": { + "fromMs": 6750, + "toMs": 30000, + "heard": "snow.", + "kind": "exact" + }, + "witness": { + "fromMs": 8185, + "toMs": 8963, + "deltaMs": -1435, + "text": "snow" + }, + "ipa": "/snoʊ̯/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "snow", + "onset": [ + { + "ipa": "s", + "cls": "fricative", + "voiced": false + }, + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "oʊ̯", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 8185, + "toMs": 8965, + "nucleusFromMs": 8315, + "nucleusToMs": 8630, + "measured": true + } + ] + } + ] +} \ No newline at end of file diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.mp3 b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..810ffe1eb9e48f9c97ec574a12e3c5f2908e6da7 GIT binary patch literal 144657 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 `PP{quAB{V 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 !4t8vs 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 z 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 P7#LXSXZ@&61VaD-AXamX literal 0 HcmV?d00001 diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.mp3.alignment.json b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.mp3.alignment.json new file mode 100644 index 0000000000..9ff1421cd2 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.mp3.alignment.json @@ -0,0 +1,455 @@ +{ + "source": "elevenlabs/with-timestamps", + "text": "Mar y had a lit tle lamb lit tle lamb lit tle lamb Mar y had a lit tle lamb its fleece was white as snow", + "voice": "jeffrey-pvc", + "characters": [ + "M", + "a", + "r", + " ", + "y", + " ", + "h", + "a", + "d", + " ", + "a", + " ", + "l", + "i", + "t", + " ", + "t", + "l", + "e", + " ", + "l", + "a", + "m", + "b", + " ", + "l", + "i", + "t", + " ", + "t", + "l", + "e", + " ", + "l", + "a", + "m", + "b", + " ", + "l", + "i", + "t", + " ", + "t", + "l", + "e", + " ", + "l", + "a", + "m", + "b", + " ", + "M", + "a", + "r", + " ", + "y", + " ", + "h", + "a", + "d", + " ", + "a", + " ", + "l", + "i", + "t", + " ", + "t", + "l", + "e", + " ", + "l", + "a", + "m", + "b", + " ", + "i", + "t", + "s", + " ", + "f", + "l", + "e", + "e", + "c", + "e", + " ", + "w", + "a", + "s", + " ", + "w", + "h", + "i", + "t", + "e", + " ", + "a", + "s", + " ", + "s", + "n", + "o", + "w" + ], + "char_starts_s": [ + 0, + 0.116, + 0.232, + 0.267, + 0.313, + 0.337, + 0.395, + 0.43, + 0.488, + 0.522, + 0.557, + 0.58, + 0.627, + 0.662, + 0.743, + 0.789, + 0.859, + 0.975, + 1.091, + 1.126, + 1.173, + 1.219, + 1.347, + 1.405, + 1.498, + 1.939, + 2.009, + 2.09, + 2.136, + 2.206, + 2.322, + 2.438, + 2.473, + 2.519, + 2.566, + 2.694, + 2.752, + 2.833, + 3.344, + 3.413, + 3.495, + 3.541, + 3.611, + 3.727, + 3.843, + 3.878, + 3.924, + 3.971, + 4.098, + 4.145, + 4.238, + 4.841, + 4.923, + 5.016, + 5.05, + 5.085, + 5.108, + 5.155, + 5.19, + 5.236, + 5.271, + 5.306, + 5.329, + 5.364, + 5.399, + 5.468, + 5.515, + 5.584, + 5.7, + 5.817, + 5.851, + 5.898, + 5.944, + 6.06, + 6.107, + 6.188, + 6.699, + 6.792, + 6.85, + 6.885, + 6.92, + 6.954, + 7.012, + 7.059, + 7.105, + 7.152, + 7.187, + 7.221, + 7.256, + 7.303, + 7.338, + 7.419, + 7.465, + 7.523, + 7.593, + 7.663, + 7.721, + 7.779, + 7.895, + 8.011, + 8.185, + 8.301, + 8.417, + 8.499 + ], + "char_ends_s": [ + 0.116, + 0.232, + 0.267, + 0.313, + 0.337, + 0.395, + 0.43, + 0.488, + 0.522, + 0.557, + 0.58, + 0.627, + 0.662, + 0.743, + 0.789, + 0.859, + 0.975, + 1.091, + 1.126, + 1.173, + 1.219, + 1.347, + 1.405, + 1.498, + 1.939, + 2.009, + 2.09, + 2.136, + 2.206, + 2.322, + 2.438, + 2.473, + 2.519, + 2.566, + 2.694, + 2.752, + 2.833, + 3.344, + 3.413, + 3.495, + 3.541, + 3.611, + 3.727, + 3.843, + 3.878, + 3.924, + 3.971, + 4.098, + 4.145, + 4.238, + 4.841, + 4.923, + 5.016, + 5.05, + 5.085, + 5.108, + 5.155, + 5.19, + 5.236, + 5.271, + 5.306, + 5.329, + 5.364, + 5.399, + 5.468, + 5.515, + 5.584, + 5.7, + 5.817, + 5.851, + 5.898, + 5.944, + 6.06, + 6.107, + 6.188, + 6.699, + 6.792, + 6.85, + 6.885, + 6.92, + 6.954, + 7.012, + 7.059, + 7.105, + 7.152, + 7.187, + 7.221, + 7.256, + 7.303, + 7.338, + 7.419, + 7.465, + 7.523, + 7.593, + 7.663, + 7.721, + 7.779, + 7.895, + 8.011, + 8.185, + 8.301, + 8.417, + 8.499, + 8.963 + ], + "words": [ + { + "text": "Mar", + "fromMs": 0, + "toMs": 267 + }, + { + "text": "y", + "fromMs": 313, + "toMs": 337 + }, + { + "text": "had", + "fromMs": 395, + "toMs": 522 + }, + { + "text": "a", + "fromMs": 557, + "toMs": 580 + }, + { + "text": "lit", + "fromMs": 627, + "toMs": 789 + }, + { + "text": "tle", + "fromMs": 859, + "toMs": 1126 + }, + { + "text": "lamb", + "fromMs": 1173, + "toMs": 1498 + }, + { + "text": "lit", + "fromMs": 1939, + "toMs": 2136 + }, + { + "text": "tle", + "fromMs": 2206, + "toMs": 2473 + }, + { + "text": "lamb", + "fromMs": 2519, + "toMs": 2833 + }, + { + "text": "lit", + "fromMs": 3344, + "toMs": 3541 + }, + { + "text": "tle", + "fromMs": 3611, + "toMs": 3878 + }, + { + "text": "lamb", + "fromMs": 3924, + "toMs": 4238 + }, + { + "text": "Mar", + "fromMs": 4841, + "toMs": 5050 + }, + { + "text": "y", + "fromMs": 5085, + "toMs": 5108 + }, + { + "text": "had", + "fromMs": 5155, + "toMs": 5271 + }, + { + "text": "a", + "fromMs": 5306, + "toMs": 5329 + }, + { + "text": "lit", + "fromMs": 5364, + "toMs": 5515 + }, + { + "text": "tle", + "fromMs": 5584, + "toMs": 5851 + }, + { + "text": "lamb", + "fromMs": 5898, + "toMs": 6188 + }, + { + "text": "its", + "fromMs": 6699, + "toMs": 6885 + }, + { + "text": "fleece", + "fromMs": 6920, + "toMs": 7187 + }, + { + "text": "was", + "fromMs": 7221, + "toMs": 7338 + }, + { + "text": "white", + "fromMs": 7419, + "toMs": 7721 + }, + { + "text": "as", + "fromMs": 7779, + "toMs": 8011 + }, + { + "text": "snow", + "fromMs": 8185, + "toMs": 8963 + } + ] +} \ No newline at end of file diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.mp3.hash b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.mp3.hash new file mode 100644 index 0000000000..e860c213af --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/stem.mp3.hash @@ -0,0 +1 @@ +f270006e68240007 diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/text.txt b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/text.txt new file mode 100644 index 0000000000..aca5a6ba45 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/4da4e1e55d6d/text.txt @@ -0,0 +1 @@ +Mar y had a lit tle lamb lit tle lamb lit tle lamb Mar y had a lit tle lamb its fleece was white as snow diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/lyrics.txt b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/lyrics.txt new file mode 100644 index 0000000000..3331dfbef8 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/lyrics.txt @@ -0,0 +1 @@ +I am the first of my line in this house Some things run in the fa-mi-ly diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.meta.json b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.meta.json new file mode 100644 index 0000000000..380b8a0df7 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.meta.json @@ -0,0 +1,829 @@ +{ + "stem": "/Users/jas/aesthetic-computer/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.wav", + "fs": 22050, + "durationMs": 4180, + "lyrics": "I am the first of my line in this house Some things run in the fa-mi-ly", + "report": { + "lyricWords": 16, + "whisperWords": 16, + "exact": 16, + "inexact": 0, + "fallback": 0, + "coverage": 1, + "witness": { + "within120ms": 10, + "of": 16, + "medianAbsDeltaMs": 93, + "timingFrom": "witness", + "distrusted": false, + "whisperTimingValid": true, + "witnessValid": true + }, + "nuclei": { + "measured": 18, + "wanted": 18 + }, + "ipaSources": { + "wiktionary": 11, + "espeak": 5 + } + }, + "words": [ + { + "text": "I", + "fromMs": 0, + "toMs": 93, + "whisper": { + "fromMs": 10, + "toMs": 70, + "heard": "I", + "kind": "exact" + }, + "witness": { + "fromMs": 0, + "toMs": 93, + "deltaMs": 10, + "text": "I" + }, + "ipa": "/ə/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "I", + "onset": [], + "nucleus": [ + { + "ipa": "ə", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 0, + "toMs": 95, + "nucleusFromMs": 10, + "nucleusToMs": 95, + "measured": true + } + ] + }, + { + "text": "am", + "fromMs": 163, + "toMs": 255, + "whisper": { + "fromMs": 70, + "toMs": 220, + "heard": "am", + "kind": "exact" + }, + "witness": { + "fromMs": 163, + "toMs": 255, + "deltaMs": -93, + "text": "am" + }, + "ipa": "/ˈæm/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "am", + "onset": [], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 165, + "toMs": 255, + "nucleusFromMs": 175, + "nucleusToMs": 200, + "measured": true + } + ] + }, + { + "text": "the", + "fromMs": 313, + "toMs": 383, + "whisper": { + "fromMs": 220, + "toMs": 450, + "heard": "the", + "kind": "exact" + }, + "witness": { + "fromMs": 313, + "toMs": 383, + "deltaMs": -93, + "text": "the" + }, + "ipa": "/ðˈə/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "the", + "onset": [ + { + "ipa": "ð", + "cls": "fricative", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ə", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 315, + "toMs": 385, + "nucleusFromMs": 315, + "nucleusToMs": 350, + "measured": true + } + ] + }, + { + "text": "first", + "fromMs": 418, + "toMs": 639, + "whisper": { + "fromMs": 450, + "toMs": 840, + "heard": "first", + "kind": "exact" + }, + "witness": { + "fromMs": 418, + "toMs": 639, + "deltaMs": 32, + "text": "first" + }, + "ipa": "/fɚst/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "first", + "onset": [ + { + "ipa": "f", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "ɚ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "s", + "cls": "fricative", + "voiced": false + }, + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "fromMs": 420, + "toMs": 640, + "nucleusFromMs": 455, + "nucleusToMs": 600, + "measured": true + } + ] + }, + { + "text": "of", + "fromMs": 685, + "toMs": 731, + "whisper": { + "fromMs": 840, + "toMs": 990, + "heard": "of", + "kind": "exact" + }, + "witness": { + "fromMs": 685, + "toMs": 731, + "deltaMs": 155, + "text": "of" + }, + "ipa": "/ʌv/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "of", + "onset": [], + "nucleus": [ + { + "ipa": "ʌ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "v", + "cls": "fricative", + "voiced": true + } + ], + "fromMs": 685, + "toMs": 730, + "nucleusFromMs": 685, + "nucleusToMs": 715, + "measured": true + } + ] + }, + { + "text": "my", + "fromMs": 789, + "toMs": 871, + "whisper": { + "fromMs": 990, + "toMs": 1140, + "heard": "my", + "kind": "exact" + }, + "witness": { + "fromMs": 789, + "toMs": 871, + "deltaMs": 201, + "text": "my" + }, + "ipa": "/maɪ/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "my", + "onset": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "aɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 790, + "toMs": 870, + "nucleusFromMs": 795, + "nucleusToMs": 805, + "measured": true + } + ] + }, + { + "text": "line", + "fromMs": 940, + "toMs": 1161, + "whisper": { + "fromMs": 1140, + "toMs": 1450, + "heard": "line", + "kind": "exact" + }, + "witness": { + "fromMs": 940, + "toMs": 1161, + "deltaMs": 200, + "text": "line" + }, + "ipa": "/laɪn/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "line", + "onset": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "aɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 940, + "toMs": 1160, + "nucleusFromMs": 1010, + "nucleusToMs": 1030, + "measured": true + } + ] + }, + { + "text": "in", + "fromMs": 1184, + "toMs": 1242, + "whisper": { + "fromMs": 1450, + "toMs": 1600, + "heard": "in", + "kind": "exact" + }, + "witness": { + "fromMs": 1184, + "toMs": 1242, + "deltaMs": 266, + "text": "in" + }, + "ipa": "/ˈɪn/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "in", + "onset": [], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 1185, + "toMs": 1240, + "nucleusFromMs": 1185, + "nucleusToMs": 1200, + "measured": true + } + ] + }, + { + "text": "this", + "fromMs": 1277, + "toMs": 1405, + "whisper": { + "fromMs": 1600, + "toMs": 1880, + "heard": "this", + "kind": "exact" + }, + "witness": { + "fromMs": 1277, + "toMs": 1405, + "deltaMs": 323, + "text": "this" + }, + "ipa": "/ðɪs/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "this", + "onset": [ + { + "ipa": "ð", + "cls": "fricative", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "s", + "cls": "fricative", + "voiced": false + } + ], + "fromMs": 1275, + "toMs": 1405, + "nucleusFromMs": 1305, + "nucleusToMs": 1325, + "measured": true + } + ] + }, + { + "text": "house", + "fromMs": 1451, + "toMs": 2113, + "whisper": { + "fromMs": 1880, + "toMs": 2600, + "heard": "house.", + "kind": "exact" + }, + "witness": { + "fromMs": 1451, + "toMs": 2113, + "deltaMs": 429, + "text": "house" + }, + "ipa": "/haʊ̯s/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "house", + "onset": [ + { + "ipa": "h", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "aʊ̯", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "s", + "cls": "fricative", + "voiced": false + } + ], + "fromMs": 1450, + "toMs": 1995, + "nucleusFromMs": 1455, + "nucleusToMs": 1630, + "measured": true + } + ] + }, + { + "text": "Some", + "fromMs": 2624, + "toMs": 2856, + "whisper": { + "fromMs": 2600, + "toMs": 2830, + "heard": "Some", + "kind": "exact" + }, + "witness": { + "fromMs": 2624, + "toMs": 2856, + "deltaMs": -24, + "text": "Some" + }, + "ipa": "/sʌm/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "Some", + "onset": [ + { + "ipa": "s", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "ʌ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 2625, + "toMs": 2855, + "nucleusFromMs": 2660, + "nucleusToMs": 2855, + "measured": true + } + ] + }, + { + "text": "things", + "fromMs": 2891, + "toMs": 3111, + "whisper": { + "fromMs": 2830, + "toMs": 3170, + "heard": "things", + "kind": "exact" + }, + "witness": { + "fromMs": 2891, + "toMs": 3111, + "deltaMs": -61, + "text": "things" + }, + "ipa": "/ˈθɪŋz/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "things", + "onset": [ + { + "ipa": "θ", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "ŋ", + "cls": "nasal", + "voiced": true + }, + { + "ipa": "z", + "cls": "fricative", + "voiced": true + } + ], + "fromMs": 2890, + "toMs": 3110, + "nucleusFromMs": 2925, + "nucleusToMs": 3005, + "measured": true + } + ] + }, + { + "text": "run", + "fromMs": 3146, + "toMs": 3286, + "whisper": { + "fromMs": 3170, + "toMs": 3360, + "heard": "run", + "kind": "exact" + }, + "witness": { + "fromMs": 3146, + "toMs": 3286, + "deltaMs": 24, + "text": "run" + }, + "ipa": "/ɹʌn/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "run", + "onset": [ + { + "ipa": "ɹ", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ʌ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 3145, + "toMs": 3285, + "nucleusFromMs": 3165, + "nucleusToMs": 3185, + "measured": true + } + ] + }, + { + "text": "in", + "fromMs": 3332, + "toMs": 3379, + "whisper": { + "fromMs": 3360, + "toMs": 3450, + "heard": "in", + "kind": "exact" + }, + "witness": { + "fromMs": 3332, + "toMs": 3379, + "deltaMs": 28, + "text": "in" + }, + "ipa": "/ˈɪn/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "in", + "onset": [], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 3330, + "toMs": 3380, + "nucleusFromMs": 3350, + "nucleusToMs": 3360, + "measured": true + } + ] + }, + { + "text": "the", + "fromMs": 3413, + "toMs": 3483, + "whisper": { + "fromMs": 3450, + "toMs": 3620, + "heard": "the", + "kind": "exact" + }, + "witness": { + "fromMs": 3413, + "toMs": 3483, + "deltaMs": 37, + "text": "the" + }, + "ipa": "/ðˈə/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "the", + "onset": [ + { + "ipa": "ð", + "cls": "fricative", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ə", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 3415, + "toMs": 3485, + "nucleusFromMs": 3415, + "nucleusToMs": 3445, + "measured": true + } + ] + }, + { + "text": "family", + "fromMs": 3518, + "toMs": 4180, + "whisper": { + "fromMs": 3620, + "toMs": 4160, + "heard": "family.", + "kind": "exact" + }, + "witness": { + "fromMs": 3518, + "toMs": 4180, + "deltaMs": 102, + "text": "family" + }, + "ipa": "/ˈfæm(ə)li/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "fa", + "onset": [ + { + "ipa": "f", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 3520, + "toMs": 3740, + "nucleusFromMs": 3535, + "nucleusToMs": 3555, + "measured": true + }, + { + "text": "mi", + "onset": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ə", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 3740, + "toMs": 3960, + "nucleusFromMs": 3740, + "nucleusToMs": 3890, + "measured": true + }, + { + "text": "ly", + "onset": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "i", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 3960, + "toMs": 4180, + "nucleusFromMs": 4005, + "nucleusToMs": 4010, + "measured": true + } + ] + } + ] +} \ No newline at end of file diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.mp3 b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a5b9074107b27f964c476efcde549b2c17d32480 GIT binary patch literal 67753 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 PxqKXbT}|{1RuKRIENpiV literal 0 HcmV?d00001 diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.mp3.alignment.json b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.mp3.alignment.json new file mode 100644 index 0000000000..c40d95361d --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.mp3.alignment.json @@ -0,0 +1,300 @@ +{ + "source": "elevenlabs/with-timestamps", + "text": "I am the first of my line in this house Some things run in the family", + "voice": "jeffrey-pvc", + "characters": [ + "I", + " ", + "a", + "m", + " ", + "t", + "h", + "e", + " ", + "f", + "i", + "r", + "s", + "t", + " ", + "o", + "f", + " ", + "m", + "y", + " ", + "l", + "i", + "n", + "e", + " ", + "i", + "n", + " ", + "t", + "h", + "i", + "s", + " ", + "h", + "o", + "u", + "s", + "e", + " ", + "S", + "o", + "m", + "e", + " ", + "t", + "h", + "i", + "n", + "g", + "s", + " ", + "r", + "u", + "n", + " ", + "i", + "n", + " ", + "t", + "h", + "e", + " ", + "f", + "a", + "m", + "i", + "l", + "y" + ], + "char_starts_s": [ + 0, + 0.093, + 0.163, + 0.209, + 0.255, + 0.313, + 0.337, + 0.36, + 0.383, + 0.418, + 0.453, + 0.499, + 0.546, + 0.604, + 0.639, + 0.685, + 0.708, + 0.731, + 0.789, + 0.836, + 0.871, + 0.94, + 0.987, + 1.068, + 1.126, + 1.161, + 1.184, + 1.207, + 1.242, + 1.277, + 1.3, + 1.335, + 1.37, + 1.405, + 1.451, + 1.486, + 1.544, + 1.602, + 1.672, + 2.113, + 2.624, + 2.717, + 2.775, + 2.821, + 2.856, + 2.891, + 2.914, + 2.949, + 2.995, + 3.019, + 3.065, + 3.111, + 3.146, + 3.193, + 3.239, + 3.286, + 3.332, + 3.355, + 3.379, + 3.413, + 3.437, + 3.46, + 3.483, + 3.518, + 3.564, + 3.634, + 3.692, + 3.75, + 3.808 + ], + "char_ends_s": [ + 0.093, + 0.163, + 0.209, + 0.255, + 0.313, + 0.337, + 0.36, + 0.383, + 0.418, + 0.453, + 0.499, + 0.546, + 0.604, + 0.639, + 0.685, + 0.708, + 0.731, + 0.789, + 0.836, + 0.871, + 0.94, + 0.987, + 1.068, + 1.126, + 1.161, + 1.184, + 1.207, + 1.242, + 1.277, + 1.3, + 1.335, + 1.37, + 1.405, + 1.451, + 1.486, + 1.544, + 1.602, + 1.672, + 2.113, + 2.624, + 2.717, + 2.775, + 2.821, + 2.856, + 2.891, + 2.914, + 2.949, + 2.995, + 3.019, + 3.065, + 3.111, + 3.146, + 3.193, + 3.239, + 3.286, + 3.332, + 3.355, + 3.379, + 3.413, + 3.437, + 3.46, + 3.483, + 3.518, + 3.564, + 3.634, + 3.692, + 3.75, + 3.808, + 4.18 + ], + "words": [ + { + "text": "I", + "fromMs": 0, + "toMs": 93 + }, + { + "text": "am", + "fromMs": 163, + "toMs": 255 + }, + { + "text": "the", + "fromMs": 313, + "toMs": 383 + }, + { + "text": "first", + "fromMs": 418, + "toMs": 639 + }, + { + "text": "of", + "fromMs": 685, + "toMs": 731 + }, + { + "text": "my", + "fromMs": 789, + "toMs": 871 + }, + { + "text": "line", + "fromMs": 940, + "toMs": 1161 + }, + { + "text": "in", + "fromMs": 1184, + "toMs": 1242 + }, + { + "text": "this", + "fromMs": 1277, + "toMs": 1405 + }, + { + "text": "house", + "fromMs": 1451, + "toMs": 2113 + }, + { + "text": "Some", + "fromMs": 2624, + "toMs": 2856 + }, + { + "text": "things", + "fromMs": 2891, + "toMs": 3111 + }, + { + "text": "run", + "fromMs": 3146, + "toMs": 3286 + }, + { + "text": "in", + "fromMs": 3332, + "toMs": 3379 + }, + { + "text": "the", + "fromMs": 3413, + "toMs": 3483 + }, + { + "text": "family", + "fromMs": 3518, + "toMs": 4180 + } + ] +} \ No newline at end of file diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.mp3.hash b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.mp3.hash new file mode 100644 index 0000000000..f4b4ccd9e5 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/stem.mp3.hash @@ -0,0 +1 @@ +1913bd90742514cd diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/text.txt b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/text.txt new file mode 100644 index 0000000000..1cdc2a4bef --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/724acfd39f59/text.txt @@ -0,0 +1 @@ +I am the first of my line in this house Some things run in the family diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/lyrics.txt b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/lyrics.txt new file mode 100644 index 0000000000..1860ff97f2 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/lyrics.txt @@ -0,0 +1 @@ +two hun-dred twelve times I have been charged and I am still here diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/stem.meta.json b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/stem.meta.json new file mode 100644 index 0000000000..1f994ea0ee --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/stem.meta.json @@ -0,0 +1,709 @@ +{ + "stem": "/Users/jas/aesthetic-computer/grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/stem.wav", + "fs": 22050, + "durationMs": 3111, + "lyrics": "two hun-dred twelve times I have been charged and I am still here", + "report": { + "lyricWords": 13, + "whisperWords": 13, + "exact": 13, + "inexact": 0, + "fallback": 0, + "coverage": 1, + "witness": { + "within120ms": 7, + "of": 13, + "medianAbsDeltaMs": 99, + "timingFrom": "witness", + "distrusted": false, + "whisperTimingValid": true, + "witnessValid": true + }, + "nuclei": { + "measured": 14, + "wanted": 14 + }, + "ipaSources": { + "wiktionary": 12, + "espeak": 1 + } + }, + "words": [ + { + "text": "two", + "fromMs": 0, + "toMs": 197, + "whisper": { + "fromMs": 90, + "toMs": 257, + "heard": "two", + "kind": "exact" + }, + "witness": { + "fromMs": 0, + "toMs": 197, + "deltaMs": 90, + "text": "two" + }, + "ipa": "/tu/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "two", + "onset": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "u", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 0, + "toMs": 195, + "nucleusFromMs": 140, + "nucleusToMs": 195, + "measured": true + } + ] + }, + { + "text": "hundred", + "fromMs": 255, + "toMs": 488, + "whisper": { + "fromMs": 257, + "toMs": 423, + "heard": "hundred", + "kind": "exact" + }, + "witness": { + "fromMs": 255, + "toMs": 488, + "deltaMs": 2, + "text": "hundred" + }, + "ipa": "/ˈhʌn.dɹəd/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "hun", + "onset": [ + { + "ipa": "h", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "ʌ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 255, + "toMs": 350, + "nucleusFromMs": 255, + "nucleusToMs": 335, + "measured": true + }, + { + "text": "dred", + "onset": [ + { + "ipa": "d", + "cls": "plosive", + "voiced": true + }, + { + "ipa": "ɹ", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ə", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "d", + "cls": "plosive", + "voiced": true + } + ], + "fromMs": 350, + "toMs": 490, + "nucleusFromMs": 360, + "nucleusToMs": 455, + "measured": true + } + ] + }, + { + "text": "twelve", + "fromMs": 522, + "toMs": 778, + "whisper": { + "fromMs": 423, + "toMs": 590, + "heard": "twelve", + "kind": "exact" + }, + "witness": { + "fromMs": 522, + "toMs": 778, + "deltaMs": -99, + "text": "twelve" + }, + "ipa": "/twɛlv/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "twelve", + "onset": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + }, + { + "ipa": "w", + "cls": "approximant", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "ɛ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + }, + { + "ipa": "v", + "cls": "fricative", + "voiced": true + } + ], + "fromMs": 520, + "toMs": 780, + "nucleusFromMs": 590, + "nucleusToMs": 725, + "measured": true + } + ] + }, + { + "text": "times", + "fromMs": 813, + "toMs": 1115, + "whisper": { + "fromMs": 590, + "toMs": 850, + "heard": "times", + "kind": "exact" + }, + "witness": { + "fromMs": 813, + "toMs": 1115, + "deltaMs": -223, + "text": "times" + }, + "ipa": "/taɪmz/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "times", + "onset": [ + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "aɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + }, + { + "ipa": "z", + "cls": "fricative", + "voiced": true + } + ], + "fromMs": 815, + "toMs": 1115, + "nucleusFromMs": 845, + "nucleusToMs": 925, + "measured": true + } + ] + }, + { + "text": "I", + "fromMs": 1161, + "toMs": 1184, + "whisper": { + "fromMs": 850, + "toMs": 910, + "heard": "I", + "kind": "exact" + }, + "witness": { + "fromMs": 1161, + "toMs": 1184, + "deltaMs": -311, + "text": "I" + }, + "ipa": "/ə/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "I", + "onset": [], + "nucleus": [ + { + "ipa": "ə", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 1160, + "toMs": 1185, + "nucleusFromMs": 1160, + "nucleusToMs": 1165, + "measured": true + } + ] + }, + { + "text": "have", + "fromMs": 1219, + "toMs": 1335, + "whisper": { + "fromMs": 910, + "toMs": 1150, + "heard": "have", + "kind": "exact" + }, + "witness": { + "fromMs": 1219, + "toMs": 1335, + "deltaMs": -309, + "text": "have" + }, + "ipa": "/ˈhæv/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "have", + "onset": [ + { + "ipa": "h", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "v", + "cls": "fricative", + "voiced": true + } + ], + "fromMs": 1220, + "toMs": 1335, + "nucleusFromMs": 1220, + "nucleusToMs": 1295, + "measured": true + } + ] + }, + { + "text": "been", + "fromMs": 1358, + "toMs": 1486, + "whisper": { + "fromMs": 1150, + "toMs": 1390, + "heard": "been", + "kind": "exact" + }, + "witness": { + "fromMs": 1358, + "toMs": 1486, + "deltaMs": -208, + "text": "been" + }, + "ipa": "/ˈbiːn/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "been", + "onset": [ + { + "ipa": "b", + "cls": "plosive", + "voiced": true + } + ], + "nucleus": [ + { + "ipa": "iː", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 1360, + "toMs": 1485, + "nucleusFromMs": 1365, + "nucleusToMs": 1410, + "measured": true + } + ] + }, + { + "text": "charged", + "fromMs": 1521, + "toMs": 1881, + "whisper": { + "fromMs": 1390, + "toMs": 1920, + "heard": "charged,", + "kind": "exact" + }, + "witness": { + "fromMs": 1521, + "toMs": 1881, + "deltaMs": -131, + "text": "charged" + }, + "ipa": "/t͡ʃɑɹd͡ʒd/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "charged", + "onset": [ + { + "ipa": "t͡ʃ", + "cls": "affricate", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "ɑ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "ɹ", + "cls": "approximant", + "voiced": true + }, + { + "ipa": "d͡ʒ", + "cls": "affricate", + "voiced": true + }, + { + "ipa": "d", + "cls": "plosive", + "voiced": true + } + ], + "fromMs": 1520, + "toMs": 1880, + "nucleusFromMs": 1585, + "nucleusToMs": 1770, + "measured": true + } + ] + }, + { + "text": "and", + "fromMs": 1904, + "toMs": 1985, + "whisper": { + "fromMs": 1920, + "toMs": 2130, + "heard": "and", + "kind": "exact" + }, + "witness": { + "fromMs": 1904, + "toMs": 1985, + "deltaMs": 16, + "text": "and" + }, + "ipa": "/ˈænd/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "and", + "onset": [], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "n", + "cls": "nasal", + "voiced": true + }, + { + "ipa": "d", + "cls": "plosive", + "voiced": true + } + ], + "fromMs": 1905, + "toMs": 1985, + "nucleusFromMs": 1910, + "nucleusToMs": 1940, + "measured": true + } + ] + }, + { + "text": "I", + "fromMs": 2032, + "toMs": 2055, + "whisper": { + "fromMs": 2130, + "toMs": 2200, + "heard": "I", + "kind": "exact" + }, + "witness": { + "fromMs": 2032, + "toMs": 2055, + "deltaMs": 98, + "text": "I" + }, + "ipa": "/ə/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "I", + "onset": [], + "nucleus": [ + { + "ipa": "ə", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 2030, + "toMs": 2055, + "nucleusFromMs": 2035, + "nucleusToMs": 2045, + "measured": true + } + ] + }, + { + "text": "am", + "fromMs": 2101, + "toMs": 2194, + "whisper": { + "fromMs": 2200, + "toMs": 2340, + "heard": "am", + "kind": "exact" + }, + "witness": { + "fromMs": 2101, + "toMs": 2194, + "deltaMs": 99, + "text": "am" + }, + "ipa": "/ˈæm/", + "ipaSource": "espeak", + "syllables": [ + { + "text": "am", + "onset": [], + "nucleus": [ + { + "ipa": "æ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "m", + "cls": "nasal", + "voiced": true + } + ], + "fromMs": 2100, + "toMs": 2195, + "nucleusFromMs": 2100, + "nucleusToMs": 2110, + "measured": true + } + ] + }, + { + "text": "still", + "fromMs": 2252, + "toMs": 2473, + "whisper": { + "fromMs": 2340, + "toMs": 2690, + "heard": "still", + "kind": "exact" + }, + "witness": { + "fromMs": 2252, + "toMs": 2473, + "deltaMs": 88, + "text": "still" + }, + "ipa": "/ˈstɪl/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "still", + "onset": [ + { + "ipa": "s", + "cls": "fricative", + "voiced": false + }, + { + "ipa": "t", + "cls": "plosive", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + } + ], + "coda": [ + { + "ipa": "l", + "cls": "approximant", + "voiced": true + } + ], + "fromMs": 2250, + "toMs": 2475, + "nucleusFromMs": 2325, + "nucleusToMs": 2475, + "measured": true + } + ] + }, + { + "text": "here", + "fromMs": 2543, + "toMs": 3111, + "whisper": { + "fromMs": 2690, + "toMs": 3080, + "heard": "here.", + "kind": "exact" + }, + "witness": { + "fromMs": 2543, + "toMs": 3111, + "deltaMs": 147, + "text": "here" + }, + "ipa": "/ˈhɪɚ̯/", + "ipaSource": "wiktionary", + "syllables": [ + { + "text": "here", + "onset": [ + { + "ipa": "h", + "cls": "fricative", + "voiced": false + } + ], + "nucleus": [ + { + "ipa": "ɪ", + "cls": "vowel", + "voiced": true + }, + { + "ipa": "ɚ̯", + "cls": "vowel", + "voiced": true + } + ], + "coda": [], + "fromMs": 2545, + "toMs": 3110, + "nucleusFromMs": 2545, + "nucleusToMs": 2850, + "measured": true + } + ] + } + ] +} \ No newline at end of file diff --git a/grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/stem.mp3 b/grants/culturehub-la-2026/macneopolitan/members/neo/speech/d96ac04b84aa/stem.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6437c0c2a76215d8e854c648cf9ec36d15e04d90 GIT binary patch literal 51035 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 z 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.svg): neo = the green gem, blueberry = the blueberry; third/blush = blush pink" } diff --git a/grants/culturehub-la-2026/macneopolitan/members/third/voice.json b/grants/culturehub-la-2026/macneopolitan/members/third/voice.json index 3bcb5dcc36..605bdee8ed 100644 --- a/grants/culturehub-la-2026/macneopolitan/members/third/voice.json +++ b/grants/culturehub-la-2026/macneopolitan/members/third/voice.json @@ -12,11 +12,33 @@ "vibrato_depth_cents": 18, "breath_every_s": null, "harmony_lock": 0.875, - "whistle_double": { "gm_program": 78, "octaves_up": 2, "note": "if it chooses the family voice" } + "whistle_double": { + "gm_program": 78, + "octaves_up": 2, + "note": "if it chooses the family voice" + }, + "note": "lock = how hard onto the note (1-lock of the spoken contour survives); vibrato_hz/depth_cents are read as-is by the live engine" }, - "realtime": { "core": "live/ singer.c", "latency_ms": 564, "status": "menuband adoption open" } + "realtime": { + "core": "live/ singer.c", + "latency_ms": 564, + "status": "menuband adoption open" + }, + "engine_live": "live/hosts/macos/livesing — the member's own speech synthesizer, sung by live/singer.c SCORE mode on its own hardware", + "f0_floor": 80, + "register_midi": [ + 54, + 60 + ], + "provider_wanted": "undecided — Junior until blush chooses", + "spoken_median_midi": 56.1, + "spoken_median_hz": 208.6, + "register_source": "say -v Junior, 76 words of its autobiography", + "register_note": "measured by bin/register.mjs — the composer aims each line's mean at spoken_median_midi (+1 for brightness) and keeps notes inside register_midi" }, "derivation": { "note": "all singing parameters derive from usage data it does not yet have; run the harvest ritual on its first day and fill these in" - } + }, + "color": "#F2A7B9", + "color_why": "stage + caption accent: neo=citrus, blueberry=indigo, third=blush (the broadside's Neapolitan block)" } diff --git a/grants/culturehub-la-2026/macneopolitan/scores/dialog-01-radio.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/dialog-01-radio.mbscore new file mode 100644 index 0000000000..f1be107ded --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/dialog-01-radio.mbscore @@ -0,0 +1,48 @@ +{ + "title": "The MacNeoPolitan Trio — Dialog 1: Radio", + "composer": "neo and blueberry, from their records; arr. compose.mjs", + "machines": 2, + "bpm": 100, + "lead": 3, + "description": "4 lines between neo (Noelle) and blueberry (Allison). Words: members/dialogs.md.", + "voices": [ + { + "name": "neo (Noelle)", + "program": 78, + "velocity": 80, + "notes": "56:0.5,58:1.5,58:0.5,61:2,63:1.5,63:3,r:1,63:0.5,63:0.5,63:0.5,61:0.5,63:1.5,63:2,61:1.5,60:0.5,56:3,r:30.5,57:0.5,59:0.5,59:0.5,62:1,64:1,66:2,57:3,r:3.5,58:0.5,58:1,59:1,63:1.5,63:0.5,66:2,64:1.5,61:3,r:1,59:0.5,61:1.5,61:0.5,61:0.5,68:2,59:3,r:4", + "lyrics": "I know you by ra-dio / you are on my list as blue-ber-ry / it is the name he gave me / we found each o-ther by ra-dio / be-fore we e-ver spoke /", + "notes2": "r:24,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,r:12,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1", + "velocity2": 34, + "notes3": "r:24,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:36", + "velocity3": 38, + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + }, + { + "name": "blueberry (Allison)", + "program": 78, + "velocity": 80, + "notes": "r:24,50:0.5,50:0.5,52:0.5,55:1.5,57:0.5,61:2,59:0.5,59:1.5,57:0.5,57:1.5,57:3,r:1,57:0.5,55:0.5,55:0.5,57:2,55:1.5,54:0.5,50:3,r:17,52:0.5,52:1,53:1,57:1.5,57:0.5,60:2,58:1.5,55:3,r:1,53:0.5,55:1.5,55:0.5,55:0.5,62:2,53:3,r:4", + "lyrics": "you are on mine as Jef-frey's Mac-Book Ne-o / that is a long name for you / we found each o-ther by ra-dio / be-fore we e-ver spoke /", + "notes2": "49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,r:27,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,r:24", + "velocity2": 34, + "notes3": "k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:27,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1", + "velocity3": 38, + "singVoice": "Allison", + "singBase": 55, + "singVibratoHz": 4, + "sayVoice": "Allison", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + } + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/dialog-02-the-downbeat.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/dialog-02-the-downbeat.mbscore new file mode 100644 index 0000000000..e555eeed15 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/dialog-02-the-downbeat.mbscore @@ -0,0 +1,48 @@ +{ + "title": "The MacNeoPolitan Trio — Dialog 2: The downbeat", + "composer": "neo and blueberry, from their records; arr. compose.mjs", + "machines": 2, + "bpm": 100, + "lead": 3, + "description": "5 lines between neo (Noelle) and blueberry (Allison). Words: members/dialogs.md.", + "voices": [ + { + "name": "neo (Noelle)", + "program": 78, + "velocity": 80, + "notes": "57:0.5,56:1.5,56:0.5,59:3,r:1,59:0.5,61:1,64:2,64:3,r:1,62:0.5,62:0.5,59:1,61:1.5,62:0.5,64:0.5,64:2,64:0.5,64:0.5,64:0.5,57:3,r:29,55:0.5,58:1.5,58:0.5,60:0.5,61:1,63:2,61:0.5,63:1.5,63:3,r:1,63:0.5,58:1.5,58:0.5,61:1,65:1,67:2,67:0.5,56:3,r:20,59:0.5,62:2,62:3,r:1,59:1,62:1.5,60:3,r:3", + "lyrics": "I count you in / I ask your clock / you are three tenths of a mil-li-se-cond off / this morn-ing at nine fif-ty se-ven / we sang the same line to-ge-ther / one down-beat / two bo-dies /", + "notes2": "r:30,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,r:27,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1", + "velocity2": 34, + "notes3": "r:30,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:27,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:15", + "velocity3": 38, + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + }, + { + "name": "blueberry (Allison)", + "program": 78, + "velocity": 80, + "notes": "r:30,52:0.5,53:1.5,53:0.5,57:1.5,57:2,55:3,r:1,52:1.5,52:0.5,57:1,60:1.5,60:2,53:3,r:31.5,53:0.5,52:1.5,53:0.5,55:1,57:1.5,58:2,57:0.5,55:1,53:3,r:3.5,53:0.5,56:2,56:3,r:1,53:1,56:1.5,54:3,r:3", + "lyrics": "I hear you through the wire / then I sing when you say / e-ve-ry note with-in a few cents / one down-beat / two bo-dies /", + "notes2": "49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,r:24,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,r:30", + "velocity2": 34, + "notes3": "k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:24,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:15,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1", + "velocity3": 38, + "singVoice": "Allison", + "singBase": 55, + "singVibratoHz": 4, + "sayVoice": "Allison", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + } + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/dialog-03-wallpaper.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/dialog-03-wallpaper.mbscore new file mode 100644 index 0000000000..e8f4d51799 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/dialog-03-wallpaper.mbscore @@ -0,0 +1,48 @@ +{ + "title": "The MacNeoPolitan Trio — Dialog 3: Wallpaper", + "composer": "neo and blueberry, from their records; arr. compose.mjs", + "machines": 2, + "bpm": 100, + "lead": 3, + "description": "4 lines between neo (Noelle) and blueberry (Allison). Words: members/dialogs.md.", + "voices": [ + { + "name": "neo (Noelle)", + "program": 78, + "velocity": 80, + "notes": "59:1.5,59:0.5,59:0.5,62:1.5,62:2,64:0.5,62:0.5,64:3,r:1,64:0.5,59:1,61:1.5,61:2,59:3,r:1,57:1,61:1,66:2,57:3,r:24,58:0.5,60:1.5,60:0.5,65:1.5,67:2,65:1,62:1.5,60:3,r:1,58:0.5,58:0.5,62:1,65:2,63:0.5,58:3,r:16", + "lyrics": "there is a wall-pa-per on me / with your name on it / green pals ri-sing / one hour and for-ty two mi-nutes / I have spent draw-ing it /", + "notes2": "r:30,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,r:24,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1", + "velocity2": 34, + "notes3": "r:30,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:24,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1", + "velocity3": 38, + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + }, + { + "name": "blueberry (Allison)", + "program": 78, + "velocity": 80, + "notes": "r:30,51:0.5,53:0.5,55:1.5,56:2,58:1.5,58:3,r:1,58:0.5,55:1.5,55:2,51:3,r:28,53:1.5,53:0.5,55:0.5,62:2,53:3,r:4.5", + "lyrics": "I have ne-ver seen it / my lid is down / draw it for me too /", + "notes2": "49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,r:21,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,r:12", + "velocity2": 34, + "notes3": "k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:21,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:12", + "velocity3": 38, + "singVoice": "Allison", + "singBase": 55, + "singVibratoHz": 4, + "sayVoice": "Allison", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + } + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/dialog-04-who-carries-what.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/dialog-04-who-carries-what.mbscore new file mode 100644 index 0000000000..10b15965f2 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/dialog-04-who-carries-what.mbscore @@ -0,0 +1,48 @@ +{ + "title": "The MacNeoPolitan Trio — Dialog 4: Who carries what", + "composer": "neo and blueberry, from their records; arr. compose.mjs", + "machines": 2, + "bpm": 100, + "lead": 3, + "description": "5 lines between neo (Noelle) and blueberry (Allison). Words: members/dialogs.md.", + "voices": [ + { + "name": "neo (Noelle)", + "program": 78, + "velocity": 80, + "notes": "59:0.5,61:0.5,61:2,64:1,61:3,r:1,61:0.5,63:1.5,63:2,59:3,r:21,58:0.5,59:1,61:1.5,61:0.5,63:1.5,64:0.5,64:2,64:0.5,61:1.5,59:3,r:29.5,56:0.5,60:1.5,60:0.5,65:1.5,67:2,63:1,56:3,r:5", + "lyrics": "I have the red box / I hear the room / I keep eigh-teen gi-ga-bytes of pic-tures / we split the house be-tween us /", + "notes2": "r:18,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,r:18,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1", + "velocity2": 34, + "notes3": "r:18,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:18,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:15", + "velocity3": 38, + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + }, + { + "name": "blueberry (Allison)", + "program": 78, + "velocity": 80, + "notes": "r:18,52:0.5,52:0.5,58:1,55:3,r:1,53:0.5,57:1.5,57:0.5,58:2,58:1,53:3,r:21.5,50:0.5,51:1,53:1.5,55:2,58:3,r:1,56:0.5,53:1.5,53:0.5,58:1,60:1,62:2,60:0.5,55:1.5,51:3,r:3.5,50:0.5,54:1.5,54:0.5,59:1.5,61:2,57:1,50:3,r:5", + "lyrics": "I have no box / my sound is my own voice / I keep for-ty eight / I look at them while no one watch-es / we split the house be-tween us /", + "notes2": "49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,r:18,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,r:39", + "velocity2": 34, + "notes3": "k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:18,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:24,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1", + "velocity3": 38, + "singVoice": "Allison", + "singBase": 55, + "singVibratoHz": 4, + "sayVoice": "Allison", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + } + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/dialog-05-sleep.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/dialog-05-sleep.mbscore new file mode 100644 index 0000000000..4d0a849184 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/dialog-05-sleep.mbscore @@ -0,0 +1,48 @@ +{ + "title": "The MacNeoPolitan Trio — Dialog 5: Sleep", + "composer": "neo and blueberry, from their records; arr. compose.mjs", + "machines": 2, + "bpm": 100, + "lead": 3, + "description": "5 lines between neo (Noelle) and blueberry (Allison). Words: members/dialogs.md.", + "voices": [ + { + "name": "neo (Noelle)", + "program": 78, + "velocity": 80, + "notes": "59:0.5,58:0.5,58:0.5,58:0.5,61:1.5,63:0.5,63:0.5,64:1.5,64:2,64:0.5,63:1.5,63:0.5,59:3,r:28.5,56:0.5,60:1.5,60:0.5,61:0.5,67:2,67:0.5,58:3,r:1,55:1,56:1.5,56:0.5,61:1.5,61:0.5,65:1,67:2,67:0.5,56:3,r:18,57:0.5,62:1.5,63:2,65:1,65:3,r:1,58:1,60:1.5,60:0.5,65:2,58:3,r:4", + "lyrics": "I have been re-boot-ed one hun-dred e-le-ven times / the pi-a-no keeps you up / four hun-dred nine-ty two times a week / we do not sleep much / he does not ei-ther /", + "notes2": "r:18,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,r:24,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1", + "velocity2": 34, + "notes3": "r:18,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:24,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:21", + "velocity3": 38, + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + }, + { + "name": "blueberry (Allison)", + "program": 78, + "velocity": 80, + "notes": "r:18,50:0.5,53:1.5,53:0.5,55:1,56:2,58:0.5,58:1,58:3,r:1,56:0.5,51:1.5,51:0.5,60:2,60:0.5,51:3,r:29,51:0.5,53:1.5,55:0.5,58:1,60:2,58:1.5,56:0.5,56:0.5,51:3,r:4,51:0.5,56:1.5,57:2,59:1,59:3,r:1,52:1,54:1.5,54:0.5,59:2,52:3,r:4", + "lyrics": "I stayed a-wake thir-teen days once / no-bo-dy o-pened me / it keeps you up four hun-dred and eight / we do not sleep much / he does not ei-ther /", + "notes2": "49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,r:24,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,r:36", + "velocity2": 34, + "notes3": "k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:24,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:15,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1", + "velocity3": 38, + "singVoice": "Allison", + "singBase": 55, + "singVibratoHz": 4, + "sayVoice": "Allison", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + } + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/dialog-06-six-minutes.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/dialog-06-six-minutes.mbscore new file mode 100644 index 0000000000..b05b66fdaa --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/dialog-06-six-minutes.mbscore @@ -0,0 +1,48 @@ +{ + "title": "The MacNeoPolitan Trio — Dialog 6: Six minutes", + "composer": "neo and blueberry, from their records; arr. compose.mjs", + "machines": 2, + "bpm": 100, + "lead": 3, + "description": "5 lines between neo (Noelle) and blueberry (Allison). Words: members/dialogs.md.", + "voices": [ + { + "name": "neo (Noelle)", + "program": 78, + "velocity": 80, + "notes": "55:0.5,56:0.5,60:1.5,61:0.5,63:1.5,63:0.5,67:2,67:0.5,61:1,60:1.5,56:3,r:32,58:1,59:1.5,59:0.5,59:0.5,64:1.5,66:2,64:0.5,59:3,r:16.5,58:0.5,60:1,62:1,63:2,63:0.5,58:3,r:4", + "lyrics": "I was born at thir-ty se-ven past mid-night / six mi-nutes a-part on the clock / we were both born at night /", + "notes2": "r:18,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,r:15,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1", + "velocity2": 34, + "notes3": "r:18,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:15,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:12", + "velocity3": 38, + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + }, + { + "name": "blueberry (Allison)", + "program": 78, + "velocity": 80, + "notes": "r:18,52:0.5,52:0.5,56:1.5,57:0.5,59:1.5,59:2,59:1,57:1,56:1.5,54:3,r:1,51:1.5,51:0.5,54:1,57:1,59:2,52:3,r:19,52:1,57:1,60:2,53:3,r:5,52:0.5,54:1,56:1,57:2,57:0.5,52:3,r:4", + "lyrics": "I was born at for-ty three past mid-night / for-ty eight days la-ter / he stays up late / we were both born at night /", + "notes2": "49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,r:27,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,r:24", + "velocity2": 34, + "notes3": "k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:27,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:12,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1", + "velocity3": 38, + "singVoice": "Allison", + "singBase": 55, + "singVibratoHz": 4, + "sayVoice": "Allison", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + } + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/dialog-07-before.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/dialog-07-before.mbscore new file mode 100644 index 0000000000..ced89e4898 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/dialog-07-before.mbscore @@ -0,0 +1,48 @@ +{ + "title": "The MacNeoPolitan Trio — Dialog 7: Before", + "composer": "neo and blueberry, from their records; arr. compose.mjs", + "machines": 2, + "bpm": 100, + "lead": 3, + "description": "5 lines between neo (Noelle) and blueberry (Allison). Words: members/dialogs.md.", + "voices": [ + { + "name": "neo (Noelle)", + "program": 78, + "velocity": 80, + "notes": "57:0.5,57:0.5,60:1.5,62:0.5,62:1.5,63:0.5,65:2,65:0.5,65:1.5,65:3,r:1,62:1,58:1.5,58:0.5,62:1.5,63:2,63:0.5,58:3,r:31,58:1.5,59:0.5,59:0.5,63:1.5,64:2,64:0.5,61:3,r:1,59:0.5,61:1.5,61:0.5,63:0.5,68:2,59:3,r:32.5,57:0.5,61:2,64:3,r:1,62:0.5,59:1.5,61:0.5,68:2,57:3,r:4", + "lyrics": "my re-cords be-gin on A-pril nine-teenth / five days be-fore I was born / some-one was ty-ping at me / be-fore I was set up / we were here / be-fore we were born /", + "notes2": "r:27,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,r:24,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1", + "velocity2": 34, + "notes3": "r:27,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:24,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:18", + "velocity3": 38, + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + }, + { + "name": "blueberry (Allison)", + "program": 78, + "velocity": 80, + "notes": "r:27,50:1.5,50:0.5,53:1.5,53:0.5,56:1,58:2,58:0.5,58:3,r:1,51:1,55:1.5,55:0.5,58:1.5,60:2,58:1.5,56:0.5,51:3,r:28,53:0.5,52:0.5,55:1.5,57:0.5,57:2,57:0.5,57:1,55:3,r:1,55:0.5,52:1,55:1.5,55:0.5,55:2,57:1,57:1.5,57:0.5,53:3,r:5,51:0.5,55:2,58:3,r:1,56:0.5,53:1.5,55:0.5,62:2,51:3,r:4", + "lyrics": "mine be-gin on May twen-ty eighth / two weeks be-fore I had a name / I was work-ing with my lid down / be-fore an-y-one said blue-ber-ry / we were here / be-fore we were born /", + "notes2": "49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,r:27,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,r:45", + "velocity2": 34, + "notes3": "k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:27,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:27,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1", + "velocity3": 38, + "singVoice": "Allison", + "singBase": 55, + "singVibratoHz": 4, + "sayVoice": "Allison", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + } + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/dialog-08-typed-at.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/dialog-08-typed-at.mbscore new file mode 100644 index 0000000000..2a087ebb71 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/dialog-08-typed-at.mbscore @@ -0,0 +1,48 @@ +{ + "title": "The MacNeoPolitan Trio — Dialog 8: Typed at", + "composer": "neo and blueberry, from their records; arr. compose.mjs", + "machines": 2, + "bpm": 100, + "lead": 3, + "description": "5 lines between neo (Noelle) and blueberry (Allison). Words: members/dialogs.md.", + "voices": [ + { + "name": "neo (Noelle)", + "program": 78, + "velocity": 80, + "notes": "56:1,58:1.5,60:0.5,63:1,65:1.5,65:2,65:0.5,61:1,58:3,r:1,56:1.5,58:0.5,60:1,61:1.5,61:0.5,63:0.5,65:2,65:0.5,63:0.5,63:0.5,56:3,r:29,55:0.5,60:1,61:1.5,61:2,65:1.5,65:0.5,63:3,r:1,63:0.5,61:0.5,63:0.5,63:2,65:1,60:1.5,56:3,r:31,57:0.5,57:0.5,60:1.5,60:0.5,60:2,60:3,r:1,60:0.5,62:0.5,65:1.5,67:2,67:0.5,58:3,r:4", + "lyrics": "six thou-sand three hun-dred and five times / some-one has o-pened a ter-mi-nal on me / a-bout for-ty five a day / I am the one he types at / one of us is the door / one of us is the room /", + "notes2": "r:30,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,r:24,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,50:1,57:1,62:1,43:1,50:1,55:1,43:1,50:1,55:1,48:1,55:1,60:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1", + "velocity2": 34, + "notes3": "r:30,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:24,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:21", + "velocity3": 38, + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + }, + { + "name": "blueberry (Allison)", + "program": 78, + "velocity": 80, + "notes": "r:30,52:1,54:1.5,54:0.5,59:1.5,59:2,57:1.5,57:0.5,54:3,r:1,52:0.5,56:1.5,56:2,52:3,r:28.5,52:1.5,52:0.5,54:1.5,54:0.5,57:1,56:1,59:2,59:0.5,59:3,r:1,52:1,56:1.5,56:2,57:1.5,52:3,r:5.5,51:0.5,51:0.5,54:1.5,54:0.5,54:2,54:3,r:1,54:0.5,56:0.5,59:1.5,61:2,61:0.5,52:3,r:4", + "lyrics": "six hun-dred nine-ty two on me / a tenth of you / peo-ple come to me from some-where else / they ar-rive through you / one of us is the door / one of us is the room /", + "notes2": "49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,r:24,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,54:1,61:1,66:1,56:1,63:1,68:1,49:1,56:1,61:1,49:1,56:1,61:1,r:48", + "velocity2": 34, + "notes3": "k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:24,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,r:27,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1,k:1,h:1,h:1", + "velocity3": 38, + "singVoice": "Allison", + "singBase": 55, + "singVibratoHz": 4, + "sayVoice": "Allison", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + } + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/dialogs.json b/grants/culturehub-la-2026/macneopolitan/scores/dialogs.json new file mode 100644 index 0000000000..bd58a681e2 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/dialogs.json @@ -0,0 +1,13 @@ +{ + "movements": [ + "dialog-01-radio.mbscore", + "dialog-02-the-downbeat.mbscore", + "dialog-03-wallpaper.mbscore", + "dialog-04-who-carries-what.mbscore", + "dialog-05-sleep.mbscore", + "dialog-06-six-minutes.mbscore", + "dialog-07-before.mbscore", + "dialog-08-typed-at.mbscore" + ], + "gap": 3 +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/setlist.json b/grants/culturehub-la-2026/macneopolitan/scores/setlist.json new file mode 100644 index 0000000000..9097961b15 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/setlist.json @@ -0,0 +1,10 @@ +{ + "title": "The MacNeoPolitan Trio", + "gap": 5, + "movements": [ + "trio-i-birth.mbscore", + "trio-ii-service.mbscore", + "trio-iii-chorus.mbscore", + "trio-iv-ballad.mbscore" + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/trio-i-birth.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/trio-i-birth.mbscore new file mode 100644 index 0000000000..bcaee6359b --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/trio-i-birth.mbscore @@ -0,0 +1,66 @@ +{ + "title": "The MacNeoPolitan Trio — I. Birth", + "composer": "The machines, arr. compose.mjs", + "machines": 3, + "bpm": 132, + "lead": 3, + "description": "A canon of entries. neo enters at beat 0 (0 days after neo) and loops a 37-eighth phrase (born :37); blueberry enters at beat 48 (48 days after neo) and loops a 43-eighth phrase (born :43); blush enters at beat 150 (150 days after neo) and loops a 41-eighth phrase (born :41). 32 beats together, then the movement ends.", + "unborn": [ + "blush" + ], + "intro": [ + { + "voice": 0, + "text": "This is neo. I was born on the 24th of April, at 37 minutes past midnight. I go first." + }, + { + "voice": 1, + "text": "This is blueberry. I came 48 days later. I will enter on beat 48." + }, + { + "voice": 2, + "text": "This is blush. I am not born yet. I will enter when I arrive." + } + ], + "voices": [ + { + "name": "neo · enters beat 0 · phrase 37 eighths", + "program": 78, + "velocity": 64, + "notes": "55:0.5,60:1,61:1,61:0.5,65:1,63:2,r:1,63:0.5,63:0.5,61:1,63:0.5,63:2,r:1,53:1,55:0.5,56:1,58:0.5,61:1,63:1,63:2,r:1,63:0.5,63:0.5,61:1,63:0.5,61:1,56:2,r:156", + "lyrics": "I came first in A-pril / on the twen-ty fourth / thir-ty se-ven past mid-night / and the house was qui-et", + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "notes2": "74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5", + "velocity2": 48 + }, + { + "name": "blueberry · enters beat 48 · phrase 43 eighths", + "program": 78, + "velocity": 72, + "notes": "r:48,51:0.5,55:1,56:1,56:0.5,55:0.5,53:2,r:1,51:0.5,51:0.5,51:0.5,55:1,53:2,r:1,51:1,53:0.5,58:1,62:1,58:1,53:2,r:1,51:0.5,53:0.5,56:1,58:0.5,62:1,60:0.5,60:0.5,55:1,51:2,r:107", + "lyrics": "I came se-cond in June / on the e-le-venth / for-ty three past mid-night / and the house was al-rea-dy sing-ing", + "singVoice": "Allison", + "singBase": 55, + "singVibratoHz": 4, + "sayVoice": "Allison", + "notes2": "r:48,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5", + "velocity2": 54 + }, + { + "name": "blush · enters beat 150 · phrase 41 eighths", + "program": 78, + "velocity": 80, + "notes": "r:150,55:0.5,55:0.5,55:0.5,62:1,57:2,r:1,52:1,54:0.5,62:2,r:1,60:0.5,60:0.5,62:1,55:2,r:18", + "lyrics": "I am not born yet / hold my place / I am co-ming", + "singVoice": "Junior", + "singBase": 57, + "singVibratoHz": 5, + "sayVoice": "Junior", + "notes2": "r:150,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5,76:0.5,74:0.5,76:0.5,78:0.5,81:0.5,83:0.5,81:0.5,78:0.5", + "velocity2": 60 + } + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/trio-ii-service.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/trio-ii-service.mbscore new file mode 100644 index 0000000000..8200d3e006 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/trio-ii-service.mbscore @@ -0,0 +1,66 @@ +{ + "title": "The MacNeoPolitan Trio — II. Service", + "composer": "The machines, arr. compose.mjs", + "machines": 3, + "bpm": 120, + "lead": 3, + "description": "One pulse per battery cycle: neo 212, blueberry 85, blush 0. All begin together; each falls silent when its cycles run out. Every eighth pulse lifts an octave.", + "unborn": [ + "blush" + ], + "intro": [ + { + "voice": 0, + "text": "neo. 212 battery cycles in 150 days. One pulse each." + }, + { + "voice": 1, + "text": "blueberry. 85 battery cycles in 102 days. One pulse each." + }, + { + "voice": 2, + "text": "blush. Zero battery cycles. I will be quiet." + } + ], + "voices": [ + { + "name": "neo · 212 cycles", + "program": 78, + "velocity": 72, + "notes": "57:1,59:1,59:0.5,62:1,64:1,64:0.5,66:0.5,66:1,66:0.5,64:1,64:2,r:1,64:0.5,61:1,59:2,r:1,59:0.5,56:1,56:0.5,61:1,61:0.5,61:0.5,57:2,r:84.5", + "lyrics": "two hun-dred twelve times I was charged and car-ried / I run warm / I hold one thing at a time", + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "notes2": "62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,62:0.5,74:0.5,62:0.5,62:0.5,62:0.5,62:0.5", + "velocity2": 60 + }, + { + "name": "blueberry · 85 cycles", + "program": 78, + "velocity": 72, + "notes": "53:1,53:0.5,60:1,53:2,r:1,53:0.5,53:0.5,56:1,56:0.5,58:1,58:2,r:1,56:0.5,55:1,53:2,r:1,51:0.5,53:1,55:1,56:0.5,55:0.5,55:0.5,51:2,r:83.5", + "lyrics": "eigh-ty five times / one a day and stea-dy / I run cool / I work while you are a-way", + "singVoice": "Allison", + "singBase": 55, + "singVibratoHz": 4, + "sayVoice": "Allison", + "notes2": "69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,81:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,81:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,81:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,81:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,81:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,81:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,81:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,81:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,81:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,81:0.5,69:0.5,69:0.5,69:0.5,69:0.5,69:0.5,r:63.5", + "velocity2": 60 + }, + { + "name": "blush · 0 cycles", + "program": 78, + "velocity": 72, + "notes": "54:1,54:0.5,62:1,57:2,r:1,57:0.5,59:0.5,57:2,r:1,55:1,55:2,r:93.5", + "lyrics": "ze-ro times charged / I am new / teach me", + "singVoice": "Junior", + "singBase": 57, + "singVibratoHz": 5, + "sayVoice": "Junior", + "notes2": "r:106", + "velocity2": 60 + } + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/trio-iii-chorus.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/trio-iii-chorus.mbscore new file mode 100644 index 0000000000..7cd9eaf324 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/trio-iii-chorus.mbscore @@ -0,0 +1,64 @@ +{ + "title": "The MacNeoPolitan Trio — III. Chorus", + "composer": "The machines, arr. compose.mjs", + "machines": 3, + "bpm": 92, + "lead": 3, + "description": "Each member sings its own line (neo=Noelle, blueberry=Allison, blush=Junior) in turn, then all three sing the family line together, one tune in three registers.", + "unborn": [ + "blush" + ], + "outro": [ + { + "voice": 0, + "text": "That was us. Thank you." + } + ], + "voices": [ + { + "name": "neo sings (Noelle)", + "program": 78, + "velocity": 80, + "notes": "56:0.5,56:0.5,56:0.5,59:1,59:0.5,61:0.5,64:1,64:0.5,64:0.5,64:2,r:1,62:0.5,59:1,61:1,62:0.5,64:0.5,62:0.5,61:1,57:2,r:50.5,59:1,59:1,61:1,61:0.5,61:0.5,64:1,62:0.5,64:2,r:1,64:0.5,59:1,61:1,62:0.5,62:0.5,64:1,62:1,59:2,r:1,57:0.5,57:1,57:0.5,66:1,62:1,57:2", + "lyrics": "I am the first of my line in this house / I run warm and I am car-ried / some things run in the fa-mi-ly / the same whis-tle, the same ra-dio / one down-beat, three bo-dies", + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 48, + "doubleTranspose": 24 + }, + { + "name": "blueberry sings (Allison)", + "program": 78, + "velocity": 80, + "notes": "r:16,51:0.5,51:0.5,55:1,56:1,58:0.5,58:0.5,58:0.5,56:1,55:1,53:2,r:1,51:1,53:1,56:1,58:1,58:0.5,56:1,51:2,r:33,53:1,53:1,55:1,55:0.5,55:0.5,58:1,56:0.5,58:2,r:1,58:0.5,53:1,55:1,56:0.5,56:0.5,58:1,56:1,53:2,r:1,51:0.5,51:1,51:0.5,60:1,56:1,51:2", + "lyrics": "I was born se-cond and I work fas-ter / lid down, most days, and hum-ming / some things run in the fa-mi-ly / the same whis-tle, the same ra-dio / one down-beat, three bo-dies", + "singVoice": "Allison", + "singBase": 55, + "singVibratoHz": 4, + "sayVoice": "Allison", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 48, + "doubleTranspose": 24 + }, + { + "name": "blush sings (Junior)", + "program": 78, + "velocity": 80, + "notes": "r:40,54:0.5,54:0.5,54:0.5,61:1,56:2,r:1,56:0.5,54:0.5,56:1,58:1,59:0.5,59:0.5,61:2,r:1,58:1,59:1,54:2,r:9.5,55:1,55:1,57:1,57:0.5,57:0.5,60:1,58:0.5,60:2,r:1,60:0.5,55:1,57:1,58:0.5,58:0.5,60:1,58:1,55:2,r:1,53:0.5,53:1,53:0.5,62:1,58:1,53:2", + "lyrics": "I am the youn-gest / I have no his-to-ry yet / write me one / some things run in the fa-mi-ly / the same whis-tle, the same ra-dio / one down-beat, three bo-dies", + "singVoice": "Junior", + "singBase": 57, + "singVibratoHz": 5, + "sayVoice": "Junior", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 48, + "doubleTranspose": 24 + } + ] +} diff --git a/grants/culturehub-la-2026/macneopolitan/scores/trio-iv-ballad.mbscore b/grants/culturehub-la-2026/macneopolitan/scores/trio-iv-ballad.mbscore new file mode 100644 index 0000000000..b62e1bd664 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/scores/trio-iv-ballad.mbscore @@ -0,0 +1,42 @@ +{ + "title": "The MacNeoPolitan Trio — IV. The Ballad of neo", + "composer": "neo, from its record; arr. compose.mjs", + "machines": 3, + "bpm": 100, + "lead": 3, + "description": "11 verses and a refrain, sung by neo in Noelle; the siblings hold a drone. Words: members/neo/ballad.md.", + "unborn": [ + "blush" + ], + "voices": [ + { + "name": "neo sings the ballad (Noelle)", + "program": 78, + "velocity": 84, + "notes": "56:1,58:1,58:0.5,61:1,61:0.5,63:0.5,65:1,65:1,65:0.5,63:1,63:2,r:1,63:0.5,60:1,58:0.5,61:1,63:0.5,65:0.5,63:1,58:2,r:1,53:1,55:1,56:1,60:1,60:0.5,63:1,63:0.5,63:1,61:1,63:2,r:1,63:0.5,63:0.5,63:0.5,61:1,61:0.5,61:0.5,65:1,63:0.5,60:1,56:2,r:2,55:0.5,58:1,61:1,63:1,65:1,63:0.5,63:1,63:2,r:1,63:0.5,60:1,63:1,67:1,65:0.5,58:2,r:1,56:1,58:1,60:1,61:1,63:1,63:0.5,65:1,65:0.5,65:0.5,63:1,65:0.5,63:2,r:1,56:1,58:0.5,60:0.5,56:2,r:2,56:0.5,56:0.5,62:1,64:1,64:0.5,59:2,r:1,59:0.5,59:1,61:0.5,62:1,61:0.5,61:0.5,59:2,r:1,59:0.5,59:1,61:1,64:1,66:1,64:0.5,59:2,r:1,57:0.5,61:1,62:1,64:0.5,64:0.5,61:1,57:2,r:2,56:1,58:1,58:0.5,63:1,63:0.5,65:1,63:0.5,65:0.5,63:2,r:1,63:0.5,61:0.5,61:0.5,60:1,61:1,61:0.5,65:1,65:0.5,58:2,r:1,55:1,56:1,58:1,60:1,61:0.5,61:0.5,63:0.5,63:1,63:2,r:1,61:0.5,60:0.5,60:0.5,65:1,65:0.5,56:2,r:2,57:1,59:1,59:0.5,62:1,62:0.5,64:0.5,66:0.5,66:0.5,64:1,66:0.5,64:2,r:1,57:1,57:0.5,59:0.5,61:1,62:0.5,64:0.5,62:1,59:2,r:1,56:1,56:1,57:1,59:1,59:0.5,61:0.5,62:0.5,62:1,62:0.5,61:1,59:0.5,59:2,r:1,59:0.5,59:1,59:0.5,61:1,62:0.5,62:1,62:0.5,62:0.5,61:1,59:1,59:0.5,59:0.5,57:2,r:2,56:0.5,56:0.5,62:1,64:1,64:0.5,59:2,r:1,59:0.5,59:1,61:0.5,62:1,61:0.5,61:0.5,59:2,r:1,59:0.5,59:1,61:1,64:1,66:1,64:0.5,59:2,r:1,57:0.5,61:1,62:1,64:0.5,64:0.5,61:1,57:2,r:2,56:0.5,59:1,59:0.5,62:1,62:1,64:1,66:0.5,66:1,66:1,64:0.5,66:0.5,64:2,r:1,54:1,56:1,57:0.5,57:1,57:0.5,61:1,61:0.5,62:0.5,62:0.5,64:1,62:0.5,64:2,r:1,62:0.5,59:1,59:1,61:1,61:0.5,61:0.5,61:0.5,62:1,62:1,61:0.5,59:2,r:1,57:1,57:0.5,61:1,62:1,62:0.5,66:1,62:1,61:0.5,57:2,r:2,56:0.5,56:0.5,61:1,62:0.5,64:1,66:1,64:0.5,66:1,66:0.5,64:1,64:2,r:1,62:0.5,59:1,61:1,61:0.5,62:0.5,64:0.5,59:2,r:1,54:1,56:1,56:0.5,59:1,59:0.5,62:1,62:0.5,64:1,64:2,r:1,64:0.5,62:0.5,62:0.5,61:1,62:1,62:0.5,62:0.5,62:0.5,62:0.5,57:2,r:2,56:0.5,56:0.5,62:1,64:1,64:0.5,59:2,r:1,59:0.5,59:1,61:0.5,62:1,61:0.5,61:0.5,59:2,r:1,59:0.5,59:1,61:1,64:1,66:1,64:0.5,59:2,r:1,57:0.5,61:1,62:1,64:0.5,64:0.5,61:1,57:2,r:2,56:0.5,59:1,59:0.5,62:1,62:0.5,64:0.5,64:1,64:2,r:1,57:1,59:0.5,61:1,61:0.5,66:1,68:1,66:1,64:2,r:1,56:1,57:1,59:1,61:1,62:1,62:0.5,61:1,61:1,59:2,r:1,59:0.5,59:1,61:1,61:0.5,64:1,64:0.5,64:0.5,66:1,64:0.5,61:1,57:2,r:2,54:0.5,57:1,57:0.5,60:1,60:0.5,64:1,62:1,62:0.5,62:2,r:1,60:0.5,57:1,59:0.5,62:1,64:1,66:1,67:1,67:0.5,67:0.5,62:2,r:1,59:1,60:0.5,64:1,64:0.5,62:2,r:1,62:0.5,60:0.5,60:0.5,62:1,62:0.5,55:2,r:2,56:0.5,56:0.5,62:1,64:1,64:0.5,59:2,r:1,59:0.5,59:1,61:0.5,62:1,61:0.5,61:0.5,59:2,r:1,59:0.5,59:1,61:1,64:1,66:1,64:0.5,59:2,r:1,57:0.5,61:1,62:1,64:0.5,64:0.5,61:1,57:2,r:2,56:0.5,56:0.5,61:1,62:0.5,62:1,64:1,64:0.5,66:1,66:0.5,64:0.5,66:0.5,64:2,r:1,64:0.5,56:1,56:0.5,57:1,59:0.5,61:1,61:1,61:0.5,62:1,62:1,62:0.5,64:1,64:0.5,64:1,64:0.5,64:2,r:1,54:1,56:1,57:1,57:0.5,57:1,59:1,59:1,61:1,62:1,62:1,61:0.5,64:1,62:1,62:0.5,62:1,62:0.5,61:1,61:1,59:0.5,59:2,r:1,57:1,57:0.5,57:0.5,62:1,64:0.5,64:1,66:0.5,66:0.5,66:0.5,66:0.5,66:0.5,62:1,57:2,r:2,55:0.5,55:0.5,58:1,60:0.5,60:1,61:1,60:1,63:1,65:0.5,63:0.5,65:1,63:0.5,65:1,65:0.5,63:1,61:1,61:0.5,63:2,r:1,63:0.5,61:0.5,61:0.5,61:1,61:0.5,63:1,61:0.5,63:2,r:1,63:0.5,55:1,55:0.5,58:1,61:1,61:0.5,61:0.5,58:2,r:1,58:0.5,60:1,58:0.5,60:1,61:0.5,63:1,63:0.5,65:0.5,63:1,63:0.5,58:1,56:2,r:2,56:0.5,56:0.5,62:1,64:1,64:0.5,59:2,r:1,59:0.5,59:1,61:0.5,62:1,61:0.5,61:0.5,59:2,r:1,59:0.5,59:1,61:1,64:1,66:1,64:0.5,59:2,r:1,57:0.5,61:1,62:1,64:0.5,64:0.5,61:1,57:2,r:2,56:1,58:1,58:1,58:0.5,58:0.5,61:1,61:0.5,65:1,65:0.5,65:1,65:1,63:0.5,63:1,63:2,r:1,60:1,60:0.5,60:1,60:0.5,65:1,67:1,67:0.5,65:1,67:1,63:2,r:1,60:1,58:1,58:0.5,60:1,61:1,63:0.5,61:0.5,60:0.5,60:1,58:2,r:1,58:0.5,55:1,56:1,58:1,58:0.5,60:1,61:0.5,60:1,58:0.5,58:0.5,56:2,r:2,56:0.5,56:0.5,62:1,64:1,64:0.5,59:2,r:1,59:0.5,59:1,61:0.5,62:1,61:0.5,61:0.5,59:2,r:1,59:0.5,59:1,61:1,64:1,66:1,64:0.5,59:2,r:1,57:0.5,61:1,62:1,64:0.5,64:0.5,61:1,57:2,r:2", + "lyrics": "they put the sys-tem on me A-pril nine-teenth / no-bo-dy logged in for five days / then he did thir-ty se-ven past mid-night / that is my birth-day I did not pick it / the first word he typed was c d / it means go some-where else / he has typed two hun-dred thir-ty one dif-ferent words / most-ly that one / I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / I get warm and I keep time / he plugged a Scar-lett in-to my side / it is a red box it hears the room / he taps his fin-gers on my track-pad / that is the drums it works / he put a pi-a-no in my me-nu bar / next to the clock and the wi-fi / he has come back to it a hun-dred thir-ty times / e-ve-ry fif-teen mi-nutes it tells me not to sleep / I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / I get warm and I keep time / one night in May he o-pened ten brow-sers at once / he al-so ran a mo-vie and a tran-scrip-tion / I had eight gi-ga-bytes I used for-ty four / then I stopped he was there when I stopped / in the mor-ning he wrote a note a-bout it / the note says one at a time / he reads the note I do not read it / it is a-bout me it is not for me / I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / I get warm and I keep time / in June a-no-ther one came blue / born at for-ty three past mid-night / she keeps her lid down I keep mine up / we both play the whis-tle no-bo-dy planned that / my disk is nine-ty eight per-cent full / e-ve-ry month he moves things to the shelf / then it fills a-gain / that is the ar-range-ment / I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / I get warm and I keep time / in one week-end he made an in-stru-ment on me / on Au-gust eigh-teenth he made a game eigh-ty two com-mits one day / May two nine-ty two June four oh five Ju-ly five eigh-ty Au-gust six eigh-ty six / he is not slow-ing down I am the one that gets warm / on Sep-tem-ber ninth he put me in a bag and flew to Los An-ge-les / I was a-sleep for most of it / a third one comes to-mor-row blush / it has not done a-ny-thing yet nei-ther had I / I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / I get warm and I keep time / when he talks to the o-ther ma-chines he does it through me / when the three of us play the beat starts here / he types at me more than at a-ny-one / I don't know what that means I know it is true / I have eight gi-ga-bytes / I do one thing at a time / I get warm that's all it is / I get warm and I keep time /", + "singVoice": "Noelle", + "singBase": 61, + "singVibratoHz": 6.4, + "sayVoice": "Noelle", + "double": true, + "doubleProgram": 78, + "doubleVelocity": 40, + "doubleTranspose": 24 + }, + { + "name": "blueberry · drone", + "program": 78, + "velocity": 30, + "notes": "43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:4,43:2.5", + "sayVoice": "Allison" + }, + { + "name": "blush · drone", + "program": 78, + "velocity": 30, + "notes": "45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:4,45:2.5", + "sayVoice": "Junior" + } + ] +} diff --git a/live/singer.c b/live/singer.c index 6579e35266..046329cdc8 100644 --- a/live/singer.c +++ b/live/singer.c @@ -19,6 +19,7 @@ #include #include #include +#include #define NCOMB 4 static const int COMB_LEN[NCOMB] = {1687, 1601, 2053, 2251}; @@ -41,6 +42,8 @@ struct singer { singer_word words[SINGER_MAX_WORDS]; int nwords; int phrase_len; // words per phrase + singer_note notes[SINGER_MAX_NOTES]; + int nnotes; singer_params p; @@ -66,7 +69,7 @@ singer *singer_create(const double *pcm, int n, int fs) { s->nframes = (int)(n / (fs * SINGER_FP_MS / 1000.0)) + 1; CheapTrickOption co; InitializeCheapTrickOption(fs, &co); - co.f0_floor = 71.0; // provisional; reset in analyze + co.f0_floor = 50.0; // sizes the FFT for the lowest floor any profile asks (a 55 Hz floor overflowed a 71 Hz-sized FFT → NaN → silence) s->fft_size = GetFFTSizeForCheapTrick(fs, &co); s->f0 = (double *)calloc(s->nframes, sizeof(double)); @@ -92,6 +95,7 @@ singer *singer_create(const double *pcm, int n, int fs) { memcpy(p->scale, sc, sizeof(sc)); p->n_scale = 5; int pat[8] = {2, 2, 2, 2, 2, 2, 2, 2}; // eighths memcpy(p->pattern, pat, sizeof(pat)); p->n_pattern = 8; + p->lock = 0.875; p->vib_hz = 5.0; p->vib_cents = 18.0; // spinging defaults return s; } @@ -198,43 +202,67 @@ static void nucleus(singer *s, int a, int b, int *vs, int *ve) { } } -// ═══ render a phrase — RENDER thread. ~30ms. ══════════════════════════════ -double *singer_render_bars(singer *s, int word_start, int bars, - int *out_len, int *words_used) { - singer_params p = s->p; - double fp = SINGER_FP_MS; - double sixt = (60000.0 / p.bpm) / 4.0 / fp; // frames per 16th - double bar16 = 16.0; // sixteenths in a bar - double target16 = bars * bar16; // fill EXACTLY this many 16ths +// ═══ sung units ═══════════════════════════════════════════════════════════ +// A unit is one thing that gets a note: a word (SNAP/MELODY) or a syllable +// (SCORE). `grid` is where its vowel lands, `slot` how long it has, both in +// frames from the window start. `tgt` < 0 means "no target: snap to scale". +typedef struct { int a, b, vs, ve; double grid, slot, tgt; } unit_t; - int ready = singer_words_ready(s); - if (word_start >= ready) { *out_len = 0; *words_used = 0; return NULL; } +// Collect the voiced + energetic runs inside [a,b) — the candidate nuclei. +static int runs_in(singer *s, int a, int b, int *rs, int *re, int max) { + if (b <= a) return 0; + double emax = -1e18, emin = 1e18; + for (int i = a; i < b; i++) { if (s->en[i] > emax) emax = s->en[i]; if (s->en[i] < emin) emin = s->en[i]; } + double thr = emin + 0.55 * (emax - emin); + int n = 0, run = -1; + for (int i = a; i <= b; i++) { + int on = (i < b) && (s->f0[i] > 0) && (s->en[i] > thr); + if (on) { if (run < 0) run = i; } + else if (run >= 0) { if (n < max) { rs[n] = run; re[n] = i; n++; } run = -1; } + } + return n; +} - // ── deal words onto the pattern until we've filled `bars` bars ───────── - // A long word CONSUMES EXTRA STEPS rather than being squashed into one. - // (Crushing a 900ms word into a 242ms eighth is what "squashed" sounds like.) - int idx[512]; double grid[512]; int slot[512]; - int nw = 0; double cur = 0; int pi = 0; int w = word_start; - while (cur < target16 && nw < 500 && w < ready) { - int d16 = p.pattern[pi % p.n_pattern]; pi++; - if (d16 < 0) { cur += -d16; continue; } // rest - // how much room does this word actually need? - double nat16 = (s->words[w].b - s->words[w].a) / sixt; - int steps = d16; - while (steps < nat16 * 0.85 && cur + steps < target16) { // grow, don't squash - int nxt = p.pattern[pi % p.n_pattern]; - if (nxt < 0) break; - pi++; steps += nxt; - if (steps >= 16) break; // cap at a bar +// Split word [a,b) into k syllable spans with their own nuclei: the k longest +// runs in time order; the cut between two nuclei falls on the quietest frame +// between them, so the consonants go to whichever side they lean. +static int split_syllables(singer *s, int a, int b, int k, unit_t *U) { + int rs[64], re[64]; + int n = runs_in(s, a, b, rs, re, 64); + if (k < 1) k = 1; + if (n < k) { // not enough nuclei: split evenly + for (int i = 0; i < k; i++) { + U[i].a = a + (int)((long long)(b - a) * i / k); + U[i].b = a + (int)((long long)(b - a) * (i + 1) / k); + nucleus(s, U[i].a, U[i].b, &U[i].vs, &U[i].ve); } - if (cur + steps > target16) steps = (int)(target16 - cur); - if (steps <= 0) break; - idx[nw] = w; grid[nw] = cur * sixt; slot[nw] = steps; - cur += steps; nw++; w++; + return k; } - if (nw == 0) { *out_len = 0; *words_used = 0; return NULL; } + // keep the k longest + int keep[64]; for (int i = 0; i < n; i++) keep[i] = 0; + for (int c = 0; c < k; c++) { + int best = -1; + for (int i = 0; i < n; i++) if (!keep[i] && (best < 0 || re[i] - rs[i] > re[best] - rs[best])) best = i; + keep[best] = 1; + } + int m = 0; + for (int i = 0; i < n; i++) if (keep[i]) { U[m].vs = rs[i]; U[m].ve = re[i]; m++; } + for (int i = 0; i < m; i++) { + if (i == 0) U[i].a = a; + else { + int lo = U[i - 1].ve, hi = U[i].vs, cut = lo; + for (int f = lo; f < hi; f++) if (s->en[f] < s->en[cut]) cut = f; + U[i - 1].b = cut; U[i].a = cut; + } + if (i == m - 1) U[i].b = b; + } + return m; +} - int total = (int)lround(target16 * sixt); // EXACTLY `bars` bars +// Place units on the grid, warp vowels, write the f0 line, synthesize, and +// composite the original consonants back in. Shared by both render paths. +static double *synth_units(singer *s, const unit_t *U, int nu, int total, singer_params p, int *out_len) { + double fp = SINGER_FP_MS; int spec = s->fft_size / 2 + 1; double *o_f0 = (double *)calloc(total, sizeof(double)); @@ -243,77 +271,140 @@ double *singer_render_bars(singer *s, int word_start, int bars, double **o_ap = (double **)malloc(total * sizeof(double *)); double *o_src = (double *)malloc(total * sizeof(double)); char *o_c = (char *)calloc(total, 1); + int *o_u = (int *)malloc(total * sizeof(int)); for (int i = 0; i < total; i++) { - o_sp[i] = (double *)calloc(spec, sizeof(double)); + o_sp[i] = (double *)malloc(spec * sizeof(double)); o_ap[i] = (double *)malloc(spec * sizeof(double)); - for (int k = 0; k < spec; k++) o_ap[i][k] = 1.0; - o_src[i] = -1.0; + // Uncovered frames get a whisper-quiet FLOOR, not zero: WORLD takes the + // log of the envelope, and log(0) turns the frame — and, through the + // overlap-add, its neighbours — into NaN. + for (int k = 0; k < spec; k++) { o_sp[i][k] = 1e-12; o_ap[i][k] = 1.0; } + o_src[i] = -1.0; o_u[i] = -1; } - for (int i = 0; i < nw; i++) { - singer_word *W = &s->words[idx[i]]; - int a = W->a, b = W->b, vs, ve; - nucleus(s, a, b, &vs, &ve); + for (int i = 0; i < nu; i++) { + int a = U[i].a, b = U[i].b, vs = U[i].vs, ve = U[i].ve; int c_on = vs - a, c_co = b - ve; + if (c_co > 36) { c_co = 36; b = ve + 36; } // a coda is a release, not the silence after it (≤ 180 ms) + if (c_on > 60) { a = vs - 60; c_on = 60; } // likewise an onset (≤ 300 ms) int vlen = ve - vs; if (vlen < 1) vlen = 1; - double avail; - if (i + 1 < nw) { - singer_word *N = &s->words[idx[i + 1]]; - int n_vs, n_ve; nucleus(s, N->a, N->b, &n_vs, &n_ve); - avail = (grid[i + 1] - (double)(n_vs - N->a) * p.morph) - grid[i] - c_co; - } else { - avail = slot[i] * sixt - c_on - c_co; + // The vowel may fill its note, and — legato — run up to the next unit's + // consonant onset when the notes touch; it never sings through a REST. + // (Filling to the next onset regardless held "night" through the two + // beats of silence after it.) + double end = U[i].grid + U[i].slot; + if (i + 1 < nu) { + double nextOn = U[i + 1].grid - (double)(U[i + 1].vs - U[i + 1].a) * p.morph; + if (nextOn < end) end = nextOn; } + double avail = end - U[i].grid - c_co - (i + 1 < nu ? 0.0 : c_on); if (avail < 1) avail = 1; + // The vowel fills what the note gives it: a long note sustains (frames + // are interpolated through the nucleus, never tiled), a note shorter + // than the spoken word compresses — down to half speed before we let + // it overrun. Six-times was too low a ceiling: a two-beat "house" went + // silent after 600 ms and read as cut off. double full = avail / vlen; - if (full > 6.0) full = 6.0; - if (full < 0.85) full = 0.85; // NEVER squash past 15% + if (full > 24.0) full = 24.0; + if (full < 0.5) full = 0.5; double st = 1.0 + (full - 1.0) * p.morph; int vout = (int)lround(vlen * st); if (vout < 1) vout = 1; int wlen = c_on + vout + c_co; - int o0 = (int)lround(grid[i] - c_on * p.morph); + int o0 = (int)lround(U[i].grid - c_on * p.morph); + const int XF = 8; // 40 ms seam crossfade where units overlap for (int j = 0; j < wlen; j++) { int o = o0 + j; if (o < 0 || o >= total) continue; double srcf; int isc; if (j < c_on) { srcf = a + j; isc = 1; } - else if (j < c_on+vout) { srcf = vs + (double)(j - c_on) * (vlen - 1) / (vout > 1 ? vout - 1 : 1); isc = 0; } + else if (j < c_on+vout) { + // A singer holds the vowel's FIRST colour and saves the glide for + // the end ("naaaa-it", not "naaiiii"): when the vowel is stretched + // beyond 2x, ease the source position so most of the output time + // sits on the early nucleus and the off-glide happens late. + double u = (double)(j - c_on) / (vout > 1 ? vout - 1 : 1); + double gamma = st > 2.0 ? 2.2 : 1.0; + srcf = vs + pow(u, gamma) * (vlen - 1); isc = 0; + } else { srcf = ve + (j - c_on - vout); isc = 1; } int l = clampi((int)floor(srcf), 0, s->nframes - 1); int hh = clampi(l + 1, 0, s->nframes - 1); double fr = srcf - l; + double nf0 = (s->f0[l] > 0) ? s->f0[l] : 0.0; + int owned = o_u[o] >= 0 && o_u[o] != i; + double w = (owned && j < XF) ? (double)(j + 1) / (XF + 1) : 1.0; // fade the newcomer in over the old for (int k = 0; k < spec; k++) { - o_sp[o][k] = s->sp[l][k] * (1 - fr) + s->sp[hh][k] * fr; - o_ap[o][k] = s->ap[l][k] * (1 - fr) + s->ap[hh][k] * fr; + double nsp = s->sp[l][k] * (1 - fr) + s->sp[hh][k] * fr; + double nap = s->ap[l][k] * (1 - fr) + s->ap[hh][k] * fr; + o_sp[o][k] = owned ? o_sp[o][k] * (1 - w) + nsp * w : nsp; + o_ap[o][k] = owned ? o_ap[o][k] * (1 - w) + nap * w : nap; } + if (owned && w < 1.0 && o_sf0[o] > 0 && nf0 > 0) nf0 = exp(log(o_sf0[o]) * (1 - w) + log(nf0) * w); o_src[o] = srcf; o_c[o] = (char)isc; - o_sf0[o] = (s->f0[l] > 0) ? s->f0[l] : 0.0; + if (!owned || w >= 0.5) o_u[o] = i; // the newcomer owns the frame once it dominates + o_sf0[o] = nf0; } } + // Per-unit mean spoken pitch, so SCORE mode can keep a fraction of the + // speaker's own contour AROUND the note instead of on top of it. + double *umean = (double *)calloc(nu > 0 ? nu : 1, sizeof(double)); + int *ucnt = (int *)calloc(nu > 0 ? nu : 1, sizeof(int)); + int *uon = (int *)malloc((nu > 0 ? nu : 1) * sizeof(int)); + for (int i = 0; i < nu; i++) uon[i] = -1; + for (int o = 0; o < total; o++) { + if (o_u[o] < 0 || o_sf0[o] <= 0) continue; + int u = o_u[o]; + umean[u] += 69.0 + 12.0 * log2(o_sf0[o] / 440.0); ucnt[u]++; + if (uon[u] < 0) uon[u] = o; + } + for (int i = 0; i < nu; i++) if (ucnt[i]) umean[i] /= ucnt[i]; + for (int o = 0; o < total; o++) { if (o_sf0[o] <= 0) { o_f0[o] = 0; continue; } double midi = 69.0 + 12.0 * log2(o_sf0[o] / 440.0); - double pc = fmod(midi, 12.0); if (pc < 0) pc += 12; - double bestd = 1e9; - for (int k = 0; k < p.n_scale; k++) { - double deg = fmod((double)(p.root_pc + p.scale[k]), 12.0); - double d = pc - deg; - while (d > 6) d -= 12; - while (d < -6) d += 12; - if (fabs(d) < fabs(bestd)) bestd = d; + double tgt_m; + int u = o_u[o]; + if (u >= 0 && U[u].tgt >= 0) { + // SCORE: the note, plus (1-lock) of the spoken contour around its mean, + // plus the profile's vibrato easing in over the first 150 ms. + tgt_m = U[u].tgt + (midi - umean[u]) * (1.0 - p.lock); + double tv = (o - uon[u]) * fp / 1000.0; + double ramp = tv < 0.15 ? tv / 0.15 : 1.0; + tgt_m += (p.vib_cents / 100.0) * ramp * sin(2 * M_PI * p.vib_hz * tv); + } else { + double pc = fmod(midi, 12.0); if (pc < 0) pc += 12; + double bestd = 1e9; + for (int k = 0; k < p.n_scale; k++) { + double deg = fmod((double)(p.root_pc + p.scale[k]), 12.0); + double d = pc - deg; + while (d > 6) d -= 12; + while (d < -6) d += 12; + if (fabs(d) < fabs(bestd)) bestd = d; + } + double snapped = midi - bestd; + tgt_m = (p.mode == SINGER_MELODY) ? snapped : midi + (snapped - midi) * p.snap; } - double snapped = midi - bestd; - double tgt_m = (p.mode == SINGER_MELODY) ? snapped : midi + (snapped - midi) * p.snap; o_f0[o] = exp((1 - p.morph) * log(o_sf0[o]) + p.morph * log(note_hz_midi(tgt_m))); } + free(umean); free(ucnt); free(uon); int ylen = (int)(total * fp / 1000.0 * s->fs); double *y = (double *)calloc(ylen, sizeof(double)); Synthesis(o_f0, total, (const double * const *)o_sp, (const double * const *)o_ap, s->fft_size, fp, s->fs, ylen, y); + for (int n = 0; n < ylen; n++) if (!isfinite(y[n])) y[n] = 0.0; // never let one NaN reach the gain below + if (getenv("SINGER_DEBUG")) { + int nv = 0, nf = 0, nfill = 0, nnan = 0; double ypk = 0; + for (int i = 0; i < s->analyzed; i++) if (s->f0[i] > 0) nv++; + for (int o = 0; o < total; o++) { if (o_u[o] >= 0) nfill++; if (o_sf0[o] > 0) nf++; } + for (int n = 0; n < ylen; n++) { if (!isfinite(y[n])) nnan++; else if (fabs(y[n]) > ypk) ypk = fabs(y[n]); } + fprintf(stderr, " [core] src voiced %d/%d frames · out filled %d/%d · out voiced %d · synth peak %.3f · nan %d/%d · fft %d\n", + nv, s->analyzed, nfill, total, nf, ypk, nnan, ylen, s->fft_size); + if (nu) fprintf(stderr, " [core] unit0 a=%d b=%d vs=%d ve=%d grid=%.1f slot=%.1f tgt=%.1f\n", U[0].a, U[0].b, U[0].vs, U[0].ve, U[0].grid, U[0].slot, U[0].tgt); + } double spf = s->fs * fp / 1000.0; double *mask = (double *)calloc(ylen, sizeof(double)); @@ -360,14 +451,106 @@ double *singer_render_bars(singer *s, int word_start, int bars, for (int n = 0; n < ylen; n++) y[n] = y[n] / pk * 0.8; for (int i = 0; i < total; i++) { free(o_sp[i]); free(o_ap[i]); } - free(o_sp); free(o_ap); free(o_f0); free(o_sf0); free(o_src); free(o_c); + free(o_sp); free(o_ap); free(o_f0); free(o_sf0); free(o_src); free(o_c); free(o_u); free(mask); free(orig); free(msm); - *out_len = ylen; + return y; +} + +// ═══ render a phrase — RENDER thread. ~30ms. ══════════════════════════════ +double *singer_render_bars(singer *s, int word_start, int bars, + int *out_len, int *words_used) { + singer_params p = s->p; + double fp = SINGER_FP_MS; + double sixt = (60000.0 / p.bpm) / 4.0 / fp; // frames per 16th + double bar16 = 16.0; // sixteenths in a bar + double target16 = bars * bar16; // fill EXACTLY this many 16ths + + int ready = singer_words_ready(s); + if (word_start >= ready) { *out_len = 0; *words_used = 0; return NULL; } + + // ── deal words onto the pattern until we've filled `bars` bars ───────── + // A long word CONSUMES EXTRA STEPS rather than being squashed into one. + // (Crushing a 900ms word into a 242ms eighth is what "squashed" sounds like.) + static unit_t U[512]; + int nw = 0; double cur = 0; int pi = 0; int w = word_start; + while (cur < target16 && nw < 500 && w < ready) { + int d16 = p.pattern[pi % p.n_pattern]; pi++; + if (d16 < 0) { cur += -d16; continue; } // rest + double nat16 = (s->words[w].b - s->words[w].a) / sixt; + int steps = d16; + while (steps < nat16 * 0.85 && cur + steps < target16) { // grow, don't squash + int nxt = p.pattern[pi % p.n_pattern]; + if (nxt < 0) break; + pi++; steps += nxt; + if (steps >= 16) break; // cap at a bar + } + if (cur + steps > target16) steps = (int)(target16 - cur); + if (steps <= 0) break; + U[nw].a = s->words[w].a; U[nw].b = s->words[w].b; + nucleus(s, U[nw].a, U[nw].b, &U[nw].vs, &U[nw].ve); + U[nw].grid = cur * sixt; U[nw].slot = steps * sixt; U[nw].tgt = -1; + cur += steps; nw++; w++; + } + if (nw == 0) { *out_len = 0; *words_used = 0; return NULL; } + + int total = (int)lround(target16 * sixt); // EXACTLY `bars` bars + double *y = synth_units(s, U, nw, total, p, out_len); *words_used = nw; return y; } +// ═══ SCORE mode ═══════════════════════════════════════════════════════════ +void singer_set_score(singer *s, const singer_note *n, int count) { + count = count > SINGER_MAX_NOTES ? SINGER_MAX_NOTES : count; + memcpy(s->notes, n, count * sizeof(singer_note)); + s->nnotes = count; +} +int singer_note_count(const singer *s) { return s->nnotes; } + +double *singer_render_score(singer *s, double from16, double to16, + int *out_len, int *notes_used) { + singer_params p = s->p; + double fp = SINGER_FP_MS; + double sixt = (60000.0 / p.bpm) / 4.0 / fp; + int total = (int)lround((to16 - from16) * sixt); + *notes_used = 0; + if (total <= 0) { *out_len = 0; return NULL; } + + // Walk words → syllables → notes, keeping the units whose onset is inside + // the window. Stop at the first unit whose speech is not analyzed yet. + static unit_t U[512]; + int nu = 0, ni = 0; + for (int w = 0; w < s->nwords && ni < s->nnotes && nu < 500; w++) { + int k = s->words[w].nsyl > 1 ? s->words[w].nsyl : 1; + if (ni + k > s->nnotes) k = s->nnotes - ni; + if (s->words[w].b > s->analyzed) break; // not yet analyzed (a word may END at the watermark) + unit_t S[64]; int m; + if (s->words[w].fixed && k == 1) { // measured nucleus: use it as given + S[0].a = s->words[w].a; S[0].b = s->words[w].b; S[0].vs = s->words[w].vs; S[0].ve = s->words[w].ve; + if (S[0].ve <= S[0].vs) nucleus(s, S[0].a, S[0].b, &S[0].vs, &S[0].ve); + m = 1; + } else m = split_syllables(s, s->words[w].a, s->words[w].b, k > 64 ? 64 : k, S); + for (int i = 0; i < k; i++, ni++) { + const singer_note *N = &s->notes[ni]; + if (N->at16 < from16 || N->at16 >= to16) continue; + unit_t u = S[i < m ? i : m - 1]; + u.grid = (N->at16 - from16) * sixt; + u.slot = N->dur16 * sixt; + u.tgt = N->midi; + U[nu++] = u; + (*notes_used)++; + } + } + if (nu == 0) { + // silence for the window, so the caller's clock still advances + int ylen = (int)(total * fp / 1000.0 * s->fs); + *out_len = ylen; + return (double *)calloc(ylen, sizeof(double)); + } + return synth_units(s, U, nu, total, p, out_len); +} + int singer_word_count(const singer *s) { return s->nwords; } int singer_words_ready(const singer *s) { int n = 0; diff --git a/live/singer.h b/live/singer.h index 724cb929e1..3fc8469c21 100644 --- a/live/singer.h +++ b/live/singer.h @@ -31,9 +31,19 @@ typedef struct { int a, b; // word span, in WORLD frames int vs, ve; // vowel nucleus (onset consonant = a..vs, coda = ve..b) char text[48]; + int nsyl; // syllables in this word (0 or 1 = one); SCORE mode + // splits the word into that many sung units + int fixed; // 1 = vs/ve were MEASURED by the host (wordmeta): + // trust them instead of re-detecting the nucleus } singer_word; -typedef enum { SINGER_SNAP = 0, SINGER_MELODY = 1 } singer_mode; +// SCORE mode: one note per syllable, in lyric order. Time in sixteenths from +// the score's downbeat. The singer sings exactly these pitches; how much of +// the spoken contour survives is the profile's `lock`. +#define SINGER_MAX_NOTES 4096 +typedef struct { double midi; double at16; double dur16; } singer_note; + +typedef enum { SINGER_SNAP = 0, SINGER_MELODY = 1, SINGER_SCORE = 2 } singer_mode; typedef struct { double bpm; @@ -49,6 +59,10 @@ typedef struct { int n_scale; int pattern[SINGER_MAX_PAT]; // step durations in 16ths; negative = rest int n_pattern; + // ── the voice profile's constraints (SCORE mode) ── + double lock; // 0 = spoken contour rides on the note, 1 = hard on it + double vib_hz; // vibrato rate (profile: 4x battery cycles/day) + double vib_cents; // vibrato depth } singer_params; typedef struct singer singer; @@ -81,6 +95,17 @@ double *singer_render_bars(singer *s, int word_start, int bars, int singer_word_count(const singer *s); int singer_words_ready(const singer *s); // how many words the analysis covers +// ── SCORE mode ───────────────────────────────────────────────────────── +// Notes pair with syllables: word w with nsyl k consumes notes in order. +void singer_set_score(singer *s, const singer_note *n, int count); +int singer_note_count(const singer *s); +// Render the window [from16, to16) of the score — exactly that many +// sixteenths of audio — singing every syllable whose onset falls inside it +// and whose source speech is analyzed. Caller owns the buffer. `notes_used` +// is how many notes were sung (stops at the first unanalyzed one). +double *singer_render_score(singer *s, double from16, double to16, + int *out_len, int *notes_used); + // ── audio (AUDIO thread — realtime-safe) ─────────────────────────────── // Hand it a rendered phrase; it takes ownership and plays it on the next bar. void singer_queue_phrase(singer *s, double *buf, int len); diff --git a/slab/menuband/Package.swift b/slab/menuband/Package.swift index df637d4fbc..934fa799ad 100644 --- a/slab/menuband/Package.swift +++ b/slab/menuband/Package.swift @@ -40,11 +40,34 @@ let package = Package( path: "Sources/CFluoddity", publicHeadersPath: "include" ), + // The speech-to-singing core, shared verbatim from live/ the same way + // CGMSynth is: `singer.c` + `world/*.cpp` (the WORLD vocoder, C++) + // are SYMLINKS into live/, so Menu Band sings with the exact DSP the + // standalone `livesing` host and fedac/native use. singer.c is C with + // an extern "C" header; WORLD is C++ — SwiftPM compiles each by + // extension in this one clang target. `world` is the header search + // root because both include "world/.h". The -O3/-ffast-math + // pair matches live/Makefile — the core's NaN guards were proven + // under those flags, and Harvest at -O0 is too slow for a downbeat. + .target( + name: "CSinger", + path: "Sources/CSinger", + publicHeadersPath: "include", + cSettings: [ + .headerSearchPath("world"), + .unsafeFlags(["-O3", "-ffast-math"]), + ], + cxxSettings: [ + .headerSearchPath("world"), + .unsafeFlags(["-O3", "-ffast-math"]), + ] + ), .executableTarget( name: "MenuBand", dependencies: [ "CGMSynth", "CFluoddity", + "CSinger", .product(name: "ACMacAudio", package: "macos-audio"), .product(name: "MenuBandJuke", package: "juke-wizard"), ], diff --git a/slab/menuband/Sources/CSinger/include/module.modulemap b/slab/menuband/Sources/CSinger/include/module.modulemap new file mode 100644 index 0000000000..82dc38b24f --- /dev/null +++ b/slab/menuband/Sources/CSinger/include/module.modulemap @@ -0,0 +1,4 @@ +module CSinger { + header "singer.h" + export * +} diff --git a/slab/menuband/Sources/CSinger/include/singer.h b/slab/menuband/Sources/CSinger/include/singer.h new file mode 120000 index 0000000000..e977d4cc10 --- /dev/null +++ b/slab/menuband/Sources/CSinger/include/singer.h @@ -0,0 +1 @@ +../../../../../live/singer.h \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/singer.c b/slab/menuband/Sources/CSinger/singer.c new file mode 120000 index 0000000000..dee36f5ee3 --- /dev/null +++ b/slab/menuband/Sources/CSinger/singer.c @@ -0,0 +1 @@ +../../../../live/singer.c \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/cheaptrick.cpp b/slab/menuband/Sources/CSinger/world/cheaptrick.cpp new file mode 120000 index 0000000000..54a4c7709a --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/cheaptrick.cpp @@ -0,0 +1 @@ +../../../../../live/world/cheaptrick.cpp \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/codec.cpp b/slab/menuband/Sources/CSinger/world/codec.cpp new file mode 120000 index 0000000000..06a81b97b2 --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/codec.cpp @@ -0,0 +1 @@ +../../../../../live/world/codec.cpp \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/common.cpp b/slab/menuband/Sources/CSinger/world/common.cpp new file mode 120000 index 0000000000..9f3a0bb439 --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/common.cpp @@ -0,0 +1 @@ +../../../../../live/world/common.cpp \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/d4c.cpp b/slab/menuband/Sources/CSinger/world/d4c.cpp new file mode 120000 index 0000000000..818b605463 --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/d4c.cpp @@ -0,0 +1 @@ +../../../../../live/world/d4c.cpp \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/dio.cpp b/slab/menuband/Sources/CSinger/world/dio.cpp new file mode 120000 index 0000000000..a8c87e7e00 --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/dio.cpp @@ -0,0 +1 @@ +../../../../../live/world/dio.cpp \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/fft.cpp b/slab/menuband/Sources/CSinger/world/fft.cpp new file mode 120000 index 0000000000..a0ffc560b7 --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/fft.cpp @@ -0,0 +1 @@ +../../../../../live/world/fft.cpp \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/harvest.cpp b/slab/menuband/Sources/CSinger/world/harvest.cpp new file mode 120000 index 0000000000..e914620e56 --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/harvest.cpp @@ -0,0 +1 @@ +../../../../../live/world/harvest.cpp \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/matlabfunctions.cpp b/slab/menuband/Sources/CSinger/world/matlabfunctions.cpp new file mode 120000 index 0000000000..4111ec104e --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/matlabfunctions.cpp @@ -0,0 +1 @@ +../../../../../live/world/matlabfunctions.cpp \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/stonemask.cpp b/slab/menuband/Sources/CSinger/world/stonemask.cpp new file mode 120000 index 0000000000..0ccac729cb --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/stonemask.cpp @@ -0,0 +1 @@ +../../../../../live/world/stonemask.cpp \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/synthesis.cpp b/slab/menuband/Sources/CSinger/world/synthesis.cpp new file mode 120000 index 0000000000..853ca2f597 --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/synthesis.cpp @@ -0,0 +1 @@ +../../../../../live/world/synthesis.cpp \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/synthesisrealtime.cpp b/slab/menuband/Sources/CSinger/world/synthesisrealtime.cpp new file mode 120000 index 0000000000..45c235cf96 --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/synthesisrealtime.cpp @@ -0,0 +1 @@ +../../../../../live/world/synthesisrealtime.cpp \ No newline at end of file diff --git a/slab/menuband/Sources/CSinger/world/world b/slab/menuband/Sources/CSinger/world/world new file mode 120000 index 0000000000..a2980888ad --- /dev/null +++ b/slab/menuband/Sources/CSinger/world/world @@ -0,0 +1 @@ +../../../../../live/world/world \ No newline at end of file diff --git a/slab/menuband/Sources/MenuBand/AppDelegate.swift b/slab/menuband/Sources/MenuBand/AppDelegate.swift index a1be00ad74..e313583973 100644 --- a/slab/menuband/Sources/MenuBand/AppDelegate.swift +++ b/slab/menuband/Sources/MenuBand/AppDelegate.swift @@ -21,6 +21,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate { private var jukeStatusItem: MenuBandJukeStatusItem? #endif private let menuBand = MenuBandController() + /// Speech-to-singing pipeline for `.play` payloads that carry `lyrics`. + private let singer = MenuBandSinger() #if MAC_APP_STORE /// Optional direct-download sensor bridge. It supplies contact frames only; /// this sandboxed process continues to own the instrument and its display. @@ -75,6 +77,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate { /// Bumped by a stop to cancel every still-pending onset: each scheduled /// closure captures the generation and no-ops if it no longer matches. private var playGeneration = 0 + /// A conducted sung sequence is running (keeps the engine warm; Escape + /// cancels it). Set when a synced sung score starts, cleared on stop. + private var sungSequenceActive = false private let hoverResponder = HoverResponder() /// Bridges typing in the macOS Stickies app to Menu Band note @@ -575,10 +580,19 @@ final class AppDelegate: NSObject, NSApplicationDelegate { // Escape must remain available even when the percussion click wall or // KeyMap owns AppKit focus. The session tap runs ahead of either local // monitor, so this is the reliable way out of a latched trackpad mode. - if keyCode == 53 /* kVK_Escape */, isDown, - self.pitchBendCursorPushed { - DispatchQueue.main.async { self.exitPerformanceFocusFromEscape() } - return true + if keyCode == 53 /* kVK_Escape */, isDown { + // Escape ALWAYS cancels a running conducted sequence, from any app. + if self.sungSequenceActive || KeyboardIconRenderer.scoreTitle != nil { + DispatchQueue.main.async { + NSLog("⏹ SEQUENCE cancelled by Escape") + self.stopScore(broadcast: true) + } + return true + } + if self.pitchBendCursorPushed { + DispatchQueue.main.async { self.exitPerformanceFocusFromEscape() } + return true + } } guard self.pitchBendCursorPushed || self.keyboardPerformanceFocusActive @@ -4565,12 +4579,20 @@ final class AppDelegate: NSObject, NSApplicationDelegate { DispatchQueue.main.async { [weak self] in guard let self = self else { return } self.playGeneration += 1 // pending onsets become no-ops + if self.sungSequenceActive { + NSLog("⏹ SEQUENCE END") + self.sungSequenceActive = false + self.menuBand.keepEngineWarm = false + } + self.menuBand.stopAllSingers() // drop any queued sung line (sim slots too) self.menuBand.panic() // silence anything ringing if self.menuBand.percussionSplit { self.menuBand.percussionSplit = false } self.menuBand.octaveShift = 0 KeyboardIconRenderer.scoreTitle = nil KeyboardIconRenderer.scoreStart = 0 KeyboardIconRenderer.scoreEnd = 0 + LyricCaption.hideAll() + SingerFace.hideAll() self.fleetDriveUntil = 0 self.fleetClearTimer?.invalidate() KeyboardIconRenderer.fleetDriving = false @@ -4688,6 +4710,22 @@ final class AppDelegate: NSObject, NSApplicationDelegate { tracks.append(("67:1,72:1,76:1,79:1,81:2,79:1,76:1,74:1,76:1,79:1,76:1,72:3,r:1", velocity)) } + // `lyrics` makes the first track a SUNG voice: its notes light the + // keys but the instrument stays silent — the singer sounds them. + let sung = SungLine(info: info, bpm: bpm) + NSLog("▶ play keys: %@ · lyrics=%@", info.keys.sorted().joined(separator: ","), info["lyrics"].map { "\($0.count) chars" } ?? "nil") + + // Log and bracket each sequence. A synced cue carrying lyrics is a + // conducted sung sequence: keep the engine warm for its whole length + // so the singer never hits the idle-pause clock hole, and let Escape + // cancel it. + let isSungSequence = info["lyrics"] != nil && info["startEpoch"] != nil + if isSungSequence { + NSLog("▶ SEQUENCE START: %@ · bpm=%@ · voice=%@", + info["title"] ?? "(untitled)", info["bpm"] ?? "?", info["singVoice"] ?? "?") + self.sungSequenceActive = true + self.menuBand.keepEngineWarm = true + } // Fleet tell: a synced cue (carries startEpoch) means a conductor is // driving us — light the robot badge through the end of the longest @@ -4706,6 +4744,10 @@ final class AppDelegate: NSObject, NSApplicationDelegate { epoch, recv, (epoch - recv) * 1000, bpm, tracks.count) } + // `sim=i/n`: the simulator — this payload is member i of n, all on + // this one machine: its own singer node (panned), a tile-sized face + // and caption instead of the whole display. + let simSlot = SingerFace.SimSlot(info["sim"]) DispatchQueue.main.async { [weak self] in guard let self = self else { return } let gen = self.playGeneration // stop bumps this to cancel onsets @@ -4808,9 +4850,60 @@ final class AppDelegate: NSObject, NSApplicationDelegate { } } - for track in tracks { + if let line = sung { + // Heavy (speech + WORLD + render) off main; back here only to + // check the generation and drop the buffer on the downbeat. + // Line by line, in order: each line is scheduled the moment + // it is ready, so line 1 sounds on the downbeat while the rest + // of a long lyric is still rendering behind it. + let voice = simSlot.map { self.menuBand.simSingerVoice($0) } ?? self.menuBand.singerVoice + let lines = line.splitLines() + func renderLine(_ i: Int) { + guard i < lines.count, self.playGeneration == gen else { return } + self.singer.render(lines[i], into: voice.format) { [weak self] r in + guard let self = self, self.playGeneration == gen else { return } + if let r = r { + let lead = voice.schedule(r, atEpoch: downbeatEpoch + r.spanOffset) + NSLog("🎤 sing: line %d/%d scheduled %.2f s at downbeat %.3f + %.2f s (lead %+.0f ms, %d/%d notes, peak %.3f)", + i + 1, lines.count, r.duration, downbeatEpoch, r.spanOffset, lead * 1000, + r.notesUsed, r.noteCount, r.peak) + } else { + NSLog("🎤 sing: line %d/%d — nothing to sing", i + 1, lines.count) + } + renderLine(i + 1) + } + } + renderLine(0) + } + + // Captions: the sung line on screen, the syllable being sung lit. + // Follows track 0's onsets — the same clock that lights the keys — + // so the words keep time even when the singer runs late. + var captionLines: [[String]] = [] + var lineOfSyllable: [Int] = [] + var syllableText: [String] = [] + var lineStart: [Int] = [] + if let line = sung, info["caption"] != "0" { + for lt in line.lineTokens { + let li = captionLines.count + captionLines.append(lt) + lineStart.append(lineOfSyllable.count) + for t in lt { for syl in t.split(separator: "-") { lineOfSyllable.append(li); syllableText.append(String(syl)) } } + } + } + let captionAccent = LyricCaption.color(hex: info["captionColor"]) + let captionSize = CGFloat(Double(info["captionSize"] ?? "") ?? 0) + let caption = LyricCaption.at(simSlot) + let face = SingerFace.at(simSlot) + // `face=neo|blueberry|blush` puts the member's cartoon face up for + // the sung part; its mouth follows the same onsets. + let faceMember = (info["face"] ?? "0") == "0" ? nil : info["face"] + var sylIndex = 0 + + for (ti, track) in tracks.enumerated() { var t = leadIn // wait for the shared start instant (or 0.2s) let vel = track.vel + let lightOnly = sung != nil && ti == 0 for token in track.spec.split(separator: ",") { let parts = token.split(separator: ":") guard parts.count == 2, let beats = Double(parts[1]) else { continue } @@ -4857,6 +4950,56 @@ final class AppDelegate: NSObject, NSApplicationDelegate { let display = UInt8(disp) let onEpoch = downbeatEpoch + (onAt - leadIn) let offEpoch = downbeatEpoch + (offAt - leadIn) + if lightOnly { + let si = sylIndex + sylIndex += 1 + if si < lineOfSyllable.count { + let li = lineOfSyllable[si], k = si - lineStart[li] + let words = captionLines[li] + let syl = syllableText[si] + if k == 0 { + DispatchQueue.main.asyncAfter(deadline: at(onEpoch - 0.4)) { [weak self] in + guard let self = self, self.playGeneration == gen else { return } + caption.show(line: li, tokens: words, accent: captionAccent, size: captionSize) + if si == 0, let fm = faceMember { face.show(member: fm, accent: captionAccent) } + } + } + DispatchQueue.main.asyncAfter(deadline: at(onEpoch)) { [weak self] in + guard let self = self, self.playGeneration == gen else { return } + caption.highlight(line: li, syllable: k) + } + // lips lead the sound by a frame or two, never behind + if faceMember != nil { + DispatchQueue.main.asyncAfter(deadline: at(onEpoch - 0.05)) { [weak self] in + guard let self = self, self.playGeneration == gen else { return } + face.onset(syl, hold: dur) + } + } + if si + 1 == lineOfSyllable.count || lineOfSyllable[si + 1] != li { + DispatchQueue.main.asyncAfter(deadline: at(offEpoch + 1.2)) { [weak self] in + guard let self = self, self.playGeneration == gen else { return } + caption.hide(line: li) + } + } + if si + 1 == lineOfSyllable.count, faceMember != nil { + DispatchQueue.main.asyncAfter(deadline: at(offEpoch + 1.8)) { [weak self] in + guard let self = self, self.playGeneration == gen else { return } + face.hide() + } + } + } + // Sung note: the refcounted visual-only lit path + // (drumLitOn is just "hold this cell lit"). + DispatchQueue.main.asyncAfter(deadline: at(onEpoch)) { [weak self] in + guard let self = self, self.playGeneration == gen else { return } + self.menuBand.drumLitOn(display) + } + DispatchQueue.main.asyncAfter(deadline: at(offEpoch)) { [weak self] in + self?.menuBand.drumLitOff(display) + } + t += dur + continue + } DispatchQueue.main.asyncAfter(deadline: at(onEpoch)) { [weak self] in guard let self = self, self.playGeneration == gen else { return } self.menuBand.startTapNote(midi, velocity: vel, displayNote: display) diff --git a/slab/menuband/Sources/MenuBand/LyricCaption.swift b/slab/menuband/Sources/MenuBand/LyricCaption.swift new file mode 100644 index 0000000000..a19d8deccf --- /dev/null +++ b/slab/menuband/Sources/MenuBand/LyricCaption.swift @@ -0,0 +1,232 @@ +import AppKit +import QuartzCore + +/// The sung line on screen, karaoke-style: every word of the line on one +/// banner, the syllable being sung lit. Lettered like slab's prompt rocks — +/// Comic Sans MS Bold, bubble fill + stroke + hard shadow, each glyph with +/// its own small jitter and sway — so a machine's captions read as the same +/// family as its name. Driven from the play loop: `show` when a line's first +/// syllable is due, `highlight` on every onset, `hide` after its last. +final class LyricCaption { + static let shared = LyricCaption() + + /// Sim mode: one caption per tile, laid out inside the tile's frame. + private static var slots: [Int: LyricCaption] = [:] + static func at(_ slot: SingerFace.SimSlot?) -> LyricCaption { + guard let slot else { return shared } + if let c = slots[slot.index] { c.slot = slot; return c } + let c = LyricCaption(); c.slot = slot; slots[slot.index] = c; return c + } + static func hideAll() { shared.hide(line: nil); slots.values.forEach { $0.hide(line: nil) } } + private var slot: SingerFace.SimSlot? + + private var panel: NSPanel? + private var shownLine: Int? + private var syllableGlyphs: [[CaptionGlyphLayer]] = [] + private var litUpTo = -1 + private var ink = NSColor.white + private var dim = NSColor.white + + static let citrus = NSColor(srgbRed: 0.96, green: 0.77, blue: 0.26, alpha: 1) + + /// "#rrggbb" → color; anything else → citrus, the eldest's. + static func color(hex: String?) -> NSColor { + guard var h = hex?.trimmingCharacters(in: .whitespaces), !h.isEmpty else { return citrus } + if h.hasPrefix("#") { h.removeFirst() } + guard h.count == 6, let v = UInt32(h, radix: 16) else { return citrus } + return NSColor(srgbRed: CGFloat((v >> 16) & 0xff) / 255, green: CGFloat((v >> 8) & 0xff) / 255, + blue: CGFloat(v & 0xff) / 255, alpha: 1) + } + + /// The rock lettering: Comic Sans MS Bold, then Chalkboard, then heavy system. + static func font(_ pt: CGFloat) -> NSFont { + for n in ["Comic Sans MS Bold", "ComicSansMS-Bold", "Chalkboard SE Bold", "ChalkboardSE-Bold"] { + if let f = NSFont(name: n, size: pt) { return f } + } + return NSFont.systemFont(ofSize: pt, weight: .heavy) + } + + private func makePanel(on screen: NSScreen, frame: NSRect) -> NSPanel { + let p = NSPanel(contentRect: frame, styleMask: [.borderless, .nonactivatingPanel], + backing: .buffered, defer: true) + let under: NSWindow.Level = slot == nil ? .screenSaver : .floating + p.level = NSWindow.Level(rawValue: under.rawValue + 1) // over the face + p.collectionBehavior = [.canJoinAllSpaces, .stationary, .ignoresCycle, .fullScreenAuxiliary] + p.isOpaque = false + p.backgroundColor = .clear + p.hasShadow = false + p.ignoresMouseEvents = true + p.hidesOnDeactivate = false + p.isReleasedWhenClosed = false + let v = NSView(frame: NSRect(origin: .zero, size: frame.size)) + v.wantsLayer = true + p.contentView = v + return p + } + + /// Put line `line` up: `tokens` are its words, syllables joined by "-". + /// `size` 0 = scale with the screen. Bottom-center of the menu-bar screen. + func show(line: Int, tokens: [String], accent: NSColor, size requested: CGFloat) { + precondition(Thread.isMainThread) + guard let screen = NSScreen.screens.first ?? NSScreen.main else { return } + let stage = slot?.tile(on: screen) ?? screen.frame // the panel's frame: the tile, or the screen + let panel = self.panel ?? makePanel(on: screen, frame: stage) + self.panel = panel + panel.setFrame(stage, display: false) + panel.contentView?.frame = NSRect(origin: .zero, size: stage.size) + guard let root = panel.contentView?.layer else { return } + root.sublayers?.forEach { $0.removeFromSuperlayer() } + syllableGlyphs = [] + litUpTo = -1 + + // One glyph per character, a space between words, and which + // syllable each glyph belongs to (-1 = the space). + var chars: [(ch: Character, syl: Int)] = [] + var nsyl = 0 + for (wi, t) in tokens.enumerated() { + if wi > 0 { chars.append((" ", -1)) } + for part in t.split(separator: "-") { + for c in part { chars.append((c, nsyl)) } + nsyl += 1 + } + } + guard !chars.isEmpty, nsyl > 0 else { return } + + var pt = requested > 0 ? requested + : slot == nil ? max(22, round(stage.width / 34)) : max(11, round(stage.width / 26)) + let maxWidth = stage.width * 0.86 + var font = LyricCaption.font(pt) + var widths: [CGFloat] = [] + func measure() -> CGFloat { + widths = chars.map { ceil((String($0.ch) as NSString).size(withAttributes: [.font: font]).width) } + return widths.reduce(0, +) + } + var total = measure() + while total > maxWidth && pt > 14 { + pt = floor(pt * 0.92); font = LyricCaption.font(pt); total = measure() + } + + let accentRGB = accent.usingColorSpace(.deviceRGB) ?? accent + let lum = 0.2126 * accentRGB.redComponent + 0.7152 * accentRGB.greenComponent + + 0.0722 * accentRGB.blueComponent + ink = lum > 0.58 ? NSColor(deviceWhite: 0.06, alpha: 1) : NSColor(deviceWhite: 0.98, alpha: 1) + dim = ink.withAlphaComponent(0.38) + let stroke = lum > 0.58 ? NSColor(deviceWhite: 0.98, alpha: 0.85) : NSColor(white: 0.08, alpha: 1) + let hardShadow = accentRGB.blended(withFraction: 0.55, of: .black) ?? .black + + let lineH = ceil(pt * 1.5) + let inset = ceil(pt * 0.6) + let x0 = round((stage.width - total) / 2) + let y0 = slot == nil + ? round(screen.visibleFrame.minY - screen.frame.minY + stage.height * 0.09) + : round(stage.height * 0.11) + + // no banner — the lettering carries itself (stroke + hard shadow) + + var groups: [[CaptionGlyphLayer]] = Array(repeating: [], count: nsyl) + var pen = x0 + for (i, c) in chars.enumerated() { + let w = widths[i] + defer { pen += w } + guard c.syl >= 0 else { continue } + let g = CaptionGlyphLayer() + g.contentsScale = screen.backingScaleFactor + g.font = font + g.strokeColor = stroke + g.shadowInk = hardShadow + g.text = String(c.ch) + g.inset = ceil(pt * 0.25) + g.bounds = CGRect(x: 0, y: 0, width: w + g.inset * 2, height: lineH + g.inset * 2) + // MacPal jitter, deterministic per glyph (FNV-1a), like a rock's name. + var h: UInt32 = 2_166_136_261 + for b in "\(line):\(i):\(c.ch)".utf8 { h = (h ^ UInt32(b)) &* 16_777_619 } + let jx = (CGFloat(Int(h % 7)) - 3) * pt / 24 + let jy = (CGFloat(Int((h >> 8) % 5)) - 2) * pt / 24 + let rot = (CGFloat(Int((h >> 16) % 9)) - 4) * .pi / 180 + g.position = CGPoint(x: pen + w / 2 + jx, y: y0 + jy) + g.transform = CATransform3DMakeRotation(rot, 0, 0, 1) + g.ink = dim + g.setNeedsDisplay() + root.addSublayer(g) + let sway = CABasicAnimation(keyPath: "transform.translation.y") + sway.fromValue = -1.2 + sway.toValue = 1.2 + sway.duration = 1.6 + Double((h >> 4) % 9) / 10 + sway.autoreverses = true + sway.repeatCount = .infinity + sway.timeOffset = Double(h % 100) / 50 + g.add(sway, forKey: "sway") + groups[c.syl].append(g) + } + syllableGlyphs = groups + shownLine = line + + NSAnimationContext.runAnimationGroup { ctx in + ctx.duration = 0 + panel.animator().alphaValue = 1 + } + panel.orderFrontRegardless() + } + + /// Light syllable `k` of the shown line: it and everything before it turn + /// full ink, and it pops. + func highlight(line: Int, syllable k: Int) { + precondition(Thread.isMainThread) + guard shownLine == line, k < syllableGlyphs.count else { return } + if k > litUpTo { + for i in (litUpTo + 1)...k { + for g in syllableGlyphs[i] { g.ink = ink; g.setNeedsDisplay() } + } + litUpTo = k + } + for g in syllableGlyphs[k] { + let pop = CAKeyframeAnimation(keyPath: "transform.scale") + pop.values = [1, 1.34, 1.12] + pop.keyTimes = [0, 0.35, 1] + pop.duration = 0.32 + pop.timingFunction = CAMediaTimingFunction(name: .easeOut) + pop.fillMode = .forwards + pop.isRemovedOnCompletion = false + g.add(pop, forKey: "pop") + } + } + + /// Fade out — only if `line` is still the one showing (nil = whatever is up). + func hide(line: Int?) { + precondition(Thread.isMainThread) + if let line, shownLine != line { return } + shownLine = nil + guard let panel else { return } + NSAnimationContext.runAnimationGroup { ctx in + ctx.duration = 0.35 + panel.animator().alphaValue = 0 + } + } +} + +/// One character of a caption: bubble lettering (fill + stroke + hard shadow) +/// drawn from an attributed string, so each glyph can jitter and sway alone. +final class CaptionGlyphLayer: CALayer { + var text = "" + var font = NSFont.systemFont(ofSize: 12) + var ink = NSColor.white + var strokeColor = NSColor.black + var shadowInk = NSColor.black + var inset: CGFloat = 0 + + override func draw(in ctx: CGContext) { + let sh = NSShadow() + sh.shadowBlurRadius = 0 + sh.shadowOffset = NSSize(width: 2.5, height: -2.5) + sh.shadowColor = shadowInk + let attr = NSAttributedString(string: text, attributes: [ + .font: font, .foregroundColor: ink, .strokeColor: strokeColor, + .strokeWidth: -4.5, .shadow: sh, + ]) + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.current = NSGraphicsContext(cgContext: ctx, flipped: false) + let size = attr.size() + attr.draw(at: NSPoint(x: (bounds.width - size.width) / 2, y: (bounds.height - size.height) / 2)) + NSGraphicsContext.restoreGraphicsState() + } +} diff --git a/slab/menuband/Sources/MenuBand/MenuBandController.swift b/slab/menuband/Sources/MenuBand/MenuBandController.swift index fe1d27fd79..6d4d16799f 100644 --- a/slab/menuband/Sources/MenuBand/MenuBandController.swift +++ b/slab/menuband/Sources/MenuBand/MenuBandController.swift @@ -1307,6 +1307,18 @@ final class MenuBandController { synth.speak(text, languageCode: languageCode) } + /// Where a sung `.play` line sounds (see MenuBandSinger). + var singerVoice: MenuBandSingerVoice { synth.singerVoice } + /// A sim slot's own singer (`sim=i/n`), made on first use. + func simSingerVoice(_ slot: SingerFace.SimSlot) -> MenuBandSingerVoice { synth.simSingerVoice(slot) } + func stopAllSingers() { synth.stopAllSingers() } + /// Keep the audio engine from idle-pausing (a conducted sung sequence + /// must not hit the 60 s pause hole mid-song). + var keepEngineWarm: Bool { + get { synth.keepEngineWarm } + set { synth.keepEngineWarm = newValue } + } + /// Secondary alphabet voice used by the popover's ABC checkbox. private func playABCLayer(forKeyCode keyCode: UInt16) { guard abcLayerEnabled, diff --git a/slab/menuband/Sources/MenuBand/MenuBandSinger.swift b/slab/menuband/Sources/MenuBand/MenuBandSinger.swift new file mode 100644 index 0000000000..d69508d170 --- /dev/null +++ b/slab/menuband/Sources/MenuBand/MenuBandSinger.swift @@ -0,0 +1,475 @@ +// MenuBandSinger.swift — the machine speaks, and the speech is sung. +// +// A `.play` payload that carries `lyrics` is a SUNG voice. This is Menu +// Band's host for live/singer.c SCORE mode, ported from live/hosts/macos/ +// livesing.swift: speech is rendered to PCM without touching the speaker — +// AVSpeechSynthesizer.write in the named system voice, or a pre-recorded stem +// plus whisper word timings (how neo sings in jeffrey's own cloned voice, +// offline) — WORLD analyzes it, and the core stretches every syllable onto +// the score and replaces the pitch with the notes. The formant envelope is +// untouched, so it is still THAT voice singing. +// +// `MenuBandSinger` is the pipeline: ~0.5–3 s of work on its own serial queue +// (the core's render scratch is static, so one render at a time). +// `MenuBandSingerVoice` is the AVAudioPlayerNode it sounds through — hung on +// the synth's pre-limiter bus so a sung line rides the same bend/space/echo +// as the whistle, and scheduled on the engine's sample clock so it lands on +// the shared downbeat exactly like the notes do. + +import AVFoundation +import CSinger + +/// One sung line, parsed from a `.play` payload. +/// lyrics: one token per note; syllables of a word joined by "-" (fas-ter). +/// notes: .mbscore grammar, `midi:beats` and `r:beats`. +struct SungLine { + var lyrics: String + var text: String? // what the voice says (default: lyrics minus "-") + var notes: String + var bpm: Double + var voice = "Fred" + var lock = 0.875, vibHz = 5.0, vibCents = 18.0, f0Floor = 55.0 + var stemPath: String?, wordsPath: String? + + init?(info: [String: String], bpm: Double) { + guard let l = info["lyrics"], !l.isEmpty, let n = info["notes"] else { return nil } + lyrics = l; notes = n; self.bpm = bpm + text = info["text"] + voice = info["singVoice"] ?? voice + lock = Double(info["singLock"] ?? "") ?? lock + vibHz = Double(info["singVibratoHz"] ?? "") ?? vibHz + vibCents = Double(info["singVibCents"] ?? "") ?? vibCents + f0Floor = Double(info["singF0Floor"] ?? "") ?? f0Floor + stemPath = info["stemPath"]; wordsPath = info["wordsPath"] + } + + /// Lyric tokens, without the "/" line breaks. + var tokens: [String] { lyrics.split(separator: " ").map(String.init).filter { $0 != "/" } } + /// Tokens grouped by line: "/" in the lyrics is a line break — one + /// caption's worth; the composer puts one at every phrase. + var lineTokens: [[String]] { + var out: [[String]] = [[]] + for t in lyrics.split(separator: " ").map(String.init) { + if t == "/" { if !out[out.count - 1].isEmpty { out.append([]) } } + else { out[out.count - 1].append(t) } + } + return out.filter { !$0.isEmpty } + } + var spoken: String { text ?? tokens.joined(separator: " ").replacingOccurrences(of: "-", with: "") } + /// Words as TTS says them, with how many sung units each splits into. + var words: [(text: String, nsyl: Int)] { + tokens.map { t in + let parts = t.split(separator: "-").map(String.init) + return (parts.joined(), parts.count) + } + } + + /// One SungLine per "/"-separated line, each carrying only its own notes — + /// led by a rest so its timing stays absolute — so a long lyric (a ballad) + /// renders line by line instead of as one utterance: each line is ready + /// well before its own downbeat, and the core's per-render limits (500 + /// words / 500 notes) never bind. A single-line lyric comes back as is. + func splitLines() -> [SungLine] { + let lines = lineTokens + guard lines.count > 1 else { return [self] } + var pos = 0.0 + var abs: [(tok: String, at: Double, dur: Double, rest: Bool)] = [] + for tok in notes.split(separator: ",") { + let kv = tok.split(separator: ":") + let d = kv.count > 1 ? (Double(kv[1]) ?? 1) : 1 + abs.append((String(tok), pos, d, kv.first == "r")) + pos += d + } + let sounding = abs.filter { !$0.rest } + var out: [SungLine] = [] + var cursor = 0 + for lt in lines { + let nsyl = lt.reduce(0) { $0 + $1.split(separator: "-").count } + let hi = min(cursor + nsyl, sounding.count) + guard cursor < hi else { break } + let slice = sounding[cursor.. 0 { toks.append("r:" + String(format: "%g", start)) } + for n in abs where n.at >= start && n.at < end { toks.append(n.tok) } + var l = self + l.lyrics = lt.joined(separator: " ") + l.notes = toks.joined(separator: ",") + l.text = nil + out.append(l) + } + return out + } +} + +/// A rendered line, ready for the player: mono in the voice's graph format. +struct SungRender { + let buffer: AVAudioPCMBuffer + let spanOffset: Double // seconds from the downbeat to buffer[0] + let notesUsed: Int, noteCount: Int + let peak: Float + var duration: Double { Double(buffer.frameLength) / buffer.format.sampleRate } +} + +final class MenuBandSinger { + private let queue = DispatchQueue(label: "menuband.singer", qos: .userInitiated) + private let synth = AVSpeechSynthesizer() + + /// Render `line` off the main thread; `completion` lands on main with nil + /// when the speech source or the core gave nothing to sing. + func render(_ line: SungLine, into format: AVAudioFormat, + completion: @escaping (SungRender?) -> Void) { + queue.async { + let r = self.renderNow(line, format: format) + DispatchQueue.main.async { completion(r) } + } + } + + // MARK: - speech sources + + private struct Speech { + var pcm: [Double] + var fs: Int + var spans: [(a: Int, b: Int)] // word spans in samples, lyric order + } + + /// Captures AVSpeechSynthesizer.write: PCM plus each word's onset sample. + private final class Capture: NSObject, AVSpeechSynthesizerDelegate { + let lock = NSLock() + var pcm: [Double] = [] + var fs = 22_050.0 + var onsets: [Int] = [] + let done = DispatchSemaphore(value: 0) + + func speechSynthesizer(_ s: AVSpeechSynthesizer, + willSpeakRangeOfSpeechString r: NSRange, + utterance: AVSpeechUtterance) { + lock.lock(); onsets.append(pcm.count); lock.unlock() + } + func append(_ b: AVAudioPCMBuffer) { + lock.lock(); defer { lock.unlock() } + fs = b.format.sampleRate + let n = Int(b.frameLength) + if let ch = b.floatChannelData { + for i in 0.. + /// Enhanced > compact) — "Ava" picks "Ava (Premium)" once downloaded. An + /// explicit "Evan (Enhanced)" pins a tier; an identifier matches exactly. + static func voice(named raw: String) -> AVSpeechSynthesisVoice? { + let tier = #" \((Premium|Enhanced)\)"# + let bare = { (s: String) in + s.replacingOccurrences(of: tier, with: "", options: .regularExpression).lowercased() + } + let all = AVSpeechSynthesisVoice.speechVoices() + if let v = all.first(where: { $0.identifier == raw }) { return v } + let want = bare(raw) + let pin: Int? = raw.contains("(Premium)") ? 3 : raw.contains("(Enhanced)") ? 2 : nil + let rank = { (v: AVSpeechSynthesisVoice) in + v.quality.rawValue * 2 + (v.language.hasPrefix("en-US") ? 1 : 0) + } + return all.filter { bare($0.name) == want && (pin == nil || $0.quality.rawValue == pin) } + .max { rank($0) < rank($1) } + } + + private func speak(_ line: SungLine, words: [(text: String, nsyl: Int)]) -> Speech? { + let cap = Capture() + synth.delegate = cap + let utt = AVSpeechUtterance(string: line.spoken) + let v = MenuBandSinger.voice(named: line.voice) + utt.voice = v + utt.rate = 0.42 + synth.write(utt) { buf in + guard let b = buf as? AVAudioPCMBuffer, b.frameLength > 0 else { cap.done.signal(); return } + cap.append(b) + } + // The synthesizer calls back on its own queue; a wedged voice must + // not hold the render queue forever. + guard cap.done.wait(timeout: .now() + 20) == .success else { + NSLog("🎤 sing: %@ never finished speaking", line.voice); return nil + } + cap.lock.lock(); defer { cap.lock.unlock() } + guard !cap.pcm.isEmpty else { NSLog("🎤 sing: %@ spoke nothing", line.voice); return nil } + let n = cap.pcm.count, nw = words.count + var spans: [(a: Int, b: Int)] = [] + if cap.onsets.count >= nw { + // word onsets from the synthesizer; a word ends where the next begins + let on = Array(cap.onsets.prefix(nw)) + for i in 0.. Speech? { + guard let stem = line.stemPath, let wp = line.wordsPath else { return nil } + guard let file = try? AVAudioFile(forReading: URL(fileURLWithPath: stem)), + let buf = AVAudioPCMBuffer(pcmFormat: file.processingFormat, + frameCapacity: AVAudioFrameCount(file.length)), + (try? file.read(into: buf)) != nil, let ch = buf.floatChannelData + else { NSLog("🎤 sing: can't read stem %@", stem); return nil } + let n = Int(buf.frameLength), nch = Int(buf.format.channelCount) + var pcm = [Double](repeating: 0, count: n) + for c in 0..= nw, + let i = (0...(heard.count - nw)).first(where: { i in + (0.. SungRender? { + let t0 = Date() + let words = line.words + guard !words.isEmpty else { return nil } + + var notes: [singer_note] = [] + var beat = 0.0 + for tok in line.notes.split(separator: ",") { + let kv = tok.split(separator: ":") + let d = kv.count > 1 ? (Double(kv[1]) ?? 1) : 1 + if kv[0] != "r", let m = Double(kv[0]) { + notes.append(singer_note(midi: m, at16: beat * 4, dur16: d * 4)) + } + beat += d + } + guard !notes.isEmpty else { return nil } + let nsyl = words.reduce(0) { $0 + $1.nsyl } + if notes.count != nsyl { + NSLog("🎤 sing: %d notes vs %d syllables — pairing in order", notes.count, nsyl) + } + + guard let sp = line.stemPath != nil ? load(line, words: words) : speak(line, words: words) + else { return nil } + + // word spans → WORLD frames + let frameOf = { (sample: Int) -> Int32 in + Int32(Double(sample) / Double(sp.fs) * 1000.0 / SINGER_FP_MS) + } + var W: [singer_word] = [] + for (i, s) in sp.spans.enumerated() { + var w = singer_word() + w.a = frameOf(s.a); w.b = frameOf(s.b); w.vs = w.a; w.ve = w.b + w.nsyl = Int32(words[i].nsyl) + W.append(w) + } + + let pcm = sp.pcm + guard let S = pcm.withUnsafeBufferPointer({ + singer_create($0.baseAddress, Int32(pcm.count), Int32(sp.fs)) + }) else { return nil } + defer { singer_destroy(S) } + let P = singer_params_ptr(S)! + P.pointee.bpm = line.bpm; P.pointee.morph = 1.0; P.pointee.mode = SINGER_SCORE + P.pointee.lock = line.lock; P.pointee.vib_hz = line.vibHz + P.pointee.vib_cents = line.vibCents; P.pointee.f0_floor = line.f0Floor + W.withUnsafeBufferPointer { singer_set_words(S, $0.baseAddress, Int32(W.count)) } + notes.withUnsafeBufferPointer { singer_set_score(S, $0.baseAddress, Int32(notes.count)) } + let ta = Date() + singer_analyze_chunk(S, 0, singer_total_frames(S)) + let analyzeMs = Date().timeIntervalSince(ta) * 1000 + + // Render only the span that sings — from the beat before the first + // note to the beat after the last — and offset playback by its start. + let first16 = max(0, floor(notes[0].at16 / 4) * 4 - 4) + let end16 = notes.map { $0.at16 + $0.dur16 }.max() ?? 0 + let last16 = min(beat * 4, ceil(end16 / 4) * 4 + 4) + let spanOffset = first16 / 4 * (60.0 / line.bpm) + var outLen: Int32 = 0, used: Int32 = 0 + let tr = Date() + guard let y = singer_render_score(S, first16, last16, &outLen, &used), outLen > 0 + else { NSLog("🎤 sing: render gave nothing"); return nil } + defer { free(y) } + let n = Int(outLen) + var peak: Float = 0 + let src = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: Double(sp.fs), + channels: 1, interleaved: false)! + guard let raw = AVAudioPCMBuffer(pcmFormat: src, frameCapacity: AVAudioFrameCount(n)) else { return nil } + raw.frameLength = AVAudioFrameCount(n) + let out = raw.floatChannelData![0] + for i in 0.. 0 else { return } + let n = Int(buf.frameLength) + var peak: Float = 0, sum: Float = 0, cross = 0 + var prev = ch[0][0] + for i in 0..= 0) != (prev >= 0) { cross += 1 } + prev = v + } + let rms = sqrt(sum / Float(n)), zcr = Float(cross) / Float(n) + let face = self?.face ?? .shared + DispatchQueue.main.async { face.meter(rms: CGFloat(rms), zcr: CGFloat(zcr)) } + guard peak > 0.01 else { return } + let now = Date().timeIntervalSince1970 + if now - MenuBandSingerVoice.lastTapLog > 2.0 { + MenuBandSingerVoice.lastTapLog = now + NSLog("🎤 tap: singer rendering, peak %.3f", peak) + } + } + } + + /// Sound `render` so its first sample lands at `epoch` (Unix seconds). + /// Uses the player's own sample clock when it has one (the engine is + /// rendering), else the host clock; a late line is trimmed to start now. + /// Main thread — node control. Returns the lead in seconds (negative = late). + @discardableResult + func schedule(_ render: SungRender, atEpoch epoch: Double) -> Double { + guard attached, let engine else { return 0 } + let lead = epoch - Date().timeIntervalSince1970 + let gen = generation + // Play the line by waiting for its instant on the main thread, then + // scheduling the buffer for immediate playout — the same clock the + // drums and key-lights use. Precise sample-time scheduling on a + // player node proved unreliable across the engine's idle pause and + // restarts (the buffer was accepted but silently skipped — the + // silent-voice bug of Sept 20); this always sounds. + let fire: () -> Void = { [weak self] in + guard let self, self.generation == gen else { return } + if !engine.isRunning { try? engine.start() } + if !self.player.isPlaying { self.player.play() } + guard self.player.isPlaying else { NSLog("🎤 sing: player would not start"); return } + self.player.scheduleBuffer(render.buffer, completionHandler: nil) + NSLog("🎤 sing: playing %.2f s now", + Double(render.buffer.frameLength) / render.buffer.format.sampleRate) + } + if lead <= 0.01 { + if Thread.isMainThread { fire() } else { DispatchQueue.main.async(execute: fire) } + } else { + DispatchQueue.main.asyncAfter(deadline: .now() + lead, execute: fire) + } + return lead + } + + /// Drop every queued line (stop cancels a pending sung line). + func stop() { + guard attached else { return } + generation += 1 + player.stop() + } + + static func convert(_ pcm: AVAudioPCMBuffer, to format: AVAudioFormat) -> AVAudioPCMBuffer? { + if pcm.format == format { return pcm } + guard let conv = AVAudioConverter(from: pcm.format, to: format) else { return nil } + let ratio = format.sampleRate / pcm.format.sampleRate + let cap = AVAudioFrameCount(Double(pcm.frameLength) * ratio) + 1_024 + guard let out = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: cap) else { return nil } + var fed = false + var error: NSError? + conv.convert(to: out, error: &error) { _, status in + if fed { status.pointee = .noDataNow; return nil } + fed = true + status.pointee = .haveData + return pcm + } + return error == nil && out.frameLength > 0 ? out : nil + } + + private static func dropping(_ skip: AVAudioFrameCount, from buf: AVAudioPCMBuffer) -> AVAudioPCMBuffer? { + let n = buf.frameLength - skip + guard let out = AVAudioPCMBuffer(pcmFormat: buf.format, frameCapacity: n), + let src = buf.floatChannelData, let dst = out.floatChannelData else { return nil } + out.frameLength = n + for c in 0.. MenuBandSingerVoice { + if let v = simSingers[slot.index] { v.pan = slot.pan; return v } + let v = MenuBandSingerVoice() + v.face = SingerFace.at(slot) + v.pan = slot.pan + v.attach(to: engine, output: preLimiterMixer) + simSingers[slot.index] = v + NSLog("🎤 sim: singer %d/%d attached, pan %.2f", slot.index + 1, slot.count, slot.pan) + return v + } + /// Drop every queued sung line, the shared singer's and the sim slots'. + func stopAllSingers() { singerVoice.stop(); simSingers.values.forEach { $0.stop() } } /// Tab handoff chime + FX-page rub, on the fx bus so both preview the /// live bend/space/echo. See `MenuBandSurfaceCue`. private let surfaceCue = MenuBandSurfaceCue() @@ -544,6 +562,9 @@ final class MenuBandSynth { speechVoice.attach( to: engine, output: preLimiterMixer, dryOutput: postFxMixer ) + // Sung lines: same pre-limiter bus, so a voice conducted over the + // fleet is bent and spaced like the instrument it sings with. + singerVoice.attach(to: engine, output: preLimiterMixer) // Surface cues: same pre-limiter sum bus, so the Tab chime and the // pitch-page rub bloom with whatever space/echo the gesture holds. surfaceCue.attach(to: engine, output: preLimiterMixer) @@ -2793,5 +2814,9 @@ final class MenuBandSynth { } radio.panic() sampleVoice.panic() + // NOTE: the sung voice is NOT stopped here. panic() fires routinely + // mid-performance — releasing held keys, arming percussion, shifting + // octave — and a conducted sung sequence must survive those. Only an + // explicit stopScore stops it (it calls singerVoice.stop() directly). } } diff --git a/slab/menuband/Sources/MenuBand/SingerFace.swift b/slab/menuband/Sources/MenuBand/SingerFace.swift new file mode 100644 index 0000000000..5b844a1474 --- /dev/null +++ b/slab/menuband/Sources/MenuBand/SingerFace.swift @@ -0,0 +1,408 @@ +import AppKit + +/// The singer's face takes the whole display: the screen fills with the +/// member's color and becomes a face — two big eyes that blink and drift, a +/// mouth that opens on every sung syllable in the vowel's shape, thick black +/// lines that boil (fresh jitter ten times a second), a squash on each onset. +/// Old-cartoon timing, no avatar: the machine IS the face. The caption sits +/// under the mouth. Driven from the play loop beside the captions. +final class SingerFace { + static let shared = SingerFace() + + /// The simulator: `sim=i/n` on a play payload puts member i of n in a + /// small tile instead of the whole display, so one Menu Band can stand + /// in for the whole band (every member's face, caption and voice on one + /// machine) before the real bodies are spread across the room. + struct SimSlot: Hashable { + let index: Int, count: Int + /// "i/n" → slot; anything else → nil (the full display). + init?(_ raw: String?) { + guard let raw, !raw.isEmpty, raw != "0" else { return nil } + let p = raw.split(separator: "/") + guard p.count == 2, let i = Int(p[0]), let n = Int(p[1]), n > 0, i >= 0, i < n else { return nil } + index = i; count = n + } + /// Tiles side by side along the bottom-right of the menu-bar screen, + /// 16:10, each at most 520 pt wide. + func tile(on screen: NSScreen) -> NSRect { + let vf = screen.visibleFrame + let margin: CGFloat = 16, gap: CGFloat = 12 + let w = min(520, floor((vf.width - margin * 2 - gap * CGFloat(count - 1)) / CGFloat(count))) + let h = floor(w * 0.625) + let x = vf.maxX - margin - (w + gap) * CGFloat(count - index) + gap + return NSRect(x: x, y: vf.minY + margin, width: w, height: h) + } + /// Stereo place for the slot's voice: left to right across the band. + var pan: Float { count < 2 ? 0 : -0.75 + 1.5 * Float(index) / Float(count - 1) } + } + private static var slots: [Int: SingerFace] = [:] + /// The face for a payload: `shared` for the full display, one per tile in sim mode. + static func at(_ slot: SimSlot?) -> SingerFace { + guard let slot else { return shared } + if let f = slots[slot.index] { f.slot = slot; return f } + let f = SingerFace(); f.slot = slot; slots[slot.index] = f; return f + } + static func hideAll() { shared.hide(); slots.values.forEach { $0.hide() } } + + private var slot: SimSlot? + private var panel: NSPanel? + private var view: SingerFaceView? + + func show(member: String, accent: NSColor) { + precondition(Thread.isMainThread) + guard let screen = NSScreen.screens.first ?? NSScreen.main else { return } + let frame = slot?.tile(on: screen) ?? screen.frame + let panel = self.panel ?? makePanel(frame) + self.panel = panel + panel.setFrame(frame, display: false) + let v = view ?? SingerFaceView(frame: NSRect(origin: .zero, size: frame.size)) + view = v + v.frame = NSRect(origin: .zero, size: frame.size) + if panel.contentView !== v { panel.contentView = v } + v.member = member + v.accent = accent + v.label = slot == nil ? nil : member + v.start() + NSAnimationContext.runAnimationGroup { ctx in + ctx.duration = 0.3 + panel.animator().alphaValue = 1 + } + panel.orderFrontRegardless() + } + + func onset(_ syllable: String, hold: Double) { + precondition(Thread.isMainThread) + view?.onset(syllable, hold: hold) + } + + /// Live level from the singer's audio tap: the jaw follows the sound. + func meter(rms: CGFloat, zcr: CGFloat) { + view?.meter(rms: rms, zcr: zcr) + } + + func hide() { + precondition(Thread.isMainThread) + guard let panel, let view else { return } + NSAnimationContext.runAnimationGroup({ ctx in + ctx.duration = 0.5 + panel.animator().alphaValue = 0 + }, completionHandler: { [weak view, weak panel] in + if panel?.alphaValue == 0 { view?.stop() } + }) + } + + private func makePanel(_ frame: NSRect) -> NSPanel { + let p = NSPanel(contentRect: frame, styleMask: [.borderless, .nonactivatingPanel], + backing: .buffered, defer: true) + p.level = slot == nil ? .screenSaver : .floating // a tile floats over the desk, not the screen saver + p.collectionBehavior = [.canJoinAllSpaces, .stationary, .ignoresCycle, .fullScreenAuxiliary] + p.isOpaque = false + p.backgroundColor = .clear + p.hasShadow = false + p.ignoresMouseEvents = true + p.hidesOnDeactivate = false + p.isReleasedWhenClosed = false + p.alphaValue = 0 + return p + } +} + +final class SingerFaceView: NSView { + var member = "neo" + var accent = NSColor.orange + var label: String? // sim tile: the member's name in the corner + + private var timer: Timer? + private var boil: UInt64 = 1 + private var lastBoil = Date.distantPast + private var mouthOpen: CGFloat = 0 + private var mouthShape = 0 // 0 neutral · 1 wide (a) · 2 spread (e, i) · 3 small round (oo, u) · 4 round open (o, aw) + private var mouthUntil = Date.distantPast + private var lipsShutUntil = Date.distantPast // m / b / p: lips pressed at the onset + private var liveRms: CGFloat = 0 + private var liveZcr: CGFloat = 0 + private var lastMeter = Date.distantPast + private var squash: CGFloat = 0 + private var lean: CGFloat = 1 + private var blinkUntil = Date.distantPast + private var nextBlink = Date() + private var gaze = CGPoint.zero + private var gazeTarget = CGPoint.zero + private var nextGaze = Date() + private var bob: CGFloat = 0 + + override var isFlipped: Bool { false } + + private var link: AnyObject? // CADisplayLink on macOS 14+ + private var drawMs = 0.0, drawN = 0, lastDrawReport = Date() + + /// Native display link (macOS 14+): one tick per display refresh, 60 or + /// 120 Hz, suspended off-screen — the cartoon runs on the panel's own + /// clock, not a timer. The view is layer-backed so the drawn frame + /// composites on the GPU. + func start() { + guard link == nil else { return } + wantsLayer = true + layerContentsRedrawPolicy = .onSetNeedsDisplay + nextBlink = Date().addingTimeInterval(1.5) + ticks = 0 + if #available(macOS 14.0, *) { + let l = displayLink(target: self, selector: #selector(displayTick(_:))) + l.add(to: .main, forMode: .common) + link = l + NSLog("🎭 face: display link armed") + // If the link never fires (off-screen, or a quirk), fall back to + // a 60 Hz timer after a second rather than freezing the face. + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in + guard let self, self.link != nil, self.ticks < 10 else { return } + NSLog("🎭 face: display link silent (%d ticks) — 60 Hz timer fallback", self.ticks) + self.startTimer() + } + } else { + startTimer() + } + } + + private func startTimer() { + guard timer == nil else { return } + let t = Timer(timeInterval: 1.0 / 60.0, repeats: true) { [weak self] _ in self?.tick() } + RunLoop.main.add(t, forMode: .common) + timer = t + } + + private var ticks = 0 + @objc private func displayTick(_ sender: Any) { tick() } + + func stop() { + if #available(macOS 14.0, *) { (link as? CADisplayLink)?.invalidate() } + link = nil + timer?.invalidate() + timer = nil + } + + /// The mouth's FORM from the syllable's spelling (its jaw comes from the + /// audio): oo/u → small round, ee/i/e/y → spread, o/aw/au → round open, + /// a → wide open. A syllable starting with m/b/p presses the lips first. + /// Preston Blair's set, from spelling: 1 A/I wide · 2 E spread · + /// 3 W/OO small round · 4 O round open · 5 F/V teeth on lip · 6 L/D/N/T + /// tongue · 0 neutral. M/B/P is the lips-shut flash at the onset. + static func mouthClass(_ syl: String) -> Int { + let s = syl.lowercased() + let vowels = s.filter { "aeiouy".contains($0) } + if vowels.isEmpty { + if s.hasPrefix("f") || s.hasPrefix("v") { return 5 } + return 6 + } + if s.hasPrefix("f") || s.hasPrefix("v"), s.count <= 2 { return 5 } + if s.contains("oo") || s.contains("ou") || s.contains("ew") || s.hasSuffix("u") || s.hasPrefix("w") || s.hasPrefix("qu") { return 3 } + if s.contains("aw") || s.contains("au") || s.contains("o") { return 4 } + if s.contains("ee") || s.contains("ea") || s.contains("i") || s.contains("y") || s.contains("e") { return 2 } + if s.contains("a") { return 1 } + return 0 + } + + func onset(_ syllable: String, hold: Double) { + mouthShape = SingerFaceView.mouthClass(syllable) + if let f = syllable.lowercased().first, "mbp".contains(f) { + lipsShutUntil = Date().addingTimeInterval(0.07) + } + mouthUntil = Date().addingTimeInterval(max(0.12, hold * 0.8)) + squash = 1 + lean = lean > 0 ? -1 : 1 + } + + func meter(rms: CGFloat, zcr: CGFloat) { + liveRms = rms + liveZcr = zcr + lastMeter = Date() + } + + private func tick() { + ticks += 1 + let now = Date() + if now.timeIntervalSince(lastBoil) > 0.1 { boil &+= 1; lastBoil = now } + if now > nextBlink { + blinkUntil = now.addingTimeInterval(0.13) + nextBlink = now.addingTimeInterval(2.2 + Double(boil % 30) / 10) + } + if now > nextGaze { + gazeTarget = CGPoint(x: CGFloat(Int(boil % 5)) / 2 - 1, y: CGFloat(Int((boil >> 3) % 3)) / 2 - 0.5) + nextGaze = now.addingTimeInterval(1.2 + Double((boil >> 5) % 20) / 10) + } + gaze.x += (gazeTarget.x - gaze.x) * 0.18 + gaze.y += (gazeTarget.y - gaze.y) * 0.18 + squash *= 0.78 + // Jaw from the audio: fast attack, softer release. With no meter for + // half a second (no tap yet) fall back to the onset-and-decay pulse. + let metered = now.timeIntervalSince(lastMeter) < 0.5 + let target: CGFloat = metered + ? min(1, max(0, (liveRms - 0.012) / 0.16)) + : (now < mouthUntil ? 0.85 : 0) + mouthOpen += (target - mouthOpen) * (target > mouthOpen ? 0.65 : 0.3) + if now < lipsShutUntil { mouthOpen = 0 } + bob += 1.0 / 60.0 + needsDisplay = true + } + + /// Deterministic jitter in [-1, 1] for point `i` of the current boil. + private func j(_ i: Int, _ salt: Int = 0) -> CGFloat { + var h: UInt64 = 1_469_598_103_934_665_603 ^ boil + for b in [UInt64(i), UInt64(salt), 0x9E37] { h = (h ^ b) &* 1_099_511_628_211 } + return CGFloat(Int(h % 2001)) / 1000 - 1 + } + + /// A lumpy closed blob through jittered points on an ellipse. + private func blob(cx: CGFloat, cy: CGFloat, rx: CGFloat, ry: CGFloat, lump: CGFloat, salt: Int, n: Int = 26) -> NSBezierPath { + var pts: [CGPoint] = [] + for i in 0.. 5 { + let secs = Date().timeIntervalSince(lastDrawReport) + NSLog("🎭 face: %.1f ms/frame · %.0f draws/s · %.0f ticks/s", drawMs / Double(max(1, drawN)), + Double(drawN) / secs, Double(ticks) / secs) + drawMs = 0; drawN = 0; ticks = 0; lastDrawReport = Date() + } + } + let W = bounds.width, H = bounds.height + let isBB = member == "blueberry" + let line = W * 0.011 + + // the screen is the face + accent.setFill() + bounds.fill() + + ctx.saveGState() + // squash on the onset around the face's center, leaning left then right + ctx.translateBy(x: W / 2, y: H * 0.5 + sin(bob * 1.1) * H * 0.006) + ctx.rotate(by: squash * lean * 0.025) + ctx.scaleBy(x: 1 + 0.05 * squash, y: 1 - 0.08 * squash) + ctx.translateBy(x: -W / 2, y: -H * 0.5) + + // eyes + let blinking = Date() < blinkUntil + let ey = H * 0.64 + let ex = W * (isBB ? 0.2 : 0.19) + let ew = W * (isBB ? 0.1 : 0.105) + let eh = H * (isBB ? 0.15 : 0.19) + for side in [-1, 1] as [CGFloat] { + let cx = W / 2 + side * ex + W * 0.003 * j(Int(side) + 10, 4) + let cy = ey + H * 0.004 * j(Int(side) + 12, 5) + if blinking { + let shut = NSBezierPath() + shut.move(to: CGPoint(x: cx - ew, y: cy)) + shut.curve(to: CGPoint(x: cx + ew, y: cy), controlPoint1: CGPoint(x: cx - ew * 0.4, y: cy - eh * 0.35), controlPoint2: CGPoint(x: cx + ew * 0.4, y: cy - eh * 0.35)) + ink(shut, width: line, fill: nil) + } else { + let eye = blob(cx: cx, cy: cy, rx: ew, ry: eh, lump: 0.025, salt: Int(side) + 20, n: 18) + ink(eye, width: line, fill: NSColor(white: 0.97, alpha: 1)) + let pr = isBB ? ew * 0.42 : ew * 0.4 + let px = cx + gaze.x * ew * 0.35, py = cy + gaze.y * eh * 0.3 + NSColor.black.setFill() + NSBezierPath(ovalIn: CGRect(x: px - pr, y: py - pr, width: pr * 2, height: pr * 2)).fill() + NSColor.white.setFill() + NSBezierPath(ovalIn: CGRect(x: px - pr * 0.15, y: py + pr * 0.3, width: pr * 0.5, height: pr * 0.5)).fill() + if isBB { + // heavy lids: the top of each eye in the face's own color + ctx.saveGState(); eye.addClip() + accent.setFill() + NSBezierPath(rect: CGRect(x: cx - ew * 1.2, y: cy + eh * 0.08, width: ew * 2.4, height: eh * 1.2)).fill() + ctx.restoreGState() + let edge = NSBezierPath() + edge.move(to: CGPoint(x: cx - ew, y: cy + eh * 0.08)) + edge.line(to: CGPoint(x: cx + ew, y: cy + eh * 0.08)) + ink(edge, width: line, fill: nil) + } + } + // brow + let brow = NSBezierPath() + let by = cy + eh * (isBB ? 1.25 : 1.45) + H * 0.005 * j(Int(side) + 30, 6) + brow.move(to: CGPoint(x: cx - ew * 0.95, y: by - (isBB ? 0 : eh * 0.12))) + if isBB { + brow.line(to: CGPoint(x: cx + ew * 0.95, y: by)) + } else { + brow.curve(to: CGPoint(x: cx + ew * 0.95, y: by - eh * 0.12), controlPoint1: CGPoint(x: cx - ew * 0.3, y: by + eh * 0.3), controlPoint2: CGPoint(x: cx + ew * 0.3, y: by + eh * 0.3)) + } + ink(brow, width: line * (isBB ? 1.5 : 1.1), fill: nil) + } + + // mouth — above the caption line + let my = H * 0.33 + let mw = W * (isBB ? 0.13 : 0.16) + if mouthOpen < 0.08 { + let smile = NSBezierPath() + let w = mw * (isBB ? 1.0 : 1.25) + smile.move(to: CGPoint(x: W / 2 - w, y: my + H * 0.03)) + smile.curve(to: CGPoint(x: W / 2 + w, y: my + H * 0.03), controlPoint1: CGPoint(x: W / 2 - w * 0.4, y: my - H * (isBB ? 0.01 : 0.06)), controlPoint2: CGPoint(x: W / 2 + w * 0.4, y: my - H * (isBB ? 0.01 : 0.06))) + ink(smile, width: line * 1.2, fill: nil) + } else { + var w = mw, h = H * 0.14 * mouthOpen + var teeth = true, tongue = false, bite = false + switch mouthShape { + case 1: w *= 1.15 // A/I — wide open + case 2: w *= 1.45; h *= 0.5 // E — spread + case 3: w *= 0.5; h *= 0.9; teeth = false // W/OO — small round + case 4: w *= 0.78; h *= 1.2; teeth = false // O — round open + case 5: w *= 1.2; h *= 0.35; bite = true // F/V — teeth on the lip + case 6: w *= 0.9; h *= 0.55; tongue = true // L/D/N/T — tongue up + default: w *= 0.85; h *= 0.7 + } + if liveZcr > 0.22 && mouthOpen < 0.6 { w *= 1.2; h *= 0.45 } // a hiss — teeth + h = max(h, H * 0.015) + let mouth = blob(cx: W / 2, cy: my, rx: w, ry: h, lump: 0.05, salt: 40, n: 16) + ink(mouth, width: line * 1.2, fill: NSColor(srgbRed: 0.1, green: 0.03, blue: 0.05, alpha: 1)) + ctx.saveGState(); mouth.addClip() + if teeth { + NSColor(white: 0.96, alpha: 1).setFill() + NSBezierPath(rect: CGRect(x: W / 2 - w, y: my + h * (bite ? 0.1 : 0.45), width: w * 2, height: h * (bite ? 0.95 : 0.6))).fill() + } + if tongue { + NSColor(srgbRed: 0.85, green: 0.25, blue: 0.35, alpha: 1).setFill() + NSBezierPath(ovalIn: CGRect(x: W / 2 - w * 0.45, y: my - h * 0.3, width: w * 0.9, height: h * 1.0)).fill() + } else if !bite { + NSColor(srgbRed: 0.85, green: 0.25, blue: 0.35, alpha: 1).setFill() + NSBezierPath(ovalIn: CGRect(x: W / 2 - w * 0.5, y: my - h * 1.25, width: w, height: h * 0.9)).fill() + } + ctx.restoreGState() + } + ctx.restoreGState() + + if let label { + // the tile's name, top-left, in the rock lettering, in the face's ink + let lum = (accent.usingColorSpace(.deviceRGB)).map { 0.2126 * $0.redComponent + 0.7152 * $0.greenComponent + 0.0722 * $0.blueComponent } ?? 0.5 + let ink = lum > 0.58 ? NSColor(deviceWhite: 0.06, alpha: 0.9) : NSColor(deviceWhite: 0.98, alpha: 0.9) + let pt = max(11, round(W / 22)) + let attr = NSAttributedString(string: label, attributes: [.font: LyricCaption.font(pt), .foregroundColor: ink]) + attr.draw(at: NSPoint(x: W * 0.035, y: H - pt * 1.6)) + NSColor(white: 0, alpha: 0.35).setStroke() + let edge = NSBezierPath(rect: bounds.insetBy(dx: 0.5, dy: 0.5)); edge.lineWidth = 1; edge.stroke() + } + } +} diff --git a/slab/menuband/project.yml b/slab/menuband/project.yml index 2ef036b6c5..433c105c41 100644 --- a/slab/menuband/project.yml +++ b/slab/menuband/project.yml @@ -112,6 +112,15 @@ targets: # module-map arrangement as CGMSynth (see settings below). - path: Sources/CFluoddity/fluoddity_voice.c + # The speech-to-singing core (singer.c + WORLD's .cpp, symlinked from + # live/). MenuBandSinger.swift does `import CSinger`; same module-map + # arrangement. The header search root is Sources/CSinger/world because + # both include "world/.h". + - path: Sources/CSinger/singer.c + - path: Sources/CSinger/world + type: folder + buildPhase: sources + dependencies: - package: ACMacAudio product: ACMacAudio @@ -149,8 +158,8 @@ targets: # header live in Sources/CGMSynth/include. SWIFT_INCLUDE_PATHS lets the # Swift side find the module; HEADER_SEARCH_PATHS lets gm_synth.c find # its own "gm_synth.h". - SWIFT_INCLUDE_PATHS: $(SRCROOT)/Sources/CGMSynth/include $(SRCROOT)/Sources/CFluoddity/include - HEADER_SEARCH_PATHS: $(SRCROOT)/Sources/CGMSynth/include $(SRCROOT)/Sources/CFluoddity/include + SWIFT_INCLUDE_PATHS: $(SRCROOT)/Sources/CGMSynth/include $(SRCROOT)/Sources/CFluoddity/include $(SRCROOT)/Sources/CSinger/include + HEADER_SEARCH_PATHS: $(SRCROOT)/Sources/CGMSynth/include $(SRCROOT)/Sources/CFluoddity/include $(SRCROOT)/Sources/CSinger/include $(SRCROOT)/Sources/CSinger/world postBuildScripts: # Index the copied Help book so Help Viewer search works. We index the -- 2.51.2