Hello,
I work on a plugin which detects pitch of an audio and sends midi messages equivalent to this pitch. I have problem with sending noteOff messages. My noteOff function is inside isNoteOn() condition. Here is code:
void Soota1AudioProcessor::processBlock (AudioBuffer& buffer, MidiBuffer& midiMessages)
{
ScopedNoDenormals noDenormals;
auto totalNumInputChannels = getTotalNumInputChannels();
auto totalNumOutputChannels = getTotalNumOutputChannels();
dywapitchtracker pitchtracker;
MidiMessage midimsg;
MidiOutput midiOutput;
midiOutput = MidiOutput::openDevice(1);
//midiOutput->startBackgroundThread();
double bufor;
int note;for (auto i = totalNumInputChannels; i < totalNumOutputChannels; ++i)
buffer.clear(i, 0, buffer.getNumSamples());for (int channel = 0; channel < totalNumInputChannels; ++channel)
{
auto* channelData = buffer.getWritePointer(channel);
bufor = (double*)channelData;
dywapitch_inittracking(&pitchtracker);
pitch = 2 * (dywapitch_computepitch(&pitchtracker, bufor, 1, 2048));
volume = Decibels::gainToDecibels(buffer.getRMSLevel(channel, 0, buffer.getNumSamples()));
//note = Hz_to_note(pitch);if (volume > -20.0 && midimsg.isNoteOn() == false) { if (Hz_to_note(pitch) >= 0 && Hz_to_note(pitch) <= 127) { //auto message = MidiMessage::noteOn(1, Hz_to_note(pitch), (uint8)100); //midiMessages.addEvent(MidiMessage::noteOn(1, Hz_to_note(pitch), (uint8)100), 0); //midiOutput->sendBlockOfMessages(midiMessages, Time::getMillisecondCounter() + 1000, 44100); midiOutput->sendMessageNow(MidiMessage::noteOn(1, Hz_to_note(pitch), 1.0f)); } } if (volume < -19.0 && midimsg.isNoteOn() == true) { //midiOutput->sendMessageNow(MidiMessage::noteOff(1, Hz_to_note(pitch), 0.0f)); midiOutput->sendMessageNow(MidiMessage::allNotesOff(1)); }
}
}
So my vst sends midi message noteOn correctly when volume is more than -20 db but it can’t get into second condition (if (volume < -19.0 && midimsg.isNoteOn() == true)) which contains noteOff() function. If my volume value drops below -19 then i have no noteOff message (I cheked in debug mode that program never enters this “if”) so it is definitely caused by “midimsg.isNoteOn() == true”.
Does my problem results from using “sendMessageNow()” function? As you can see, I tried sending midi messages how it’s done in juce demo (with use of “addEvent”) but I couldn’t make it work.