Skip to content

Fix MIDI Problems

Find the message or the symptom, then work through the fix. Quoted blocks are what resonon prints.

First check that the track has an output. A new MidiTrack has none until >> routes it, and print(bass); shows no output. Route it to a declared alias:

let bass = MidiTrack("bass");
bass >> MidiOutput("synth");

MIDI port “synth” is not connected — 3 events dropped. Add a [[midi.outputs]] entry with this alias.

The track was routed to the alias, but the preferences no longer declare it.

  1. Declare it in ~/.resonon/preferences.toml — resonon setup picks the port from a list:

    [[midi.outputs]]
    alias = "synth"
    port = "IAC"
  2. Run reload_preferences() to open it without restarting.

  3. Check what is connected: print(midi_connected()); prints {alias: port} for every open port.

MIDI port “synth” has no device — 3 events dropped. Run resonon --list-ports and check the port name.

The alias is declared, but no device matches its port. Resonon also prints this for every port when it runs with --no-midi, which opens no ports on purpose.

  1. Run resonon --list-ports and compare the names. A port name matches exactly first, then as a substring, so "IAC" finds "IAC Driver Bus 1".
  2. Plug the device in, then run reload_preferences(). The alias stays valid while the device is missing, so the tracks that use it do not need to change.
  3. For gear that is not always there, add optional = true to its entry: its absence is expected rather than reported.

On the DAW side, check that the track’s MIDI input is the port, that it is armed or monitoring, and that it has an instrument.

  1. Run resonon --list-ports. It prints an entry for each attached device, ready to paste.
  2. For a DAW on the same Mac, turn on a virtual port: Audio MIDI Setup → Window → Show MIDI Studio → IAC Driver → Device is online.
  3. Run reload_preferences() after you change the file or plug in the device.

A note-on was sent, and its note-off never arrived — often after a change in the middle of a note.

  1. Press F5 to play: on start, resonon sends a note-off for every note it left sounding.
  2. Press Shift+F5 three times: the third stop sends a note-off for every note resonon started that is still sounding, on every port.
  3. If the note still hangs, the synth or DAW lost the note-off: use its own panic.

A device is behind or ahead of the mix by the same amount every time: trim its port — see Align Hardware with the Mix. When the timing wobbles, or a device following resonon’s clock drifts, trace what is sent:

  1. Start the trace, with the transport playing:

    set_midi_trace(true);
  2. Let it play a few bars, then stop the trace. It prints what it captured:

    set_midi_trace(false);
  3. Read the report. Each NoteOn line says how far ahead of its time it was sent, or LATE. Under Inter-tick intervals, the jitter line is the spread of the clock’s tick spacing.

midi_trace_report() prints what has been captured so far and keeps recording. Turn the trace off when you are done: it takes a lock on the audio thread while it records.

Notes sent LATE reached the output after their time: check the load — see the audio crackles, or reacts late and notes drop out under load. A steady report with a device that still wobbles points at the device or its connection.

Nothing is wrong. Resonon writes C4 for MIDI note 60; Ableton Live and some other DAWs call the same note C3.

ResononMIDI noteAbleton Live
C460C3
A469A3
C572C4