Search code examples
midimido

How to handle duplicate note_on, note_off, tempo change in more than one tracks, and tracks without program_change in a midi file?


I'm using Mido for python, working on parsing midi files into <start_time, duration, program, pitch> tuples and met some problems.

Some files that I parse has multiple note_on, resulting in notes at the same pitch and same program being opened more than once.

Some files contains multiple note_off resulting in trying to close notes that is no longer on due to being closed before (assuming only one note at the same program and same pitch can be on).

Some tracks does not have a program_change in the beginning of the track (or even worse, not even having one in the whole track).

Some files has more than one track containing set_tempo messages.

What should I do in each of these cases to ensure I get the correct interpretation?


Solution

  • In general, to get a correct MIDI message stream, you have to merge all tracks in a type 1 file. What matters for a synthesizer are not tracks, but channels.

    The MIDI specification says:

    ASSIGNMENT OF NOTE ON/OFF COMMANDS

    If an instrument receives two or more Note On messages with the same key number and MIDI channel, it must make a determination of how to handle the additional Note Ons. It is up to the receiver as to whether the same voice or another voice will be sounded, or if the messages will be ignored. The transmitter, however, must send a corresponding Note Off message for every Note On sent. If the transmitter were to send only one Note Off message, and if the receiver in fact assigned the two Note On messages to different voices, then one note would linger. Since there is no harm or negative side effect in sending redundant Note Off messages this is the recommended practice.


    The General MIDI System Level 1 Developer Guidelines say that in response to a “GM System On” message, a device should set Program Change to 0. So you can assume this to be the initial value for channels that have notes without a preceding Program Change.


    The Standard MIDI Files specification says that

    tempo information should always be stored in the first MTrk chunk.

    But "should" is not "must".