参考代码:https://github.com/salu133445/lakh-pianoroll-dataset(处理LMD到LPD)
参考代码:https://github.com/sumuzhao/CycleGAN-Music-Style-Transfer(处理midi文件成单轨道数据)
以上两个都没有完整过程,可以按上面思路处理成mulititrack类,然后通过文章一作者的开源库pretty_midi、pypianoroll进行操作
这是我把midi音乐处理为5个track的过程,能运行,只是没进行封装:
以单个midi文件为例:
multitrack=Multitrack(beat_resolution=4,name="0eb9b102beab4ac575947a23f06e4fce")
x = pretty_midi.PrettyMIDI("/media/gfq/dataset/Lakh MIDI Data/LPD_test/cleaner_midi_gen/0a0a2b0e4d3b7bf4c5383ba025c4683e.mid")
multitrack.parse_pretty_midi(x)
category_list = {'Drums': [], 'Piano': [], 'Guitar': [], 'Bass': [], 'Strings': []}
program_dict = {'Drums': 0,'Piano': 0, 'Guitar': 24, 'Bass': 32, 'Strings': 48}
for idx, track in enumerate(multitrack.tracks):
if track.is_drum:
category_list['Drums'].append(idx)
elif track.program//8 == 0:
category_list['Piano'].append(idx)
elif track.program//8 == 3:
category_list['Guitar'].append(idx)
elif track.program//8 == 4:
category_list['Bass'].append(idx)
else:
category_list['Strings'].append(idx)
tracks = []
for key in category_list:#Bass\Drums\Guitar\Piano\Strings
if category_list[key]:
merged = multitrack[category_list[key]].get_merged_pianoroll()
# print(merged.shape) #(14088, 128)
tracks.append(Track(merged, program_dict[key], key == 'Drums', key))
# print("tracks:",tracks)
else:
tracks.append(Track(None, program_dict[key], key == 'Drums', key))
multitrack=Multitrack(None, tracks, multitrack.tempo, multitrack.downbeat, multitrack.beat_resolution, multitrack.name)
接下来步骤是参考中没有的,读取到npy数据
data=multitrack.get_stacked_pianorolls()
data_clip=get_bar_piano_roll(data)#这是参考中的函数
data_clip=data_clip[:,:,24:108,:]
可以直接把data_clip保存到npy,不过建议以下代码(改变存储字符类型)减少储存空间,我把7G的存储到小于1G
data_clip=data_clip>0.5