@@ -419,8 +419,8 @@ public: | |||||
clearBuffers(); | clearBuffers(); | ||||
const float sampleRate = (float)kData->engine->getSampleRate(); | |||||
const uint32_t portCount = static_cast<uint32_t>(fDescriptor->PortCount); | |||||
const float sampleRate(static_cast<float>(kData->engine->getSampleRate())); | |||||
const uint32_t portCount(static_cast<uint32_t>(fDescriptor->PortCount)); | |||||
uint32_t aIns, aOuts, mIns, params, j; | uint32_t aIns, aOuts, mIns, params, j; | ||||
aIns = aOuts = mIns = params = 0; | aIns = aOuts = mIns = params = 0; | ||||
@@ -989,7 +989,6 @@ public: | |||||
if (kData->needsReset) | if (kData->needsReset) | ||||
{ | { | ||||
// TODO! | |||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | ||||
{ | { | ||||
for (unsigned char j=0, l=MAX_MIDI_CHANNELS; j < MAX_MIDI_CHANNELS; ++j) | for (unsigned char j=0, l=MAX_MIDI_CHANNELS; j < MAX_MIDI_CHANNELS; ++j) | ||||
@@ -999,17 +998,27 @@ public: | |||||
fMidiEvents[j].type = SND_SEQ_EVENT_CONTROLLER; | fMidiEvents[j].type = SND_SEQ_EVENT_CONTROLLER; | ||||
fMidiEvents[j].data.control.channel = j; | fMidiEvents[j].data.control.channel = j; | ||||
fMidiEvents[j].data.control.param = MIDI_CONTROL_ALL_SOUND_OFF; | |||||
fMidiEvents[j].data.control.param = MIDI_CONTROL_ALL_NOTES_OFF; | |||||
fMidiEvents[j+l].type = SND_SEQ_EVENT_CONTROLLER; | fMidiEvents[j+l].type = SND_SEQ_EVENT_CONTROLLER; | ||||
fMidiEvents[j+l].data.control.channel = j; | fMidiEvents[j+l].data.control.channel = j; | ||||
fMidiEvents[j+l].data.control.param = MIDI_CONTROL_ALL_NOTES_OFF; | |||||
fMidiEvents[j+l].data.control.param = MIDI_CONTROL_ALL_SOUND_OFF; | |||||
} | } | ||||
midiEventCount = MAX_MIDI_CHANNELS*2; | midiEventCount = MAX_MIDI_CHANNELS*2; | ||||
} | } | ||||
else | |||||
else if (kData->ctrlChannel >= 0 && kData->ctrlChannel < MAX_MIDI_CHANNELS) | |||||
{ | { | ||||
for (unsigned char j=0; j < MAX_MIDI_NOTE; ++j) | |||||
{ | |||||
carla_zeroStruct<snd_seq_event_t>(fMidiEvents[j]); | |||||
fMidiEvents[j].type = SND_SEQ_EVENT_NOTEOFF; | |||||
fMidiEvents[j].data.note.channel = kData->ctrlChannel; | |||||
fMidiEvents[j].data.note.note = j; | |||||
} | |||||
midiEventCount = MAX_MIDI_NOTE; | |||||
} | } | ||||
if (kData->latency > 0) | if (kData->latency > 0) | ||||
@@ -1219,8 +1228,8 @@ public: | |||||
{ | { | ||||
if (! allNotesOffSent) | if (! allNotesOffSent) | ||||
{ | { | ||||
sendMidiAllNotesOffToCallback(); | |||||
allNotesOffSent = true; | allNotesOffSent = true; | ||||
sendMidiAllNotesOffToCallback(); | |||||
} | } | ||||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | ||||
@@ -923,22 +923,23 @@ public: | |||||
if (kData->needsReset) | if (kData->needsReset) | ||||
{ | { | ||||
// TODO | |||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | ||||
{ | { | ||||
for (int c=0; c < MAX_MIDI_CHANNELS; c++) | |||||
for (int c=0; c < MAX_MIDI_CHANNELS; ++c) | |||||
{ | { | ||||
#ifdef FLUIDSYNTH_VERSION_NEW_API | #ifdef FLUIDSYNTH_VERSION_NEW_API | ||||
fluid_synth_all_notes_off(fSynth, c); | fluid_synth_all_notes_off(fSynth, c); | ||||
fluid_synth_all_sounds_off(fSynth, c); | fluid_synth_all_sounds_off(fSynth, c); | ||||
#else | #else | ||||
fluid_synth_cc(f_synth, c, MIDI_CONTROL_ALL_SOUND_OFF, 0); | |||||
fluid_synth_cc(f_synth, c, MIDI_CONTROL_ALL_NOTES_OFF, 0); | |||||
fluid_synth_cc(fSynth, c, MIDI_CONTROL_ALL_SOUND_OFF, 0); | |||||
fluid_synth_cc(fSynth, c, MIDI_CONTROL_ALL_NOTES_OFF, 0); | |||||
#endif | #endif | ||||
} | } | ||||
} | } | ||||
else | |||||
else if (kData->ctrlChannel >= 0 && kData->ctrlChannel < MAX_MIDI_CHANNELS) | |||||
{ | { | ||||
for (k=0; k < MAX_MIDI_NOTE; ++k) | |||||
fluid_synth_noteoff(fSynth, kData->ctrlChannel, k); | |||||
} | } | ||||
kData->needsReset = false; | kData->needsReset = false; | ||||
@@ -1140,8 +1141,8 @@ public: | |||||
{ | { | ||||
if (! allNotesOffSent) | if (! allNotesOffSent) | ||||
{ | { | ||||
sendMidiAllNotesOffToCallback(); | |||||
allNotesOffSent = true; | allNotesOffSent = true; | ||||
sendMidiAllNotesOffToCallback(); | |||||
} | } | ||||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | ||||
@@ -1163,8 +1164,8 @@ public: | |||||
{ | { | ||||
if (! allNotesOffSent) | if (! allNotesOffSent) | ||||
{ | { | ||||
sendMidiAllNotesOffToCallback(); | |||||
allNotesOffSent = true; | allNotesOffSent = true; | ||||
sendMidiAllNotesOffToCallback(); | |||||
} | } | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | ||||
@@ -411,8 +411,8 @@ public: | |||||
clearBuffers(); | clearBuffers(); | ||||
const float sampleRate = (float)kData->engine->getSampleRate(); | |||||
const uint32_t portCount = static_cast<uint32_t>(fDescriptor->PortCount); | |||||
const float sampleRate(static_cast<float>(kData->engine->getSampleRate())); | |||||
const uint32_t portCount(static_cast<uint32_t>(fDescriptor->PortCount)); | |||||
uint32_t aIns, aOuts, params, j; | uint32_t aIns, aOuts, params, j; | ||||
aIns = aOuts = params = 0; | aIns = aOuts = params = 0; | ||||
@@ -522,17 +522,18 @@ public: | |||||
if (kData->needsReset) | if (kData->needsReset) | ||||
{ | { | ||||
// TODO | |||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | ||||
{ | { | ||||
for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | ||||
{ | { | ||||
fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_SOUND_OFF, 0, k, 0); | |||||
fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_NOTES_OFF, 0, k, 0); | |||||
fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_NOTES_OFF, 0, k); | |||||
fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_SOUND_OFF, 0, k); | |||||
} | } | ||||
} | } | ||||
else | |||||
else if (kData->ctrlChannel >= 0 && kData->ctrlChannel < MAX_MIDI_CHANNELS) | |||||
{ | { | ||||
for (k=0; k < MAX_MIDI_NOTE; ++k) | |||||
fMidiInputPort->DispatchNoteOff(k, 0, kData->ctrlChannel); | |||||
} | } | ||||
kData->needsReset = false; | kData->needsReset = false; | ||||
@@ -733,8 +734,8 @@ public: | |||||
{ | { | ||||
if (! allNotesOffSent) | if (! allNotesOffSent) | ||||
{ | { | ||||
sendMidiAllNotesOffToCallback(); | |||||
allNotesOffSent = true; | allNotesOffSent = true; | ||||
sendMidiAllNotesOffToCallback(); | |||||
} | } | ||||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | ||||
@@ -750,8 +751,8 @@ public: | |||||
{ | { | ||||
if (! allNotesOffSent) | if (! allNotesOffSent) | ||||
{ | { | ||||
sendMidiAllNotesOffToCallback(); | |||||
allNotesOffSent = true; | allNotesOffSent = true; | ||||
sendMidiAllNotesOffToCallback(); | |||||
} | } | ||||
} | } | ||||
@@ -1262,8 +1262,8 @@ public: | |||||
clearBuffers(); | clearBuffers(); | ||||
const float sampleRate = (float)kData->engine->getSampleRate(); | |||||
const uint32_t portCount = fRdfDescriptor->PortCount; | |||||
const float sampleRate(static_cast<float>(kData->engine->getSampleRate())); | |||||
const uint32_t portCount(static_cast<uint32_t>(fRdfDescriptor->PortCount)); | |||||
uint32_t aIns, aOuts, cvIns, cvOuts, params, j; | uint32_t aIns, aOuts, cvIns, cvOuts, params, j; | ||||
aIns = aOuts = cvIns = cvOuts = params = 0; | aIns = aOuts = cvIns = cvOuts = params = 0; | ||||
@@ -2278,15 +2278,57 @@ public: | |||||
if (kData->needsReset) | if (kData->needsReset) | ||||
{ | { | ||||
// TODO! | |||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
k = fEventsIn.ctrlIndex; | |||||
uint8_t midiData[3] = { 0 }; | |||||
if (fEventsIn.ctrl->type & CARLA_EVENT_TYPE_MIDI) | |||||
{ | { | ||||
//for (unsigned char j=0, l=MAX_MIDI_CHANNELS; j < MAX_MIDI_CHANNELS; ++j) | |||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | |||||
{ | |||||
midiData[0] = MIDI_STATUS_CONTROL_CHANGE + k; | |||||
midiData[1] = MIDI_CONTROL_ALL_NOTES_OFF; | |||||
if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_ATOM) | |||||
lv2_atom_buffer_write(&evInAtomIters[k], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData); | |||||
else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_EVENT) | |||||
lv2_event_write(&evInEventIters[k], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData); | |||||
else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_MIDI_LL) | |||||
lv2midi_put_event(&evInMidiStates[k], 0, 3, midiData); | |||||
midiData[0] = MIDI_STATUS_CONTROL_CHANGE + k; | |||||
midiData[1] = MIDI_CONTROL_ALL_SOUND_OFF; | |||||
if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_ATOM) | |||||
lv2_atom_buffer_write(&evInAtomIters[k], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData); | |||||
else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_EVENT) | |||||
lv2_event_write(&evInEventIters[k], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData); | |||||
else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_MIDI_LL) | |||||
lv2midi_put_event(&evInMidiStates[k], 0, 3, midiData); | |||||
} | |||||
} | |||||
else if (kData->ctrlChannel >= 0 && kData->ctrlChannel < MAX_MIDI_CHANNELS) | |||||
{ | |||||
for (k=0; k < MAX_MIDI_NOTE; ++k) | |||||
{ | |||||
midiData[0] = MIDI_STATUS_NOTE_OFF + kData->ctrlChannel; | |||||
midiData[1] = k; | |||||
if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_ATOM) | |||||
lv2_atom_buffer_write(&evInAtomIters[k], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData); | |||||
else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_EVENT) | |||||
lv2_event_write(&evInEventIters[k], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData); | |||||
else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_MIDI_LL) | |||||
lv2midi_put_event(&evInMidiStates[k], 0, 3, midiData); | |||||
} | |||||
} | } | ||||
} | |||||
else | |||||
{ | |||||
} | } | ||||
if (kData->latency > 0) | if (kData->latency > 0) | ||||
@@ -2487,7 +2529,7 @@ public: | |||||
CARLA_ASSERT(note.channel >= 0 && note.channel < MAX_MIDI_CHANNELS); | CARLA_ASSERT(note.channel >= 0 && note.channel < MAX_MIDI_CHANNELS); | ||||
uint8_t midiEvent[3] = { 0 }; | |||||
uint8_t midiEvent[3]; | |||||
midiEvent[0] = (note.velo > 0) ? MIDI_STATUS_NOTE_ON : MIDI_STATUS_NOTE_OFF; | midiEvent[0] = (note.velo > 0) ? MIDI_STATUS_NOTE_ON : MIDI_STATUS_NOTE_OFF; | ||||
midiEvent[0] += note.channel; | midiEvent[0] += note.channel; | ||||
midiEvent[1] = note.note; | midiEvent[1] = note.note; | ||||
@@ -2700,8 +2742,8 @@ public: | |||||
{ | { | ||||
if (! allNotesOffSent) | if (! allNotesOffSent) | ||||
{ | { | ||||
sendMidiAllNotesOffToCallback(); | |||||
allNotesOffSent = true; | allNotesOffSent = true; | ||||
sendMidiAllNotesOffToCallback(); | |||||
} | } | ||||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | ||||
@@ -1193,24 +1193,34 @@ public: | |||||
if (kData->needsReset) | if (kData->needsReset) | ||||
{ | { | ||||
// TODO! | |||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | ||||
{ | { | ||||
for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | ||||
{ | { | ||||
fMidiEvents[k].data[0] = MIDI_STATUS_CONTROL_CHANGE + k; | fMidiEvents[k].data[0] = MIDI_STATUS_CONTROL_CHANGE + k; | ||||
fMidiEvents[k].data[1] = MIDI_CONTROL_ALL_SOUND_OFF; | |||||
fMidiEvents[k].size = 2; | |||||
fMidiEvents[k].data[1] = MIDI_CONTROL_ALL_NOTES_OFF; | |||||
fMidiEvents[k].data[2] = 0; | |||||
fMidiEvents[k].size = 3; | |||||
fMidiEvents[k+i].data[0] = MIDI_STATUS_CONTROL_CHANGE + k; | fMidiEvents[k+i].data[0] = MIDI_STATUS_CONTROL_CHANGE + k; | ||||
fMidiEvents[k+i].data[1] = MIDI_CONTROL_ALL_NOTES_OFF; | |||||
fMidiEvents[k+i].size = 2; | |||||
fMidiEvents[k+i].data[1] = MIDI_CONTROL_ALL_SOUND_OFF; | |||||
fMidiEvents[k+i].data[2] = 0; | |||||
fMidiEvents[k+i].size = 3; | |||||
} | } | ||||
fMidiEventCount = MAX_MIDI_CHANNELS*2; | fMidiEventCount = MAX_MIDI_CHANNELS*2; | ||||
} | } | ||||
else | |||||
else if (kData->ctrlChannel >= 0 && kData->ctrlChannel < MAX_MIDI_CHANNELS) | |||||
{ | { | ||||
for (k=0; k < MAX_MIDI_NOTE; ++k) | |||||
{ | |||||
fMidiEvents[k].data[0] = MIDI_STATUS_NOTE_OFF + kData->ctrlChannel; | |||||
fMidiEvents[k].data[1] = k; | |||||
fMidiEvents[k].data[2] = 0; | |||||
fMidiEvents[k].size = 3; | |||||
} | |||||
fMidiEventCount = MAX_MIDI_NOTE; | |||||
} | } | ||||
kData->needsReset = false; | kData->needsReset = false; | ||||
@@ -1452,8 +1462,8 @@ public: | |||||
{ | { | ||||
if (! allNotesOffSent) | if (! allNotesOffSent) | ||||
{ | { | ||||
sendMidiAllNotesOffToCallback(); | |||||
allNotesOffSent = true; | allNotesOffSent = true; | ||||
sendMidiAllNotesOffToCallback(); | |||||
} | } | ||||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | ||||
@@ -1004,7 +1004,6 @@ public: | |||||
if (kData->needsReset) | if (kData->needsReset) | ||||
{ | { | ||||
// TODO! | |||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | ||||
{ | { | ||||
for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | ||||
@@ -1012,7 +1011,7 @@ public: | |||||
fMidiEvents[k].type = kVstMidiType; | fMidiEvents[k].type = kVstMidiType; | ||||
fMidiEvents[k].byteSize = sizeof(VstMidiEvent); | fMidiEvents[k].byteSize = sizeof(VstMidiEvent); | ||||
fMidiEvents[k].midiData[0] = MIDI_STATUS_CONTROL_CHANGE + k; | fMidiEvents[k].midiData[0] = MIDI_STATUS_CONTROL_CHANGE + k; | ||||
fMidiEvents[k].midiData[1] = MIDI_CONTROL_ALL_SOUND_OFF; | |||||
fMidiEvents[k].midiData[1] = MIDI_CONTROL_ALL_NOTES_OFF; | |||||
fMidiEvents[k+i].type = kVstMidiType; | fMidiEvents[k+i].type = kVstMidiType; | ||||
fMidiEvents[k+i].byteSize = sizeof(VstMidiEvent); | fMidiEvents[k+i].byteSize = sizeof(VstMidiEvent); | ||||
@@ -1022,8 +1021,17 @@ public: | |||||
fMidiEventCount = MAX_MIDI_CHANNELS*2; | fMidiEventCount = MAX_MIDI_CHANNELS*2; | ||||
} | } | ||||
else | |||||
else if (kData->ctrlChannel >= 0 && kData->ctrlChannel < MAX_MIDI_CHANNELS) | |||||
{ | { | ||||
for (k=0; k < MAX_MIDI_NOTE; ++k) | |||||
{ | |||||
fMidiEvents[k].type = kVstMidiType; | |||||
fMidiEvents[k].byteSize = sizeof(VstMidiEvent); | |||||
fMidiEvents[k].midiData[0] = MIDI_STATUS_NOTE_OFF + kData->ctrlChannel; | |||||
fMidiEvents[k].midiData[1] = k; | |||||
} | |||||
fMidiEventCount = MAX_MIDI_NOTE; | |||||
} | } | ||||
if (kData->latency > 0) | if (kData->latency > 0) | ||||
@@ -1287,8 +1295,8 @@ public: | |||||
{ | { | ||||
if (! allNotesOffSent) | if (! allNotesOffSent) | ||||
{ | { | ||||
sendMidiAllNotesOffToCallback(); | |||||
allNotesOffSent = true; | allNotesOffSent = true; | ||||
sendMidiAllNotesOffToCallback(); | |||||
} | } | ||||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | ||||
@@ -54,13 +54,14 @@ enum PluginBridgeInfoType { | |||||
enum PluginBridgeOpcode { | enum PluginBridgeOpcode { | ||||
kPluginBridgeOpcodeNull = 0, | kPluginBridgeOpcodeNull = 0, | ||||
kPluginBridgeOpcodeReadyWait = 1, | kPluginBridgeOpcodeReadyWait = 1, | ||||
kPluginBridgeOpcodeSetBufferSize = 2, | |||||
kPluginBridgeOpcodeSetSampleRate = 3, | |||||
kPluginBridgeOpcodeSetParameter = 4, | |||||
kPluginBridgeOpcodeSetProgram = 5, | |||||
kPluginBridgeOpcodeSetMidiProgram = 6, | |||||
kPluginBridgeOpcodeProcess = 7, | |||||
kPluginBridgeOpcodeQuit = 8 | |||||
kPluginBridgeOpcodeSetBufferSize = 2, // int | |||||
kPluginBridgeOpcodeSetSampleRate = 3, // float | |||||
kPluginBridgeOpcodeSetParameter = 4, // int, float | |||||
kPluginBridgeOpcodeSetProgram = 5, // int | |||||
kPluginBridgeOpcodeSetMidiProgram = 6, // int | |||||
kPluginBridgeOpcodeMidiEvent = 7, // int, char, ... (int = size, max 4) | |||||
kPluginBridgeOpcodeProcess = 8, | |||||
kPluginBridgeOpcodeQuit = 9 | |||||
}; | }; | ||||
/*! | /*! | ||||