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!")