Skip to content

M12: ship Cento (Live devices and the Max patch), GUI redesign, read-me tutorial - #3

Merged
nnokes merged 23 commits into
mainfrom
claude/dazzling-edison-2p29y3
Oct 5, 2026
Merged

nnokes merged 23 commits into
mainfrom
claude/dazzling-edison-2p29y3

Conversation

@nnokes

@nnokes nnokes commented Oct 5, 2026

Copy link
Copy Markdown
Owner

Finishes M12, "Ship to others (free)". Every check in the M12 checklist passed on the Mac, including the freeze test held over from M0 and a newcomer hearing a piece using only the read-me.

Downloads

  • Cento for Live: frozen cento.brain and cento.voice, the demo set (Cento Demo Project), and the Cento folder with 131 Bach chorales.
  • Cento for Max: Cento Patch/ holds cento.maxpat and every patch and script it uses, side by side. Max finds them with nothing on its search path. It needs Max 9 but no license. A standalone app waits for later.
  • npm run package makes both zips and says what's missing. It finds the patch's files by following cento.maxpat's references, and embeds the read-me's pictures in the page.

Repository layout

  • patchers/ holds only what you open: cento.maxpat, cento.brain.amxd and cento.voice.amxd.
  • The patches they're made of are in patchers/parts/, and the script bundles in patchers/scripts/.
  • For development, add patchers to the search path with Subfolders ticked.

GUI redesign

  • Buttons: every button is a live.text in Live's own look.
  • Section names: a dark row along the top names each section (PLAY or CLIPS AND VOICES, COMPOSE, MAGDALENA, PIANO ROLL). The window button is a square ↗ at its right end.
  • compose is now update composition. The pop-up window has its own, in place of reload seed.
  • More features (Max only): the listening test, load a chorale (with its original key switch), the test phrase, and stop and clear the queue.
  • Widths: the left panel is narrower and Magdalena's panel wider; the strip keeps its width.
  • Piano roll: bar numbers, cadence triangles and Magdalena's dots each have a row of their own.
  • Text fits: comments wrap at their shown width. Tests check that comment text and button labels fit.

Read me first

  • A short tutorial using screenshots of the device, the pop-up window and the corpora window, with numbered markers.
  • It covers the Live demo, the Max patch, teaching Magdalena, choosing chorales and reading the piano roll.
  • American spelling throughout the read-me and the hover text (color, favorite...).

Checks

  • npm test passes (247 tests).
  • The patch, bundle and personal-path checks are clean.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu


Generated by Claude Code

claude added 23 commits October 4, 2026 17:20
Max 9's [v8ui] answers a "summary" message itself, so the corpus
window's script never got it: the Max window said "unknown message
argument type" and "v8ui: bad arguments for message summary" each time
the list was shown (reported with the Bach Chorales Figured Bass corpus
on), and the line under the list stayed as it was. Renamed to "footer";
a test keeps scripts off the names Max keeps for itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
On a Mac, opening cento.maxpat didn't find ~/Documents/Cento: Max's
Folder object seems to list a folder's files only unless its typelist
asks for folders. listNames now lists twice (as it comes, then with
typelist ["fold"]). When no Cento folder is found, the Max window now
says so and where it looked, with how many names Max listed there (it
was silent in a clone of the repository).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
Before shipping, the panels follow the order you use them (M12):
- Composing panel: compose (the one strong blue button), seed, next and
  export midi on top; then chorales..., beats, chorale form; then
  stream, phrases, transpose, signatures; the status line; listening
  test... and a tools menu at the bottom.
- Tools menu: load a chorale (in C or A minor, or its own key), play the
  test phrase, stop and clear the queue. The Original Key switch is gone:
  the menu item says the key.
- Max version: plug-in instruments get their own window (set up...,
  emi.instruments); the panel keeps play, tempo, audio, output and the
  plug-in switch, and a line on hover help.
