2017-11-14 10 views
1

피아노의 MIDI 파일에서 모든 음표의 시작 및 정지 시간을 얻으려고합니다. 필자의 이해에서 델타 시간이있는 note_on 및 note_off 이벤트가 있으며 시작 및 중지 시간을 얻는 데 사용할 수 있습니다. 그러나, 내가 헷갈 렸던 것은 시간 변수와 관련이있다. 나는 다음과 같은 출력을 얻을 같은MIDI 메시지 혼동 [파이썬]

for msg in mid: 
    print(msg.dict()) 

로 난 그냥 간단한 프로그램이있을 때 : 나의 이해에서

{'note': 60, 'velocity': 61, 'type': 'note_on', 'channel': 0, 'time': 0.0016891895833333333} 
{'note': 64, 'velocity': 57, 'type': 'note_on', 'channel': 0, 'time': 0.20270275} 
{'note': 67, 'velocity': 56, 'type': 'note_on', 'channel': 0, 'time': 0.20270275} 
{'note': 67, 'velocity': 0, 'type': 'note_on', 'channel': 0, 'time': 0.20270275} 
{'note': 72, 'velocity': 60, 'type': 'note_on', 'channel': 0, 'time': 0} 
{'type': 'set_tempo', 'tempo': 794702, 'time': 0.20101356041666665} 

을,이 노트가 모든보다 1 틱 있습니다 델타 시간을 갖고 있음을 의미 나에게 완전히 틀린 것처럼 보입니다. 그러나, 내가 좋아하는 것은 이러한 방식으로 note_on, note_off 및 set_tempo 이벤트가 발생하는 순서대로 수행된다는 것입니다. 그들은 모두 100 + 틱 가지고

<meta message set_tempo tempo=794702 time=480> 
<meta message set_tempo tempo=810811 time=120> 
<meta message set_tempo tempo=800000 time=960> 
<meta message set_tempo tempo=810811 time=360> 
... 
=== Track 1 
<meta message midi_port port=0 time=0> 
<meta message track_name name=u'Piano right' time=0> 
<message program_change channel=0 program=0 time=0> 
<message control_change channel=0 control=7 value=100 time=0> 
<message control_change channel=0 control=10 value=64 time=0> 
<message control_change channel=0 control=91 value=127 time=0> 
<meta message text text=u'bdca426d104a26ac9dcb070447587523' time=0> 
<message note_on channel=0 note=67 velocity=56 time=241> 
<message note_on channel=0 note=67 velocity=0 time=120> 

메시지에 시간 요소가 나에게 더 의미가 있지만, 순서입니다 : 내가 대신

mid.print_tracks() 

작업을 수행 할 때 I는 다음과 같은 출력을 얻을 트랙을 선택하면 모든 템포 변경 사항이 즉시 인쇄 된 다음 오른손의 모든 노트 이벤트가 출력되고 왼손 등의 모든 노트 이벤트가 인쇄됩니다. 시간 속성을 가진 MIDI 이벤트의 목록을 print_tracks()에서 얻을 수있는 100 개 이상의 숫자로 얻을 수있는 두 가지 장점을 모두 얻을 수 있습니까?

+1

이러한 개체를 생성 한 라이브러리는 무엇입니까? –

+0

지정하지 않으셔서 죄송합니다. 제가 사용하는 라이브러리는 Mido입니다 https://mido.readthedocs.io/en/latest/ –

답변

1

documentation는 말한다 :

time 속성은 여러 가지 방법으로 사용된다 : 트랙 내부

  • , 그것은 틱에서 델타 시간입니다. 이것은 정수 여야합니다. 메시지에
  • , 그것은 (마지막 굴복 메시지 경과 시간) 델타 시간 (초)

델타 시간이 추가 그래서, 같은 트랙에서 이전 메시지에 상대적입니다 play()에서 산출 각각의 트랙에 대해 개별적으로 업 그레 이드됩니다.

+0

바로 읽을 수 있습니다. 그러나 제가 혼동 스러웠던 부분은 메시지를 출력하는 방법에 따라 숫자가 완전히 다른 방법입니다. –