AudioToMidiNow Use the MP3 to MIDI converter

MIDI PATCH SELECTION

MIDI Program Change: New Sound, Same Notes?

A MIDI program-change event requests a patch or preset on a particular channel. It does not rewrite the note numbers, velocities, or note-event times already in a MIDI file. If an imported melody has the right notes but the wrong sound, inspect the program messages and the receiving instrument before transposing or drawing the notes again.

That distinction is visible in the four downloadable examples below. Every file contains the same channel-1 note: key 60, velocity 80, starting at tick 0 and ending at tick 480. Changing the program request changes the selected program in our small state model; the note events stay identical.

Four files that separate patch selection from notes

On October 25, 2026, we generated four original Standard MIDI Files and parsed their bytes with the supplied Python script. They use format 0, one track, 480 ticks per quarter note and a 500,000-microsecond tempo event. Each program event precedes the note-on in track order, even when both have tick 0.

Program state when the channel-1 note begins; values are raw 0–127 numbers
DownloadRequest before noteInitial programProgram at note-onNote span
program-0.midChannel 1, program 00060; ticks 0–480
program-40.midChannel 1, program 4004060; ticks 0–480
wrong-channel.midChannel 2, program 400060; ticks 0–480
no-program.midNone0, then 40 in separate runs0, then 4060; ticks 0–480

The wrong-channel case leaves channel 1's program unchanged in the model. The no-program file has exactly the same bytes in both runs; its starting state is deliberately supplied by the parser. These are useful controls: a missing request and a request on another channel can both leave a melody using a sound selected elsewhere.

This experiment checks file structure and a declared channel-state rule. We did not render audio, open these files in a DAW, measure patch-loading delays, or test an audio-to-MIDI model. A receiver may ignore, filter or remap program changes. The table therefore reports program numbers, not instrument names or an assertion about what every player will sound like.

Read the message without confusing it with a note

The MIDI Association's message summary distinguishes Program Change from Note On and Note Off. A program message has a status byte in the C0–CF range followed by one program-number data byte. The channel occupies the low four bits of the status byte. The program value is 0–127.

C0 28       program 40 on channel 1
C1 28       program 40 on channel 2
90 3C 50    note-on: channel 1, key 60, velocity 80
80 3C 00    note-off: channel 1, key 60

These are hexadecimal message bytes, without the MIDI file's delta-time and track wrappers. Hex 28 is decimal 40. The program value is not a pitch: changing 28 in the program message does not turn key 60 into key 40. Similarly, a C0 message has one data byte; a parser that consumes two will misread the following event.

Why the sound can still differ between players

A program number is a request interpreted by the destination. Gig Performer's own documentation explains both device-specific patch ordering and its ability to use program changes for rackspace or song-part selection. Do not assume the same raw number means the same sound across arbitrary plug-ins and hardware.

There is also a display-number trap. The same documentation describes switching the displayed range between 0–127 and 1–128. Compare the numbering convention before adding or subtracting one. Our downloads and table use raw values throughout; they do not label program 40 as a universally available instrument.

For a destination that uses banks, consult its implementation guide as well as its program list. Bank selection and program selection are separate pieces of the setup. This experiment intentionally contains no bank-select messages, so it cannot prove that a particular bank or preset library was loaded.

A short check before editing a converted melody

  1. Inspect the notes first. Compare pitch and timing with the source recording. A sound-selection change cannot repair a missing note or an octave error.
  2. Check the destination and channel. Find the program event in the event list, then check where the track sends its notes. Our wrong-channel control is a reminder to compare both fields.
  3. Check whether the receiver supports the request. A visible program event is not proof that a plug-in accepted it. Use its documented MIDI implementation and patch mapping.
  4. Check when the request is sent. Ableton's official instructions say its clip program request is sent when the clip is launched. An imported event list and a clip-launch setting are different places to inspect.
  5. Compare with a copy that has no program request. Choose the destination's sound manually for that comparison. Keep the original file so you can restore its setup rather than accidentally deleting it.

If the wrong pitch is actually inside the note data, return to the transcription checklist. If a held note changes pitch without a different note number, the separate pitch-bend example examines another message type. Those problems need different evidence from patch selection.

Reproduce the byte-level comparison

Download experiment.py into an empty working folder and run python experiment.py with Python 3. It writes the four MIDI files, the parsed event trace and the comparison CSV. No packages or account are required. The script asserts identical note events and the five program-at-note-on results 0, 40, 0, 0 and 40.

The parser is deliberately limited to the explicit-status messages and meta events generated here. It is not a general MIDI validator and does not implement running status, sound generation, bank mapping or device-specific preset behavior. Use the files to inspect this distinction, then verify the actual destination with its own documentation and playback.