def _parse_midi_event(self, f, delta_time, status): if status & 0xF0 != 0xF0: command = (status & 0xF0) >> 4 channel = status & 0x0F data_1 = self._read_8(f) & 0x7F data_2 = 0 if command in [8, 9, 10, 11, 14]: data_2 = self._read_8(f) & 0x7F if command == 8: return events.NoteOffEvent(delta_time, channel, data_1, data_2) elif command == 9: if data_2 == 0: return events.NoteOffEvent(delta_time, channel, data_1, data_2) return events.NoteOnEvent(delta_time, channel, data_1, data_2) elif command == 10: return events.PolyphonicKeyPressureEvent(delta_time, channel, data_1, data_2) elif command == 11: return events.ControlChangeEvent(delta_time, channel, data_1, data_2) elif command == 12: return events.ProgramChangeEvent(delta_time, channel, data_1) elif command == 13: return events.ChannelPressureEvent(delta_time, channel, data_1) elif command == 14: return events.PitchWheelChangeEvent(delta_time, channel, (data_2 << 7) | data_1) return None message_id = status & 0x0F if message_id == 0: manufacturer_id = self._read_8(f) data = [] d = self._read_8(f) while d != 0xF7: data.append(d) d = self._read_8(f) return events.SystemExclusiveEvent(delta_time, manufacturer_id, data) elif message_id == 2: lo7 = self._read_8(f) hi7 = self._read_8(f) return events.SongPositionPointerEvent(delta_time, (hi7 << 7) | lo7) elif message_id == 3: return events.SongSelectEvent(delta_time, self._read_8(f)) elif message_id == 6: return events.TuneRequestEvent(delta_time) elif message_id == 8: return events.TimingClockEvent(delta_time) elif message_id == 10: return events.StartEvent(delta_time) elif message_id == 11: return events.ContinueEvent(delta_time) elif message_id == 12: return events.StopEvent(delta_time) elif message_id == 14: return events.ActiveSensingEvent(delta_time) elif message_id == 15: return events.ResetEvent(delta_time) return None
def pop_sound(ticktime): cc = events.ProgramChangeEvent(tick=0, channel=0, value=pop_ins) track.append(cc) on = events.NoteOnEvent(channel=0, tick=ticktime, velocity=120, pitch=pop_pitch) track.append(on) #ticktime+=Notelength+Tempo off = events.NoteOffEvent(tick=ticktime + Notelength + Tempo, pitch=pop_pitch, channel=0) track.append(off) return ticktime