1

我正在使用 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()
4

1 回答 1

2

在 MIDI 文件中,所有事件之前都有一个增量时间值,该值指定从最后一个事件开始等待多长时间。

在您的代码中,t并且tLast都增加了音符的持续时间,因此在音符关闭和下一个音符打开之间没有停顿。

如果你想让下一个音符稍后开始,你必须增加t一个更大的数量。

于 2016-12-28T14:02:16.783 回答