You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bach Italian Concerto scenario (demo/scenarios/bach-italian-3rd.sh):
- Shift drums 15 s earlier (fill_wait 45→30) and use `sweep_pad` for
audible cutoff/resonance motion during the intro — same helper the
acid demo uses.
- Bring back the BassPan LFO (pan-only is clean; cutoff/resonance LFOs
clicked).
- Lock the missing `sequencer.bass{2,3,4}_steps` paths — the planner
was running bass1/bass2 lanes on the KIT agent and the step arrays
were the one slot not explicitly blocked.
- Stage 3 "full stop" another 6 s earlier (21 s of MIDI-end headroom).
- Punchier FX targets at each stage — bitcrush wasn't audible at the
previous subtle values.
Sequencer card height (src/ui/rack_grid.rs):
- `sequencer_grid_rows` now mirrors what the panel actually renders:
gates modules on reaches_master (not just enabled), budgets the
collapsed drum-chip strip, and accounts for the separator row that
precedes drum voices. Fixes the "sequencer content hidden behind
empty cell backgrounds" problem where a patched-but-unwritten drum
kit pushed its collapsed chips past the card boundary.
Song timeline + bass lock list UI (src/ui/panels/sequencer_chain.rs,
src/ui/panels/bass_locks.rs):
- Song-timeline bars fill the available panel width dynamically
instead of a hard-coded 12-bar window; painter switched to the
parent layer so 1.5 px cursor strokes don't get half-clipped.
- Bass LOCKED strip wraps inside the module width with
`horizontal_wrapped`, so a long scenario lock list no longer
distorts the bass panel.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# ── Scene 2: Play + PAD agent ───────────────────────────────────────────────
143
+
# ── Scene 2: Play ──────────────────────────────────────────────────────────
144
+
# No PAD agent. The three LFOs configured in Setup sweep pan /
145
+
# cutoff / resonance natively — that's the filter performance.
146
+
# AI narrative for this scenario lives on the KIT + FX agents added
147
+
# below.
115
148
116
149
scene "Play"
117
150
118
151
look_at sequencer
119
152
play
120
153
121
-
add_agent PAD gemma bass
122
-
wait_for_model
123
-
124
-
# PAD's ONLY remit: squelch the filter (cutoff + resonance). No pan
125
-
# (LFO owns it), no notes, no patterns, no anything else. Bar-based
126
-
# ramps so the motion develops across pattern cycles, not bumps.
127
-
ask "PAD: squelch the 303 filter across the Bach outro. Move ONLY cutoff and resonance — everything else is locked or off-limits. Cutoff in [0.05, 0.55], resonance in [0.70, 1.0]. Keep voice 0 and voice 1 within 0.12 of each other so the two hands read as one squelching instrument.
128
-
129
-
Use \`ramps\` with \`bars\`: 4 or 8. Never step-jump. Example per turn:
Each next cycle, re-target to new corners of the cutoff/resonance pad so the motion is a continuous drift. DO NOT touch: notes, steps, patterns, gate, accent, slide, volume, pan, distortion, env_mod, decay. DO NOT add ramps for any of those. Cutoff + resonance on both voices — that is your entire scope." PAD 0
139
-
140
154
# ── Scene 3: Drums arrive (+60s) ────────────────────────────────────────────
141
-
# Deterministic half-time kick + hat pattern via direct api_params.
142
-
# No KIT agent — the pattern is fixed, the scene is just showing the
143
-
# 808 layering in. chain_advance_preserve_non_bass carries the
144
-
# drums across bank swaps so they play for the rest of the piece.
155
+
# KIT writes a 32-step half-time pulse under the 240 BPM bass, and
156
+
# gets re-asked twice during the outro so the groove evolves rather
157
+
# than loops unchanged. Scope=kit_a keeps it away from the bass
158
+
# sequencer. chain_advance_preserve_non_bass carries the drums
159
+
# across bank swaps so they play for the rest of the piece.
145
160
146
161
scene "Drums arrive"
147
162
148
-
# 60 s of Bach + PAD-driven filter drift before the 808 layers in.
149
-
# Scroll around instead of staring at one place: filter pad → agent
150
-
# console → back-panel cable tour → front → sequencer, then the 808
151
-
# arrival reads as a deliberate reveal after the camera tour.
152
-
fill_wait 60
163
+
# 30 s of Bach before the 808 layers in. Smoothly sweep the filter
164
+
# pad via the shared `sweep_pad` helper — same motion the intro /
165
+
# default acid demo uses, lerped keyframes at ~7.5 fps so cutoff and
166
+
# resonance move together in a visible arc on the XY pad. No LFO
167
+
# (LFOs on BassCutoff kept clicking on note retriggers); this is
168
+
# pure scripted api_params inside the helper, which we've proven
169
+
# doesn't click. `sweep_pad` writes to voice 0 only (matches the
170
+
# acid demo) — voice 1 stays at defaults so the left-hand line keeps
171
+
# a stable timbre under the sweeping right hand.
172
+
look_at bass
173
+
wait_seconds 4
174
+
sweep_pad 22
175
+
look_at sequencer
176
+
wait_seconds 4
153
177
154
178
add_instrument 808
155
179
show_then_return 808 5
156
180
157
-
# Bass 2× drums — Bach stays centre-stage. Tuned well below the
158
-
# intro mix because the filter sweep can get loud on resonance peaks.
# KIT writes a half-time pulse that feels like 120 under the running
165
-
# 240 BPM bass. Scope=kit_a keeps it away from the bass sequencer.
166
-
# Pattern is deliberately specific — kick on 0/8, closed hat on 4/12
167
-
# of a 16-step loop — so the first response has concrete targets
168
-
# instead of drifting to a full 4-on-the-floor that'd overwhelm Bach.
169
-
ask "KIT: half-time drums under a 240 BPM Bach outro. Kit_a only, 16-step loop. Kick on steps 0 and 8 ONLY (not every 4 — that's too dense at this tempo). Closed hi-hat on steps 4 and 12. NO snare on 2 and 4 — this is not pop. Add one or two quiet ghost hits somewhere unusual for texture (a soft hat on a weird step, or a single tom ping). Everything quiet, velocity ~0.4 max. The drums should feel half the speed of the bass — a slow pulse under a running melodic line, not a dance beat. DO NOT touch kit_b / hoover / an1x / bass — kit_a only." KIT 0
193
+
# First ask: sparse 32-step half-time pulse. Explicit step targets so
194
+
# the model has concrete positions instead of drifting to a dense
195
+
# 4-on-the-floor that'd bury Bach.
196
+
ask "KIT: half-time drums under a 240 BPM Bach score. Kit_a only, 32-step loop (two bars). Kick on steps 0, 8, 16, 24. Closed hi-hat on steps 4, 12, 20, 28. NO snare on 2 and 4 — this is not pop. Add two or three quiet ghost hits somewhere unusual for texture across the 32 steps (a soft hat on a weird step, a single tom ping, a muted kick). Everything quiet, velocity ~0.4 max. Half the speed of the bass — a slow pulse under a running melodic line, not a dance beat. DO NOT touch kit_b / hoover / an1x / bass — kit_a only." KIT 0
170
197
171
198
# ── Scene 4: FX outro ───────────────────────────────────────────────────────
172
-
# One FX agent, tight scope: reverb + bitcrush only. Three asks
173
-
# ~30 s apart so the escalation reads as a progression, and the
174
-
# camera stays on the FX module after each ask so you can see the
175
-
# bitcrush wet knob swing.
199
+
# FX is now DRIVEN DIRECTLY from bash via api_params, not by an FX
200
+
# agent. Reason: the FX lane of Gemma 4 reliably emits `reverb_*`
201
+
# and `ring_mod_*` but never `bitcrush_*` in its raw output, no
202
+
# matter how explicitly the prompt spells the field names. Three
203
+
# consecutive prior recordings all had bitcrush stuck at its default
204
+
# (rate = 0, mix = 0) because the agent never wrote the keys.
205
+
# Scripted api_params gives a predictable escalation — three nudges,
206
+
# roughly 30 s apart, with each one bumping the three bitcrush
207
+
# channels together so the crunch builds audibly into the ending.
176
208
177
209
scene "FX outro"
178
210
179
-
FX_START_OFFSET=$(echo "$PLAY_DURATION - 60 - 90"| bc -l)
211
+
# Align FX outro so stage 3 ends ~21 s before the MIDI's natural stop
212
+
# (previous cut used 15 s of headroom; TTS was still landing 6 s
213
+
# after music, so another 6 s earlier). Stages are 30 + 30 + 32 =
214
+
# 92 s; drums phase was 30 s; everything else comes out of this
215
+
# pre-FX fill.
216
+
FX_START_OFFSET=$(echo "$PLAY_DURATION - 30 - 92 - 21"| bc -l)
180
217
# Long stretch between drums-arrive and FX-outro — fill it with
181
218
# camera motion instead of staring at the sequencer.
182
219
fill_wait "$FX_START_OFFSET"
183
220
221
+
# Add the visible FX modules. Both reverb and bitcrush are drawn to
222
+
# the rack so what the viewer sees matches what they hear — the bus
223
+
# DSP runs reverb unconditionally whenever fx.reverb_mix > 0, so
224
+
# without a reverb module visible the previous take had "invisible
225
+
# reverb". Other FX channels are locked above so nothing else
226
+
# audible can sneak in.
227
+
add_effect reverb
228
+
show_then_return reverb 4
229
+
enable_fx reverb
184
230
add_effect bitcrush
185
231
show_then_return bitcrush 4
186
-
# Flip bitcrush on — it was added disabled by default so the module
187
-
# could sit in the rack briefly without clicking the signal. The FX
188
-
# agent's ramps below then have something to affect.
189
232
enable_fx bitcrush
190
233
191
-
add_agent FX gemma fx
234
+
# FX field-name note: state keys are `fx.bitcrush_mix`,
# `fx.reverb_size`. `bitcrush_bits` is INVERTED: 1.0 = full quality
237
+
# (bypass), 0.0 = 1-bit. So "more crunch" means bits DOWN.
192
238
193
-
# Stage 1: gentle.
194
-
ask "FX: outro starts now. Nudge reverb_mix up to about 0.30 and lengthen reverb_size a touch. Bring bitcrush in light: wet around 0.20, bit_depth_reduction around 0.30, sample_rate_reduction around 0.25. Leave delay / chorus / phaser / eq / compressor ALONE — this scenario only uses reverb and bitcrush. Use ramps with bars: 4 for every move." FX 0
ask "KIT: evolve the 32-step groove. Keep it sparse and half-time (kick on 0/8/16/24 still anchors it), but add a couple of extra ghost kicks or off-grid hats — maybe an anticipation before the downbeat (step 7 or 23), or a pair of 16th hats somewhere in the second bar. Still no backbeat snare. 32-step loop, velocities ~0.4 max, kit_a only." KIT 0
195
246
196
247
look_at fx
197
248
wait_seconds 30
198
249
199
-
# Stage 2: dirtier.
200
-
ask "FX: stage two. Push bitcrush harder — wet 0.55, bit_depth_reduction 0.60, sample_rate_reduction 0.55. Raise reverb_mix another step to about 0.45. Still reverb + bitcrush only — nothing else. Ramps with bars: 4." FX 0
ask "KIT: push the groove further. Stay 32 steps, half-time, kit_a only. Vary the kick placement (can drop one of 0/8/16/24 for a breath, add one at 11 or 27 for tension), let the hats get a bit more active in the second bar. One sparse snare ghost is allowed now — somewhere unexpected like 14 or 22, never on 4 or 12. Velocities still quiet." KIT 0
201
253
202
254
look_at fx
203
255
wait_seconds 30
204
256
205
-
# Stage 3: full chaos.
206
-
ask "FX: final stage. Bitcrush cranked: wet 0.85+, bit_depth_reduction 0.90, sample_rate_reduction 0.85. Reverb_mix to 0.70 with reverb_size close to 1.0 for a cavernous tail. Reverb + bitcrush ONLY. Ramps with bars: 2 or 4 for a faster collapse into the final bars." FX 0
257
+
# Stage 3: full chaos — hard digital crunch + cavernous reverb.
258
+
# Stage 3 is 32 s so the final bitcrush values sit long enough to
259
+
# actually register as the "collapse" moment of the piece.
0 commit comments