frZone is a Processing instrument for frequency-zone analysis with two deliberate operating modes:
- Generic classroom mode keeps the sketch standalone and tweakable for teaching thresholds, hysteresis, cooldown, and routing basics.
- Rig-tuned mode turns the sketch into the
live-riganalysis sibling: a committed, additive analysis lane that mirrors the authority snapshot and emits the canonical Ch 15 controls.
- Generic classroom mode
- IAC-targeted MIDI out with editable per-band notes and CCs
- Legacy OSC streams
/bandEnergyand/bandTrigger - MIDI hello pulse for confirming blind visual receivers are connected
- MIDI learn burst for quick patch checks
- Save/load of classroom mappings in
processing/FreqZone/data/mapping.json
- Rig-tuned mode
- Canonical analysis lane on MIDI Ch 15
- Canonical CCs 20 / 22 / 23 / 24 for
analysis.low_band,analysis.mid_band,analysis.upper_mid_band, andanalysis.high_band - Semantic OSC aliases
/analysis/<band>plus/analysis/trigger/<band> - Committed authority mirror at
atlas/live-rig.default.json - Committed rig profile at
interop/frzone.rig.json
- Install Processing (Java mode). In Contribution Manager, add Minim and oscP5.
- Open
processing/FreqZone/FreqZone.pdeand press ▶. - Optional: put
your_audio.mp3inprocessing/FreqZone/data/, press P in File mode. - Enable IAC Driver (macOS: Audio MIDI Setup → MIDI Studio). The sketch auto‑targets ports matching
"IAC". - For rig-tuned mode, set
RIG_TUNED_MODE = truenear the top of the sketch, then validate the committed contract files withpython3 tools/validate_rig_alignment.py.
Want the classroom-ready mental model? Start with Per-frame signal flow — it walks through the exact draw() loop and calls out the identifiers you can grep while hacking.
Keys:
1/2 band select · [ / ] threshold · ; / ' hysteresis · , / . cooldown · - / = note · c/C CC · i solo selected band (OSC/MIDI only) · G MIDI hello · B burst · S/O save/load · t/T transpose · d/D list/cycle MIDI outs · L live/file · P play · SPACE OSC toggle · M MIDI toggle
In rig-tuned mode the note/CC remap, burst-learn, and save/load controls are intentionally locked so the committed analysis lane stays canonical. G still sends a MIDI hello on the canonical CC lane so you can confirm the route without changing mappings.
- Start with the comments in the sketch. Everything documented there reflects the current defaults. If you fork this for a class, narrate those comments live so your cohort knows the code matches what they're hearing.
- Run a "threshold relay" exercise. Pair students up; one drives the knobs while the other narrates what the sketch reports. Swap roles every five minutes. This keeps the vocabulary honest and matches the hysteresis logic in the code.
- Use MIDI hello as a signal routing check. The
Gkey sends a short pulse on the active MIDI lanes, which is useful for Signal Culture apps that receive MIDI blindly. UseBwhen you specifically want a MIDI-learn burst in generic mode. - Document your own band presets. Have the class export
mapping.json(pressS). Stash those files in a shared drive so future cohorts can remix previous work. The defaults are intentionally "good enough" but not perfect, so everyone practices refinement.
live-rig treats frZone as the analysis sibling only: it owns normalized band analysis and must remain additive rather than scene-defining. The local contract surface for that mode lives here:
atlas/live-rig.default.json— committed mirror of the authority snapshotatlas/interop.yaml— repo role and interface statementinterop/frzone.rig.json— committed rig profile for the canonical analysis lanetools/sync_live_rig_authority.py— refresh the local mirror from../live-rigtools/validate_rig_alignment.py— verify the local mirror and rig profile stay aligned
That keeps the sibling contract explicit: if frZone disappears, the rest of the rig falls back to scene base plus manual macros instead of losing shared control semantics.
At the top of the sketch:
String MIDI_DEVICE_HINT = "IAC"; // substring of device name/description/vendor
boolean MIDI_STRICT = true; // if not found, MIDI disabled (no SoftSynth)
String[] MIDI_HELLO_FALLBACK_HINTS = { "Interstream", "Signal Culture", "Network", "Session" };Press d to print outputs that are openable by the sketch and confirm the exact name. Press Shift+D to cycle outputs. Press G to send a short MIDI hello through the selected output; if no receiver is open, it refreshes devices and tries the fallback hints before using the first openable output.
- OSC event:
/bandTrigger→i f f f f f i(bandIndex, fLo, fHi, energy, threshold, hysteresis, cooldownMs) - OSC energy:
/bandEnergy→i f f f(bandIndex, fLo, fHi, energyN 0..1) - Rig-tuned OSC aliases:
/analysis/low_band,/analysis/mid_band,/analysis/upper_mid_band,/analysis/high_band - Rig-tuned trigger aliases:
/analysis/trigger/<band>carrying the normalized band energy - MIDI:
- Generic mode: editable per-band notes plus per-band CC stream
- Rig-tuned mode: semantic analysis CCs on Ch 15 only
- processing/ — The core instrument. Crack open
FreqZone/FreqZone.pdefirst to see how thresholds, hysteresis, and cooldowns are narrated in code while you test routing live. - firmware/ — Incremental Raspberry Pi Pico WH physical control-surface prototype. Stage 3 scans eight muxed potentiometers and five buttons, then emits USB MIDI plus serial diagnostics.
- docs/ — Cheat sheets for getting moving fast. Start with
docs/quickstart.md, thendocs/osc_addresses.mdso you can wire OSC without guessing. - examples/ — Quick probes to prove the pipes work. Run
examples/osc/python_receiver.pyto sanity‑check OSC output before students start improvising. - assignments/ — Guided labs that keep the teaching flow honest. Use them to stage short feedback loops while everyone experiments.
- atlas/ + interop/ — The sibling-repo contract surface for rig-tuned mode.
Made for teaching & performance. Contributions welcome.