2016-12-27 14 views
0

음표 값에서 MIDI 파일을 쓰려면 music21을 사용하고 있습니다.music21 : 음표로 음표를 MIDI 파일에 쓰십시오.

다음 코드는 3 개의 노트를 순차적으로 씁니다.

그러나 노트 사이에 "빈"공간을 어떻게 삽입합니까?

각 "침묵 간격"의 위치/길이를 계산할 필요가 없도록 "위치"별로 음표를 삽입 할 수 있다면 매우 쉽습니다. 음악 21에서 가능합니까?

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- 부분을 얻지는 않습니다. dt.time은 직접 인쇄되지 않았습니다. – ytrewq

답변

1

MIDI 파일에서 모든 이벤트 앞에는 마지막 이벤트로부터 기다리는 시간을 지정하는 델타 시간 값이옵니다.

코드에서 ttLast은 메모의 재생 시간만큼 증가하므로 메모가 꺼져있을 때와 다음 메모가 표시 될 때 사이에 일시 중지가 없습니다.

다음 메모를 나중에 시작하려면 더 큰 금액으로 t을 늘려야합니다.