Browse Source

More sampler tweaks

tags/1.9.4
falkTX 11 years ago
parent
commit
e2a4bfebb5
2 changed files with 41 additions and 70 deletions
  1. +8
    -7
      source/backend/plugin/FluidSynthPlugin.cpp
  2. +33
    -63
      source/backend/plugin/LinuxSamplerPlugin.cpp

+ 8
- 7
source/backend/plugin/FluidSynthPlugin.cpp View File

@@ -887,7 +887,9 @@ public:
pData->hints = 0x0; pData->hints = 0x0;
pData->hints |= PLUGIN_IS_SYNTH; pData->hints |= PLUGIN_IS_SYNTH;
pData->hints |= PLUGIN_CAN_VOLUME; pData->hints |= PLUGIN_CAN_VOLUME;
pData->hints |= PLUGIN_CAN_BALANCE;

if (! fUses16Outs)
pData->hints |= PLUGIN_CAN_BALANCE;


// extra plugin hints // extra plugin hints
pData->extraHints = 0x0; pData->extraHints = 0x0;
@@ -1585,8 +1587,8 @@ public:
if (fUses16Outs && ! label2.endsWith(" (16 outs)")) if (fUses16Outs && ! label2.endsWith(" (16 outs)"))
label2 += " (16 outs)"; label2 += " (16 outs)";


pData->filename = carla_strdup(filename);
fLabel = label2.dup(); fLabel = label2.dup();
pData->filename = carla_strdup(filename);


if (name != nullptr && name[0] != '\0') if (name != nullptr && name[0] != '\0')
pData->name = pData->engine->getUniquePluginName(name); pData->name = pData->engine->getUniquePluginName(name);
@@ -1613,7 +1615,6 @@ public:


pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE;
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH;
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; pData->options |= PLUGIN_OPTION_SEND_PITCHBEND;
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;


@@ -1680,15 +1681,15 @@ CarlaPlugin* CarlaPlugin::newFluidSynth(const Initializer& init, const bool use1
carla_debug("CarlaPlugin::newFluidSynth({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, bool2str(use16Outs)); carla_debug("CarlaPlugin::newFluidSynth({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, bool2str(use16Outs));


#ifdef WANT_FLUIDSYNTH #ifdef WANT_FLUIDSYNTH
if (! fluid_is_soundfont(init.filename))
if (init.engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK && use16Outs)
{ {
init.engine->setLastError("Requested file is not a valid SoundFont");
init.engine->setLastError("Carla's rack mode can only work with Stereo modules, please choose the 2-channel only SoundFont version");
return nullptr; return nullptr;
} }


if (init.engine->getProccessMode() == ENGINE_PROCESS_MODE_CONTINUOUS_RACK && use16Outs)
if (! fluid_is_soundfont(init.filename))
{ {
init.engine->setLastError("Carla's rack mode can only work with Stereo modules, please choose the 2-channel only SoundFont version");
init.engine->setLastError("Requested file is not a valid SoundFont");
return nullptr; return nullptr;
} }




+ 33
- 63
source/backend/plugin/LinuxSamplerPlugin.cpp View File

@@ -179,9 +179,9 @@ public:
: CarlaPlugin(engine, id), : CarlaPlugin(engine, id),
fUses16Outs(use16Outs), fUses16Outs(use16Outs),
fFormat(carla_strdup(format)), fFormat(carla_strdup(format)),
fRealName(nullptr),
fLabel(nullptr), fLabel(nullptr),
fMaker(nullptr), fMaker(nullptr),
fRealName(nullptr),
fEngine(nullptr), fEngine(nullptr),
fMidiInputDevice(nullptr), fMidiInputDevice(nullptr),
fMidiInputPort(nullptr), fMidiInputPort(nullptr),
@@ -264,12 +264,6 @@ public:
fFormat = nullptr; fFormat = nullptr;
} }


if (fRealName != nullptr)
{
delete[] fRealName;
fRealName = nullptr;
}

if (fLabel != nullptr) if (fLabel != nullptr)
{ {
delete[] fLabel; delete[] fLabel;
@@ -282,6 +276,12 @@ public:
fMaker = nullptr; fMaker = nullptr;
} }


if (fRealName != nullptr)
{
delete[] fRealName;
fRealName = nullptr;
}

clearBuffers(); clearBuffers();
} }


@@ -601,7 +601,9 @@ public:
pData->hints = 0x0; pData->hints = 0x0;
pData->hints |= PLUGIN_IS_SYNTH; pData->hints |= PLUGIN_IS_SYNTH;
pData->hints |= PLUGIN_CAN_VOLUME; pData->hints |= PLUGIN_CAN_VOLUME;
pData->hints |= PLUGIN_CAN_BALANCE;

if (! fUses16Outs)
pData->hints |= PLUGIN_CAN_BALANCE;


// extra plugin hints // extra plugin hints
pData->extraHints = 0x0; pData->extraHints = 0x0;
@@ -981,53 +983,21 @@ public:
if (MIDI_IS_STATUS_NOTE_ON(status) && midiEvent.data[2] == 0) if (MIDI_IS_STATUS_NOTE_ON(status) && midiEvent.data[2] == 0)
status = MIDI_STATUS_NOTE_OFF; status = MIDI_STATUS_NOTE_OFF;


