def testAddNote(self): MyMIDI = MIDIFile(1) MyMIDI.addNote(0, 0, 100, 0, 1, 100) self.assertEquals(MyMIDI.tracks[0].eventList[0].type, "note") self.assertEquals(MyMIDI.tracks[0].eventList[0].pitch, 100) self.assertEquals(MyMIDI.tracks[0].eventList[0].time, 0) self.assertEquals(MyMIDI.tracks[0].eventList[0].duration, 1) self.assertEquals(MyMIDI.tracks[0].eventList[0].volume, 100)
def testAddNote(self): MyMIDI = MIDIFile(1) MyMIDI.addNote(0, 0, 100,0,1,100) self.assertEquals(MyMIDI.tracks[0].eventList[0].type, "note") self.assertEquals(MyMIDI.tracks[0].eventList[0].pitch, 100) self.assertEquals(MyMIDI.tracks[0].eventList[0].time, 0) self.assertEquals(MyMIDI.tracks[0].eventList[0].duration, 1) self.assertEquals(MyMIDI.tracks[0].eventList[0].volume, 100)
def testSysEx(self): MyMIDI = MIDIFile(1) MyMIDI.addSysEx(0,0, 0, struct.pack('>B', 0x01)) MyMIDI.close() self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'SysEx') self.assertEquals(get_byte(MyMIDI, 0, 0), 0x00) self.assertEquals(get_byte(MyMIDI, 0, 1), 0xf0) self.assertEquals(get_byte(MyMIDI, 0, 2), 3) self.assertEquals(get_byte(MyMIDI, 0, 3), 0x00) self.assertEquals(get_byte(MyMIDI, 0, 4), 0x01) self.assertEquals(get_byte(MyMIDI, 0, 5), 0xf7)
def testDeinterleaveNotes(self): MyMIDI = MIDIFile(1) MyMIDI.addNote(0, 0, 100, 0, 2, 100) MyMIDI.addNote(0, 0, 100, 1, 2, 100) MyMIDI.close() self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0) self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128) self.assertEquals(MyMIDI.tracks[0].MIDIEventList[2].type, 'NoteOn') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[2].time, 0) self.assertEquals(MyMIDI.tracks[0].MIDIEventList[3].type, 'NoteOff') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[3].time, 256)
def __init__(self, number_tracks: object = 1, tempo: object = 60, instrument: object = 0) -> object: """ instrument: can be an integer or a list """ self.number_tracks = number_tracks self.midi_data = MIDIFile(number_tracks) for track in range(number_tracks): self.midi_data.addTrackName(track, 0, "Track {0}".format(track)) self.midi_data.addTempo(track, 0, tempo) instr = instrument[track] if isinstance(instrument, list) else instrument self.midi_data.addProgramChange(track, 0, 0, instr)
def testUniversalSysEx(self): MyMIDI = MIDIFile(1) MyMIDI.addUniversalSysEx(0,0, 1, 2, struct.pack('>B', 0x01)) MyMIDI.close() self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'UniversalSysEx') self.assertEquals(get_byte(MyMIDI, 0, 0), 0x00) self.assertEquals(get_byte(MyMIDI, 0, 1), 0xf0) self.assertEquals(get_byte(MyMIDI, 0, 2), 6) self.assertEquals(get_byte(MyMIDI, 0, 3), 0x7E) self.assertEquals(get_byte(MyMIDI, 0, 4), 0x7F) self.assertEquals(get_byte(MyMIDI, 0, 5), 0x01) self.assertEquals(get_byte(MyMIDI, 0, 6), 0x02) self.assertEquals(get_byte(MyMIDI, 0, 7), 0x01) self.assertEquals(get_byte(MyMIDI, 0, 8), 0xf7)
def __init__(self, number_tracks=1, tempo=60, instrument=0, channel=None): """ instrument: can be an integer or a list channel: can be an integer or a list """ self.number_tracks = number_tracks self.midi_data = MIDIFile(number_tracks) for track in range(number_tracks): self.midi_data.addTrackName(track, 0, "Track {0}".format(track)) self.midi_data.addTempo(track, 0, tempo) instr = instrument[track] if isinstance(instrument, list) else instrument if channel is None: _channel = track elif isinstance(channel, list): _channel = channel[track] else: _channel = channel self.midi_data.addProgramChange(track, _channel, 0, instr)
def __init__(self, number_tracks=1, tempo=60, instrument=0): """ instrument: can be an integer or a list """ self.number_tracks = number_tracks self.midi_data = MIDIFile(number_tracks) for track in range(number_tracks): self.midi_data.addTrackName(track, 0, "Track {0}".format(track)) self.midi_data.addTempo(track, 0, tempo) instr = instrument[track] if isinstance(instrument, list) else instrument self.midi_data.addProgramChange(track, 0, 0, instr)
def testTuning(self): MyMIDI = MIDIFile(1) MyMIDI.changeNoteTuning(0, [(1, 440), (2, 880)]) MyMIDI.close() self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'UniversalSysEx') self.assertEquals(get_byte(MyMIDI, 0, 0), 0x00) self.assertEquals(get_byte(MyMIDI, 0, 1), 0xf0) self.assertEquals(get_byte(MyMIDI, 0, 2), 15) self.assertEquals(get_byte(MyMIDI, 0, 3), 0x7E) self.assertEquals(get_byte(MyMIDI, 0, 4), 0x7F) self.assertEquals(get_byte(MyMIDI, 0, 5), 0x08) self.assertEquals(get_byte(MyMIDI, 0, 6), 0x02) self.assertEquals(get_byte(MyMIDI, 0, 7), 0x00) self.assertEquals(get_byte(MyMIDI, 0, 8), 0x2) self.assertEquals(get_byte(MyMIDI, 0, 9), 0x1) self.assertEquals(get_byte(MyMIDI, 0, 10), 69) self.assertEquals(get_byte(MyMIDI, 0, 11), 0) self.assertEquals(get_byte(MyMIDI, 0, 12), 0) self.assertEquals(get_byte(MyMIDI, 0, 13), 0x2) self.assertEquals(get_byte(MyMIDI, 0, 14), 81) self.assertEquals(get_byte(MyMIDI, 0, 15), 0) self.assertEquals(get_byte(MyMIDI, 0, 16), 0) self.assertEquals(get_byte(MyMIDI, 0, 17), 0xf7)
def testSysEx(self): MyMIDI = MIDIFile(1) MyMIDI.addSysEx(0, 0, 0, struct.pack('>B', 0x01)) MyMIDI.close() self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'SysEx') self.assertEquals(get_byte(MyMIDI, 0, 0), 0x00) self.assertEquals(get_byte(MyMIDI, 0, 1), 0xf0) self.assertEquals(get_byte(MyMIDI, 0, 2), 3) self.assertEquals(get_byte(MyMIDI, 0, 3), 0x00) self.assertEquals(get_byte(MyMIDI, 0, 4), 0x01) self.assertEquals(get_byte(MyMIDI, 0, 5), 0xf7)
def testUniversalSysEx(self): MyMIDI = MIDIFile(1) MyMIDI.addUniversalSysEx(0, 0, 1, 2, struct.pack('>B', 0x01)) MyMIDI.close() self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'UniversalSysEx') self.assertEquals(get_byte(MyMIDI, 0, 0), 0x00) self.assertEquals(get_byte(MyMIDI, 0, 1), 0xf0) self.assertEquals(get_byte(MyMIDI, 0, 2), 6) self.assertEquals(get_byte(MyMIDI, 0, 3), 0x7E) self.assertEquals(get_byte(MyMIDI, 0, 4), 0x7F) self.assertEquals(get_byte(MyMIDI, 0, 5), 0x01) self.assertEquals(get_byte(MyMIDI, 0, 6), 0x02) self.assertEquals(get_byte(MyMIDI, 0, 7), 0x01) self.assertEquals(get_byte(MyMIDI, 0, 8), 0xf7)
class Midi(object): def __init__(self, number_tracks=1, tempo=60, instrument=0, channel=None): """ instrument: can be an integer or a list channel: can be an integer or a list """ self.number_tracks = number_tracks self.midi_data = MIDIFile(number_tracks) for track in range(number_tracks): self.midi_data.addTrackName(track, 0, "Track {0}".format(track)) self.midi_data.addTempo(track, 0, tempo) instr = instrument[track] if isinstance(instrument, list) else instrument if channel is None: _channel = track elif isinstance(channel, list): _channel = channel[track] else: _channel = channel self.midi_data.addProgramChange(track, _channel, 0, instr) def seq_chords(self, seqlist, track=0, time=0, channel=None): if track + 1 > self.number_tracks: raise MidiError("You are trying to use more tracks than we have.") _channel = channel if channel is not None else track for item in seqlist: if isinstance(item, NoteSeq): volume = item[0].volume dur = item[0].midi_dur for note in item: self.midi_data.addNote(track, _channel, note.midi_number, time, dur, volume) time += dur elif isinstance(item, Rest): time += item.midi_dur else: raise MidiError( "The input should be a list of NoteSeq but yours is a {0}: {1}" .format(type(seqlist), seqlist)) return time def seq_notes(self, noteseq, track=0, time=0, channel=None): if track + 1 > self.number_tracks: raise MidiError("You are trying to use more tracks than we have.") _channel = channel if channel is not None else track for note in noteseq: if isinstance(note, Note): self.midi_data.addNote(track, _channel, note.midi_number, time, note.midi_dur, note.volume) else: # we ignore the rests pass time += note.midi_dur return time def write(self, filename): if isinstance(filename, str): with open(filename, 'wb') as midifile: self.midi_data.writeFile(midifile) else: self.midi_data.writeFile(filename)
from pyknon.MidiFile import MIDIFile, MIDIHeader, MIDITrack, writeVarLength, frequencyTransform, returnFrequency tx = 11 m = MIDIFile(tx) length = 256 # all notes off for t in range(128): m.addNote(0, 0, t, 0, 0, 0) prev = [-1] * tx def writeNote(a, b, c, d, e, f, g=False): if d >= length: return if g or c != prev[a]: m.addNote(a, b, c, d, e, f) else: m.tracks[a].eventList[-1].duration += e prev[a] = c def popcnt(x): return bin(x).count('1') def toscale(scale, note): # todo: totally broken poct = popcnt(scale) n = note % (poct + 1) c = 0 o = 0 for i in format(scale, '012b'):
import math from pyknon.MidiFile import MIDIFile ntracks = 8 m = MIDIFile(ntracks) length = 1024 prev = [-1] * ntracks def add(trk, chn, note, time, dur, vol, rep=False): if time >= length: return if rep or note != prev[trk]: m.addNote(trk, chn, note, time, dur, vol) else: idx = -1 while 'duration' not in dir(m.tracks[trk].eventList[idx]): idx -= 1 m.tracks[trk].eventList[idx].duration += dur prev[trk] = note def popcnt(x): return bin(x).count('1') def toscale(scale, note): poct = popcnt(scale) n = note % (poct + 1) c = 0 o = 0
class Midi(object): def __init__(self, number_tracks=1, tempo=60, instrument=0, channel=None): """ instrument: can be an integer or a list channel: can be an integer or a list """ self.number_tracks = number_tracks self.midi_data = MIDIFile(number_tracks) for track in range(number_tracks): self.midi_data.addTrackName(track, 0, "Track {0}".format(track)) self.midi_data.addTempo(track, 0, tempo) instr = instrument[track] if isinstance(instrument, list) else instrument if channel is None: _channel = track elif isinstance(channel, list): _channel = channel[track] else: _channel = channel self.midi_data.addProgramChange(track, _channel, 0, instr) def seq_chords(self, seqlist, track=0, time=0, channel=None): if track + 1 > self.number_tracks: raise MidiError("You are trying to use more tracks than we have.") _channel = channel if channel is not None else track for item in seqlist: if isinstance(item, NoteSeq): volume = item[0].volume dur = item[0].midi_dur for note in item: self.midi_data.addNote(track, _channel, note.midi_number, time, dur, volume) time += dur elif isinstance(item, Rest): time += item.midi_dur else: raise MidiError("The input should be a list of NoteSeq but yours is a {0}: {1}".format(type(seqlist), seqlist)) return time def seq_notes(self, noteseq, track=0, time=0, channel=None): if track + 1 > self.number_tracks: raise MidiError("You are trying to use more tracks than we have.") _channel = channel if channel is not None else track for note in noteseq: if isinstance(note, Note): self.midi_data.addNote(track, _channel, note.midi_number, time, note.midi_dur, note.volume) else: # we ignore the rests pass time += note.midi_dur return time def write(self, filename): if isinstance(filename, str): with open(filename, 'wb') as midifile: self.midi_data.writeFile(midifile) else: self.midi_data.writeFile(filename)
def testTimeShift(self): # With one track MyMIDI = MIDIFile(1) MyMIDI.addNote(0, 0, 100, 5, 1, 100) MyMIDI.close() self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0) self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128) # With two tracks MyMIDI = MIDIFile(2) MyMIDI.addNote(0, 0, 100, 5, 1, 100) MyMIDI.addNote(1, 0, 100, 6, 1, 100) MyMIDI.close() self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0) self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128) self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].type, 'NoteOn') self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].time, 128) self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].type, 'NoteOff') self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].time, 128) # Negative Time MyMIDI = MIDIFile(1) MyMIDI.addNote(0, 0, 100, -5, 1, 100) MyMIDI.close() self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0) self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128) # Negative time, two tracks MyMIDI = MIDIFile(2) MyMIDI.addNote(0, 0, 100, -1, 1, 100) MyMIDI.addNote(1, 0, 100, 0, 1, 100) MyMIDI.close() self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0) self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff') self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128) self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].type, 'NoteOn') self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].time, 128) self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].type, 'NoteOff') self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].time, 128)