def separate_track(original_track, num_track=1, default_tempo=100): set_tempo_event = SetTempoEvent() set_tempo_event.set_bpm(default_tempo) original_track.make_ticks_abs() channel_set = set() for event in original_track: if type(event) is NoteOnEvent or type(event) is NoteOffEvent: channel_set.add(event.channel) if type(event) is SetTempoEvent: set_tempo_event = event channel_track_map = {} index = 0 for channel in channel_set: channel_track_map[channel] = index index += 1 tracks = [] for i in range(max(num_track, len(channel_set))): tracks.append( Track(events=[MIDI.copy_event(set_tempo_event)], tick_relative=False)) for event in original_track: if type(event) is NoteOnEvent or type(event) is NoteOffEvent: copied_event = MIDI.copy_event(event) tracks[channel_track_map[copied_event.channel]].append( copied_event) for track in tracks: track.sort() track.make_ticks_rel() original_track.make_ticks_rel() return tracks
def copy_track(original_track, channel_offset=1, default_tempo=100): set_tempo_event = SetTempoEvent() set_tempo_event.set_bpm(default_tempo) for event in original_track: if type(event) is SetTempoEvent: set_tempo_event = event new_track = Track(events=[MIDI.copy_event(set_tempo_event)], tick_relative=True) for event in original_track: if type(event) is NoteOnEvent or type(event) is NoteOffEvent: copied_event = MIDI.copy_event(event) copied_event.channel += channel_offset new_track.append(copied_event) return new_track
def new_track(tempo=100): track = Track() set_tempo_event = SetTempoEvent() set_tempo_event.set_bpm(tempo) track.append(set_tempo_event) return track