def filterMidiFiles(sourceDir, targetDir): for dirpath, dirnames, filenames in os.walk(sourceDir): for filename in [f for f in filenames if fnmatch(f, '*.mid')]: try: mid = MidiFile(os.path.join(dirpath,filename)) except: print('Cannot read file \"{}\"'.format(os.path.join(dirpath,filename))) continue timeSignatures = midi.getMidiTimeSignature(mid) tempos = midi.getMidiTempo(mid) if len(timeSignatures) > 1: print('Midi contains multiple time signatures: \"{}\"'.format(os.path.join(dirpath,filename))) continue tempo = 500000 timeSignature = (4,4,24,8) if len(tempos) > 0: tempo = tempos[0] if len(timeSignatures) > 0: timeSignature = timeSignatures[0] for trackNum in range(len(mid.tracks)): track = midi.makeTrackFromMidi(mid, trackNum) if isValidMidiTrack(track): trackMid = midi.makeMidiFromTrack(track, mid.ticks_per_beat, tempo, timeSignature) trackMidName = filename[0:-4] + "-" + str(trackNum) + ".mid" trackMid.save(os.path.join(targetDir,trackMidName))
def loadMidisAndGenerateBars(path, generator, bars): midis = loadMidis(path) for b in bars: assert b < generator.barCount, "Invalid bar count" tracks = [midi.makeTrackFromMidi(m,0) for m in midis] generated = [] for t in tracks: startBar = 0 endBar = 0 totalTrack = midi.Track(barLen=generator.barLen) while startBar < generator.barCount: if startBar in bars: totalTrack = generator.generateBar(totalTrack) startBar += 1 else: endBar = startBar+1 while (not endBar in bars) and (endBar < generator.barCount): endBar += 1 (_,trackSeg) = midi.splitTrack(t, generator.barLen*startBar) (trackSeg,_) = midi.splitTrack(trackSeg, generator.barLen*endBar) totalTrack = midi.concatenateTracks([totalTrack,trackSeg]) startBar = endBar if totalTrack.length != generator.barLen*startBar: pdb.set_trace() # If you got here something is wrong generated.append(totalTrack) return generated
def loadMidisAndTrainGenerator(path, hiddenStates, hiddenLayer, netEpochs, barLen, barCount, clusterCount, hmmIters=1000, filename=None): midis = loadMidis(path) tracks = [midi.makeTrackFromMidi(m,0) for m in midis] generator = rm.MelodyGenerator(hiddenStates, hiddenLayer, barLen, barCount, clusterCount, hmmIters=hmmIters) generator.trainTimed(netEpochs, tracks) if not (filename is None): generator.save(filename) return generator
def loadMidisAndGenerate(path, generator): midis = loadMidis(path) tracks = [midi.makeTrackFromMidi(m,0) for m in midis] trackEndings = [generator.generateBar(t) for t in tracks] return trackEndings
def run(self): midis = loadMidis(self.path) tracks = [midi.makeTrackFromMidi(m,0) for m in midis] trackDS = rm.TrackDataSet(tracks) self.mg.trainTimed(self.neuralNetEpochs, trackDS) self.eventQueue.put("Training complete!")