- Plain names: chorales..., chorale form, signatures, transpose,
  listening test..., keep, chance, taste report, write clips, test clips.
  Live's parameters keep their names, so mappings and automation in
  saved sets still work. Engine messages follow ("no chorales yet: click
  chorales and switch a folder on", "chance 0.50: ...").
- Grey headings (PLAY, COMPOSE, EMILY, CLIPS AND VOICES), one look per
  kind of control, "Press compose, then play." in an empty roll.
- The panels' piano roll is 260 px (it was 400): the pop-up window has
  the large one. The Live device is 884 px wide.
- Tests: every panel's controls fit inside it and none overlap; the tools
  menu, the instruments window and the renamed buttons are wired as
  before. docs/controls.md regenerated; README, the read-me, PLAN and the
  M11 and M12 checklists (new section 0) follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
The button and its window keep their M11 names: corpora, and the window
Cento: corpora. The engine's messages say so again ("no corpus: switch a
folder on in corpora", "no corpus yet: click corpora and switch a folder
on"); the hover text, docs/controls.md, README, read-me and checklists
follow. The rest of the GUI redesign stays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
The taste layer was called Emily, which reads as David Cope's Emily
Howell and says nothing about what it does. On screen it is now
Magdalena, after Anna Magdalena Bach, singer and copyist of Bach's
music:
- Her panel's heading is MAGDALENA, with "user's taste" beside it.
- The music you keep is Magdalena's notebook (her notebooks of 1722 and
  1725 collected the pieces she loved).
- The pop-up window has an explain Magdalena button: a small window
  (emi.magdalena, "Cento: about Magdalena") on who she is, what like,
  dislike, chance, keep, mix, novelty and snapshots do, and a credit to
  Cope's Emily Howell with the note that Cento is independent of him.
- Status lines, the Max window, the taste pane, hover texts,
  docs/controls.md, README, the read-me, the Cento folder's note, PLAN
  and the M12 checklist (section 0) say Magdalena.
Nothing inside is renamed: the emily-* modules, cento.emily.json, the
engine's messages and Live's parameters keep their names, so saved work
and mappings carry on. A test checks that no panel or window still says
Emily (Emily Howell aside).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
- Each part of the strip sits on a solid colour of its own (a [panel]
  behind everything, ignoring clicks): playing green (both versions'
  left panel), composing blue, Magdalena brown. Their labels and
  headings are light (the grey on dark was hard to read).
- Lighter secondary text in the pop-up window's taste pane, the corpus
  window and the piano roll (bar numbers, note names, the empty-roll
  hint).
- The pop-up window: the grey line beside each view's title now starts
  where the title ends; with the longer titles (Magdalena) it ran into
  them.
- chance is temperature again: the dial (now wide enough for the word),
  its hover text, the status line and the explanation.
- Tests: each section's [panel] covers it and its text is light; the
  overlap check leaves the panels out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
like and dislike are a little shorter, so the slider (its name and value
shown) fits between keep/window and taste report, which now spans the
panel. The parameter keeps its name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
Bottom right of the composing panel, beside the tools menu: on, a
chorale you load keeps its own key; off, it's moved to C major or A
minor (the default). It's the same Live parameter as before (Original
Key), restored from the settings file in the Max version. The tools menu
goes back to one "load a chorale..." item, which follows the switch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
patchers/ now holds only cento.maxpat, cento.brain.amxd and
cento.voice.amxd. The internal patches moved to patchers/parts/ and the
built scripts to patchers/scripts/. Max and Live find them when the
patchers row in File Preferences has Subfolders ticked (README Setup,
M12 checklist step 0). Frozen devices and the app embed everything, so
users of the download see no change. The corpus stays in corpus/.

- maxgen.py writes the internal patches to patchers/parts/
- build.js writes the bundles to patchers/scripts/
- emi-settings finds patchers/ from a patch in parts/
- tests: the new layout, and the engine running from parts/

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
- Every button is a live.text in button mode, like the switches. In
  Live, compose, next, like, dislike, keep and write clips can be
  mapped; the other buttons are hidden from mapping and automation.
- A dark row along the top names each section, centred above it (PLAY
  or CLIPS AND VOICES, COMPOSE, MAGDALENA, PIANO ROLL); the sections
  are 149 px high below it. "user's taste" sits under Magdalena's name.
- The listening test and the less-used tools (load a chorale with its
  original key switch, the test phrase, stop and clear) move from the
  shared panel to the Max version's more features window (emi.extras).
