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
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)}
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())
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