def merge_tracksFIXED(tracks): """Returns a MidiTrack object with all messages from all tracks. The messages are returned in playback order with delta times as if they were all in one track. """ now = 0 # REMOVE THIS messages = MidiTrack() for track in tracks: now = 0 # ADD THIS for message in track: now += message.time if message.type not in ('track_name', 'end_of_track'): messages.append(message.copy(time=now)) if message.type == 'end_of_track': break messages.sort(key=lambda x: x.time) messages.append(MetaMessage('end_of_track', time=now)) # Convert absolute time back to delta time. last_time = 0 for message in messages: message.time -= last_time last_time += message.time return messages
def to_delta_time(midi_track: MidiTrack): """Convert a mido MidiTrack object from absolute time to delta time. Parameters ---------- midi_track : :class:`mido.MidiTrack` object mido MidiTrack object to convert. """ # Sort messages by absolute time midi_track.sort(key=lambda x: x.time) # Convert to delta time time = 0 for msg in midi_track: time_ = msg.time msg.time -= time time = time_