gpt4 book ai didi

python - 在 music21 中将钢琴卷转换为 MIDI?

转载 作者:行者123 更新时间:2023-12-05 06:39:22 25 4
gpt4 key购买 nike

我正在使用 music21 来处理 MIDI 和 mXML 文件,并将它们转换为我在项目中使用的钢琴卷帘。

我的钢琴卷由 88 维向量序列组成,其中向量中的每个元素代表一个音高。一个向量是一个时间步长,可以是第 16 次、第 8 次、第 4 次等。元素可以获得三个值{0, 1, 2}。 0 表示音符关闭。 1 表示音符打开。 2 也意味着该音符已打开,但它始终跟随 1 - 这就是我区分同一音符的多次按键的方式。例如,让时间步长为 8,这两个音调为 C 和 E:

[0 0 0 ... 1 0 0 0 1 ... 0]
[0 0 0 ... 1 0 0 0 1 ... 0]
[0 0 0 ... 2 0 0 0 2 ... 0]
[0 0 0 ... 2 0 0 0 2 ... 0]
[0 0 0 ... 1 0 0 0 0 ... 0]
[0 0 0 ... 1 0 0 0 0 ... 0]

我们看到 C 和 E 同时演奏四分音符,然后再次演奏四分音符,最后我们以持续四分音符的 C 结束。

现在,我正在为每个音符创建 Stream() 并在音符出现时填充它。这给了我 88 个流,当我将其转换为 MIDI 并使用 MuseScore 打开该 MIDI 时,给我留下了无法阅读的困惑局面。

我的问题是,有没有更好的方法可以将这种钢琴卷帘转换为 MIDI?一些我可以使用的算法或想法将不胜感激。

最佳答案

在我看来,music21 是一个很好的库,但级别太高了这个工作。没有流、四分音符或和弦这样的东西在 MIDI 中——只有消息。试试 Mido图书馆代替。这里是示例代码:

from mido import Message, MidiFile, MidiTrack

def stop_note(note, time):
return Message('note_off', note = note,
velocity = 0, time = time)

def start_note(note, time):
return Message('note_on', note = note,
velocity = 127, time = time)

def roll_to_track(roll):
delta = 0
# State of the notes in the roll.
notes = [False] * len(roll[0])
# MIDI note for first column.
midi_base = 60
for row in roll:
for i, col in enumerate(row):
note = midi_base + i
if col == 1:
if notes[i]:
# First stop the ringing note
yield stop_note(note, delta)
delta = 0
yield start_note(note, delta)
delta = 0
notes[i] = True
elif col == 0:
if notes[i]:
# Stop the ringing note
yield stop_note(note, delta)
delta = 0
notes[i] = False
# ms per row
delta += 500

roll = [[0, 0, 0, 1, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 0, 0, 0, 1, 0],
[0, 0, 0, 2, 0, 0, 0, 2, 0],
[0, 1, 0, 2, 0, 0, 0, 2, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0]]

midi = MidiFile(type = 1)
midi.tracks.append(MidiTrack(roll_to_track(roll)))
midi.save('test.mid')

关于python - 在 music21 中将钢琴卷转换为 MIDI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44661688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com