1. Overview
mini-midi is a USB MIDI foot controller: three footswitches,
each with its own LED, plus an optional expression pedal on a
TRS jack with its own LED. It appears to your computer as two things at once:
a class-compliant MIDI port that your DAW uses, and a
serial port that this editor uses. They never interfere, so
you can retune the controller while playing.
Each footswitch carries a primary assignment and, optionally,
a secondary assignment triggered by holding it. Everything you
configure lives on the device, so once saved it works standalone with no
computer attached.
2. Quick start
- Plug the controller in and press Connect; pick its serial
port in the browser's dialog.
- Set each button's type and its fields. Edits apply to the
device immediately — you can test with your foot as you go.
- Press Save to device to make it survive a power cycle.
Until you do, the “Unsaved changes on device” badge is showing.
- Optionally Export .json to keep a backup.
No hardware? Press Demo mode to drive a simulated controller.
Every control works, including a simulated pedal.
3. Connect bar
- Connect
- Opens the browser's serial-port picker. Requires Chrome, Edge, or another
Chromium browser — Web Serial does not exist in Safari or Firefox. On
connect the editor reads the device's current settings into the form.
- Disconnect
- Releases the port. Your settings stay in the form.
- Demo mode
- Connects to a simulated device built into the page. Works in any browser
and needs no hardware. Its pedal sweeps on its own and its simulated pot is
deliberately a partial, reversed range so the calibration flow has something
real to find.
- Connection badge
- Disconnected / Connected / Demo device, plus the device name, firmware
version and config version once connected.
- Unsaved changes on device
- Appears when the device's live settings differ from what is in its flash —
i.e. you have edited something but not pressed Save to device. Power-cycling
now would lose those edits.
- Help
- This document.
Everything below the connect bar is greyed out until you connect (to a real or
demo device). The preset row at the bottom stays usable offline.
One card per footswitch. The dot at the top-left of each card mirrors that
button's real LED, including its flashing.
Type chooses what the button does: None,
Action, Effect, Program, Expression or
Fade.
Changing the type keeps the MIDI channel and any secondary action.
None sends nothing and its LED stays off.
MIDI channel (1–16) appears on every type. Every assignment
has its own — a button and its hold action can be on different channels.
4.1 Action — momentary note
Sends a note while you hold the switch. Use for tap-tempo, drum hits, momentary stutters.
- Note
- The note sent. Type a name (
C#4, Gb2) or a raw
number 0–127; the raw number is always shown next to the field. See
note names if your DAW disagrees about octaves.
- On velocity
- 1–127, the velocity of the Note On. Note Off is always velocity 0.
- Send length (ms)
- 10–2000. Only shown when the button has a secondary action. With a
hold action configured, the primary fires on release and so has no “held”
phase — it sends a fixed-length pulse of this duration instead.
LED: lit while you hold the switch. This is the only type whose LED follows your foot.
4.2 Effect — with DAW feedback
Drives an effect and shows what the DAW says is actually happening.
- Send & return note
- One note used in both directions: the controller sends it, and listens for
the same note coming back from the DAW.
- Button behavior
-
Toggle (needs DAW echo) — press flips the effect based on
the last state the DAW confirmed: off → Note On 127, on → Note Off.
This mode needs your DAW to echo the note back (see
DAW setup). Without an echo the controller never
learns the effect turned on, so every press sends “on” and you can never turn
it off.
Momentary while held — Note On 127 on press, Note Off on
release, exactly like Action. The send never depends on the DAW, so this
works with or without an echo. The LED still follows the DAW.
- Send length (ms)
- 10–2000. Only shown for Momentary on a button that also has a
secondary action, for the same reason as Action's.
LED: follows the DAW's return only, in both modes — never your
foot. Brightness tracks the returned velocity. With no echo it simply never
lights; that is by design, the LED reports the rig, not the switch.
4.3 Program — program change
- Program number
- 0–127. Sent as a Program Change on press. Release sends nothing.
LED: lit only when the DAW's current program matches
this button's number. Pressing does not light it — the controller waits for the
DAW to confirm. Until the first Program Change arrives from the DAW, all program
LEDs stay dark. Assign several buttons to different programs and at most one is
lit at a time.
4.4 Expression — choose the pedal's target
Pressing an expression button sends no MIDI of its own. It
chooses which CC the expression pedal drives. Exactly one expression effect is
active at a time.
- CC number
- 0–127, the controller number the pedal sends.
- Value min / Value max
- 0–127. The pedal's heel and toe ends map to these. Setting min higher than
max is allowed and simply inverts the range.
- Reverse
- Flips the pedal for this effect only. (If the whole pedal reads backwards,
fix it once in Pedal range instead.)
- Return to home value
- When you switch away from this effect, walk its CC back to a
resting value instead of leaving it where your foot was — e.g. a wah that
returns to heel-down. Reveals three more fields:
- Home value
- 0–127, where it walks back to.
- Return-to-home speed
- 0.01–1.0. How much of the remaining distance is covered per step: small is
a slow glide, 1.0 is instant.
- Return-to-home threshold
- 0.0–5.0. How close counts as arrived, so the glide ends cleanly on the
exact home value instead of creeping.
- Send on selection
- What happens when you switch to this effect and the pedal is not
where the CC was left:
- Snap to pedal value — jump straight to the pedal. Fine
for volume.
- When current value reached (catch / pickup) — send
nothing until you sweep the pedal through the stored value, then track.
No jumps. Best for wah.
- Interpolate to pedal value — glide from the stored
value to the pedal, chasing it if it moves.
An effect whose CC has never been sent always snaps, whatever this says.
- On-selection speed / threshold
- Only shown for Interpolate; same meaning as the return-to-home pair.
LED: lit when this is the active expression effect. See
Default effect for what “active” means at startup
and whether pressing again can turn it off.
4.5 Fade — timed CC fade
Pressing the switch glides a Control Change between two values,
A and B, over a fixed time along a chosen
curve — a motorized fader on a footswitch. Use it for volume swells, filter
sweeps, crossfades. The fade starts at A; nothing is sent until the first
press.
- Press while resting at an end → fade to the other end.
- Press mid-fade → reverse: the value retraces exactly the
path it came along, back to where it started. No jump, and the return takes
as long as the distance it covers.
- Release sends nothing — a fade in flight always finishes
on its own unless you press again.
- CC number
- 0–127, the controller number the fade sends.
- A value / B value
- 0–127 each, the two endpoints. A is where the fade rests at power-on.
A higher than B is simply a downward fade, and equal values are
allowed too (the fade still travels; only one value is ever sent).
- Fade time (ms)
- 10–60000. How long a full A→B trip takes.
- Curve
- The trajectory shape, previewed in the small plot (A bottom-left, B
top-right):
- Linear — constant rate.
- Log — fast start, gentle landing.
- Exponential — gentle start, fast finish.
- S curve — eases both ends.
- Custom — draw your own (below).
The curve shapes the value's path through time; the endpoints and total
time are the same whichever you pick, and a reversal retraces the same
curve.
Custom curve. Choosing Custom turns the preview
into an editor: drag the two handles to bend the curve (mouse or touch), or
type the four numbers x1 y1 x2 y2 beside it — they are the
control points of a cubic Bézier and stay in sync with the handles.
Everything is confined to the unit square, so the value can never overshoot
past A or B. Switching back to a named curve keeps your drawn shape, ready
for the next time you pick Custom.
While connected, the card shows the fade's live value and a
progress bar from A to B with the direction it is travelling.
LED: brightness shows progress toward B — off at
A, full at B, ramping through the curve mid-flight — even for a downward
fade. It reports the fade's own engine, not the DAW: incoming MIDI never
moves a fade.
4.6 Secondary (hold) action
Below the divider in each card, Add secondary action gives that
footswitch a second job triggered by holding it. Remove secondary
action takes it away again.
Adding one changes when the primary fires. A press is now
ambiguous until the hold time has passed, so:
- Short press → the primary fires, once, on release.
- Hold past the hold length → the secondary fires
immediately, while your foot is still down; the primary does not fire, and
releasing sends nothing.
Exactly one of the two happens per press — never both, never neither.
- Type
- Action / Effect / Program / Expression / Fade — the same types, with the
same fields. There is no “None”; removing it is the button's job.
- Hold length (ms)
- 100–5000, default 500. How long to hold before it fires.
A secondary is a full assignment in its own right: its effect returns and
program matches are tracked separately, and a secondary Expression is a
selectable pedal target like any other.
4.7 What the LEDs mean
Per type, on a button with no hold action:
- Action — lit while held (plus the length of its pulse).
- Effect — lit by the DAW's return only.
- Program — lit only when the DAW's current program matches.
- Expression — lit when it is the active pedal target.
- Fade — brightness is the fade's progress toward B: off at
A, full at B, even when B is the quieter value.
- None — always dark.
With a hold action configured, one LED reports both halves:
- Fast flash (about 8×/second) — you are holding, and the
secondary has not fired yet. Keep holding. It stops the instant it fires.
- Slow flash, mostly dark — the secondary's state is on and
the primary's is off.
- Slow flash, mostly lit — both are on.
- Steady — only the primary is on.
So the LED's overall darkness still reads as the primary, and the flashing
tells you the hold action is engaged.
5. Expression pedal panel
5.1 Device settings
- Pedal detect enabled
- Use the jack's plug-detect switch to know whether a pedal is connected.
Turn off if you have a permanently wired pot or no detect switch — the pedal
is then always treated as present.
- Send deadband
- 0–16. Minimum change in the outgoing CC value before it is re-sent.
Raise it if a resting pedal chatters; 0 sends every change.
- Poll interval (ms)
- 5–100. How often the pedal position is read. Lower is more responsive and
more MIDI traffic.
- Return interval (ms)
- 10–200. The step rate for return-to-home walks and interpolate glides.
This is a rate; the speeds themselves are per-effect.
- Retain value when unplugged
- With no pedal connected the input floats and reads noise. When on, the last
real reading is frozen instead, so the effect stays parked where you left it.
5.2 Pedal range
Real pots rarely sweep the full electrical range, and TRS wiring flips plenty of
them. Set range… teaches the controller what your pedal
actually reads.
- Move the pedal to the position that should be 0%, press
Set 0%.
- Move it to 100%, press Set 100%.
- Apply.
The dialog shows the live raw reading, a preview of what the current position
would become, and both captured numbers (editable for fine-tuning).
Reset to full range restores the uncalibrated default;
Cancel discards.
A backwards pedal needs no extra setting. If you capture a
higher reading for 0% than for 100%, that is the reversal, and the
controller inverts accordingly. Capturing the same value at both ends is
refused — the two ends must differ.
Calibration is applied before everything else, so value min/max, catch and
interpolate all work in terms of your pedal's real travel.
5.3 Live readouts
- Pedal
- Whether a pedal is detected.
- Position
- Calibrated pedal position, 0.00–1.00.
- Sent CC
- The value actually being sent. During catch or interpolate this
deliberately differs from the position.
- Active mode
- Which effect the pedal is driving right now.
- Program
- The DAW's current program, or — until one arrives.
5.4 Default effect
The right-hand column. This is the effect the pedal falls back to, and it
belongs to no button.
Default effect? ON
- It owns the pedal at startup and whenever nothing is selected.
- Pressing an expression button switches to that effect.
- Pressing the already-active button again switches it
off, back to the default.
- Because it has no button, all expression LEDs are dark while it is
active — which is how you can see at a glance that no override is engaged.
- It has the full field list of any expression effect: channel, CC, min, max,
reverse, home value and its parameters, send-on-selection and its parameters.
Default effect? OFF
- Its parameters are not shown and not stored.
- You cannot switch an expression effect off — only switch to
another one, which turns the first off.
- One effect is active from startup: the first expression assignment found,
preferring primaries over hold actions, then the lower button number.
6. Overlap warnings
When two assignments would send the same thing, an amber
Heads up panel appears above the button cards and the
fields involved are outlined in amber. These are warnings, not
errors: overlapping is allowed, Save and Export keep working, and
sometimes it is exactly what you want.
They are checked across every assignment — primaries, hold actions, and
the default effect — and only when the channel matches too:
- Same note on two Action/Effect assignments: the DAW
cannot tell them apart. If both are Effects, they instead share
one on/off state and their LEDs follow the same returns — which is a real
technique, so the wording says so rather than treating it as a mistake.
- Same CC on two Expression or Fade assignments (the
default effect counts too). Two Expression effects merely duplicate a
target — switching between them has no audible effect. When a Fade is
involved, the two drive the same parameter independently and will
fight over it.
- Same program number on two Program assignments: their
LEDs will light together, instead of exactly one at a time.
A note, a CC and a program that happen to share a number are
unrelated messages and never warn. Neither does a field you are still
typing into.
7. General settings
- LED brightness (%)
- 0–100. Scales every LED — all three button LEDs and the expression LED.
0 turns them all off, which is a legitimate setting for a dark stage. The
small onboard USB light is not affected.
- Button debounce (ms)
- 1–100, default 5. How long a switch must settle before a change counts.
Raise it if one stomp registers twice; lower it if fast taps get missed.
Note this sits in front of hold detection, so large values affect hold feel.
8. Presets & saving
- Preset
- A display name stored with the settings.
- Middle C
- C3 / C4 / C5 — display only. See note names.
- Save to device
- Writes the current settings to the controller's flash so they survive a
power cycle. Everything else you do only changes the device's live state.
- Export .json
- Downloads the settings as a preset file. The file is exactly the device's
configuration — nothing is lost in translation.
- Import .json
- Loads a preset, checks it thoroughly, and applies it to the device. It does
not save to flash; press Save to device if you want to keep it. A bad
file is reported field by field and never reaches the device.
- Revert
- Re-reads the device's current settings, discarding local edits.
9. Setting up your DAW
Ports. The controller appears as a normal MIDI input. Enable it
as a controller/remote input in your DAW. The serial port this editor uses is a
separate thing — you do not configure it in the DAW.
mini-midi speaks only plain MIDI — Note On/Off, Program Change and CC. There is
nothing DAW-specific to install.
9.1 Effect buttons need a return
An Effect button in Toggle mode decides what to send
from the last state your DAW confirmed. For that to work, your DAW must
send the same note back to the controller whenever the effect's
state changes:
- Effect turns on → send Note On, same note, same channel.
The velocity becomes the LED brightness.
- Effect turns off → send Note Off (or Note On with velocity 0).
Set the controller as a MIDI output destination in your DAW and have the
effect's on/off state drive that note. Matching is on channel and note —
anything else is ignored.
No return? Two symptoms. The LED never lights, and — more
annoying — the button turns the effect on but never off, because the controller
never learns it went on. If you cannot set up a return, switch that button's
behavior to Momentary while held, which does not depend on the
DAW at all.
9.2 Program buttons need a Program Change back
A Program button sends a Program Change on press but does
not light its own LED. It waits for your DAW to send a
Program Change back on a channel one of your program buttons
uses. That returned number is what lights the matching button.
So: have your DAW emit a Program Change to the controller whenever the active
patch/scene changes. You then get correct lights even when the patch is changed
from somewhere other than this pedal. Until the first one arrives, all program
LEDs stay dark — that is expected, not a fault.
9.3 Expression
The pedal sends ordinary CC messages; map them in the DAW like any other
controller. Nothing needs to come back. CC 11 (Expression) and CC 7 (Volume) are
the conventional choices, but any number works.
9.4 Note names and middle C
Hosts disagree about note names. This editor calls MIDI note 60
C4 by default; Logic Pro and MainStage call the same note
C3, and some hosts use C5. Nothing is wrong with the MIDI — only
the label differs.
Set Middle C in the preset row to match your DAW and the names
here will agree with it. It changes no stored value and is never written to the
device or a preset. The raw number shown next to each note field is the thing
actually sent, and it never changes.
10. Troubleshooting
- Connect shows no devices
- Check the controller is running its firmware rather than sitting in
bootloader mode — in bootloader mode it appears as a USB drive, not a serial
port. Also confirm you are in Chrome or Edge.
- An effect turns on but never off
- No MIDI return is reaching the controller. See
9.1, or use Momentary mode.
- A program LED never lights
- Your DAW is not sending Program Change back. See 9.2.
- The pedal does not reach 0 or 127
- Calibrate it — Pedal range.
- The pedal works backwards
- Recalibrate, capturing 0% at the end you want quiet. Do not use per-effect
Reverse for this.
- Notes are an octave off from the DAW
- A naming convention difference, not a wrong note. See 9.4.
- Settings vanish after a power cycle
- You did not press Save to device. The badge in the header
warns when there are unsaved changes.
- One stomp triggers twice
- Raise Button debounce in General settings.