void MidiProgramInBlock::startLearning() {
    // check if already in learning state:
    if (m_learning) {
        // yes -> cancel learning:
        m_controller->midi()->removeNextEventCallback(getUid());
        setLearning(false);
        return;
    }
    // listen for the next event:
    setLearning(true);
    m_controller->midi()->registerForNextEvent(getUid(), [this](MidiEvent event) { this->checkIfEventFits(event); });
}
void MidiNoteInRangeBlock::checkIfEventFits(MidiEvent event) {
    setLearning(false);
    // chek if this event was a control change event:
    if (event.type != MidiConstants::NOTE_ON) {
        m_controller->guiManager()->showToast("This was not a Note event.");
        return;
    }
    // set attributes to match the event:
    setUseDefaultChannel(false);
    setChannel(event.channel);
    setKey(event.target);
    // update output:
    m_outputNode->setValue(event.value);
    emit validMessageReceived();
}
void MidiProgramInBlock::checkIfEventFits(MidiEvent event) {
    setLearning(false);
    // chek if this event was a control change event:
    if (event.type != MidiConstants::PROGRAM_CHANGE) {
        m_controller->guiManager()->showToast("This was not a Program Change event.");
        return;
    }
    // set attributes to match the event:
    setUseDefaultChannel(false);
    setChannel(event.channel);
    setProgram(event.target + 1);
    // update output:
    m_outputNode->setValue(1.0);
    emit validMessageReceived();
    m_programIsActive = true;
    emit programIsActiveChanged();
}
Пример #4
0
//-----------------------------------------------------------------------------
// a plugin editor should call this during valueChanged from a control 
// to turn MIDI learning on & off, VST parameter style
void VstChunk::setParameterMidiLearn(float value)
{
	setLearning(value > 0.5f);
}