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(); }
//----------------------------------------------------------------------------- // 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); }