python处理midi文件成多轨道数据

参考代码: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

注意处理和保存midi时候注意beat_resolution参数,每个节拍多多少个pixel。

 

猜你喜欢

转载自blog.csdn.net/qq_33266320/article/details/83443553