iOS Как получить MIDI-темп (BPM) с хоста с помощью CoreMidi? - PullRequest
2 голосов
/ 10 марта 2012

Я хочу знать, как я могу получить темп MIDI (ударов в минуту) от хоста, работающего на моем компьютере (это просто Ableton Live или Logic Pro), использующего CoreMidi?

Поддерживают ли стандарты MIDI эту функцию?Если да, то, пожалуйста, покажите мне пример кода Objective C.Я использую petegoodliffe-PGMidi для отправки MIDI.Но в этом случае я хочу получить темп от хоста.

Спасибо.

Ответы [ 3 ]

12 голосов
/ 10 марта 2012

Хотите верьте, хотите нет, но нет MIDI-сообщения, в котором говорится, что «текущий темп составляет 120 бит / мин».Такого рода сообщения не были бы очень полезны в любом случае, так как в большинстве случаев причина знать текущий темп заключается в синхронизации устройств, да?Что вам нужно сделать, это рассчитать текущий темп на основе синхронизации сообщений синхронизации MIDI.

Сообщения синхронизации синхронизации MIDI - это системные сообщения реального времени сообщения, состоящие из одного байта, 0xFA (или 1111 1000 в двоичном виде).Они отправляются из источника тактового сигнала MIDI 24 раза в квартальную ноту.

Если ваш BPM равен 120, то вы увидите 2880 таких сообщений в минуту или 48 в секунду.Это означает, что каждое тактовое сообщение будет разнесено на 20,8333 миллисекунды.

1000 / ((BPM * 24) / 60) = MS_BETWEEN_MESSAGES

Чтобы рассчитать BPM по часам MIDI, вам нужно знать время между каждым сообщением часов.Как только вы это знаете, эта формула работает и в обратном направлении.Допустим, мы знаем, что наши сообщения находятся на расстоянии около 17,86 мс:

(1000 / 17.86 / 24) * 60 = 139.978 BPM

Теперь, здесь есть большой улов, и это реально, вы нене буду знать точное время между этими сообщениями.Сумма, на которую вы будете отключены, варьируется от системы к системе и от программы к программе, но она будет отключена.Даже в идеальном мире есть время для отправки этого байта по проводам.То, что я сделал в прошлом, это усреднение времени последних нескольких сообщений.Это приводит к гораздо более стабильному измерению BPM, но не без последствий.Когда BPM быстро меняется, наши измерения будут отставать.Как вы справитесь с этим, зависит от ваших потребностей.

Все, что вам нужно сделать сейчас, - это настроить Ableton Live для отправки MIDI-сообщений о синхронизации.Для этого перейдите в «Настройки», «MIDI» и просто включите синхронизацию для нужного интерфейса MIDI.

1 голос
/ 17 февраля 2013

У меня есть форк PGMidi с расчетом BPM и Quantize.здесь: https://github.com/yderidde/PGMidi/blob/master/Sources/PGMidi/PGMidiSession.mm#L186

Это говорит о том, что я уверен, что его можно оптимизировать для получения лучших и более точных результатов, и на самом деле, если у кого-то есть предложения сделать это еще лучше, пожалуйста, дайте мне знать!

Настало время иметь решение с открытым исходным кодом для всех этих базовых функций, которые нужны любому при создании приложения coremidi.

1 голос
/ 11 марта 2012
- (void) midiRead:(const MIDIPacketList *)pktlist{

    MIDIPacket  *packet = MIDIPacketListInit((MIDIPacketList*)pktlist);
    int statusByte = packet->data[0];
    int status = statusByte >= 0xf0 ? statusByte : statusByte >> 4 << 4;

    switch (status) {
        case 0xb0: //cc
            NSLog(@"CC working!");
            break;
        case 0x90: // Note on, etc...
            NSLog(@"Note on/off working!");
            break;
        case 0xf8: // Clock tick
            NSLog(@"clock working!");
            break;
    }
...