2012-01-02 41 views
3

我很難解析Midi包。有時它的3個字節在一個數據流上可以是155個字節。 如何迭代大量數據包並獲得我所需要的? 對於「b0」來說,它只有12字節的3個字節,我只想分割「b0」及其後面的字節: [b02c2c],然後其他[b02c2d]或[f0 ....]包...在iOS中解析Midi包

繼承人什麼,我一直在努力,並讓我頭疼..

NSString *StringFromPacket(const MIDIPacket *packet,id self) 
{ 
    NSMutableString * result = [[NSMutableString alloc] init]; 

    for (int i = 0; i < packet->length; i++) 
    { 
     NSString *s = [NSString stringWithFormat:@"%02x",packet->data[i]]; 

     for (NSString *line in [s componentsSeparatedByString:@"b0"]) 
     { 
      // This appends to string but b0 disappears and only get the following 2 bytes 
      // Along with the others like f0,a0,90. I would like to filter without losing b0 
      [result appendFormat:line]; 
     } 
    } 

    [self controlEvent:result]; 
} 


-(void)controlEvent:(NSString *)line 
{ 
    if (line == @"b02c2c") 
    { 
     //Do Something 
    } 
} 
+0

我對你的問題和代碼感到困惑 - 你能展示一些MIDI數據包以及你想對它們做什麼操作嗎? – sarnold 2012-01-02 01:24:43

+6

請勿使用字符串匹配來分析二進制數據。在使用之前,請確保您完全理解MIDI數據格式。 – Till 2012-01-02 01:25:52

+0

我基本上會收到這樣一個數據包: 18字節:[b0,0c,0e,b0,2c,05,b0,0c,0f,b0,2c,02,b0,0c,0d,b0,2c,02 ] 如何將它們分成3個字節然後發送到一個方法? – Cocell 2012-01-02 02:40:03

回答

1

我與編程IPhone沒有經驗,但我有快看iOS的MIDI API。

在MIDI中有各種MIDI事件(注意,注意,控制器更改等)每個事件可以有不同的字節數。從第一個字節開始,您可以設置事件類型和您知道信息長度的類型(請參閱http://www.midi.org/techspecs/midimessages.php上的MIDI參考)唯一的例外是系統專用MIDI信息(有關詳細信息,請參閱可以發送和接收系統專用信息的特定設備的MIDi參考和參考)

似乎MIDIPacket可以包含可變數量的MIDI信息。所以你可以看第一個字節。假設您在MIDI通道1上收到了關於midi事件的提示。在第一個字節中,您將獲得值80(十六進制)。從文檔可以看到,Note On Event有兩個數據字節。下一個字節是MIDI音符編號(您可以看到MIDI音符編號列表,例如http://midikits.net23.net/midi_analyser/midi_note_numbers_for_octaves.htm)。並且下一個音符號碼是速度(多快(或幾乎)被按下)。然後你可以重複這個程序。

請注意,對於某些消息,如Pitch Wheel Change,兩個數據字節攜帶一個值(MSB和LSB)。

如果知道字節從0開始,它就是MIDI數據字節,這可能對您有用。 MIDI事件在其第一個字節中有1個。

1

另一個有用的資源:http://home.roadrunner.com/~jgglatt

具體而言,您可能要檢查出的MIDI協議消息的部分:http://home.roadrunner.com/~jgglatt/tech/midispec.htm

除此之外,解析MIDI是剛剛經歷了字節和搬運走的事相應的消息。

+1

「除此之外,解析MIDI只是遍歷字節並相應地處理消息。」 - 不要開玩笑! – 2013-05-20 16:01:14

+0

@Olivier'Ölbaum'Scherler哈,是的,我知道,它使它聽起來比現在容易。但是,一旦你習慣了它,恕我直言,MIDI並不是那麼糟糕。 :) – 2013-05-20 17:49:40

+1

是的,這將是有趣的。 Furst認識到每條消息可以有多個數據包,然後可以有運行狀態,然後交織系統消息。 :) – 2013-05-27 07:56:22