Example #1
0
def train3(options, args):
    partition_algorithm= options.partition_algorithm
    rythm_patch= options.rythm_patch
    melody_patch= options.melody_patch
    level= options.level
    infname= args[0]
    if len(args) >= 2:
        outfname= args[1]
    else:
        import electrozart
        outpath= path.abspath(path.join(electrozart.__path__[0], '../..', options.output_dir, datetime.now().strftime('%Y-%m-%d')))
        if not path.isdir(outpath):
            print "Creating dir", outpath
            os.makedirs(outpath)

        outfname= path.basename(infname)
        if outfname in os.listdir(outpath) and not options.override:
            # -4 por el .mid +1 por el -
            versions= [fname[len(outfname)-4+1:-4] for fname in os.listdir(outpath) if fname.startswith(outfname[:-4])]
            versions= [str for str in versions if len(str) > 0]
            for i in reversed(xrange(len(versions))):
                try:
                    versions[i]= int(versions[i])
                except:
                    versions.pop(i)
            if len(versions) == 0:
                versions= [0]
            outfname= '%s-%s.mid' % (outfname[:-4], max(versions)+1)
        
        outfname= path.join(outpath, outfname)


    parser= MidiScoreParser()
    score= parser.parse(infname)
    #score= quantize(score)
    
    composer= NarmourMarkov()
    composer= YamlComposer()
    composer= SupportNotesComposer()
    composed_score= composer.compose(score, **options.__dict__)

    composer.original_score= score
    composer.composed_score= composed_score

    writer= NotesScoreWriter()
    writer= MidiScoreWriter()
    writer.dump(composed_score, outfname)
    print "saving in ", outfname
    print 'done!'
    return composer
Example #2
0
def compare(fname1, fname2, solo_patch):
    parser= MidiScoreParser()
    score1= parser.parse(fname1)
    score2= parser.parse(fname2)

    i1= get_solo_instrument(score1, solo_patch)
    i2= get_solo_instrument(score2, solo_patch)

    solo1= score1.get_notes(instrument= i1)
    solo2= score2.get_notes(instrument= i2)

    different_onsets= 0
    same_notes= 0

    solo1_idx= solo2_idx= 0
    while solo1_idx < len(solo1) and solo2_idx < len(solo2):
        n1= solo1[solo1_idx]
        n2= solo2[solo2_idx]

        if n1.start != n2.start: 
            different_onsets+= 1
            if n1.start < n2.start:
                solo1_idx+=1
            else:
                solo2_idx+=1
        else:
            if n1.pitch == n2.pitch: 
                same_notes+=1
            solo1_idx+=1                
            solo2_idx+=1
    
    if solo2_idx < len(solo2):
        import ipdb;ipdb.set_trace()

    if solo1_idx < len(solo1):
        import ipdb;ipdb.set_trace()
            
    if solo1[-1].end != solo2[-1].end: 
        import ipdb;ipdb.set_trace()

    #return float(same_notes)/len(solo1)
    return {'different_onsets':different_onsets, 
            'same_notes':float(same_notes)/len(solo1),            
            'solo1_len':len(solo1),
            'solo2_len':len(solo2)}
Example #3
0
def main():
    fnames = argv[1:]

    parser = MidiScoreParser()
    instrs = []
    for i, fname in enumerate(fnames):
        # if i > 2: break
        score = parser.parse(fname)
        if not score:
            continue
        file_instrs = {}
        print
        print "* " * 10
        print fname
        for instr, notes in score.notes_per_instrument.iteritems():
            print "\tpatch:%s, channel:%s, id:%s, n_notes:%s" % (instr.patch, instr.channel, instr.id, len(notes))
            finstr, fnotes = file_instrs.get(instr.patch, (None, None))
            if not finstr or len(fnotes) < len(notes):
                file_instrs[instr.patch] = instr, notes

        instrs.extend(file_instrs.iteritems())
Example #4
0
def train3(options, args):
    print "using seed", options.seed

    infname= args[0]
    if len(args) >= 2:
        outfname= args[1]
    else:
        import electrozart
        outpath= path.abspath(path.join(electrozart.__path__[0], '../..', options.output_dir, datetime.now().strftime('%Y-%m-%d')))
        if not path.isdir(outpath):
            print "Creating dir", outpath
            os.makedirs(outpath)
        if os.path.exists('output'): os.unlink('output')
        os.system('ln -s %s output' % outpath)

        outfname= path.basename(infname).lower()
        if outfname in os.listdir(outpath) and not options.override:
            # -4 por el .mid +1 por el -
            versions= [fname[len(outfname)-4+1:-4] for fname in os.listdir(outpath) if fname.startswith(outfname[:-4])]
            versions= [s for s in versions if len(s) > 0]
            for i in reversed(xrange(len(versions))):
                if not versions[i].isdigit():
                    versions.pop(i)
                else:
                    versions[i]= int(versions[i])
            if len(versions) == 0:
                versions= [0]
            outfname= '%s-%s.mid' % (outfname[:-4], max(versions)+1)
        
        outfname= path.join(outpath, outfname)


    # fnames
    info_folder= outfname.replace('.mid', '-info')
    params_file= outfname[:-3] + 'log'
    diff_file= outfname[:-3] + 'diff'
    svn_file= outfname[:-3] + 'svn'
    solo_fname= outfname.replace('.mid', '-solo.mid')
    perc_fname= outfname.replace('.mid', '-perc.mid')
    wolp_fname= outfname.replace('.mid', '-wolp.mid')
    outfname= outfname.lower()

    parser= MidiScoreParser()
    score= parser.parse(infname)
    #score= quantize(score)
    
    composer= NarmourMarkov()
    composer= YamlComposer()
    composer= SupportNotesComposer()
    if options.only_save_info:
        composer.build_models(score, **options.__dict__)
        print "\n\nSAVING INFO\n\n"
        if os.path.exists(info_folder):
            import shutil
            shutil.rmtree(info_folder)
        os.makedirs(info_folder)
        composer.save_info(info_folder, score)
        print_files(params_file, diff_file, svn_file, outfname, solo_fname, wolp_fname, perc_fname, info_folder)
        return

    composed_score, instrument= composer.compose(score, **options.__dict__)
    # XXX
    composer.original_score= score
    composer.composed_score= composed_score
    orig_composed_score= composed_score.copy()

    writer= NotesScoreWriter()
    writer= MidiScoreWriter()
    writer.dump(composed_score, outfname)

    solo_notes= composed_score.get_notes(instrument=instrument)
    piano= Instrument(patch=None)
    composed_score.notes_per_instrument= {piano: solo_notes}
    writer.dump(composed_score, solo_fname)

    lp_notes= set(score.get_first_voice())
    notes_wolp= []
    composed_score.notes_per_instrument= {instrument: solo_notes}
    for i in score.instruments:
        if i == instrument: continue
        composed_score.notes_per_instrument[i]= [n for n in score.get_notes(instrument=i) if n not in lp_notes]

    writer.dump(composed_score, wolp_fname)

    import to_percusion
    perc_notes= to_percusion.get_percusion_track(solo_notes)
    orig_composed_score.notes_per_instrument[instrument]= perc_notes
    instrument.is_drums= True
    writer.dump(orig_composed_score, perc_fname)

    # draw things
    if options.save_info:
        os.makedirs(info_folder)

        composer.save_info(info_folder, score)
    
    params= composer.params
    params['options']= options.__dict__
    params['args']= args
        
    print_files(params_file, diff_file, svn_file, outfname, solo_fname, wolp_fname, perc_fname, info_folder)
    save_state(composer, params_file, diff_file, svn_file)

    print 'done!'

    return composer