2012-01-02 3 views
3

Мне сложно разбирать Midi Packets. Время от времени его 3 байта, тогда это может быть 155 байт в одном потоке. Как я могу перебирать массивный пакет и просто получать то, что мне нужно? Скажите «b0» только 3 байта из 12 байтового пакета, я просто хочу разделить «b0» и его следующие байты: [b02c2c], затем остальные [b02c2d] или [f0 ....] в том же пакет ...Parse Midi Packet в iOS

Вот что я работаю, и дает мне головную боль ..

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

+6

Не используйте сопоставление строк для разбора двоичных данных. Перед использованием убедитесь, что вы полностью понимаете формат данных MIDI. – Till

+0

Я бы получил в основном такой пакет: 18 байт: [b0,0c, 0e, b0,2c, 05, b0,0c, 0f, b0,2c, 02, b0,0c, 0d, b0,2c, 02 ] Как я могу отделить их на 3 байта, а затем отправить методу? – Cocell

ответ

1

я не имею никакого опыта программирования IPhone, но у меня был быстрый взгляд на IOS MIDI API.

В MIDI есть различные MIDI-события (обратите внимание, обратите внимание, изменение контроллера и т. Д.). Каждое событие может иметь различное количество байтов. С первого байта вы можете указать тип события и тип сообщения, который вы знаете, длина сообщения (см. Ссылку на MIDI в http://www.midi.org/techspecs/midimessages.php). Единственным исключением является сообщение System Exclusive MIDI (подробнее см. Ссылку MIDi и ссылку для конкретного устройства, которое может отправлять и получать сообщения System Exclusive)

Похоже, что MIDIPacket может содержать переменное количество MIDI-сообщений. Таким образом, вы можете посмотреть первый байт. Предположим, вы получили заметку о midi-событии на MIDI-канале 1. В первом байте вы получите значение 80 (hex). Из документации вы можете видеть, что 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 - это просто прохождение байтов и обработка сообщений соответственно». - Не шутите! –

+0

@ Olivier'Ölbaum'Scherler ha, да, я знаю, это звучит проще, чем есть. Но MIDI не так уж плох, как только вы привыкнете к нему, ИМХО. :) –

+1

Да, это будет интересно. Furst вы понимаете, что у вас может быть несколько пакетов на сообщение, а затем могут быть статусы runnning, а затем чередующиеся системные сообщения. :) –