Жiжo

intonation and confession in 27-EDO — the decoder hears only the audio

the lattice · one column per edon, one row per voice
dramatis personae · one per line — NAME, commentary (the comma and after is only commentary)
the text to be intonated
what the machine heard

The dramatis personae field names the speakers, one per line — everything after a comma is commentary for humans and ignored by the machine. In the score, [NAME] is a stage direction: it makes no sound and takes no time, but the confession opens a new line as NAME: wherever one stood, reuniting libretto and voice. A bracketed name not in the personae is not a direction and is sung as literal scripture. The text field executes exactly two verbs and nothing else: sleep(seconds) renders as measured silence, and bpm(x) sets the tempo from that point on (240 is the native quarter-second pulse). Write bpm(120) Slowly sleep(0.5) bpm(480) nowquickly. sleep() renders as measured silence — write Hello sleep(0.5) World to let the robot breathe between utterances; everything else is literal scripture and no other code is ever evaluated. Intonate renders the text as chordal trytes — one tribble per voice, Dominant/Mediant/Tonic at 1760/880/440 Hz, one 27-EDO step per edon, with the Diatonic a step above — and plays the buffer. Confess runs a Goertzel bank over that same rendered audio and reassembles characters from pitch alone — and hears the rests too, confessing each silence back as its own sleep() and each tempo shift as a bpm() — transcribing like a musician: repeats are heard as repeats at the prevailing tempo, and a bpm() is declared only when the audio forces one, so a score that halves its tempo exactly on a doubled letter is genuinely ambiguous to any listener, machine or human. The round trip is exact when the verdict says so. Listen at the door opens the microphone and decodes the loudest stable chord in the room, quarter-second by quarter-second — sing to it, or play it a recording of itself.