int32_t fragmentPos = sampleAccurate ? startTime : time;

if (MIDI_IS_STATUS_NOTE_OFF(status))
{
const uint8_t note = midiEvent.data[1];

fMidiInputPort->DispatchNoteOff(note, 0, channel, fragmentPos);

pData->postponeRtEvent(kPluginPostRtEventNoteOff, channel, note, 0.0f);
}
else if (MIDI_IS_STATUS_NOTE_ON(status))
{
const uint8_t note = midiEvent.data[1];
const uint8_t velo = midiEvent.data[2];

fMidiInputPort->DispatchNoteOn(note, velo, channel, fragmentPos);

pData->postponeRtEvent(kPluginPostRtEventNoteOn, channel, note, velo);
}
else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) != 0)
{
//const uint8_t note = midiEvent.data[1];
//const uint8_t pressure = midiEvent.data[2];
if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) == 0)
continue;
if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0)
continue;
if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0)
continue;
if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (pData->options & PLUGIN_OPTION_SEND_PITCHBEND) == 0)
continue;


// unsupported
}
else if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0)
{
const uint8_t control = midiEvent.data[1];
const uint8_t value = midiEvent.data[2];

fMidiInputPort->DispatchControlChange(control, value, channel, fragmentPos);
}
else if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) != 0)
{
//const uint8_t pressure = midiEvent.data[1];

// unsupported
}
else if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (pData->options & PLUGIN_OPTION_SEND_PITCHBEND) != 0)
{
const uint8_t lsb = midiEvent.data[1];
const uint8_t msb = midiEvent.data[2];
const int value = ((msb << 7) | lsb) - 8192;
fMidiInputPort->DispatchRaw(const_cast<uint8_t*>(midiEvent.data), sampleAccurate ? startTime : time);


fMidiInputPort->DispatchPitchbend(value, channel, fragmentPos);
}
if (status == MIDI_STATUS_NOTE_ON)
pData->postponeRtEvent(kPluginPostRtEventNoteOn, channel, midiEvent.data[1], midiEvent.data[2]);
else if (status == MIDI_STATUS_NOTE_OFF)
pData->postponeRtEvent(kPluginPostRtEventNoteOff, channel, midiEvent.data[1], 0.0f);


break; break;
} }
@@ -1168,7 +1138,7 @@ public:
return fUses16Outs ? xtrue : xfalse; return fUses16Outs ? xtrue : xfalse;
} }


bool init(const char* filename, const char* const name, const char* label)
bool init(const char* const filename, const char* const name, const char* const label)
{ {
CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false);


@@ -1181,13 +1151,13 @@ public:
return false; return false;
} }


if (filename == nullptr)
if (filename == nullptr || filename[0] == '\0')
{ {
pData->engine->setLastError("null filename"); pData->engine->setLastError("null filename");
return false; return false;
} }


if (label == nullptr)
if (label == nullptr || label[0] == '\0')
{ {
pData->engine->setLastError("null label"); pData->engine->setLastError("null label");
return false; return false;
@@ -1298,28 +1268,27 @@ public:
if (fUses16Outs && ! label2.endsWith(" (16 outs)")) if (fUses16Outs && ! label2.endsWith(" (16 outs)"))
label2 += " (16 outs)"; label2 += " (16 outs)";


fRealName = carla_strdup(info.InstrumentName.c_str());
fLabel = label2.dup(); fLabel = label2.dup();
fMaker = carla_strdup(info.Artists.c_str()); fMaker = carla_strdup(info.Artists.c_str());
fRealName = carla_strdup(info.InstrumentName.c_str());


pData->filename = carla_strdup(filename); pData->filename = carla_strdup(filename);


if (name != nullptr && name[0] != '\0') if (name != nullptr && name[0] != '\0')
pData->name = pData->engine->getUniquePluginName(name); pData->name = pData->engine->getUniquePluginName(name);
else
else if (fRealName[0] != '\0')
pData->name = pData->engine->getUniquePluginName(fRealName); pData->name = pData->engine->getUniquePluginName(fRealName);
else
pData->name = pData->engine->getUniquePluginName(label);


// --------------------------------------------------------------- // ---------------------------------------------------------------
// Register client
// register client


pData->client = pData->engine->addClient(this); pData->client = pData->engine->addClient(this);


if (pData->client == nullptr || ! pData->client->isOk()) if (pData->client == nullptr || ! pData->client->isOk())
{ {
pData->engine->setLastError("Failed to register plugin client"); pData->engine->setLastError("Failed to register plugin client");
LinuxSampler::EngineFactory::Destroy(fEngine);
fInstrument = nullptr;
fEngine = nullptr;
return false; return false;
} }


@@ -1331,6 +1300,7 @@ public:
pData->options = 0x0; pData->options = 0x0;


pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE;
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; pData->options |= PLUGIN_OPTION_SEND_PITCHBEND;
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF;


@@ -1357,9 +1327,9 @@ public:
private: private:
const bool fUses16Outs; const bool fUses16Outs;
const char* fFormat; const char* fFormat;
const char* fRealName;
const char* fLabel; const char* fLabel;
const char* fMaker; const char* fMaker;
const char* fRealName;


int32_t fCurMidiProgs[16]; int32_t fCurMidiProgs[16];




Loading…
Cancel
Save