python mido如何在列表中获取[note, starttime, stoptime, track]? [英] python mido how to get [note, starttime, stoptime, track] in a list?
问题描述
我需要以下方面的帮助:我正在设计一种新的乐谱.我想读取一个 MIDI 文件并获得一个包含每个音符/开始-停止-时间/曲目的列表.预期结果:
I need help in the following: I am designing a new music notation. I want to read a midi file and get a list that contains every note/start-stop-time/track. Desired result:
[[60, 0, 0.25, 1], [62, 0.25, 0.50, 1]]# the format is [note, start-time, stop-time, miditrack]
*更新 1 - 得到 [note, note_on(time), note_off(time), channel]
以下代码创建了一个字典,其中增量时间被转换为线性时间(但我不确定这是否是正确的方法):
The following code creates a dictionary in which the delta times are converted to linear time(but I am not sure if this is the right approach):
from mido import MidiFile
mid = MidiFile('testsunvox.mid')
midimsgs = []
# Put all note on/off in midinote as dictionary
for i in mid:
if i.type == 'note_on' or i.type == 'note_off':
midimsgs.append(i.dict())
# change time values from delta to relative time # don't know for sure if this is the right way...
mem1=0
for i in midimsgs:
time = i['time'] + mem1
i['time'] = time
mem1 = i['time']
# put note, starttime, stoptime, as nested list in a list. # format is [note, start, stop, channel]
for i in midimsgs:
print (i)
我现在找不到正确的问题,但目标是:
I cannot find the right question for this right now but the goal is to get:
[note, note_on(time), note_off(time), channel]
对于每个音符.但问题是有两条消息(note-on/off),我想把它做成一个.如果我找到了,我会发布我的解决方案.(或者也许有人知道 mido 库的一个非常简单的技巧来做到这一点......)
for each note. But the problem is that there are two messages(note-on/off) and I want to make it one. I will post my solution if I found it. (or maybe someone knows a very simple trick of the mido libriary to do this...)
推荐答案
我现在明白我的方法是错误的.我需要保持单独的注释和注释消息.以下代码:
I see now that my aproach is wrong. I need to keep seperated note-on and note-off messages. The following code:
from mido import MidiFile
mid = MidiFile('testlilypond.mid')
mididict = []
output = []
# Put all note on/off in midinote as dictionary.
for i in mid:
if i.type == 'note_on' or i.type == 'note_off' or i.type == 'time_signature':
mididict.append(i.dict())
# change time values from delta to relative time.
mem1=0
for i in mididict:
time = i['time'] + mem1
i['time'] = time
mem1 = i['time']
# make every note_on with 0 velocity note_off
if i['type'] == 'note_on' and i['velocity'] == 0:
i['type'] = 'note_off'
# put note, starttime, stoptime, as nested list in a list. # format is [type, note, time, channel]
mem2=[]
if i['type'] == 'note_on' or i['type'] == 'note_off':
mem2.append(i['type'])
mem2.append(i['note'])
mem2.append(i['time'])
mem2.append(i['channel'])
output.append(mem2)
# put timesignatures
if i['type'] == 'time_signature':
mem2.append(i['type'])
mem2.append(i['numerator'])
mem2.append(i['denominator'])
mem2.append(i['time'])
output.append(mem2)
# viewing the midimessages.
for i in output:
print(i)
print(mid.ticks_per_beat)
给出这个输出:([类型,音符,时间,频道])
gives this output:([type, note, time, channel])
['time_signature', 4, 4, 0]
['note_on', 69, 0, 0]
['note_off', 69, 0.500053, 0]
['note_on', 71, 0.500053, 0]
['note_off', 71, 0.7500795, 0]
['note_on', 69, 0.7500795, 0]
['note_off', 69, 1.000106, 0]
['note_on', 71, 1.000106, 0]
['note_off', 71, 1.500159, 0]
['note_on', 69, 1.500159, 0]
['note_off', 69, 2.000212, 0]
['time_signature', 3, 4, 2.000212]
['note_on', 66, 2.000212, 0]
['note_off', 66, 2.5002649999999997, 0]
['note_on', 64, 2.5002649999999997, 0]
['note_off', 64, 3.0003179999999996, 0]
['note_on', 62, 3.0003179999999996, 0]
['note_off', 62, 3.5003709999999995, 0]
384
[Finished in 0.0s]
我的目标是:从一个MIDI文件列表中获取所有需要的信息.这是一种从消息中获取信息到 python 列表的方法.(我还使(增量)时间线性.您需要使用 for 循环将前一个时间"添加到当前时间)
Which is was my goal: getting all needed information in a list from a midifile. This is a way to get info from messages into a python list.(I also made the (delta)time linear. You need to add the previous 'time' to the current one using a for loop)
这篇关于python mido如何在列表中获取[note, starttime, stoptime, track]?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!