music21:按笔记位置向MIDI文件写入笔记

问题描述:

我正在使用music21从笔记值中写入midi文件。music21:按笔记位置向MIDI文件写入笔记

以下代码依次写入三个注释。

但是,如何在笔记之间插入“空白”空间?

如果我可以通过他们的“位置”插入笔记,这样就不会计算每个无声间隔的位置/长度,这将非常容易。 music21可以吗?

import music21 
from music21 import * 

mt = midi.MidiTrack(1) 
mt2 = midi.MidiTrack(1) 

# duration, pitch, velocity 
data = [[1024, 60, 90], [1024, 50, 70], [1024, 51, 120],[1024, 62, 80], ] 

t=0 
tLast=0 
for d,p,v in data: 
    dt = midi.DeltaTime(mt) 
    dt.time = t-tLast 
    #add to track events 
    mt.events.append(dt) 

    me=midi.MidiEvent(mt) 
    me.type="NOTE_ON" 
    me.channel=1 
    me.time= None #d 
    me.pitch = p 
    me.velocity = v 
    mt.events.append(me) 

    # add note off/velocity zero message 
    dt = midi.DeltaTime(mt) 
    dt.time = d 
    # add to track events 
    mt.events.append(dt) 

    me=midi.MidiEvent(mt) 
    me.type="NOTE_ON" 
    me.channel=1 
    me.time= None #d 
    me.pitch = p 
    me.velocity = 0 
    mt.events.append(me) 
    tLast = t+d 
    t +=d 

dt=midi.DeltaTime(mt) 
dt.time = 0 
mt.events.append(dt) 
me = midi.MidiEvent(mt) 
me.type = "END_OF_TRACK" 
me.channel = 1 
me.data ='' # must set data to empty string 
mt.events.append(me) 

mf = midi.MidiFile() 
mf.ticksPerQuarterNote = 1024 # cannot use: 10080 
mf.tracks.append(mt) 

mf.tracks.append(mt2) 


mf.open('test.mid', 'wb') 
mf.write() 
mf.close() 
+0

你知道你在用't','tLast'和'dt.time'做什么吗? –

+0

@CL。不太... – ytrewq

+0

@CL。我尝试过调试,但tLast和t始终设置为相同的值,所以我没有真正获得t-tLast部分..并且dt.time没有直接打印 – ytrewq

在MIDI文件中,所有事件之前都有一个增量时间值,该值指定了最后一次事件等待的时间。

在您的代码中,ttLast都会随着音符的持续时间而增加,因此在音符关闭和以下音符之间没有暂停。

如果你想要下一个音符稍后开始,你必须增加更多的t