def writemidi( self, filedir="" ): # sort the events by absoluteticks # put all tempo, time signature data in track 0, as well as any instrument or track names # first grab the track name if self.texts[0][0].text != "": trackname = MIDI.TrackNameEvent(text=self.texts[0][0].text, tick=0) trackname.absoluteticks = 0 # for some reason, the data doesn't get through via the text above. trackname.data = [ ] i = 0 while i < len(self.texts[0][0].text): trackname.data.append( ord( self.texts[0][0].text[i] ) ) i+= 1 tracks = [[ trackname]] del trackname # so that when we reuse this variable later it doesn't change the above else: tracks = [[]] # put all tempo, time signature data in track 0 tracks[0] += self.texts[0][1:] + self.tempos+self.timesignatures+self.notes[0] # sort everything tracks[0].sort(key=operator.attrgetter('absoluteticks')) # then grab the instrument if self.channels[0] != 9 and self.instruments[0]: tracks[0].insert(0, MIDI.ProgramChangeEvent( value=self.instruments[0], channel=self.channels[0] ) ) for i in range(1,len(self.notes)): # sort each track separately # first grab the track name if self.texts[i][0].text != "": trackname = MIDI.TrackNameEvent(text=self.texts[i][0].text, tick=0) # for some reason, the data doesn't get through via the text above. trackname.data = [ ] trackname.absoluteticks = 0 j = 0 while j < len(self.texts[i][0].text): trackname.data.append( ord( self.texts[i][0].text[j] ) ) j += 1 tracks.append( [ trackname ] ) del trackname # so that when we reuse this variable later it doesn't change the above else: tracks.append( [] ) # then grab the instrument tracks[i] += self.texts[i][1:] + self.notes[i] tracks[i].sort(key=operator.attrgetter('absoluteticks')) if self.channels[i] != 9 and self.instruments[i]: tracks[i].insert(0, MIDI.ProgramChangeEvent( value=self.instruments[i], channel=self.channels[i] )) # now that everything is sorted globally, # make sure that the local ticks are correct. tickdivisor = config.EDITresolution for i in range(len(tracks)): tracks[i].insert(0, MIDI.ControlChangeEvent( tick=0, channel=self.channels[i], data=[7,127]) ) for track in tracks: previouseventabsoluteticks = 0 for event in track: try: thiseventabsoluteticks = int(event.absoluteticks) except AttributeError: thiseventabsoluteticks = 0 # number of ticks between previous event and the current event tickmeoff = thiseventabsoluteticks - previouseventabsoluteticks event.tick = tickmeoff # check to see how small we can get the resolution tickdivisor = gcd( tickdivisor, tickmeoff ) # set up the ticks for next event previouseventabsoluteticks = thiseventabsoluteticks if config.EDITresolution % tickdivisor: Error(" min RESOLUTION does not divide our EDITresolution. something is funky ") # prep the new pattern for creating newpattern = MIDI.Pattern( resolution=config.EDITresolution/tickdivisor ) for track in tracks: if tickdivisor > 1: for event in track: # divide up the relative ticks event.tick /= tickdivisor # keep absolute ticks in the EDITresolution if track[-1].name != "End of Track": # add an end of track if it isn't there track.append( MIDI.EndOfTrackEvent( tick=config.EDITresolution/tickdivisor ) ) newpattern.append( MIDI.Track(track) ) if filedir == "": MIDI.write_midifile(self.midifile, newpattern) else: MIDI.write_midifile(filedir, newpattern)
def main(argv): import getopt from wavestream import WaveReader def usage(): print( 'usage: %s [-M|-F] [-n pitchmin] [-m pitchmax] [-t threshold] ' '[-o out.mid] [-w wsize] [-p instru] wav ...' % argv[0]) return 100 try: (opts, args) = getopt.getopt(argv[1:], 'MFn:m:t:o:w:p:') except getopt.GetoptError: return usage() pitchmin = 70 pitchmax = 400 threshold = 0.97 outpath = 'out.mid' wsize = 50 instru = 0 attack = 70 release = 70 for (k, v) in opts: if k == '-M': (pitchmin, pitchmax) = (75, 200) # male voice elif k == '-F': (pitchmin, pitchmax) = (150, 300) # female voice elif k == '-n': pitchmin = int(v) elif k == '-m': pitchmax = int(v) elif k == '-t': threshold = float(v) elif k == '-o': outpath = v elif k == '-w': wsize = int(v) elif k == '-p': instru = int(v) contour = None for path in args: src = WaveReader(path) if contour is None: contour = PitchContour(src.framerate, pitchmin=pitchmin, pitchmax=pitchmax, threshold=threshold) contour.load(src.readraw(), src.nframes) src.close() events = [midi.ProgramChangeEvent(tick=0, channel=0, data=[instru])] window = [] km0 = 0 kt = 0 kd = 0 piano = open("../server/piano.txt", "w") for p in contour.segments: if p == 0: k = 0 else: i = getpt(FRANGES, p) (_, k) = FRANGES[i - 1] window.append(k) if len(window) < wsize: continue window = window[1:] km1 = majority(window) if km0 == km1: kd += 1 else: print km0, kd piano.write(str(km0) + ' ' + str(kd) + '\r\n') if km0 == 0: kt += kd else: events.append( midi.NoteOnEvent(tick=kt, channel=0, data=[km0, attack])) events.append( midi.NoteOffEvent(tick=kd, channel=0, data=[km0, release])) kt = 0 kd = 0 km0 = km1 piano.write('EOF') piano.close() events.append(midi.EndOfTrackEvent(tick=0, data=[])) pat = midi.Pattern(tracks=[events]) midi.write_midifile(outpath, pat) return
# In[37]: pattern = midi.Pattern(format=1, resolution=480, tracks=[ midi.Track([ midi.TimeSignatureEvent(tick=0, data=[4, 2, 24, 8]), midi.KeySignatureEvent(tick=0, data=[0, 0]), midi.SetTempoEvent(tick=0, data=[7, 161, 32]), midi.ControlChangeEvent(tick=0, channel=0, data=[121, 0]), midi.ProgramChangeEvent(tick=0, channel=0, data=[0]), midi.ControlChangeEvent(tick=0, channel=0, data=[7, 100]), midi.ControlChangeEvent(tick=0, channel=0, data=[10, 64]), midi.ControlChangeEvent(tick=0, channel=0, data=[91, 0]), midi.ControlChangeEvent(tick=0, channel=0, data=[93, 0]), midi.PortEvent(tick=0, data=[0]) ])
INSTRUMENT = 40 # Choose the instrument rendering the music BASE_TICK = 25 unigrams = open(INPUT_FILE, "r") prev_unigram = 0 # No sound to start with tick_count = 0 pattern = midi.Pattern() track = midi.Track() pattern.append(track) set_instrument_event = midi.ProgramChangeEvent() set_instrument_event.set_value(INSTRUMENT) track.append(set_instrument_event) set_tempo_event = midi.SetTempoEvent() set_tempo_event.set_bpm(BPM) track.append(set_tempo_event) for unigram_string in unigrams: tick_count = tick_count + 1 unigram = int(unigram_string) if unigram != prev_unigram: note = unigram + (LOWEST_NOTE - 1) previous_note = prev_unigram + (LOWEST_NOTE - 1) if prev_unigram != 0: # First turn off any notes that are playing already
def vector_to_midi(vector): '''Given a np array (vector.data), returns a python midi pattern''' pattern = midi.Pattern(resolution=960) #first, separate tracks tracklist = {} for i in xrange(2, vector.shape[0], 4): for j in xrange(0, vector.shape[1]): track = vector[i:i + 4, j] if np.sum(track) > 0: instrument = int(track[0]) if instrument not in tracklist: tracklist[instrument] = np.vstack( (vector[0:2, j].reshape(-1, 1), track.reshape(-1, 1))) else: tracklist[instrument] = np.hstack( (tracklist[instrument], np.vstack((vector[0:2, j].reshape(-1, 1), track.reshape(-1, 1))))) for k, track in tracklist.iteritems(): miditrack = midi.Track() pattern.append(miditrack) bpm = track[1, 0] tempoevent = midi.SetTempoEvent(tick=0, bpm=bpm) miditrack.append(tempoevent) instrument = int(track[2, 0]) fontevent = midi.ProgramChangeEvent(tick=0, value=instrument) miditrack.append(fontevent) if not np.array_equal(bpm * np.ones(track.shape[1]), track[1, :]): print 'Tempo changes. Code assumes it doesn\'t. Contact Jingyi.' event_tick = 0 track_duration = np.max(track[0, :] + track[-1, :]) active_notes = {} start_times = track[0, :] for t in xrange(0, int(track_duration) + 1): for pitch in active_notes: active_notes[pitch] -= 1 negs = [k for k, v in active_notes.iteritems() if v < 0] for n in negs: active_notes.pop(n) while 0 in active_notes.values(): pitches = [k for k, v in active_notes.iteritems() if v == 0] for pitch in pitches: off = midi.NoteOffEvent(tick=t - event_tick, pitch=pitch) miditrack.append(off) active_notes.pop(pitch) event_tick = t #run through track to add on/off events if t in start_times: ni = np.where(t == start_times) for n in ni[0]: note = track[:, n] start_time = int(note[0]) pitch = int(note[3]) velocity = int(note[4]) duration = int(note[5]) active_notes[pitch] = duration on = midi.NoteOnEvent(tick=t - event_tick, velocity=velocity, pitch=pitch) miditrack.append(on) event_tick = start_time miditrack.append(midi.EndOfTrackEvent(tick=0)) return pattern
# if group[0] == 'blank': # continue print("Group: ") empty = True for instrument in group: inum = instrument_num(instrument) # For normal instruments, play a couple of different notes. # For percussion instruments, play a couple of note on # the percussion channel. if inum <= 128: print("\t%s (%i)" % (instrument, inum)) track.extend( [ midi.ProgramChangeEvent(tick=time, channel=0, data=[inum]), midi.NoteOnEvent( tick=0, channel=0, velocity=92, pitch=midi.A_3 ), midi.NoteOffEvent( tick=50, channel=0, velocity=92, pitch=midi.A_3 ), midi.NoteOnEvent( tick=0, channel=0, velocity=92, pitch=midi.B_3 ), midi.NoteOffEvent( tick=50, channel=0, velocity=92, pitch=midi.B_3 ), ] ) else:
def select_patch(self, patch): if patch < 0 or patch >= BANK_SIZE: raise ArgumentError("Invalid Patch") self.seq.event_write(midi.ProgramChangeEvent(tick=0, channel=0, data=[patch]), False, False, True)
import midi pattern = midi.Pattern() track = midi.Track() pattern.append(track) track.append(midi.ProgramChangeEvent(tick=0, channel=2, data=[5])) track.append(midi.NoteOnEvent(tick=0, channel=2, data=[80, 127])) track.append(midi.NoteOffEvent(tick=160, channel=2, data=[80, 127])) track.append(midi.NoteOnEvent(tick=0, channel=2, data=[80, 127])) track.append(midi.NoteOffEvent(tick=160, channel=2, data=[80, 127])) track.append(midi.NoteOnEvent(tick=0, channel=2, data=[80, 127])) track.append(midi.NoteOffEvent(tick=160, channel=2, data=[80, 127])) track.append(midi.NoteOnEvent(tick=0, channel=2, data=[80, 127])) track.append(midi.NoteOffEvent(tick=160, channel=2, data=[80, 127])) eot = midi.EndOfTrackEvent(tick=1) track.append(eot) print(pattern) midi.write_midifile("example.mid", pattern)
""" Created on Sun Sep 30 12:56:08 2018 @author: wrb """ import numpy as np import midi import time melody=np.loadtxt('save_test.txt',dtype=np.int32) # Recon tone_set=[midi.TimeSignatureEvent(tick=0, data=[4, 2, 24, 8]), midi.EndOfTrackEvent(tick=0, data=[])] note_list=[midi.ProgramChangeEvent(tick=0, channel=0, data=[1])] l=np.shape(melody)[0] k=0 p=0 #ch=np.array([[48,52,55],[43,47,50],[45,48,52],[40,43,47], # [41,45,48],[36,40,43],[38,41,45],[43,47,50]])+12 ch=np.array([[48,52,55],[47,50,55],[48,52,57],[47,52,55], [48,53,57],[48,52,55],[50,53,57],[47,50,55]]) amp1=112 amp0=80 rhy=80 for i in range(l): if (i%8==0): a=(i//8)%8 if (i>0): note_list.append(midi.NoteOffEvent(tick=rhy*(i-p), channel=0, data=[ch[a-1,0], 0]))
def main(): line_re = r"(?P<timestamp>\d{2}:\d{2}:\d{2}.\d{6}) IP (?P<src>\d+\.\d+\.\d+\.\d+)\.(?P<sport>\d+) > (?P<dst>\d+\.\d+\.\d+\.\d+)\.(?P<dport>\d+): (?:Flags \[(?P<flags>[SFPRUWE\.]+)\])?.+?length (?P<length>\d+)" arg_parser = argparse.ArgumentParser(description="MIDI from tcpdump") arg_parser.add_argument('-f', help="Output file, omit or give - for stdout", metavar='file', default='-') args = arg_parser.parse_args() if args.f == '-': output_file = sys.stdout else: output_file = open(args.f, 'w') pattern = midi.Pattern() track = midi.Track() pattern.append(track) track2 = midi.Track() pattern.append(track2) last_time = datetime.now() line = sys.stdin.readline() while line: match = re.match(line_re, line) if match: data = match.groupdict() # Get the difference between now and the last event now = datetime.strptime(data['timestamp'], '%H:%M:%S.%f') spacing = int((now - last_time).microseconds / 1000.0) last_time = now if spacing < MIN_SPACING: spacing = MIN_SPACING # Determine note length based on packet length pkt_length = int(data.get('length', 0)) note_length = int(pow(pkt_length, 0.75)) if note_length < MIN_LENGTH: note_length = MIN_LENGTH # determine the note to play based on TCP flags note = midi.C_3 flags = data.get('flags', '') if flags: if 'S' in flags: note = midi.D_3 elif '.' in flags: note = midi.C_3 elif 'F' in flags: note = midi.G_3 elif 'R' in flags: note = midi.F_3 # Determine the octave based on the src and dst IPs octave = hash((data['src'], data['dst'])) % 6 + 2 note = note + octave * 12 if note > MAX_OCTAVE: note = MAX_OCTAVE # Finally, append the note to the track track.append(midi.NoteOnEvent(tick=0, velocity=70, pitch=note)) track.append(midi.NoteOffEvent(tick=300, pitch=note)) track.append(midi.ProgramChangeEvent(data=[0])) track2.append(midi.NoteOnEvent(tick=50, velocity=70, pitch=note)) track2.append(midi.NoteOffEvent(tick=90, pitch=note)) track2.append(midi.ProgramChangeEvent(data=[19])) line = sys.stdin.readline() # Dump MIDI track to stdout track.append(midi.EndOfTrackEvent(tick=1)) track2.append(midi.EndOfTrackEvent(tick=1)) midi.write_midifile(output_file, pattern) return 0
def set_instrument(self, time, instrument_number): #print(" %s set instrument at %s to %s" % (self.id, time, instrument_number)) self.midi_data_track.append( midi.ProgramChangeEvent(channel=self.channel_number, tick=time, value=instrument_number))
def writemidi(self, filedir=""): # sorteer de events van abs ticks # gooit alle tracks en time signatures in track [0] # pak de track naam if self.texts[0][0].text != "": trackname = MIDI.TrackNameEvent(text=self.texts[0][0].text, tick=0) trackname.absoluteticks = 0 # dunno werkt niet voor een of andere reden trackname.data = [] i = 0 while i < len(self.texts[0][0].text): trackname.data.append(ord(self.texts[0][0].text[i])) i += 1 tracks = [[trackname]] del trackname # verwijderd de naam als de hierboven genoteerde naam opnieuw wordt gebruikt else: tracks = [[]] # gooi alles in track [0] tracks[0] += self.texts[0][ 1:] + self.tempos + self.timesignatures + self.notes[0] # sorteer alles tracks[0].sort(key=operator.attrgetter('absoluteticks')) # pakt de instrument if self.channels[0] != 9 and self.instruments[0]: tracks[0].insert( 0, MIDI.ProgramChangeEvent(value=self.instruments[0], channel=self.channels[0])) for i in range(1, len(self.notes)): # sorteer de tracks # pak de track naam if self.texts[i][0].text != "": trackname = MIDI.TrackNameEvent(text=self.texts[i][0].text, tick=0) # dunno dit werkt niet voor een of andere reden trackname.data = [] trackname.absoluteticks = 0 j = 0 while j < len(self.texts[i][0].text): trackname.data.append(ord(self.texts[i][0].text[j])) j += 1 tracks.append([trackname]) del trackname # verwijderd de naam als de hierboven genoteerde naam opnieuw wordt gebruikt else: tracks.append([]) # pak de instrument tracks[i] += self.texts[i][1:] + self.notes[i] tracks[i].sort(key=operator.attrgetter('absoluteticks')) if self.channels[i] != 9 and self.instruments[i]: tracks[i].insert( 0, MIDI.ProgramChangeEvent(value=self.instruments[i], channel=self.channels[i])) # kijk of de lokale ticks goed zijn tickdivisor = config.EDITresolution for i in range(len(tracks)): tracks[i].insert( 0, MIDI.ControlChangeEvent(tick=0, channel=self.channels[i], data=[7, 127])) for track in tracks: previouseventabsoluteticks = 0 for event in track: try: thiseventabsoluteticks = int(event.absoluteticks) except AttributeError: thiseventabsoluteticks = 0 # aantal ticks in vergelijking tot voorgaande ticks en current ticks tickmeoff = thiseventabsoluteticks - previouseventabsoluteticks event.tick = tickmeoff # om te kijken hoe klein de resolutie is tickdivisor = gcd(tickdivisor, tickmeoff) # set de ticks voor de volgende event(midi) previouseventabsoluteticks = thiseventabsoluteticks if config.EDITresolution % tickdivisor: Error( " min RESOLUTON kan niet gedeeld worden door EDITresolution. er is iets gaande " ) newpattern = MIDI.Pattern(resolution=config.EDITresolution / tickdivisor) for track in tracks: if tickdivisor > 1: for event in track: # deel de relatieve ticks event.tick /= tickdivisor # laat abs ticks in de edit resolution if track[-1].name != "End of Track": # voeg het einde van een track hier als het er niet is track.append( MIDI.EndOfTrackEvent(tick=config.EDITresolution / tickdivisor)) newpattern.append(MIDI.Track(track)) if filedir == "": MIDI.write_midifile(self.midifile, newpattern) else: MIDI.write_midifile(filedir, newpattern)
def roll_to_midi(rolls, tick_per_time_slice, resolution=120): # melody is index 0 # guitar is index 1 # piano is index 2 # bass is index 3 # drum is index 4 result = midi.Pattern(resolution=resolution * 100) for i in range(5): if i >= len(rolls): continue roll = rolls[i] channel = i # for drum if channel == 4: channel = 9 track = midi.Track() if i == 0: track.append( midi.ProgramChangeEvent(tick=0, data=[53], channel=channel)) elif i == 1: track.append( midi.ProgramChangeEvent(tick=0, data=[29], channel=channel)) elif i == 2: track.append( midi.ProgramChangeEvent(tick=0, data=[0], channel=channel)) elif i == 3: track.append( midi.ProgramChangeEvent(tick=0, data=[34], channel=channel)) else: track.append( midi.ProgramChangeEvent(tick=0, data=[1], channel=channel)) current_tick = 0 prev_intensity = [0 for _ in range(128)] prev_tick = 0 for time_slice in range(roll.shape[1]): for pitch in range(roll.shape[0]): if roll[pitch][time_slice] != prev_intensity[pitch]: diff_tick = current_tick - prev_tick if roll[pitch][time_slice] == 0: track.append( midi.NoteOffEvent( tick=diff_tick, data=[pitch, prev_intensity[pitch]], channel=channel)) prev_intensity[pitch] = 0 prev_tick = current_tick else: if prev_intensity[pitch] == 0: track.append( midi.NoteOnEvent( tick=diff_tick, data=[pitch, roll[pitch][time_slice]], channel=channel)) prev_intensity[pitch] = roll[pitch][time_slice] prev_tick = current_tick else: track.append( midi.NoteOffEvent( tick=diff_tick, data=[pitch, prev_intensity[pitch]], channel=channel)) track.append( midi.NoteOnEvent( tick=diff_tick, data=[pitch, roll[pitch][time_slice]], channel=channel)) prev_intensity[pitch] = roll[pitch][time_slice] prev_tick = current_tick current_tick += tick_per_time_slice track.append(midi.EndOfTrackEvent(tick=0, channel=channel)) # if i == 1: result.append(track) return result
def main(): line_re = r"(?P<timestamp>\d{2}:\d{2}:\d{2}.\d{6}) IP (?P<src>\d+\.\d+\.\d+\.\d+)\.(?P<sport>\d+) > (?P<dst>\d+\.\d+\.\d+\.\d+)\.(?P<dport>\d+): (?:Flags \[(?P<flags>[SFPRUWE\.]+)\])?.+?length (?P<length>\d+)" arg_parser = argparse.ArgumentParser(description="MIDI from tcpdump") arg_parser.add_argument('-f', help="Output file, omit or give - for stdout", metavar='file', default='-') args = arg_parser.parse_args() if args.f == '-': output_file = sys.stdout else: output_file = open(args.f, 'w') # To add track you can copy the first track (track = midi.Track() pattern.append(track)) an change the number behind. pattern = midi.Pattern() ########################### track = midi.Track() pattern.append(track) ########################### track2 = midi.Track() pattern.append(track2) track3 = midi.Track() pattern.append(track3) track4 = midi.Track() pattern.append(track4) track5 = midi.Track() pattern.append(track5) track6 = midi.Track() pattern.append(track6) track7 = midi.Track() pattern.append(track7) """track8 = midi.Track() pattern.append(track8) track9 = midi.Track() pattern.append(track9) track10 = midi.Track() pattern.append(track10) track11 = midi.Track() pattern.append(track11) track12 = midi.Track() pattern.append(track12) track13 = midi.Track() pattern.append(track13) track14 = midi.Track() pattern.append(track14) track15 = midi.Track() pattern.append(track15)""" last_time = datetime.now() line = sys.stdin.readline() while line: match = re.match(line_re, line) if match: data = match.groupdict() # Get the difference between now and the last event now = datetime.strptime(data['timestamp'], '%H:%M:%S.%f') spacing = int((now - last_time).microseconds / 1000.0) last_time = now if spacing < MIN_SPACING: spacing = MIN_SPACING # Determine note length based on packet length pkt_length = int(data.get('length', 0)) note_length = int(pow(pkt_length, 0.75)) if note_length < MIN_LENGTH: note_length = MIN_LENGTH # determine the note to play based on TCP flags note = midi.E_3 # Modifire midi.C_3 to midi.E_3 flags = data.get('flags', '') if flags: # You can change the note D C G F how do you want. if 'S' in flags: note = midi.D_5 elif '.' in flags: note = midi.C_5 elif 'F' in flags: note = midi.G_5 elif 'R' in flags: note = midi.F_5 # Determine the octave based on the src and dst IPs octave = hash((data['src'], data['dst'])) % 6 + 2 note = note + octave * 5 if note > MAX_OCTAVE: note = MAX_OCTAVE # Finally, append the note to the track, Velocity is between 0 and 127 also just copy the first 3 lines to add an track don't forget to change the number behind track. track.append(midi.NoteOnEvent(tick=800, velocity=127, pitch=50)) track.append(midi.NoteOffEvent(tick=800, pitch=50)) track.append(midi.ProgramChangeEvent(data=[115])) track2.append( midi.NoteOnEvent(tick=200, velocity=127, pitch=midi.C_3)) track2.append(midi.NoteOffEvent(tick=200, pitch=midi.C_3)) track2.append(midi.ProgramChangeEvent(data=[120])) track3.append(midi.NoteOnEvent(tick=400, velocity=50, pitch=note)) track3.append(midi.NoteOffEvent(tick=400, pitch=note)) track3.append(midi.ProgramChangeEvent(data=[0])) track4.append(midi.NoteOnEvent(tick=200, velocity=50, pitch=note)) track4.append(midi.NoteOffEvent(tick=400, pitch=note)) track4.append(midi.ProgramChangeEvent(data=[27])) track5.append(midi.NoteOnEvent(tick=400, velocity=100, pitch=note)) track5.append(midi.NoteOffEvent(tick=800, pitch=note)) track5.append(midi.ProgramChangeEvent(data=[53])) track6.append(midi.NoteOnEvent(tick=200, velocity=50, pitch=note)) track6.append(midi.NoteOffEvent(tick=400, pitch=note)) track6.append(midi.ProgramChangeEvent(data=[32])) track7.append(midi.NoteOnEvent(tick=0, velocity=75, pitch=note)) track7.append(midi.NoteOffEvent(tick=100, pitch=note)) track7.append(midi.ProgramChangeEvent(data=[72])) #track8.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note)) #track8.append(midi.NoteOffEvent(tick=500, pitch=note)) #track8.append(midi.ProgramChangeEvent(data=[52])) #track9.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note)) #track9.append(midi.NoteOffEvent(tick=500, pitch=note)) #track9.append(midi.ProgramChangeEvent(data=[52])) #track10.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note)) #track10.append(midi.NoteOffEvent(tick=500, pitch=note)) #track10.append(midi.ProgramChangeEvent(data=[52])) #track11.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note)) #track11.append(midi.NoteOffEvent(tick=500, pitch=note)) #track11.append(midi.ProgramChangeEvent(data=[52])) #track12.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note)) #track12.append(midi.NoteOffEvent(tick=500, pitch=note)) #track12.append(midi.ProgramChangeEvent(data=[52])) #track13.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note)) #track13.append(midi.NoteOffEvent(tick=500, pitch=note)) #track13.append(midi.ProgramChangeEvent(data=[52])) #track14.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note)) #track14.append(midi.NoteOffEvent(tick=500, pitch=note)) #track14.append(midi.ProgramChangeEvent(data=[52])) #track15.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note)) #track15.append(midi.NoteOffEvent(tick=500, pitch=note)) #track15.append(midi.ProgramChangeEvent(data=[52])) line = sys.stdin.readline() # Dump MIDI track to stdout add the track.append(midi.EndOfTrackEvent(tick=1)) and change the number behind the track to add a track track.append(midi.EndOfTrackEvent(tick=1)) track2.append(midi.EndOfTrackEvent(tick=1)) track3.append(midi.EndOfTrackEvent(tick=1)) track4.append(midi.EndOfTrackEvent(tick=1)) track5.append(midi.EndOfTrackEvent(tick=1)) track6.append(midi.EndOfTrackEvent(tick=1)) track7.append(midi.EndOfTrackEvent(tick=1)) # track8.append(midi.EndOfTrackEvent(tick=1)) # track9.append(midi.EndOfTrackEvent(tick=1)) # track10.append(midi.EndOfTrackEvent(tick=1)) # track11.append(midi.EndOfTrackEvent(tick=1)) # track12.append(midi.EndOfTrackEvent(tick=1)) # track13.append(midi.EndOfTrackEvent(tick=1)) # track14.append(midi.EndOfTrackEvent(tick=1)) # track15.append(midi.EndOfTrackEvent(tick=1)) midi.write_midifile(output_file, pattern) return 0
def process(input_path, output_path, resolution): output = midi.Pattern(resolution=resolution) print(resolution) melody_track = midi.Track() melody_track.append(midi.ProgramChangeEvent(tick=0, data=[53], channel=0)) guitar_track = midi.Track() guitar_track.append(midi.ProgramChangeEvent(tick=0, data=[29], channel=1)) piano_track = midi.Track() piano_track.append(midi.ProgramChangeEvent(tick=0, data=[0], channel=2)) bass_track = midi.Track() bass_track.append(midi.ProgramChangeEvent(tick=0, data=[34], channel=3)) drum_track = midi.Track() # drum_track.append(midi.TrackNameEvent(tick=0, text='tk10', data=[116, 107, 49, 48])) # drum_track.append(midi.PortEvent(tick=0, data=[0])) # drum_track.append(midi.ChannelPrefixEvent(tick=0, data=[9])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[0, 127])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[32, 0])) drum_track.append(midi.ProgramChangeEvent(tick=0, channel=9, data=[1])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[7, 110])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[11, 100])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[91, 34])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 29])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 28])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 47])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 121])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 24])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 47])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 60])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 24])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 45])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 64])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 24])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 43])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 63])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 28])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 40])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 53])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 28])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 57])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 84])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 24])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 42])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 60])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 24])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 46])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 59])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 24])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 49])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 59])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 28])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 49])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 19])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 28])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 51])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 95])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 29])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 55])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 60])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[101, 127])) # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[100, 127])) with open(input_path, 'r') as f: rdr = csv.reader(f) cur_tick = 0.0 plus_tick_per_time_slice = 0.0205 * resolution print(plus_tick_per_time_slice) lines = 0 for line in rdr: lines += 1 ones = [i for i, x in enumerate(line) if x == '1'] for i in ones: if 0 <= i < 128: melody_track.append( midi.NoteOnEvent(tick=0, data=[i, 70], channel=0)) elif 128 <= i < 256: melody_track.append( midi.NoteOffEvent(tick=0, data=[i - 128, 0], channel=0)) elif 0 <= i - 356 < 128: guitar_track.append( midi.NoteOnEvent(tick=0, data=[i - 356, 30], channel=1)) elif 128 <= i - 356 < 256: guitar_track.append( midi.NoteOffEvent(tick=0, data=[i - 356 - 128, 0], channel=1)) elif 0 <= i - 356 * 2 < 128: piano_track.append( midi.NoteOnEvent(tick=0, data=[i - 356 * 2, 30], channel=2)) elif 128 <= i - 356 * 2 < 256: piano_track.append( midi.NoteOffEvent(tick=0, data=[i - 356 * 2 - 128, 0], channel=2)) elif 0 <= i - 356 * 3 < 128: bass_track.append( midi.NoteOnEvent(tick=0, data=[i - 356 * 3, 30], channel=3)) elif 128 <= i - 356 * 3 < 256: bass_track.append( midi.NoteOffEvent(tick=0, data=[i - 356 * 3 - 128, 0], channel=3)) elif 0 <= i - 356 * 4 < 128: drum_track.append( midi.NoteOnEvent(tick=0, data=[i - 356 * 4, 30], channel=9)) elif 128 <= i - 356 * 4 < 256: drum_track.append( midi.NoteOffEvent(tick=0, data=[i - 356 * 4 - 128, 0], channel=9)) prev_tick = cur_tick cur_tick += plus_tick_per_time_slice plus_tick = int(cur_tick - prev_tick) melody_track[-1].tick += plus_tick guitar_track[-1].tick += plus_tick piano_track[-1].tick += plus_tick bass_track[-1].tick += plus_tick drum_track[-1].tick += plus_tick print(lines) print(cur_tick) melody_track.append(midi.EndOfTrackEvent(tick=0, channel=0)) guitar_track.append(midi.EndOfTrackEvent(tick=0, channel=1)) piano_track.append(midi.EndOfTrackEvent(tick=0, channel=2)) bass_track.append(midi.EndOfTrackEvent(tick=0, channel=3)) drum_track.append(midi.EndOfTrackEvent(tick=0, channel=9)) output.append(melody_track) output.append(guitar_track) output.append(piano_track) output.append(bass_track) output.append(drum_track) midi.write_midifile(output_path, output)
def write_midifile(melody, chords, pattern, filename): beat = 4 def get_chord_pitches(chord): base = chord_base[chord[0]] if 'm' in chord: return (base, base + 3, base + 7) else: return (base, base + 4, base + 7) pattern = copy.deepcopy(pattern) del pattern[1] track_melody = midi.Track() pattern.append(track_melody) track_melody.append(midi.ProgramChangeEvent(tick=0, value=0, channel=0)) track_melody.append( midi.TrackNameEvent(tick=0, text='Track 1#', data=[84, 114, 97, 99, 107, 32, 49])) pre_note = None for note in melody: if pre_note != None: tick = int( (note.position - pre_note.position) * pattern.resolution) track_melody.append( midi.NoteOffEvent(tick=tick, pitch=pre_note.pitch, channel=0)) track_melody.append( midi.NoteOnEvent(tick=0, velocity=100, pitch=note.pitch, channel=0)) pre_note = note track_melody.append( midi.NoteOffEvent(tick=pattern.resolution * 1, pitch=pre_note.pitch, channel=0)) track_melody.append(midi.EndOfTrackEvent(tick=0, channel=0)) track_chord = midi.Track() pattern.append(track_chord) track_chord.append(midi.ProgramChangeEvent(tick=0, value=0, channel=1)) track_chord.append( midi.TrackNameEvent(tick=0, text='Track 2#', data=[84, 114, 97, 99, 107, 32, 49], channel=1)) pre_chord = None for chord in chords: if pre_chord != None: tick = int((chord[0] - pre_chord[0]) * pattern.resolution) track_chord.append( midi.NoteOnEvent(tick=tick, velocity=0, pitch=0, channel=1)) for pitch in get_chord_pitches(pre_chord[1]): track_chord.append( midi.NoteOnEvent(tick=0, velocity=0, pitch=pitch, channel=1)) for pitch in get_chord_pitches(chord[1]): track_chord.append( midi.NoteOnEvent(tick=0, velocity=80, pitch=pitch, channel=1)) pre_chord = chord for i, pitch in enumerate(get_chord_pitches(pre_chord[1])): track_chord.append( midi.NoteOnEvent(tick=pattern.resolution * beat if i == 0 else 0, velocity=0, pitch=pitch, channel=1)) track_chord.append(midi.EndOfTrackEvent(tick=0, channel=1)) midi.write_midifile(filename, pattern)