def add_defaults(single_track, defaults=master_defaults): time_signature = MetaMessage("time_signature") time_signature.numerator = defaults["time_signature.numerator"] time_signature.denominator = defaults["time_signature.denominator"] time_signature.clocks_per_click = defaults["time_signature.clocks_per_click"] time_signature.notated_32nd_notes_per_beat = defaults["time_signature.notated_32nd_notes_per_beat"] key_signature = MetaMessage("key_signature") key_signature.key = defaults["key_signature.key"] set_tempo = MetaMessage("set_tempo") set_tempo.tempo = defaults["set_tempo.tempo"] msgs = [time_signature, key_signature, set_tempo] msgs.extend(single_track) msgs.append(MetaMessage('end_of_track')) return MidiTrack(msgs)
def add_defaults(single_track): time_signature = MetaMessage("time_signature") time_signature.numerator = 4 time_signature.denominator = 2 #quattro quarti time_signature.clocks_per_click = 24 time_signature.notated_32nd_notes_per_beat = 8 key_signature = MetaMessage("key_signature") key_signature.key = 'C' # C major set_tempo = MetaMessage("set_tempo") set_tempo.tempo = 400000 #500000 # 120bpm msgs = [time_signature, key_signature, set_tempo] msgs.extend(single_track) msgs.append(MetaMessage('end_of_track')) return MidiTrack(msgs)
def encoding_to_message(encoding, decodings, defaults=master_defaults): message = decodings[encoding] if message == "START_TRACK": #header defaults time_signature = MetaMessage("time_signature") time_signature.numerator = defaults["time_signature.numerator"] time_signature.denominator = defaults["time_signature.denominator"] time_signature.clocks_per_click = defaults[ "time_signature.clocks_per_click"] time_signature.notated_32nd_notes_per_beat = defaults[ "time_signature.notated_32nd_notes_per_beat"] key_signature = MetaMessage("key_signature") key_signature.key = defaults["key_signature.key"] set_tempo = MetaMessage("set_tempo") set_tempo.tempo = defaults["set_tempo.tempo"] return [time_signature, key_signature, set_tempo] if message == "END_TRACK": return [MetaMessage('end_of_track')] if message == "WAIT_A_BEAT": return [message] if message.startswith("note"): parts = message.split("-") res = Message(parts[0]) res.note = int(parts[1]) res.time = int(parts[2]) # defaults res.channel = defaults["note.channel"] res.velocity = defaults["note.velocity"] return [res] return []
def timesteps_to_midi(timesteps, zeros=0, ones=1, defaults=master_defaults): o = zeros l = ones messages = [] #HEADER time_signature = MetaMessage("time_signature") time_signature.numerator = defaults["time_signature.numerator"] time_signature.denominator = defaults["time_signature.denominator"] time_signature.clocks_per_click = defaults[ "time_signature.clocks_per_click"] time_signature.notated_32nd_notes_per_beat = defaults[ "time_signature.notated_32nd_notes_per_beat"] key_signature = MetaMessage("key_signature") key_signature.key = defaults["key_signature.key"] set_tempo = MetaMessage("set_tempo") set_tempo.tempo = defaults["set_tempo.tempo"] messages.extend([time_signature, key_signature, set_tempo]) state_vectors = { "NOTE": [o, o], "START_TRACK": [l, o], "END_TRACK": [o, l] } silence = [o for i in range(128)] + state_vectors["NOTE"] wait = 0 last_timestep = silence def timestep_diffs(timestep1, timestep2): res = [] for i, t1 in enumerate(timestep1): diff = timestep1[i] - timestep2[i] if diff != 0: res.append(i) return res for timestep in timesteps: diffs = timestep_diffs(timestep[:128], last_timestep[:128]) if (len(diffs) == 0): wait += 1 else: for d in diffs: if last_timestep[d] == o and timestep[d] == l: message = Message("note_on", note=d, time=wait, channel=defaults["note.channel"], velocity=defaults["note.velocity"]) messages.append(message) wait = 0 elif last_timestep[d] == l and timestep[d] == o: message = Message("note_off", note=d, time=wait, channel=defaults["note.channel"]) messages.append(message) wait = 0 last_timestep = timestep messages.append(MetaMessage('end_of_track', time=wait)) wait = 0 mid = MidiFile(ticks_per_beat=defaults["ticks_per_beat"]) mid.tracks.append(MidiTrack(messages)) return mid