2017-10-12 100 views
0

我讀這篇文章:https://www.midikits.net/midi_analyser/running_status.htm如何區分運行狀態的DeltaTime(VLQ),南部規格

enter image description here

我讀一個MIDI文件,這裏的最後一個片段以字節爲單位:

00 B2 07 64 00 0A 40 00 
5B 00 00 5D 00 00 FF 21 
01 00 83 5F 90 3C 00 01 
FF 2F 00 

https://www.midi.org/downloads?task=callelement&format=raw&item_id=92&element=f85c494b-2b32-4109-b8c1-083cca2b7db6&method=download

閱讀第91頁,Delta Time顯然不發送,而不是發送帶有「運行狀態」相關的兩個字節

enter image description here

這裏我的解釋(我知道是不好的,由於我沒有考慮運行狀態)

00 B2 07 64 
    // track event size: '4', delta time: '0', event: 'status byte 'B2', 
    // data length: '2', data: '0764', description: 'Controller Change', 
    // channel: '2 - Midi Event Type' 
00 0A // track event size: '2', delta time: '0', event: ' - ' 
40 00 // track event size: '2', delta time: '64', event: ' - ' 
5B 00 // track event size: '2', delta time: '91', event: ' - ' 
00 5D // track event size: '2', delta time: '0', event: ' - ' 
00 00 // track event size: '2', delta time: '0', event: ' - ' 
FF 21 01 // track event size: '3', delta time: '16289', event: ' - ' 
00 83 5F 90 
    // delta time: '0', event: 'status byte '83', data length: '2', data: '5F90', 
    // description: 'Note Off', channel: '3 - Midi Event Type' 
3C 00 // track event size: '2', delta time: '60', event: ' - ' 
01 FF 2F 00 
    //track event size: '4', delta time: '1', event: 'type: '2F', 
    // data length: '0', data: '', description: 'End of Track - Meta Event Type' 

正如你可以00 0A線看00是像Delta Time一樣對待,但0A與某些事件類型無關。 (我認爲這是一個運行狀態),同樣的情況發生在3C 00行。

問:

什麼是區分當是運行狀態當是delta time線索?

編輯1:

在我的例子能解釋像Control Changes Messages

0A 40 // 0A Pan 

檢查的網頁鏈接相關爲例。

假設相同Delta Time00

00 // Delta Time 
    90 3C 7F // Note ON, Channel 0, Key 3C , Velocity 7F 
00 // Delta Time 
    90 40 7F // Note ON, Channel 0, Key 40 , Velocity 7F 
00 // Delta Time 
    90 43 7F // Note ON, Channel 0, Key 43 , Velocity 7F 

例如變換像

00 // Delta Time 
    90 3C 7F // Note ON, Channel 0, Key 3C , Velocity 7F 
00 // Delta Time 
    40 7F // Note ON, Channel 0, Key 40 , Velocity 7F 
00 // Delta Time 
    43 7F // Note ON, Channel 0, Key 43 , Velocity 7F 

之前但是,正如我不CONTROL CHANGE MESSAGES (DATA BYTES)

40 7F // 40 Damper Pedal on/off (Sustain) 

    43 7F // 43 Soft Pedal On/Off 

回答

1

混淆內部的軌道,每事件的前綴是一個增量時間值。增量時間值的長度是顯而易見的:它以沒有設置最高有效位的字節結束。

MIDI事件本身的長度由狀態字節決定。使用運行狀態時,使用前一個狀態字節。狀態字節和數據字節可以通過最高有效位來區分。 當你閱讀的增量時間,下一個字節沒有MSB集,你已經運行狀態,並根據需要通過事件必須儘量多的數據字節:

 
00    delta time 
    B2 07 64 control change: volume = 100 
00    delta time 
     0A 40 (running status) expression = 64 
00    delta time 
     5B 00 (running status) reverb = 0 
00    delta time 
     5D 00 (running status) chorus = 0 
00    delta time 
    FF 21 01 00 meta event: port number = 0 
83 5F   delta time 
    90 3C 00 note-off 
01    delta time 
    FF 2F 00 meta event: end of track 
+0

謝謝你,我找到了運行狀態的解釋... https://www.midi。org/specifications/item/table-3-control-change-messages-data-bytes-2 –

+0

運行狀態可用於任何事件類型;你必須記住最後的實際狀態字節。 –

+0

但是,當從文件中讀取字節時,如何知道必須應用哪種解釋?控制更改消息或運行狀態有任何限制? (不含ambiguos數據字節) –