首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将二维numpy数组转换为MIDI文件?

如何将二维numpy数组转换为MIDI文件?
EN

Stack Overflow用户
提问于 2022-01-03 03:53:33
回答 1查看 573关注 0票数 1

最近,我尝试在音乐转录方面进行工作,并使用(https://github.com/LUMII-Syslab/RSE),在运行visualizer.py之后,它将生成visualization.npy文件,我想知道如何将NumPy数组转换为MIDI文件。

如果我理解正确的话,下面的图片就是基本的真实和预测,现在我想把预测的一个转换成一个MIDI文件,我尝试了从其他的讨论(How to read a MP3 audio file into a numpy array / save a numpy array to MP3?)中得到解决方案,但是只得到了空的MIDI文件。

代码语言:javascript
运行
复制
def arry2mid(ary, tempo=500000):
    # get the difference
    new_ary = np.concatenate([np.array([[0] * 128]), np.array(ary)], axis=0) #88
    changes = new_ary[1:] - new_ary[:-1]
    # create a midi file with an empty track
    mid_new = mido.MidiFile()
    track = mido.MidiTrack()
    mid_new.tracks.append(track)
    track.append(mido.MetaMessage('set_tempo', tempo=tempo, time=0))
    # add difference in the empty track
    last_time = 0
    for ch in changes:
        if set(ch) == {0}:  # no change
            last_time += 1
        else:
            on_notes = np.where(ch > 0)[0]
            on_notes_vol = ch[on_notes]
            off_notes = np.where(ch < 0)[0]
            first_ = True
            for n, v in zip(on_notes, on_notes_vol):
                new_time = last_time if first_ else 0
                track.append(mido.Message('note_on', note=n + 21, velocity=v, time=new_time))
                first_ = False
            for n in off_notes:
                new_time = last_time if first_ else 0
                track.append(mido.Message('note_off', note=n + 21, velocity=0, time=new_time))
                first_ = False
            last_time = 0
    return mid_new

prepare_for_midi = vls[:, :, 0] #pick predict piano-roll
prepare_for_midi = np.transpose(prepare_for_midi, [1, 0]) #turn to shape[128, N]
print("prepare_for_midi shape: ", prepare_for_midi.shape)
print("prepare_for_midi head:", prepare_for_midi[:3])
#prepare_for_midi = [np.round(element) for element in prepare_for_midi] # float turn to int
prepare_for_midi = 128 * prepare_for_midi
prepare_for_midi = prepare_for_midi.astype(int)
print("prepare_for_midi shape: ", prepare_for_midi.shape)
print("prepare_for_midi head:", prepare_for_midi[:3])
mid_new = arry2mid(prepare_for_midi)
mid_new.save('mid_new.mid')

地面真相:

预测:

此外,我想问如何通过这个存储库推断另一个音乐文件,因为培训数据集最初是npz格式(我已经从https://www.kaggle.com/imsparsh/musicnet-dataset?select=musicnet.npz下载了它),所以我认为mabey可以尝试转换音乐文件格式(wav,mp3...etc)。转换为npy格式,但我不确定使用audio2numpy包进行转换是否能产生与musicnet.npz中的npy文件相同的格式。

如果我有一个不清楚的部分,请让我知道,我会补充更多的解释。

EN

Stack Overflow用户

发布于 2022-01-10 03:09:23

RSE存储库现在更新为包含一个文件transcribe.py,该文件可以将带有预测的NumPy数组转换为MIDI文件。如果对模型进行了培训,则可以将文件放在musicnet_data目录中并运行python3 transcribe.py yourfile.wav,从而将wav文件转录为MIDI。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70561526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档