- Magdalena's panel: no taste report button (her one-line report
  stays); the temperature slider is tall enough for its name and value.
- No "rest the mouse" lines on panels or windows; the hover text stays.
- Piano roll: bar numbers, cadence triangles and Magdalena's dots each
  have a row of their own above the notes, so none covers another.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
The new layout (0.0 to 0.5) and the Cento folder (1.1 to 1.5) passed in
Max and Live. 1.6 (both products sharing the files) is not reported yet;
next, the freeze test and the rest of sections 2 to 6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
The pop-up window's button moves from Magdalena's panel to the right
end of the row of section names: an 18-px square with an arrow (no room
for a word), as high as the names. The piano roll's name stays centred,
clear of it. keep now spans Magdalena's panel.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
The left panel gives Magdalena's panel 40 px: PLAY 232 -> 192 px (Max),
CLIPS AND VOICES 170 -> 130 px (Live), Magdalena 130 -> 170 px. The Max
strip stays 946 px and the Live device 884 px. In Live, "all voices on
this track" is now "all voices here" to fit (its parameter keeps its
name, All Voices Here).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
Max wraps a comment as wide as its box in the patching view, so the
voice-tracks note in the Live panel (160 px there, 118 on show) ran off
the panel. Every comment on show is now as wide in the patching view as
on show, with presentation_linecount lines. Notes that were too long for
their boxes (the more features window, the pop-up window) are shorter,
and a test checks that every comment's text fits its box.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
The composing panel's main button says "update composition" (its Live
parameter keeps its name, Compose, so mappings still work); the top row
makes room for it. The pop-up window's reload seed, which sent the same
message, is now an update composition button of its own, in the same
blue. The empty piano roll says "Press update composition, then play."
A rough test checks that every button's label fits it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
Section 1 has passed in full. The freeze test (2.4) now says why frozen
devices remember earlier runs: the memory is in the Cento folder, which
every copy of Cento finds, not in the device; and the window button is
the square arrow at the top right.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
Frozen cento.brain and cento.voice, in a folder of their own with
patchers off the search path, compose, play, open their windows and find
the Cento folder (from the patch's folder). Recorded in the M12
checklist, in M0's results (spike d) and in the plan's status.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
The demo set, saved and collected from the frozen devices, opens and
plays on its own. Step 3.4 now says to tick Subfolders when putting the
patchers entry back, and the app's step 4.3 names every window to try.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
The Max download is now the patch: Cento Patch/ holds cento.maxpat and
every patch and script it uses, found by following its references, side
by side, so Max finds them with nothing on its search path. Nothing is
built in Max and there are no Gatekeeper steps; users need Max 9 (free;
no licence needed to run it).

- package.js: Cento-for-Max-vX.Y.Z.zip (--only live|max); the app's
  checks are gone; a missing part or script is reported
- tests: the patch's files (each once, none of Live's), the zip's
  listing, the engine running from the download's folder and finding
  Documents/Cento, and the read-me agreeing with the zip
- read-me (2b: install Max 9, open Cento Patch/cento.maxpat), release
  guide, M12 checklist (section 4: the patch from its zip), PLAN, README

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
- The read-me is reworked into a guided start: what Cento is, the Cento
  folder, the Live demo and the Max patch, a quick tour of the device
  (a screenshot with numbered markers), teaching Magdalena your taste
  (the large window, marked the same way), choosing chorales (the
  corpora window), keeping what you make, and reading the piano roll.
- The screenshots live in release/images/; npm run package puts them
  inside the read-me as data: URLs, so the read-me in a zip is one file.
  A picture the read-me shows that isn't there is reported.
- color, favorite, neighbor, license, gray... in the hover text, the
  read-me and the code; tests check the hover text and the read-me.
- The piano roll's hover text says keep, not accept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
Sections 4 to 6 of the M12 checklist passed on the Mac: Cento for Max
from its zip, the two zips, and a newcomer hearing a piece from the
read-me alone. The README links to the latest release, and PLAN.md and
the README say M12 passed; v0.1.0 is next, from main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qc2Gb9RBL6vFmghUimczFu
@nnokes
nnokes merged commit 6302656 into main Oct 5, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants