Hi all,
I do some steps using tracktion engine but I’m stuck on this:
Using the PitchShiftPlugin after a SamplerPlugin, is this possible?
This is the code I’m trying to use:
void App::loadSounds()
{
// Creating eight tracks
edit.ensureNumberOfAudioTracks(8);
auto& transport = edit.getTransport();
// Setting BPM to the track
//edit.tempoSequence.getTempos()[0]->setBpm(90);
edit.tempoSequence.getTempos()[0]->setBpm(90);
edit.setClickTrackVolume(1.0f);
edit.clickTrackEnabled = false;
edit.clickTrackEmphasiseBars = false;
// Crea un intervallo di tempo che copre esattamente 1 barra
const tracktion::TimeRange editTimeRange(0s, edit.tempoSequence.toTime({ 4, tracktion::BeatDuration() }));
juce::AudioFormatManager formatManager;
formatManager.registerBasicFormats();
// Just add 8 random sound to a fixed array.
juce::String basePath("C:\\FAKEPATH\\Projects\\1\\Sounds\\");
for (int i = 0; i < numFiles; ++i)
{
juce::String fileName = "sample" + juce::String(i + 1) + ".wav";
audioFiles[i].file = juce::File(basePath + fileName);
std::unique_ptr<juce::AudioFormatReader> reader(formatManager.createReaderFor(audioFiles[i].file));
if (reader)
{
audioFiles[i].numSamples = reader->lengthInSamples;
int numSamples = reader->lengthInSamples;
double sampleRate = reader->sampleRate;
double durationInSeconds = numSamples / sampleRate;
DBG("sample" + juce::String(i + 1) + ".wav");
DBG("Lunghezza in sample: " + juce::String(numSamples));
DBG("Frequenza di campionamento: " + juce::String(sampleRate));
DBG("Durata in secondi: " + juce::String(durationInSeconds));
}
else
{
audioFiles[i].numSamples = 0;
DBG("Errore: impossibile leggere il file audio.");
}
}
auto audioTracks = tracktion::getAudioTracks(edit);
for (size_t i = 0; i < 8; ++i)
{
if (audioTracks.size() <= i)
{
DBG("Errore: meno tracce del previsto!");
continue;
}
auto track = audioTracks[i];
if (!track)
{
DBG("Errore: traccia " + juce::String(i + 1) + " non valida!");
continue;
}
track->setName("Track " + juce::String(i + 1));
track->setColour(juce::Colour::fromRGB(230, 244, 241));
auto clip = track->insertNewClip(tracktion::TrackItem::Type::midi, "Clip 1", editTimeRange, nullptr);
if (!clip)
{
DBG("Errore: impossibile inserire il MIDI Clip sulla traccia " + juce::String(i + 1));
continue;
}
DBG("MIDI Clip creata sulla traccia: " + juce::String(i + 1));
DBG("Midi clip lunghezza: " + juce::String(clip->getLengthInBeats().inBeats()));
auto midiClip = dynamic_cast<tracktion::MidiClip*>(clip);
if (!midiClip)
{
DBG("Errore: MidiClip non valido sulla traccia " + juce::String(i + 1));
continue;
}
juce::Random random;
midiClip->setColour(juce::Colour::fromRGB(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
juce::String samplerName = "SamplerPlugin_" + juce::String(i);**
auto sampler = dynamic_cast<tracktion::SamplerPlugin*>(
edit.getPluginCache().createNewPlugin(tracktion::SamplerPlugin::xmlTypeName, {}).get()
);
if (!sampler)
{
DBG("Errore: impossibile creare il SamplerPlugin sulla traccia " + juce::String(i + 1));
continue;
}
auto pitchShift = dynamic_cast<tracktion::PitchShiftPlugin*>(
edit.getPluginCache().createNewPlugin(tracktion::PitchShiftPlugin::xmlTypeName, {}).get()
);
pitchShift->semitonesValue = 10.0f;
pitchShift->setEnabled(true);
track->pluginList.insertPlugin(*sampler, 0, nullptr);
track->pluginList.insertPlugin(*pitchShift, -1, nullptr);
int midiNote = 36;
if (i == 1) {
DBG("Carico il file: " + audioFiles[i].file.getFullPathName());
const auto error = sampler->addSound(audioFiles[1].file.getFullPathName(), "Slice 1", 0, audioFiles[1].numSamples, 1.0f);
if (!error.isEmpty())
{
DBG("Errore nel caricamento del suono sulla traccia " + juce::String(i) + ": " + error);
continue;
}
sampler->setSoundParams(sampler->getNumSounds() - 1, midiNote, midiNote, midiNote);
//sampler->setSoundOpenEnded(sampler->getNumSounds() - 1, true);
DBG("Settaggio parametri sampler per slice: 1");
midiNote = 36 + 1;
DBG("Carico il file: " + audioFiles[i].file.getFullPathName());
const auto error2 = sampler->addSound(audioFiles[2].file.getFullPathName(), "Slice 2", 0, audioFiles[2].numSamples, 1.0f);
if (!error2.isEmpty())
{
DBG("Errore nel caricamento del suono sulla traccia " + juce::String(i) + ": " + error);
continue;
}
sampler->setSoundParams(sampler->getNumSounds() - 1, midiNote, midiNote, midiNote);
//sampler->setSoundOpenEnded(sampler->getNumSounds() - 1, true);
DBG("Settaggio parametri sampler per slice: 2");
}
else {
for (size_t y = 0; y < 16; y++)
{
DBG("Carico il file: " + audioFiles[i].file.getFullPathName());
const auto error = sampler->addSound(audioFiles[i].file.getFullPathName(), "Slice " + juce::String(y + 1), 0, audioFiles[i].numSamples, 1.0f);
if (!error.isEmpty())
{
DBG("Errore nel caricamento del suono sulla traccia " + juce::String(i) + ": " + error);
continue;
}
sampler->setSoundParams(sampler->getNumSounds() - 1, midiNote, midiNote, midiNote);
//sampler->setSoundOpenEnded(sampler->getNumSounds() - 1, true);
DBG("Settaggio parametri sampler per slice: " + juce::String(y));
midiNote = 36 + y;
}
}
if (i == 0) {
//midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(0), tracktion::BeatDuration::fromBeats(4), 127, 0, nullptr);
}
else if (i == 1) {
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(1), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(3), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(37, tracktion::BeatPosition::fromBeats(0), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(37, tracktion::BeatPosition::fromBeats(0.5), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(37, tracktion::BeatPosition::fromBeats(1), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(37, tracktion::BeatPosition::fromBeats(1.5), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(37, tracktion::BeatPosition::fromBeats(2), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(37, tracktion::BeatPosition::fromBeats(2.5), tracktion::BeatDuration::fromBeats(0.5), 127.0, 0, nullptr);
midiClip->getSequence().addNote(37, tracktion::BeatPosition::fromBeats(3), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(37, tracktion::BeatPosition::fromBeats(3.5), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
}
else if (i == 2) {
/*midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(0), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(0.5), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(1), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(1.5), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(2), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(2.5), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(3), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(3.5), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);*/
}
else if (i == 3) {
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(0), tracktion::BeatDuration::fromBeats(0.5), 80, 0, nullptr);
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(1.75), tracktion::BeatDuration::fromBeats(0.25), 60, 0, nullptr);
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(2), tracktion::BeatDuration::fromBeats(0.5), 80, 0, nullptr);
midiClip->getSequence().addNote(36, tracktion::BeatPosition::fromBeats(2.50), tracktion::BeatDuration::fromBeats(0.5), 80, 0, nullptr);
}
else {
//6midiClip->getSequence().addNote(42, tracktion::BeatPosition::fromBeats(0), tracktion::BeatDuration::fromBeats(0.5), 127, 0, nullptr);
}
}
transport.setLoopRange(editTimeRange);
//transport.setPosition(0s);
transport.looping = false;
//transport.play(false);
}
Basically the program compile correctly but crash on:
if (! timestretcher->isInitialised())
{
timestretcher->initialise (sr, samplesPerBlock, 2, mode, elastiqueOptions, true);
jassert (timestretcher->isInitialised());
}
The part of the function that should do what I expect is this:
juce::String samplerName = "SamplerPlugin_" + juce::String(i);**
auto sampler = dynamic_cast<tracktion::SamplerPlugin*>(
edit.getPluginCache().createNewPlugin(tracktion::SamplerPlugin::xmlTypeName, {}).get()
);
if (!sampler)
{
DBG("Errore: impossibile creare il SamplerPlugin sulla traccia " + juce::String(i + 1));
continue;
}
auto pitchShift = dynamic_cast<tracktion::PitchShiftPlugin*>(
edit.getPluginCache().createNewPlugin(tracktion::PitchShiftPlugin::xmlTypeName, {}).get()
);
pitchShift->semitonesValue = 10.0f;
pitchShift->setEnabled(true);
track->pluginList.insertPlugin(*sampler, 0, nullptr);
track->pluginList.insertPlugin(*pitchShift, -1, nullptr);
Any one has some suggestions?
Thanks!
