diff --git a/releases/16_the_bells/images/leds.svg b/releases/16_the_bells/images/leds.svg index 6628f72ee..1ba6c9688 100644 --- a/releases/16_the_bells/images/leds.svg +++ b/releases/16_the_bells/images/leds.svg @@ -1,17 +1,17 @@ - + - - Main knob — method select + + + Main knob — method select + @@ -41,8 +43,10 @@ - - Plain Hunt Minimus [4] + + + Plain Hunt Minimus [4] + @@ -50,8 +54,10 @@ - - Grandsire Doubles [5] + + + Grandsire Doubles [5] + @@ -59,8 +65,10 @@ - - Plain Bob Doubles [5] + + + Plain Bob Doubles [5] + @@ -68,8 +76,10 @@ - - Plain Hunt Doubles [5] + + + Plain Hunt Doubles [5] + @@ -77,8 +87,10 @@ - - Reverse Canterbury Doubles [5] + + + Reverse Canterbury Doubles [5] + @@ -86,8 +98,10 @@ - - St Martins Doubles [5] + + + St Martins Doubles [5] + @@ -95,8 +109,10 @@ - - St Simons Doubles [5] + + + St Simons Doubles [5] + @@ -104,8 +120,10 @@ - - Stedman Doubles [5] + + + Stedman Doubles [5] + @@ -113,8 +131,10 @@ - - Plain Bob Minor [6] + + + Plain Bob Minor [6] + @@ -122,8 +142,10 @@ - - St Clements Minor [6] + + + St Clements Minor [6] + @@ -131,8 +153,10 @@ - - Grandsire Triples [7] + + + Grandsire Triples [7] + @@ -140,130 +164,166 @@ - - Plain Bob Triples [8] - - - X knob — scale - - - - - - - - - Major - - - - - - - - - Minor - - - - - - - - - Pentatonic Major - - - - - - - - - Pentatonic Minor - - - - - - - - - Blues - - - - - - - - - Chromatic - - - Y knob — clock divide/multiply - - - - - - - - - /8 - - - - - - - - - /4 - - - - - - - - - /2 - - - - - - - - - x1 - - - - - - - - - x2 + + + Plain Bob Triples [8] + - - - - - - - - x4 + + + + Y knob — scale + + + + + + + + + + + Major + + + + + + + + + + + Minor + + + + + + + + + + + Pentatonic Major + + + + + + + + + + + Pentatonic Minor + + + + + + + + + + + Blues + + + + + + + + + + + Chromatic + + - - - - - - - - x8 + + + + X knob — clock divide/multiply + + + + + + + + + + + /8 + + + + + + + + + + + /4 + + + + + + + + + + + /2 + + + + + + + + + + + x1 + + + + + + + + + + + x2 + + + + + + + + + + + x4 + + + + + + + + + + + x8 + + \ No newline at end of file diff --git a/releases/16_the_bells/info.yaml b/releases/16_the_bells/info.yaml index 3226328ce..c55b2870a 100644 --- a/releases/16_the_bells/info.yaml +++ b/releases/16_the_bells/info.yaml @@ -1,13 +1,22 @@ -draft: true +draft: false Name: The Bells short-description: Bellringing methods sequencer — 12 change-ringing methods with tempo and jitter, quantised to six scales +summary: | + A bellringing methods sequencer: plays 12 traditional English change-ringing methods + (Plain Hunt Minimus through Plain Bob Triples, 4-7 bells), sending each row of the + method as a v/oct pitch sequence quantised to one of six scales, with a synchronised + gate pulse per bell strike. Intended to drive oscillators or other CV inputs that can + respond to permutation patterns. + + Z switch selects mode: Up = Play, Middle = Stop, Down (hold) = Edit. While held down, + turning a knob selects that knob's edit-mode parameter (method / clock divide / scale); + releasing Z returns to Play/Stop with the new parameter applied. Language: C++ (ComputerCard) Creator: James Saunders Version: 1.0.0 Status: Released date-created: 2026-06-27 date-updated: 2026-06-30 - tags: - sequencer - campanology @@ -16,17 +25,6 @@ tags: - scale - generative -summary: | - A bellringing methods sequencer: plays 12 traditional English change-ringing methods - (Plain Hunt Minimus through Plain Bob Triples, 4-7 bells), sending each row of the - method as a v/oct pitch sequence quantised to one of six scales, with a synchronised - gate pulse per bell strike. Intended to drive oscillators or other CV inputs that can - respond to permutation patterns. - - Z switch selects mode: Up = Play, Middle = Stop, Down (hold) = Edit. While held down, - turning a knob selects that knob's edit-mode parameter (method / clock divide / scale); - releasing Z returns to Play/Stop with the new parameter applied. - panel: outputs: - id: CVOut1 @@ -58,7 +56,7 @@ controls: y: name: Covering Tenor description: Same as Play - - when: { z: down, gesture: hold } + - when: { z: down } main: name: Method Select description: Chooses one of 12 change-ringing methods (see manual for full list); takes effect at the next row boundary @@ -69,10 +67,27 @@ controls: name: Scale Select description: Six scales — Major, Minor, Pentatonic Major, Pentatonic Minor, Blues, Chromatic + switch: + up: + name: Play + description: Run the selected change-ringing method + middle: + name: Stop + description: Halt the sequence; tempo, jitter, and covering tenor remain live + down: + name: Edit + description: Hold to edit — Main selects method, X clock divide/multiply, Y scale; release to apply + leds: - when: { z: up } - display: custom - description: Bells 1-6 shown as a single lit LED matching the bell number; bells 7-8 shown as a single unlit LED among the rest (mirrored), since only 6 LEDs are available - - when: { z: down, gesture: hold } - display: custom - description: Same 1-6-lit / 7-12-mirrored scheme, showing the currently selected method (1-12), clock divide step, or scale, depending on which knob last moved + display: list + items: + - id: LED0 + name: Bell / row + description: Bells 1-6 shown as a single lit LED matching the bell number; bells 7-8 shown as a single unlit LED among the rest (mirrored), since only 6 LEDs are available + - when: { z: down } + display: list + items: + - id: LED0 + name: Edit value + description: Same 1-6-lit / 7-12-mirrored scheme, showing the currently selected method (1-12), clock divide step, or scale, depending on which knob last moved diff --git a/releases/36_GradualProcess/36_GradualProcess.pdf b/releases/36_GradualProcess/36_GradualProcess.pdf new file mode 100644 index 000000000..207347f0f Binary files /dev/null and b/releases/36_GradualProcess/36_GradualProcess.pdf differ diff --git a/releases/36_GradualProcess/GradualProcess.uf2 b/releases/36_GradualProcess/GradualProcess.uf2 index 96042b3dd..7a3c170df 100644 Binary files a/releases/36_GradualProcess/GradualProcess.uf2 and b/releases/36_GradualProcess/GradualProcess.uf2 differ diff --git a/releases/36_GradualProcess/GradualProcess1.0.3.uf2 b/releases/36_GradualProcess/GradualProcess1.0.3.uf2 new file mode 100644 index 000000000..475cdc33c Binary files /dev/null and b/releases/36_GradualProcess/GradualProcess1.0.3.uf2 differ diff --git a/releases/36_GradualProcess/info.yaml b/releases/36_GradualProcess/info.yaml index 165a50d3f..7ae3eeab1 100644 --- a/releases/36_GradualProcess/info.yaml +++ b/releases/36_GradualProcess/info.yaml @@ -1,13 +1,22 @@ -draft: true +draft: false Name: GradualProcess -short-description: Three generative composition processes (Glass, Reich, Tintinnabuli) in one card, chosen by Main's position at power-on +short-description: Three generative composition processes (Glass, Reich, Pärt) in one card, chosen by Main's position at power-on +summary: | + A multi-process card: three independent generative composition processes live in one + firmware image, and which one runs is chosen by the Main knob's position at power-on + (or reset) — CCW third = Glass, middle third = Reich, CW third = Pärt. LEDs + briefly flash to confirm the selection (~0.5s) before it starts. The choice latches for + that session; to switch, set Main to a different zone and power-cycle/reset again. All three processes share the same Z-switch convention (Up = Play, Middle = Stop, Down + held = Settings), the same 6-scale system (Major, Minor, Pentatonic Major, Pentatonic + Minor, Blues, Chromatic) on Y while Z is held, and the same 7-step clock divide/multiply + (/8 /4 /2 x1 x2 x4 x8) on X while Z is held — only the Play-mode controls and outputs + differ between them, described per-process below. Language: C++ (ComputerCard) Creator: James Saunders Version: 1.0.0 Status: Released date-created: 2026-07-04 date-updated: 2026-07-06 - tags: - generative - sequencer @@ -16,139 +25,174 @@ tags: - harmony - multi-mode -summary: | - A multi-process card: three independent generative composition processes live in one - firmware image, and which one runs is chosen by the Main knob's position at power-on - (or reset) — CCW third = Glass, middle third = Reich, CW third = Tintinnabuli. LEDs - briefly flash to confirm the selection (~0.5s) before it starts. The choice latches for - that session; to switch, set Main to a different zone and power-cycle/reset again. +# Three power-on modes → three custom panels (see panels/manifest.yaml). +# Glass is the unconditioned base for shared sockets where labels match; Reich and +# Pärt override jacks/knobs that differ. Z Play/Stop/Settings are documented in +# controls.switch (when.z cannot combine with when.panel). +panel: + inputs: + - id: PulseIn1 + when: { panel: glass } + name: Remove Unit + type: pulse + description: Debounced trigger; removes the most recently added unit (minimum 1 unit) + - id: PulseIn2 + when: { panel: glass } + name: Add Unit + type: pulse + description: Debounced trigger; appends a freshly-generated unit - All three processes share the same Z-switch convention (Up = Play, Middle = Stop, Down - held = Settings), the same 6-scale system (Major, Minor, Pentatonic Major, Pentatonic - Minor, Blues, Chromatic) on Y while Z is held, and the same 7-step clock divide/multiply - (/8 /4 /2 x1 x2 x4 x8) on X while Z is held — only the Play-mode controls and outputs - differ between them, described per-process below. + outputs: + # Glass (default panel) — additive process after Philip Glass + - id: CVOut1 + when: { panel: glass } + name: Pitch + type: cv + description: v/oct pitch of the current phrase + - id: CVOut2 + when: { panel: glass } + name: Inversion + type: cv + description: Tonal inversion of CV Out 1 (each scale degree mirrored around the tonic), in rhythmic unison with CV Out 1 + - id: PulseOut1 + when: { panel: glass } + name: Gate + type: pulse + description: ~10ms trigger, shared by both CV outputs since they always change together + - id: PulseOut2 + when: { panel: glass } + name: Phrase Sync + type: pulse + description: ~10ms pulse once at the start of each loop of the current phrase + + # Reich — discrete and gradual phasing + - id: CVOut1 + when: { panel: reich } + name: Voice 1 Pitch + type: cv + description: v/oct pitch, read from the primary beat position + - id: CVOut2 + when: { panel: reich } + name: Voice 2 Pitch + type: cv + description: v/oct pitch, same pattern, read from Voice 2's independently-clocked beat position + - id: PulseOut1 + when: { panel: reich } + name: Voice 1 Gate + type: pulse + description: ~10ms trigger on each Voice 1 note + - id: PulseOut2 + when: { panel: reich } + name: Voice 2 Gate + type: pulse + description: ~10ms trigger on each Voice 2 note — independent of Pulse Out 1 whenever the voices land on different beats + + # Pärt — tintinnabuli melody + harmony + - id: CVOut1 + when: { panel: part } + name: M-Voice Pitch + type: cv + description: v/oct melody pitch + - id: CVOut2 + when: { panel: part } + name: T-Voice Pitch + type: cv + description: v/oct harmony pitch from the tonic triad per the current harmonisation type — never in unison with the melody + - id: PulseOut1 + when: { panel: part } + name: M-Voice Gate + type: pulse + description: Sustained high for the note's full held duration, with a brief ~5ms low retrigger blip at the start of every new note + - id: PulseOut2 + when: { panel: part } + name: T-Voice Gate + type: pulse + description: Identical timing to Pulse Out 1 — the two voices always attack and release together + +controls: + switch: + up: + name: Play + description: Run the selected process + middle: + name: Stop + description: Halt playback + down: + name: Settings + description: > + Hold for settings — X = clock divide/multiply (/8…x8), Y = scale select + (Major, Minor, Pentatonic Major/Minor, Blues, Chromatic). Main is + process-specific while held: unused in Glass; Phrase Length (4–20 beats) + in Reich; Harmonisation Type in Pärt. Mode itself is chosen by Main's + third at power-on (CCW Glass / mid Reich / CW Pärt). + + knobs: + - when: { panel: glass } + main: + name: Tempo + description: Always active in Play. Additive-process phrase after Glass's Music in Similar Motion — grows/shrinks one melodic unit at a time. + x: + name: Clock Divide (Z hold) + description: Unassigned in Play. While Z is held — seven steps /8 /4 /2 x1 x2 x4 x8. + y: + name: Add/Remove Unit + description: > + Play — zone gesture: flick CW past ~2/3 and back to centre to add a unit; + flick CCW past ~1/3 and back to remove one. While Z is held — Scale Select + (six scales). -# This card runs three independent processes rather than one fixed control layout, so -# the usual single "controls:" block doesn't apply cleanly — each process's controls, -# outputs and LED behaviour are listed under its own entry below instead. -processes: - - id: Glass - description: > - Additive-process pitch sequencer after Philip Glass's "Music in Similar Motion". - A phrase is built from short melodic cells drawn from the piece's own vocabulary - (steps, runs, and one characteristic leap), concatenated into a looping contour - that grows or shrinks one unit at a time. - outputs: - - id: CVOut1 - name: Pitch - description: v/oct pitch of the current phrase - - id: CVOut2 - name: Inversion - description: Tonal inversion of CV Out 1 (each scale degree mirrored around the tonic), in rhythmic unison with CV Out 1 - - id: PulseOut1 - name: Gate - description: ~10ms trigger, shared by both CV outputs since they always change together - - id: PulseOut2 - name: Phrase Sync - description: ~10ms pulse once at the start of each loop of the current phrase - controls: - - when: { z: up } - main: { name: Tempo, description: Always active } - x: { name: unassigned } - y: - name: Add/Remove Unit - description: Zone gesture — flick CW past ~2/3 travel and back to centre to add a unit; flick CCW past ~1/3 and back to remove one - pulseIn1: { name: Remove Unit, description: Debounced trigger; removes the most recently added unit (minimum 1 unit) } - pulseIn2: { name: Add Unit, description: Debounced trigger; appends a freshly-generated unit } - - when: { z: down, gesture: hold } - x: { name: Clock Divide/Multiply, description: /8 /4 /2 x1 x2 x4 x8 } - y: { name: Scale Select, description: Six scales } - leds: - - when: { z: any } - display: custom - description: Current unit count, 1-6-lit / 7-12-mirrored scheme (7-12 possible since each unit is 1-4 notes); scale/clock-divide shown instead while Z is held + - when: { panel: reich } + main: + name: Tempo / Phrase Length + description: > + Play — tempo (always active). While Z is held — Phrase Length 4–20 beats + (preset only; takes effect on the next fresh Play). + x: + name: Gradual Phase Drift + description: > + Play — three zones (CCW/centre/CW). CW makes Voice 2's clock run slightly + faster than Voice 1, drifting a full beat every ~8–12 phrase repeats; CCW + mirrors. Drift is sticky through the current beat. While Z is held — + clock divide/multiply (/8…x8). + y: + name: Stepped Phase Shift + description: > + Play — flick CW and back to step Voice 2 one beat later; flick CCW and back + one beat earlier. If an X drift is still running, the flick quick-locks it. + While Z is held — Scale Select (six scales). - - id: Reich - description: > - Discrete-and-gradual phasing sequencer after Steve Reich's phase pieces (Piano - Phase, Clapping Music). A fixed-length pattern (4-20 beats, default 12) built from - 1/2/3-beat note groups each followed by a rest is read by two independent, - normally-synchronised clocks, whose relationship can be shifted instantly or - drifted gradually. - outputs: - - id: CVOut1 - name: Voice 1 Pitch - description: v/oct pitch, read from beat position `currentBeat` - - id: CVOut2 - name: Voice 2 Pitch - description: v/oct pitch, same pattern, read from its own independently-clocked beat position - - id: PulseOut1 - name: Voice 1 Gate - description: ~10ms trigger on each Voice 1 note - - id: PulseOut2 - name: Voice 2 Gate - description: ~10ms trigger on each Voice 2 note — independent of Pulse Out 1 whenever the voices land on different beats - controls: - - when: { z: up } - main: { name: Tempo, description: Always active } - x: - name: Gradual Phase Drift - description: > - Three zones (CCW/centre/CW). CW makes Voice 2's clock run very slightly - faster than Voice 1's, gradually drifting a full beat out of phase every - ~8-12 phrase repeats; CCW mirrors this, drifting the other way. The drift - is "sticky" through the current beat regardless of where X moves in the - meantime, and is only re-evaluated against X's zone once that beat - completes (continues if X is still off-centre, locks if centred). - y: - name: Stepped Phase Shift - description: > - Zone gesture — flick CW and back to centre to step Voice 2 one beat later; - flick CCW and back to step it one beat earlier. If a gradual X drift is - still running when Y is flicked, that flick is a "quick lock": it completes - the in-progress drift immediately and locks there, rather than performing - its own independent step. - - when: { z: down, gesture: hold } - main: { name: Phrase Length, description: 4-20 beats, preset only (not live during playback); takes effect on the next fresh Play } - x: { name: Clock Divide/Multiply, description: /8 /4 /2 x1 x2 x4 x8 } - y: { name: Scale Select, description: Six scales } - leds: - - when: { z: any } - display: bar_graph - description: How far Voice 2 has drifted from unison with Voice 1 — more LEDs lit the further out of phase, symmetric in both directions, 0 lit at unison; phrase length/clock-divide/scale shown instead while Z is held + - when: { panel: part } + main: + name: Tempo / Harmonisation + description: > + Play — tempo (always active). While Z is held — Harmonisation Type, six + zones CCW→CW: inf-2nd, inf-1st, alt-2nd, alt-1st, sup-1st, sup-2nd. + x: + name: Clock Divide (Z hold) + description: Unassigned in Play. While Z is held — seven steps /8 /4 /2 x1 x2 x4 x8. + y: + name: Scale (Z hold) + description: > + Unassigned in Play. While Z is held — Scale Select; also sets the tonic + triad (major-family scales use a major triad; minor-family and blues use a + minor triad). - - id: Tintinnabuli - description: > - Melody-and-harmony generator after Arvo Part's tintinnabuli technique. An M-voice - (melody) walks mostly stepwise through the active mode with occasional held notes; - a T-voice (tintinnabuli) sounds a note from the fixed tonic triad at every melody - attack, chosen by its position relative to the melody pitch. - outputs: - - id: CVOut1 - name: M-Voice Pitch - description: v/oct melody pitch - - id: CVOut2 - name: T-Voice Pitch - description: v/oct harmony pitch, derived from the M-voice per the current harmonisation type — never in unison with the melody - - id: PulseOut1 - name: M-Voice Gate - description: Sustained high for the note's full held duration, with a brief ~5ms low retrigger blip at the start of every new note - - id: PulseOut2 - name: T-Voice Gate - description: Identical timing to Pulse Out 1 — the two voices always attack and release together - controls: - - when: { z: up } - main: { name: Tempo, description: Always active } - x: { name: unassigned } - y: { name: unassigned } - - when: { z: down, gesture: hold } - main: - name: Harmonisation Type - description: Six zones, CCW to CW — inf-2nd, inf-1st, alt-2nd, alt-1st, sup-1st, sup-2nd (inferior/alternating/superior direction, x 1st/2nd triad position) - x: { name: Clock Divide/Multiply, description: /8 /4 /2 x1 x2 x4 x8 } - y: { name: Scale Select, description: Six scales — also sets the tonic triad (major-family scales use a major triad, minor-family and blues use a minor triad) } - leds: - - when: { z: any } - display: custom - description: Current harmonisation type (single LED, 1-6); clock-divide/scale shown instead while Z is held + leds: + - when: { panel: glass } + display: list + items: + - id: LED0 + name: Unit count + description: Current unit count, 1–6 lit / 7–12 mirrored; scale/clock-divide shown instead while Z is held + - when: { panel: reich } + display: list + items: + - id: LED0 + name: Phase offset + description: How far Voice 2 has drifted from unison — more LEDs lit the further out of phase, 0 at unison; phrase length/clock-divide/scale while Z is held + - when: { panel: part } + display: list + items: + - id: LED0 + name: Harmonisation + description: Current harmonisation type (single LED, 1–6); clock-divide/scale shown instead while Z is held diff --git a/releases/36_GradualProcess/panels/manifest.yaml b/releases/36_GradualProcess/panels/manifest.yaml new file mode 100644 index 000000000..7991570f7 --- /dev/null +++ b/releases/36_GradualProcess/panels/manifest.yaml @@ -0,0 +1,23 @@ +version: 1 +default: glass + +# Three power-on modes (Main knob third at boot), three panels. Glass is the +# default CCW third; Reich is middle; Pärt is CW. Labels that differ per mode +# use when.panel in info.yaml; shared Z-switch semantics live in controls.switch. +# +# Images/content are generated from those entries (`image: auto` / `content: auto`). +panels: + - id: glass + name: "Glass (additive)" + image: auto + content: auto + + - id: reich + name: "Reich (phasing)" + image: auto + content: auto + + - id: part + name: "Pärt (tintinnabuli)" + image: auto + content: auto