Parse Midi Packet в iOS - PullRequest
       31

Parse Midi Packet в iOS

3 голосов
/ 02 января 2012

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

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

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
    }
}

Ответы [ 2 ]

1 голос
/ 02 октября 2012

Другой полезный ресурс: http://home.roadrunner.com/~jgglatt

В частности, вы можете проверить раздел сообщений протокола MIDI: http://home.roadrunner.com/~jgglatt/tech/midispec.htm

Помимо этого, анализ MIDI - это вопроспросто проходя байты и обрабатывая сообщения соответственно.

1 голос
/ 01 октября 2012

У меня нет опыта программирования на iPhone, но я быстро взглянул на iOS MIDI API.

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

Кажется, что MIDIPacket может содержать переменное количество MIDI-сообщений.Таким образом, вы можете посмотреть на первый байт.Предположим, вы получили событие Midi Note On на канале MIDI 1. В первом байте у вас будет значение 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 в своем первом байте.

...