def converter(filepath, datasets, midi_dict): """Save a multi-track piano-roll converted from a MIDI file to target dataset directory and update MIDI information to `midi_dict`""" try: midi_md5 = os.path.splitext(os.path.basename(filepath))[0] multitrack = Multitrack(beat_resolution=settings['beat_resolution'], name=midi_md5) pm = pretty_midi.PrettyMIDI(filepath) midi_info = get_midi_info(pm) multitrack.parse_pretty_midi(pm) if 'lpd' in datasets: dst = change_prefix(os.path.dirname(filepath), settings['lmd']['full'], settings['lpd']['full']) make_sure_path_exists(dst) multitrack.save(os.path.join(dst, midi_md5 + '.npz')) if 'lpd-5' in datasets: dst = change_prefix(os.path.dirname(filepath), settings['lmd']['full'], settings['lpd-5']['full']) merged = get_merged(multitrack) make_sure_path_exists(dst) merged.save(os.path.join(dst, midi_md5 + '.npz')) return (midi_md5, midi_info) except: return None
def converter(filepath, src, dst): """Convert a MIDI file to a multi-track piano-roll and save the resulting multi-track piano-roll to the destination directory. Return a tuple of `midi_md5` and useful information extracted from the MIDI file. """ midi_md5 = os.path.splitext(os.path.basename(filepath))[0] multitrack = Multitrack(beat_resolution=CONFIG["beat_resolution"], name=midi_md5) pm = pretty_midi.PrettyMIDI(filepath) # Merge tracks assert pm.instruments[0].name == "MELODY" assert pm.instruments[1].name == "BRIDGE" assert pm.instruments[2].name == "PIANO" pm.instruments[0].name = "MAIN" pm.instruments[0].notes = ( pm.instruments[0].notes + pm.instruments[1].notes + pm.instruments[2].notes ) del pm.instruments[2] del pm.instruments[1] multitrack.parse_pretty_midi(pm) midi_info = get_midi_info(pm) result_dir = change_prefix(os.path.dirname(filepath), src, dst) make_sure_path_exists(result_dir) multitrack.save(os.path.join(result_dir, midi_md5 + ".npz")) return (midi_md5, midi_info)
def converter(file): phrase_size = BAR_SIZE * PHRASE_SIZE try: midi_md5 = os.path.splitext( os.path.basename(os.path.join(MIDI_FILE_PATH, file)))[0] multitrack = Multitrack(beat_resolution=BEAT_RESOLUTION, name=midi_md5) pm = pretty_midi.PrettyMIDI(os.path.join(MIDI_FILE_PATH, file)) multitrack.parse_pretty_midi(pm) midi_info = get_midi_info(pm) length = multitrack.get_max_length() padding_size = phrase_size - ( length % phrase_size) if length % phrase_size else 0 tmp = length // phrase_size + (1 if length % phrase_size else 0) multitrack.clip(0, 127) data = multitrack.get_merged_pianoroll(mode='max') if padding_size: data = np.concatenate((data, np.array([[0 for _ in range(128)] for _ in range(padding_size)])), axis=0) data.astype(np.float64) data = data / 127. data[data < 0.35] = 0. data[data >= 0.35] = 1. data_by_phrase = [] phrase_number = [330] + [i for i in range(tmp - 2, -1, -1)] for i in range(0, len(data), phrase_size): data_by_phrase.append(data[i:i + phrase_size]) with open( os.path.join(NP_FILE_PATH, '{}_{}.pkl'.format(tmp, midi_md5)), 'wb') as fp: pickle.dump([np.array(data_by_phrase), phrase_number], fp) return (midi_md5, midi_info) except Exception as e: print(e) return None
def converter(filepath): """Save a multi-track piano-roll converted from a MIDI file to target dataset directory and update MIDI information to `midi_dict`""" try: midi_name = os.path.splitext(os.path.basename(filepath))[0] multitrack = Multitrack(beat_resolution=24, name=midi_name) pm = pretty_midi.PrettyMIDI(filepath) midi_info = get_midi_info(pm) multitrack.parse_pretty_midi(pm) merged = get_merged(multitrack) make_sure_path_exists(converter_path) merged.save(os.path.join(converter_path, midi_name + '.npz')) return [midi_name, midi_info] except: return None
def converter(filepath, src, dst): """Convert a MIDI file to a multi-track piano-roll and save the resulting multi-track piano-roll to the destination directory. Return a tuple of `midi_md5` and useful information extracted from the MIDI file. """ try: midi_md5 = os.path.splitext(os.path.basename(filepath))[0] multitrack = Multitrack(beat_resolution=CONFIG['beat_resolution'], name=midi_md5) pm = pretty_midi.PrettyMIDI(filepath) multitrack.parse_pretty_midi(pm) midi_info = get_midi_info(pm) result_dir = change_prefix(os.path.dirname(filepath), src, dst) make_sure_path_exists(result_dir) multitrack.save(os.path.join(result_dir, midi_md5 + '.npz')) return (midi_md5, midi_info) except: return None
def converter(filepath, millis): """Save a multi-track piano-roll converted from a MIDI file to target dataset directory and update MIDI information to `midi_dict`""" midi_name = os.path.splitext(os.path.basename(filepath))[0] print('printing midi_name in the converter function...') print(midi_name) multitrack = Multitrack(beat_resolution=24, name=midi_name) pm = pretty_midi.PrettyMIDI(filepath) midi_info = get_midi_info(pm) print(pm) print('printing midi_info...') print(midi_info) multitrack.parse_pretty_midi(pm) merged = get_merged(multitrack) print('printing merged...') print(merged) converter_path = os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/converter') print('still ok1') make_sure_path_exists(converter_path) print('still ok2') merged.save(os.path.join(converter_path, midi_name + '.npz')) print('still ok3') return [midi_name, midi_info]
def get_npy(ROOT_PATH='./datasets/midi2npy/', test_ratio=0.1): """2. convert_clean.py""" """3. choose the clean midi from original sets""" if not os.path.exists(os.path.join(ROOT_PATH, 'cleaner_midi')): os.makedirs(os.path.join(ROOT_PATH, 'cleaner_midi')) l = [f for f in os.listdir(os.path.join(ROOT_PATH, 'cleaner'))] print(l) print(len(l)) for i in l: shutil.copy( os.path.join(ROOT_PATH, 'origin_midi', os.path.splitext(i)[0] + '.mid'), os.path.join(ROOT_PATH, 'cleaner_midi', os.path.splitext(i)[0] + '.mid')) """4. merge and crop""" if not os.path.exists(os.path.join(ROOT_PATH, 'cleaner_midi_gen')): os.makedirs(os.path.join(ROOT_PATH, 'cleaner_midi_gen')) if not os.path.exists(os.path.join(ROOT_PATH, 'cleaner_npy')): os.makedirs(os.path.join(ROOT_PATH, 'cleaner_npy')) l = [f for f in os.listdir(os.path.join(ROOT_PATH, 'cleaner_midi'))] print(l) count = 0 for i in range(len(l)): try: multitrack = Multitrack(beat_resolution=4, name=os.path.splitext(l[i])[0]) x = pretty_midi.PrettyMIDI( os.path.join(ROOT_PATH, 'cleaner_midi', l[i])) multitrack.parse_pretty_midi(x) category_list = {'Piano': [], 'Drums': []} program_dict = {'Piano': 0, 'Drums': 0} for idx, track in enumerate(multitrack.tracks): if track.is_drum: category_list['Drums'].append(idx) else: category_list['Piano'].append(idx) tracks = [] merged = multitrack[category_list['Piano']].get_merged_pianoroll() print(merged.shape) pr = get_bar_piano_roll(merged) pr_clip = pr[:, :, 24:108] if int(pr_clip.shape[0] % 4) != 0: pr_clip = np.delete(pr_clip, np.s_[-int(pr_clip.shape[0] % 4):], axis=0) pr_re = pr_clip.reshape(-1, 64, 84, 1) save_midis( pr_re, os.path.join(ROOT_PATH, 'cleaner_midi_gen', os.path.splitext(l[i])[0] + '.mid')) np.save( os.path.join(ROOT_PATH, 'cleaner_npy', os.path.splitext(l[i])[0] + '.npy'), pr_re) except: count += 1 print('Wrong', l[i]) continue print(count) """5. concatenate into a big binary numpy array file""" # l = [f for f in os.listdir(os.path.join(ROOT_PATH, 'MIDI/pop/pop_test/cleaner_npy'))] # print(l) # train = np.load(os.path.join(ROOT_PATH, 'MIDI/pop/pop_test/cleaner_npy', l[0])) # print(train.shape, np.max(train)) # for i in range(1, len(l)): # print(i, l[i]) # t = np.load(os.path.join(ROOT_PATH, 'MIDI/pop/pop_test/cleaner_npy', l[i])) # train = np.concatenate((train, t), axis=0) # print(train.shape) # np.save(os.path.join(ROOT_PATH, 'MIDI/pop/pop_test/pop_test_piano.npy'), (train > 0.0)) """6. separate numpy array file into single phrases""" if not os.path.exists(os.path.join(ROOT_PATH, 'phrase')): os.makedirs(os.path.join(ROOT_PATH, 'phrase')) l = [f for f in os.listdir(os.path.join(ROOT_PATH, 'cleaner_npy'))] x = np.load(os.path.join(ROOT_PATH, 'cleaner_npy/' + l[0])) # print(x.shape) count = 0 for i in range(x.shape[0]): if np.max(x[i]): count += 1 np.save( os.path.join(ROOT_PATH, 'phrase/piano_{}.npy'.format(i + 1)), x[i]) print(x[i].shape) if count == 11216: break # print(count) """some other codes"""
piano_roll = np.delete(piano_roll, np.s_[-int(piano_roll.shape[0] % 64):], axis=0) piano_roll = piano_roll.reshape(-1, 64, 128) return piano_roll LAST_BAR_MODE = 'remove' l = [f for f in os.listdir('./Jazz/')] #print(l) count = 0 count2 = 0 for i in range(len(l)): try: #time.sleep(3) multitrack = Multitrack(beat_resolution=4, name=os.path.splitext(l[i])[0]) x = pretty_midi.PrettyMIDI(os.path.join('./Jazz/', l[i])) multitrack.parse_pretty_midi(x) category_list = {'Piano': [], 'Drums': []} program_dict = {'Piano': 0, 'Drums': 0} for idx, track in enumerate(multitrack.tracks): if track.is_drum: category_list['Drums'].append(idx) else: category_list['Piano'].append(idx) tracks = [] merged = multitrack[category_list['Piano']].get_merged_pianoroll() merged = multitrack.get_merged_pianoroll() #print('ok') #print(merged.shape + ' merged shape') tracks = [(Track(merged, program=0, is_drum=False, name=os.path.splitext(l[i])[0]))] mt = Multitrack(None, tracks, multitrack.tempo, multitrack.downbeat, multitrack.beat_resolution, multitrack.name) #mt.write(os.path.join(ROOT_PATH, '-Study No.2 opus.105.mid'))
def test_pre_process_midi(): print('start to preprocess test midi') for music_gerne in music_gerne_selected: print("start working on", music_gerne) """build path""" if not os.path.exists( os.path.join(ROOT_PATH, music_gerne + '/' + music_gerne + '_test')): os.makedirs( os.path.join(ROOT_PATH, music_gerne + '/' + music_gerne + '_test/')) if not os.path.exists( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/origin_midi')): os.makedirs( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/origin_midi')) """1. divide the original set into train and test sets""" l = [ f for f in os.listdir( os.path.join(ROOT_PATH, music_gerne + '/' + music_gerne + '_midi')) ] print(l) idx = np.random.choice(len(l), int(test_ratio * len(l)), replace=False) print(len(idx)) for i in idx: shutil.move( os.path.join(ROOT_PATH, music_gerne + '/' + music_gerne + '_midi', l[i]), os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test' + '/origin_midi', l[i])) """2. convert_clean.py""" convert_clean.main(music_gerne=music_gerne, mode='test') """3. choose the clean midi from original sets""" if not os.path.exists( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_midi')): os.makedirs( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_midi')) if not os.path.exists( os.path.join(ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner')): os.makedirs( os.path.join(ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner')) l = [ f for f in os.listdir( os.path.join(ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner')) ] print(l) print(len(l)) for i in l: shutil.copy( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test' + '/origin_midi', os.path.splitext(i)[0] + '.mid'), os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_midi', os.path.splitext(i)[0] + '.mid')) """4. merge and crop""" if not os.path.exists( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_midi_gen')): os.makedirs( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_midi_gen')) if not os.path.exists( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_npy')): os.makedirs( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_npy')) l = [ f for f in os.listdir( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_midi')) ] print(l) count = 0 for i in range(len(l)): try: multitrack = Multitrack(beat_resolution=4, name=os.path.splitext(l[i])[0]) x = pretty_midi.PrettyMIDI( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_midi', l[i])) multitrack.parse_pretty_midi(x) stacked = multitrack.get_stacked_pianorolls() print("stacked_shape:", stacked.shape) pr = get_bar_piano_roll(stacked) print("pr_shape:", pr.shape) pr_clip = pr[:, :, 24:108] print("pr_clip_shape:", pr_clip.shape) if int(pr_clip.shape[0] % 4) != 0: pr_clip = np.delete(pr_clip, np.s_[-int(pr_clip.shape[0] % 4):], axis=0) pr_re = pr_clip.reshape(-1, 64, 84, 3) print("pr_re_shape:", pr_re.shape) print( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_midi_gen', os.path.splitext(l[i])[0] + '.mid')) save_midis( pr_re, os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_midi_gen', os.path.splitext(l[i])[0] + '.mid')) np.save( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_npy', os.path.splitext(l[i])[0] + '.npy'), pr_re) except: count += 1 print('Wrong', l[i]) continue print('total fails:', count) """5. concatenate into a big binary numpy array file""" l = [ f for f in os.listdir( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_npy')) ] print(l) train = np.load( os.path.join(ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_npy', l[0])) print(train.shape, np.max(train)) for i in range(1, len(l)): print(i, l[i]) t = np.load( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/cleaner_npy', l[i])) train = np.concatenate((train, t), axis=0) print(train.shape) np.save( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test' + '/' + music_gerne + '_test.npy'), (train > 0.0)) """6. separate numpy array file into single phrases""" if not os.path.exists( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/phrase_test')): os.makedirs( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/phrase_test')) x = np.load( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test' + '/' + music_gerne + '_test.npy')) print(x.shape) count = 0 for i in range(x.shape[0]): if np.max(x[i]): count += 1 np.save( os.path.join( ROOT_PATH, music_gerne + '/' + music_gerne + '_test/phrase_test' + '/' + music_gerne + '_test_{}.npy'.format(i + 1)), x[i]) print(x[i].shape) # if count == 11216: # break print(count) """some other codes"""
def midiToNpy(millis, filename): tf.reset_default_graph() converter_path = os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/converter') cleaner_path = os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner') if not os.path.exists( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/converter')): os.makedirs( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/converter')) if not os.path.exists( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner')): os.makedirs(os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner')) """1. divide the original set into train and test sets""" ''' l = [f for f in os.listdir(MIDI_FOLDER)] print(len(l)) # idx = np.random.choice(len(l), int(test_ratio * len(l)), replace=False) idx = np.random.choice(len(l), int(len(l)), replace=False) print(len(idx)) print('?') ''' """2. convert_clean.py""" #midi_paths = get_midi_path(MIDI_FOLDER) #print('printing midi_paths...') #print(midi_paths) midi_dict = {} #kv_pairs = [converter(midi_path, millis) for midi_path in midi_paths] file_location = os.path.join(MIDI_FOLDER, millis, filename) print('file_location is ' + file_location) kv_pairs = [converter(file_location, millis)] print('printing kv_pairs...') print(kv_pairs) for kv_pair in kv_pairs: if kv_pair is not None: midi_dict[kv_pair[0]] = kv_pair[1] if not os.path.exists( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/json')): os.makedirs(os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/json')) # with open(os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/json'), 'w') as outfile: with open( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/json/midis.json'), 'w') as outfile: print('printing midi_dict...') print(midi_dict) json.dump(midi_dict, outfile) print("[Done] {} file converted".format(len(midi_dict))) ##with open(os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/json/midis.json'), 'w') as infile: # midi_dict = json.load(infile) count = 0 make_sure_path_exists(cleaner_path) midi_dict_clean = {} for key in midi_dict: if midi_filter(midi_dict[key]): midi_dict_clean[key] = midi_dict[key] count += 1 shutil.copyfile(os.path.join(converter_path, key + '.npz'), os.path.join(cleaner_path, key + '.npz')) with open( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/midis_clean.json'), 'w') as outfile: json.dump(midi_dict_clean, outfile) print("[Done] {} files out of {} have been successfully cleaned".format( count, len(midi_dict))) for key in midi_dict: if midi_filter1(midi_dict[key]): midiHasIssue = False else: midiHasIssue = True print('couldn\'t be cleaned.') """3. choose the clean midi from original sets""" if not os.path.exists( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_midi')): os.makedirs( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_midi')) l = [ f for f in os.listdir( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner')) ] print(l) print(len(l)) for i in l: shutil.copy( os.path.join(UPLOAD_FOLDER, 'MIDI', millis, os.path.splitext(i)[0] + '.mid'), os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_midi', os.path.splitext(i)[0] + '.mid')) """4. merge and crop""" if not os.path.exists( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_midi_gen')): os.makedirs( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_midi_gen')) if not os.path.exists( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_npy')): os.makedirs( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_npy')) l = [ f for f in os.listdir( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_midi')) ] print(l) count = 0 for i in range(len(l)): try: multitrack = Multitrack(beat_resolution=4, name=os.path.splitext(l[i])[0]) x = pretty_midi.PrettyMIDI( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_midi', l[i])) multitrack.parse_pretty_midi(x) category_list = {'Piano': [], 'Drums': []} program_dict = {'Piano': 0, 'Drums': 0} for idx, track in enumerate(multitrack.tracks): if track.is_drum: category_list['Drums'].append(idx) else: category_list['Piano'].append(idx) tracks = [] merged = multitrack[category_list['Piano']].get_merged_pianoroll() print(merged.shape) pr = get_bar_piano_roll(merged) print(pr.shape) pr_clip = pr[:, :, 24:108] print(pr_clip.shape) if int(pr_clip.shape[0] % 4) != 0: pr_clip = np.delete(pr_clip, np.s_[-int(pr_clip.shape[0] % 4):], axis=0) pr_re = pr_clip.reshape(-1, 64, 84, 1) print('printing pr_re.shape...') print(pr_re.shape) save_midis( pr_re, os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_midi_gen', os.path.splitext(l[i])[0] + '.mid')) np.save( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_npy', os.path.splitext(l[i])[0] + '.npy'), pr_re) print('saved properly in cleaner_npy?') except: count += 1 print('Wrong', l[i]) continue print(count) """""" "5. concatenate into a big binary numpy array file" "" l = [ f for f in os.listdir( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_npy')) ] print(l) print('printing len(l)...') print(len(l)) if len(l) > 0: train = np.load( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_npy', l[0])) #print(train.shape, np.max(train)) for i in range(1, len(l)): print(i, l[i]) t = np.load( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/cleaner_npy', l[i])) train = np.concatenate((train, t), axis=0) #print('printing train.shape...') #print(train.shape) np.save( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/jazz_test_piano.npy'), (train > 0.0)) """6. separate numpy array file into single phrases""" if not os.path.exists( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/phrase_test')): os.makedirs( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/phrase_test')) x = np.load( os.path.join(UPLOAD_FOLDER, 'MIDI/' + millis + '/jazz_test_piano.npy')) print(x.shape) count = 0 for i in range(x.shape[0]): if np.max(x[i]): count += 1 np.save( os.path.join( UPLOAD_FOLDER, 'MIDI/' + millis + '/phrase_test/jazz_piano_test_{}.npy'.format(i + 1)), x[i]) print(x[i].shape) if count == 11216: break print(count) return [True, midiHasIssue, kv_pairs[0][1]] else: print('Some other issue - though shouldn\'t ever get here') return [False, midiHasIssue, kv_pairs[0][1]]