Задержка между сообщением о включении и выключении ноты в фреймворке JUCE

Я делаю небольшой инструмент на C++, используя структуру JUCE. Он отправляет MIDI, но я пришел к проблеме. Я хотел бы отправить аккорды в свою DAW, отправив примечание к сообщению, за которым следует сообщение о примечании. Код noteOn выглядит так:

        void MainContentComponent::handleNoteOn (MidiKeyboardState*, int 
        midiChannel, int midiNoteNumber, float velocity)
        {
            timestamp = (Time::getMillisecondCounterHiRes() * 0.001);
            MidiMessage m (MidiMessage::noteOn  (midiChannel, midiNoteNumber , velocity));
            MidiMessage m2 (MidiMessage::noteOn  (midiChannel, midiNoteNumber + 3, velocity));
            MidiMessage m3 (MidiMessage::noteOn (midiChannel, midiNoteNumber + 7, velocity));
            m.setTimeStamp (timestamp);
            m2.setTimeStamp (timestamp);
            m3.setTimeStamp (timestamp);
            sendToOutputs (m);
            sendToOutputs (m2);
            sendToOutputs (m3);

            handleNoteOff(midiChannel, midiNoteNumber, velocity)
        }

Проблема в том, что сообщение об отключении примечания следует сразу после сообщения о примечании. Мне нужна задержка между сообщением о включении и выключении примечания. Любая идея о том, как это сделать? Я думал о вариантах задержки, но насколько я знаю, они заморозят всю программу. Есть ли в JUCE что-нибудь, что может мне помочь? Я не смог найти его в Интернете.


person Jurze    schedule 25.09.2017    source источник


Ответы (1)


Учебник JUCE: класс MidiMessage показывает, как отправлять сообщения с задержкой:

Класс MidiBuffer предоставляет функции для перебора буферов MIDI-сообщений на основе их меток времени. Чтобы проиллюстрировать это, мы настроим простую систему планирования, в которой мы добавим MidiMessage объектов с определенными метками времени к MidiBuffer объекту. Затем мы используем объект Timer, который регулярно проверяет, должны ли быть доставлены какие-либо MIDI-сообщения.

Предупреждение

Класс Timer не подходит для высокоточной синхронизации. Это используется для простоты примера, сохраняя все вызовы функций в потоке сообщений. Для более надежной синхронизации вы должны использовать другой поток (в большинстве случаев звуковой поток подходит для рендеринга MidiBuffer объектов в звук).

person CL.    schedule 26.09.2017
comment
ты герой, должно быть пропустил это. Большое спасибо! - person Jurze; 26.09.2017