mini-midi

Disconnected

Expression pedal

full range
Pedal not detected
Position
Sent CC
Active mode none
Program

Default effect

General settings

Brightness scales every PWM LED, including the expression LED. Debounce is the settling window after a switch changes state.

Set pedal range

Move the pedal to each end and capture what it actually reads. The captured numbers become the pedal's 0% and 100% — everything else (value min/max, catch, interpolate) works from that.

Reading now
1. Heel down / off the position that should send the lowest value
2. Toe down / full the position that should send the highest value
Preview

mini-midi help

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

  1. Plug the controller in and press Connect; pick its serial port in the browser's dialog.
  2. Set each button's type and its fields. Edits apply to the device immediately — you can test with your foot as you go.
  3. Press Save to device to make it survive a power cycle. Until you do, the “Unsaved changes on device” badge is showing.
  4. 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.

4. Button assignments

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.

  1. Move the pedal to the position that should be 0%, press Set 0%.
  2. Move it to 100%, press Set 100%.
  3. 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.