Appendix: MIDI
FRIZZ takes MIDI from the TRS MIDI input and over USB (CHOMPI is a USB device, so USB MIDI comes from a computer or a host), both alike. With MIDI out on, it sends its clock and the loop’s Start, Stop and Continue out of the TRS MIDI output, and over USB if you ask; otherwise it sends nothing over TRS, and over USB it only answers FRIZZ’s own queries (see Remote control).
MIDI clock
Section titled “MIDI clock”Quantized recording, and the effects’ tempo while there’s no loop, follow MIDI clock (24 PPQN), from the input the clock source picks. The clock is read on every channel.
Clock source
Section titled “Clock source”The lower A# on the settings page picks whose clock counts, each press the next:
- Auto (the default): whichever input ticks first, TRS or USB, until it has been silent for 0.5 s; then whichever ticks next.
- TRS or USB: only that input’s clock; the other’s is ignored, even while the chosen one is silent. A DAW over USB can then play notes and send CCs without its clock getting in the way of a sequencer on the jack, or the other way round.
- Internal: no MIDI clock at all. The tempo comes from the loop, your taps or the last tempo, and tap tempo works while a clock runs; a quantized recording is refused, as without a clock.
Switching to a source that leaves out the clock FRIZZ was following lets go of it at once, as
a clock that stops: a quantized recording ends where it is. Notes, controllers, program
changes and FRIZZ’s own SysEx come in from both inputs whatever the source; MIDI Start, Stop,
Continue and Song Position come only from the chosen input (see Start and Stop). It’s kept as
clock_source in FRIZZ/frizz_master.txt (0 Auto, 1 TRS, 2 USB, 3 internal), and
firmware/remote.py source auto|trs|usb|internal sets it too.
The clock factor on the settings page makes FRIZZ follow the clock at half its tempo or at double: a DAW at 70 BPM with FRIZZ thinking in 140, or the other way round. It counts for everything that follows the clock: the bars of a quantized recording and the effects’ tempo. A loop recorded to it keeps those bars when the factor changes later; the effects then follow the loop at the new factor. Changing it during a quantized recording ends that recording where it is, as a lost clock does.
Channels
Section titled “Channels”FRIZZ listens on 16 channels, with two kinds of map:
- The global channel, 16 at first: notes (the keys), program changes (scenes), the looper, the scenes, the gains, every effect’s latch, the compressor, and the knobs of the effect in focus. That alone covers FRIZZ from a hardware controller or a TRS chain.
- The effect channels 1-15, one per white key, left to right: 1 freezer, 2 shifter, 3 folder, 4 crusher, 5 filter, 6 flanger, 7 phaser, 8 resonator, 9 slicer, 10 wow & flutter, 11 tape stop, 12 delay, 13 reverb, 14 chaos key, 15 master compressor. Each has the same CCs, so in a DAW one MIDI track per effect has the same automation lanes everywhere.
On the global channel, its own map wins: set it to 5, and channel 5 is the global channel, with the filter reached through the focus (CC 23 and CC 14-22) and its latch (CC 106). Set to every channel (0), only the global map counts, on all of them, and the effect channels are off.
Change the global channel on the settings page, in FRIZZ/frizz_master.txt
(midi_channel 16; 0 listens on every channel), or from a computer with
firmware/remote.py channel N.
A shared TRS chain: over USB, FRIZZ is a port of its own. Over TRS, the effect channels
take channels 1-15 of the cable too, so other gear on the same chain that listens or sends on
them reaches FRIZZ’s effects. If that gets in the way, switch the effect channels off over TRS
with the settings page’s lower D# (midi_block_trs 0 in FRIZZ/frizz_master.txt); over USB
they still count, and the global channel works over both.
Notes: the keys
Section titled “Notes: the keys”A note holds the key it lands on while it’s on, as your finger would: an FX key punches its effect in, a scene key recalls, and so on. The 25 keys are a keyboard from note 48 (C3, or C2 in Ableton Live): the white keys from 48 up, the dark keys on the sharps, so the scene keys are notes 54 (the blank scene), 56, 58, 61 and 63 (scenes 1-4), and save, copy and delete 66, 68 and 70. Below them:
| Note | Key |
|---|---|
| 36, 37, 38, 39 | Knob 1, 2, 3, 4 pressed |
| 40 | The transport knob pressed |
| 41 | VOLUME pressed |
| 45 | CHOMPI (SHIFT) |
| 46 | PLAY |
| 47 | LOOP |
- A key held by your hand and by a note is pressed once, and let go when both have let go.
- The velocity doesn’t matter; a note on at velocity 0 is a note off.
- All Notes Off (CC 123) or All Sound Off (CC 120) lets go of every key MIDI holds, for a note off that went missing.
Controllers
Section titled “Controllers”On each effect channel (1-15), and on the global channel for the effect in focus:
| CC | Function |
|---|---|
| 14, 15, 16, 17 | Page 1’s knobs 1-4, set outright |
| 18, 19, 20, 21 | Page 2’s knobs 1-4 (Mix or the sends’ Freeze, stereo or its own, Band, Level), set outright |
| 22 | Latch: 64 and above on, below off, acting as the value crosses 64. The compressor (channel 15) has none, nor a page 2 knob 2: its CC 19 does nothing |
On the global channel:
| CC | Function |
|---|---|
| 14-22 | The effect in focus, as on its own channel |
| 23 | Focus: 1-15, the white key whose knobs CC 14-22 reach (15 the compressor). It’s the effect the knobs edit, as SHIFT + its key picks it, and it follows when you pick one by hand |
| 24-31 | The master compressor’s knobs, as channel 15’s 14-21: 24-27 page 1 (threshold, ratio, attack, release), 28, 30 and 31 page 2 (the compressor’s Mix, sidechain highpass, Makeup); 29 does nothing |
| 84 | The input’s source: 0-63 AUX, 64-127 the mic, as the settings page’s upper F# picks it |
| 85 | Output gain |
| 86 | Input gain, of the input heard (AUX or the mic) |
| 87 | Input/loop mix |
| 89 | Headphone feed, as VOLUME’s page 3: 127 the master out, 0 the input alone (AUX or the mic) |
| 90 | The loop’s speed in semitones, set outright: 64 as recorded (1×), 0 the slowest (1/16×), 127 double. Only with a loop; forward or in reverse as it runs |
| 3 | Morph to scene 0-4 (0 the blank one), as SHIFT + its key, landing on the bar line (CC 9’s), counted from the CC. During a morph, drop or build-up, it stops that where it is and starts the new one from there. It acts as the value changes: to morph to the same scene again, send another value first (127, no scene) |
| 9 | How many bars a morph over CC 3, or a drop over CC 83, takes, 1-8 (1 at first) |
| 80 | The crossfader: takes a running morph (CC 3’s, or one you hold) to where it says, 0 the scene it started from, 127 the scene it goes to. Reaching 127 lands it; reaching 0 after being away from it goes back to where it started; in between it waits |
| 81 | Stops a morph, drop or build-up where it is, as the value crosses 64 upward |
| 82 | A tempo tap, as the value crosses 64 upward: a button sending 127 and 0 |
| 83 | Drop to scene 0-4 (0 the blank one) hard on the next bar line, or CC 9’s, counted from the CC, as SHIFT + its key and a press of the transport knob. Like CC 3, it stops a sequence running and acts as the value changes: to drop to the same scene again, send another value first (127, no scene) |
| 102-115 | The latch of white key 1-14 (102 the freezer … 108 the phaser … 114 the reverb, 115 the chaos key), as CC 22 |
| 116 | The source’s effects, the source heard now: 0-63 through them, 64-127 past them, as the settings page’s upper A#. Set also while the source isn’t monitored |
| 117 | The source’s monitoring, the source heard now: 0-63 off, 64-127 on, as the settings page’s upper G# |
| 120, 123 | All Sound Off, All Notes Off: let go of every key MIDI holds |
- Set outright, a value does what the knob or key would: the LEDs follow, the scene key pulses as edited, a morph lands where the CC put the parameter, a send ringing out takes it at once. The knobs stay on the effect you picked (except with CC 23). 64 is a knob’s centre exactly (the filter’s flat cutoff, a delay’s random off), 127 its top. Stepped parameters take the nearest step.
- Switches act as they change (latches, CC 3, 81, 82, 83): an automation lane that sends the same value again does nothing, so a latch you switched by hand stays as you left it until the lane crosses 64 again. Use 0 and 127.
- Automation isn’t saved: nothing that comes in by CC goes to the card. After a restart the compressor is as you left it by hand (its knobs, the settings page, or FRIZZ’s SysEx), the source (CC 84) as the jack picks it, each source’s effects and monitoring (CC 116, 117) as the settings page’s upper G# and A# left them, the input gains as you last turned them, and the output gain and the input/loop mix at their power-on levels. Scenes you save keep what the CCs set, as ever.
- Left free on purpose, so what hosts and keyboards send by themselves reaches nothing: bank select (0, 32), mod wheel (1), breath (2), foot (4), volume (7), pan (10), expression (11), the pedals (64-69), keyboards’ sound controllers (70-79), NRPN and RPN with their data entry (6, 38, 96-101: a DAW’s pitch-bend range doesn’t turn a knob), 88, effects depths (91-95: a keyboard sends reverb depth, 91, at power-on), Reset All Controllers (121). CC 46-53 stay free for a 14-bit mode later.
- Notes 36-39, the knob presses, turn the page as your hand does. Mod wheel, pitch bend, aftertouch and other controllers are ignored. Notes and program changes count on the global channel only.
Program changes
Section titled “Program changes”Program change 0-4 presses scene key 0-4 (0 the blank scene): a recall, or in a save, copy or delete mode the slot. 5 and above are ignored.
Start and Stop
Section titled “Start and Stop”With transport following on, a DAW’s play button starts and stops the loop with the song. It’s
off at first; switch it on on the settings page (the lower F#),
with firmware/remote.py transport on, or midi_transport 1 in FRIZZ/frizz_master.txt.
| Message | A loop recorded to the clock (quantized) | A free loop |
|---|---|---|
| Start | back to its start, playing from the next clock tick (playing, it glides there) | plays on from where it is |
| Continue | plays on from where it is, from the next clock tick | plays on |
| Stop | pauses | pauses |
| Song Position, while paused | moves it there, by its length in the sender’s 16ths (a 2-bar loop is 32: position 36 is 4 in; with the clock factor at half when it was recorded, a bar of the loop is two of the sender’s) | ignored |
So a DAW’s Start lines the loop up with its bar 1, and moving its playhead while stopped takes the loop along. A loop counts as recorded to the clock if its recording ended on the clock’s bars (PLAY held + LOOP with a clock coming in); one closed early because the clock stopped counts as free. Song Position while playing is ignored, as are MIDI Machine Control and MIDI Time Code. Without a clock coming in, Start and Continue play at once.
With the clock source on TRS or USB, Start, Stop, Continue and Song Position count only from that input; on Auto or internal, from both.
MIDI out
Section titled “MIDI out”FRIZZ sends its clock, so a drum machine, a sequencer or a synth’s arpeggio plays
in time with it, and with the loop. The upper C# on the settings
page switches it, each press the next: off (the default, dim), TRS
(the TRS MIDI output, orange), TRS and USB (white). It’s kept as midi_out in
FRIZZ/frizz_master.txt (0 off, 1 TRS, 2 TRS and USB), and firmware/remote.py out off|trs|all sets it too.
The clock (24 PPQN) runs all the time while MIDI out is on, at the tempo FRIZZ thinks in, the beat on the settings page’s lower G#:
- With a loop: the loop’s tempo, at its speed and the clock factor, with the loop’s start on beat 1 (at half, a loop of an odd number of beats on every other pass, so the clock runs evenly). In reverse the clock keeps running, at the loop’s speed; while the loop is paused, it runs on at the loop’s tempo.
- Without a loop, with a MIDI clock coming in: that clock, passed on tick for tick, with the clock factor: at double a tick more halfway between two, at half every other one.
- Neither: the last tempo (tapped, from the last loop or from a clock; 120 BPM at power-on), with the clock factor.
Start, Stop and Continue follow the loop:
- A new loop starting to play sends Start, so the gear starts on the loop’s beat 1. If the gear already plays from a DAW’s Start that FRIZZ passed on, no second Start: it plays on, and the loop takes over the clock.
- A pause sends Stop. PLAY sends Song Position (where the loop goes on, to the 16th) and then Continue on that 16th, so the gear goes on where the loop does. Gear that ignores Song Position goes on where it stopped, which is the same place, unless the loop moved while paused. A standstill of the transport knob is a pause to the gear too: Stop going into it, Song Position and Continue when you turn out of it.
- A loop taken back to its start by a DAW’s Start (with transport following on) sends Start with that tick, so the gear starts over with it.
- Without a loop, Start, Continue and Stop that come in from the clock’s input are passed on.
- Erasing the loop sends nothing: the gear plays on, to the clock that’s coming in or the loop’s tempo.
Not back to the sender: while FRIZZ passes a clock on, nothing goes back out of the input it comes in on. A DAW over USB gets nothing back over USB, gear on the TRS jacks nothing out of TRS. With a loop, FRIZZ leads, and its clock goes out of every port MIDI out is set to.
Nothing else goes out: no notes, no MIDI thru, and controllers only with MIDI feedback on.
- Gear that follows any clock by itself takes FRIZZ’s tempo as soon as MIDI out is on, even while nothing plays. That’s why it’s off at first.
- Over USB, the clock goes out between FRIZZ’s other work: it’s less steady than the TRS output’s (by up to a millisecond or so), and while FRIZZ writes the card (a scene saved) its ticks wait and come out in a bunch. For tight timing, use TRS.
- A DAW that follows FRIZZ’s clock (synced to an external MIDI clock): set its project tempo roughly to the loop’s. REAPER, for one, keeps its own tempo and follows a clock smoothly only within about half to twice it (measured); further off, it plays in jumps. So the clock factor at double or half may need the DAW’s tempo moved along. It also holds still about a second after Start before it runs, then plays in step.
- Gear with MIDI thru on that sends FRIZZ’s clock back into its TRS input: with the clock source on Auto, FRIZZ follows its own clock coming back. Set the clock source to internal or USB, or switch the gear’s thru off. With transport following on and a loop, FRIZZ’s Start comes back too: it takes the loop back to its start, which sends Start again, and the loop starts over and over. The clock source on internal doesn’t stop that (on internal, Start and Stop count from both inputs): set it to USB, switch transport following off, or the gear’s thru.
MIDI feedback
Section titled “MIDI feedback”What you change on the panel goes out as the CCs that would set it (see
Controllers), so a controller with LED rings or motor faders, or a DAW
picking up a knob, follows the panel. Off at first; the upper D# on the settings
page switches it (midi_feedback 1 in FRIZZ/frizz_master.txt). It goes
where MIDI out goes, so MIDI out has to be on too.
- What goes out: an effect’s knobs (CC 14-21) and latch (CC 22) on its own channel, and for the effect in focus also on the global channel (CC 14-22); the latches by key (CC 102-115), the focus (CC 23) as you pick an effect, the compressor (CC 24-31), the gains and the input/loop mix (CC 85-87), the headphone feed (CC 89), the input (CC 84: 0 AUX, 127 the mic, also when the jack switches it; CC 116 and 117, 0 or 127, the source’s effects and monitoring, also when a switch of the source brings up the other’s), the loop’s speed (CC 90), and the crossfader (CC 80) while you hold it by hand.
- A scene recalled sends what it changed, once. A morph sends only where it lands, once it has. The chaos key changes no setting, so it sends nothing.
- Never back: what came in by MIDI, or by FRIZZ’s SysEx, isn’t sent back, so a DAW recording what it also sends doesn’t loop.
- Paced: a value goes at most once every 10 ms, and only when its 7-bit value changed. A scene’s many changes take a moment to go out of TRS (about 660 CCs a second). The clock goes first, so its timing stays as without feedback.
- With the effect channels off over TRS, only the global channel’s go out of TRS; over USB, all. On every channel (omni), only the global ones go out, on channel 16.
- Switching it on sends nothing by itself: a controller learns a value when it next changes.
Remote control
Section titled “Remote control”FRIZZ’s own SysEx (F0 7D 43 48 ..., documented in firmware/code/src/MidiControl.h) presses
keys, turns knobs, sets the channel, transport following, the clock source and MIDI out, and holds the mode switch up or down (until power-off) on
every channel; its keys and knobs act as your hands do, on the settings page too, and over USB answers what the play
page shows, every LED, the processing load, and sends and receives scenes. firmware/remote.py
uses it from a Linux computer: state, leds, load, settings, channel 16, transport on|off, source usb, out off|trs|all, switch up|down|hand, scene get 2 my.json, scene put 3 my.json, and play SCRIPT --cpu, which plays a scenario of the virtual CHOMPI on the device
and reports the worst load and how many audio blocks ran late (crackles).
The 7D in that header is MIDI’s ID for projects without a manufacturer ID of their own, and
the multi-firmware launcher uses the same header. FRIZZ keeps it until the launcher moves to an ID of its
own, and then follows (#103).
For developers, one more command over USB, 0x3E, lets the test tools read and set FRIZZ’s
state by number: see the developers’ SysEx in
the developer guide.
DAW notes
Section titled “DAW notes”Knobs back to 0 when the DAW stops: REAPER 7 as it comes sends every CC its tracks played
back to 0 when you stop, so the knobs you automated jump to 0. To keep them where the
automation left them, untick Reset MIDI CC/Pitch on: playback stop (and playback
loop/skip, which does the same at a loop’s turn) in REAPER’s Preferences, Playback, or enter
cc0-120=-1 under CC reset overrides there. Other DAWs may do something similar.