music21: запись нот в MIDI-файл по позиции ноты

Я использую music21 для записи миди-файла из значений нот.

Следующий код записывает три заметки последовательно.

Однако как вставить «пустое» пространство между заметками?

Было бы очень просто, если бы я мог просто вставлять ноты по их «позиции», чтобы мне не приходилось вычислять позицию/длину каждого молчаливого интервала. Возможно ли это с 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()

person ytrewq    schedule 27.12.2016    source источник
comment
Вы понимаете, что делаете с t, tLast и dt.time?   -  person CL.    schedule 28.12.2016
comment
@КЛ. не совсем...   -  person ytrewq    schedule 28.12.2016
comment
@КЛ. Я пытался отладить, но tLast и t всегда были установлены на одно и то же значение, поэтому я действительно не получаю часть t-tLast... и dt.time не печатался напрямую   -  person ytrewq    schedule 28.12.2016


Ответы (1)


В MIDI-файле всем событиям предшествует дельта-значение времени, указывающее, как долго ждать от последнего события.

В вашем коде t и tLast увеличиваются на продолжительность заметки, поэтому между отключенной заметкой и следующей заметкой нет паузы.

Если вы хотите, чтобы следующая нота начиналась позже, вам нужно увеличить t на большую величину.

person CL.    schedule 28.12.2016