MIDI
Test whenever you touch MIDI mapping, MidiMapper, the MIDI page, or MIDI-triggered actions.
Prerequisites
- A MIDI controller (hardware or software) that can send CC and Program Change messages
- Alternatively, use the CC sender on the MIDI page to simulate CC input
Test Cases
TC-MI-001: Assign CC to parameter
Steps:
- Open the MIDI page
- Add a mapping: channel Any, a CC number, target a block parameter (e.g. mix)
- Send that CC from your controller
Expected: The parameter moves in response to the CC value.
TC-MI-002: MIDI Learn
Steps:
- Click the MIDI Learn button on a mapping or parameter
- Move a knob/fader on your MIDI controller
Expected: The CC number and channel are auto-detected and assigned.
TC-MI-003: Program Change for presets
Steps:
- Assign Program Change to presets (Link icon on preset dropdown)
- Send PC 0, PC 1, PC 2 from your controller
Expected: Presets switch to the corresponding index in the preset list.
TC-MI-004: CC sender
Steps:
- Open the MIDI page
- Add a CC mapping to a parameter
- Use the CC number input and value input to send a test CC
Expected: The mapped parameter responds to the injected CC value.
TC-MI-005: MIDI monitor
Steps:
- Open the MIDI page
- Enable the MIDI monitor
- Send various MIDI messages from your controller
Expected: Messages appear in real time with correct type, channel, and data values.
TC-MI-006: Remove and clear mappings
Steps:
- Add 3+ MIDI mappings
- Remove one mapping
- Clear all mappings
Expected: Individual removal works. Clear all removes everything. No orphan mappings.
TC-MI-007: Mappings persist in preset
Steps:
- Add MIDI mappings to parameters
- Save the preset
- Load a different preset (mappings should change)
- Reload the original preset
Expected: Preset-level mappings are restored. Global mappings (preset change, scene switch) persist independently.
TC-MI-008: Activity indicator
Steps:
- Add a CC mapping
- Send that CC from your controller
Expected: The mapping row briefly highlights to show activity.
TC-MI-009: Assign MIDI to a block state via Learn
Prerequisites: A loaded preset with a plugin block that has at least 2 states (use the + button in the States section to add states if needed).
Steps:
- Open the Options panel for a plugin block with multiple states.
- Click the small link icon on the State 2 square.
- In the dialog, click Learn, then send a CC from your controller (e.g. CC 64 with value 127).
- Save.
Expected: The State 2 square’s middle segment now shows CC 64 in azure. The MIDI page lists a row reading Block State (BlockName) -- State 2.
TC-MI-010: Per-state CC threshold
Prerequisites: TC-MI-009 completed (State 2 assigned to a CC, e.g. CC 64).
Steps:
- Send the assigned CC at value 0 (release) — state should not change.
- Send the assigned CC at value 30 — state should not change.
- Send the assigned CC at value 63 — state should not change.
- Send the assigned CC at value 64 — State 2 activates.
- Send the assigned CC at value 127 — State 2 stays active (no-op since already there).
Expected: Only values >= 64 trigger the state change. Lower values are silently ignored. The State 2 square gets the active amber outline once triggered.
TC-MI-011: Scene precedence over per-state MIDI
Prerequisites: Block has State 1 and State 2; State 2 is mapped to a CC; one scene captured with State 1 active.
Steps:
- Recall the scene — State 1 active.
- Send the State 2 CC — State 2 active.
- Recall the scene again — State 1 active.
- Send the State 2 CC again — State 2 active.
- Recall the scene one more time — State 1 active.
Expected: Each scene recall re-asserts its captured state index. The per-state CC override does not stick across scene changes.
TC-MI-012: Mapping cleanup on state and block delete
Prerequisites: Block with at least 3 states; State 2 mapped to CC A, State 3 mapped to CC B.
Steps:
- Delete State 2 (click the X on its square).
- Send CC B — the state that was previously State 3 (now State 2) activates.
- Open the MIDI page — the surviving row reads
Block State (BlockName) -- State 2(not State 3). - Delete the entire block from the grid.
- Open the MIDI page — no rows for that block remain.
Expected: Deleting a state drops its mapping and shifts higher-indexed mappings down by one. Deleting the block prunes every mapping that targeted it (state, bypass, mix, balance, level).
TC-MI-013: CC range mapping for Block Mix
Steps:
- Open the MIDI assign dialog for Block Mix on a plugin block.
- In the Shaping section, set Min CC to 20, Min Mix to 30%, Max CC to 100, Max Mix to 80%. Save.
- Send the assigned CC at values 0, 20, 60, 100, 127.
Expected: Mix values are 30%, 30%, 55%, 80%, 80% respectively.
TC-MI-014: Inverted mapping
Steps:
- Edit the mapping from TC-MI-013. Set Min Mix to 80% and Max Mix to 30%.
- Save.
- Send the assigned CC at values 20, 60, 100.
Expected: Mix values are 80%, 55%, 30%.
TC-MI-015: Curve change alters response
Steps:
- Reset shaping to defaults (Min CC 0 -> 0%, Max CC 127 -> 100%).
- Set Curve to Log. Sweep an expression pedal. Watch the Mix display.
- Set Curve to Exp. Sweep again.
- Set Curve to S-curve. Sweep again.
Expected: Log — changes feel more responsive at low CC values. Exp — changes feel more responsive at high CC values. S-curve — plateau at the ends, steep transition in the middle.
TC-MI-016: Per-mapping threshold for Block Bypass
Steps:
- Map a CC to a Block Bypass. Open the assign dialog.
- In the Trigger section, drag the Threshold slider to 80. Save.
- Send the assigned CC at value 79.
- Send the assigned CC at value 80.
- Send the assigned CC at value 0.
Expected: CC 79 -> block bypassed (effect off). CC 80 -> block engaged (effect on). CC 0 -> block bypassed.
TC-MI-017: Per-mapping threshold for Block State
Steps:
- On a block with multiple states, map a CC to State 2. Drag Threshold to 110. Save.
- Send the assigned CC at value 64.
- Send the assigned CC at value 110.
Expected: CC 64 -> State 2 does NOT activate. CC 110 -> State 2 activates.
TC-MI-018: Default threshold + bypass polarity change
Steps:
- Open a v0.16.0-pre preset with Bypass and State mappings.
- For Block State mappings: verify they respond exactly as before (CC ≥ 64 recalls the state).
- For Block Bypass mappings: verify polarity has flipped per the v0.16.0 release notes (CC ≥ 64 now engages the block; previously it bypassed). Toggle bypass via the UI and re-test if the saved direction is now wrong.
- Open the assign dialog for any binary mapping; verify the Trigger threshold defaults to 64 and the rule line reads
ON >= CC 64(orRECALL >= CC 64for State).
Expected: State mappings unchanged. Bypass mappings now engage the block when CC is high (correction; documented breaking change). Threshold default 64.