#include "Plugin.h" #include "PluginEditor.h" AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new Plugin(); } Plugin::Plugin() { parameters = new Parameters(this, kInternalBlocksize); granulator = new Granulator(parameters, kInternalBlocksize); program_bank = new ProgramBank(kNumPrograms, parameters); editor_parameter_update_pending = false; editor_program_update_pending = false; current_program = 0; saved_state = true; block_sample_pos = 0; progchange_param_enabled = true; } Plugin::~Plugin() { delete parameters; delete granulator; delete program_bank; } /* void Plugin::createAppSettingsDir() { File appDataDir = File::getSpecialLocation(File::userApplicationDataDirectory); File* argotlunarDir = new File(appDataDir.getFullPathName() + "/.argotlunar"); argotlunarDir->createDirectory(); } File* Plugin::getMidiMapFile() { File appDataDir = File::getSpecialLocation(File::userApplicationDataDirectory); return new File(appDataDir.getFullPathName() + "/.argotlunar/midimap.xml"); } */ bool Plugin::acceptsMidi() const { return false; } bool Plugin::isInputChannelStereoPair(int index) const { return true; } bool Plugin::isOutputChannelStereoPair(int index) const { return true; } bool Plugin::producesMidi() const { return false; } bool Plugin::hasEditor() const { return true; } const String Plugin::getName() const { return "Argotlunar2"; } const String Plugin::getInputChannelName(const int channelIndex) const { return String (channelIndex + 1); } const String Plugin::getOutputChannelName(const int channelIndex) const { return (channelIndex == 0) ? "L" : "R"; } double Plugin::getTailLengthSeconds() const { return 0.0; } AudioProcessorEditor* Plugin::createEditor() { return new PluginEditor(this); } void Plugin::prepareToPlay (double samplerate, int samples_per_block) { granulator->prepareToPlay(static_cast(samplerate)); } void Plugin::releaseResources() { granulator->releaseResources(); } void Plugin::processBlock(AudioSampleBuffer& buffer, MidiBuffer& midiMessages) { if (getTotalNumInputChannels() != 2 && getTotalNumOutputChannels() != 2) { return; } float* chan1 = buffer.getWritePointer(0); float* chan2 = buffer.getWritePointer(1); int sampleframes = buffer.getNumSamples(); int blocks = sampleframes / kInternalBlocksize; if (getPlayHead() != 0 && getPlayHead()->getCurrentPosition(pos)) { if ((&pos)->bpm == 0.0f) { parameters->setQuantizationDisabled(); parameters->setParameter(kDelayQuant, 0.0f, false); parameters->setParameter(kIotQuant, 0.0f, false); parameters->setParameter(kDurQuant, 0.0f, false); } else parameters->time_quantizer->setPositionInfo(&pos); } else { parameters->setQuantizationDisabled(); } block_sample_pos = 0; for (int i = 0; i < blocks; i++) { granulator->processInternalBlock(chan1, chan2, kInternalBlocksize); chan1 += kInternalBlocksize; chan2 += kInternalBlocksize; parameters->time_quantizer->incrementPositionInfo(); } int samples_remaining = sampleframes % kInternalBlocksize; if (samples_remaining) { granulator->processInternalBlock(chan1, chan2, samples_remaining); } } int Plugin::getNumParameters() { return static_cast(NUM_PARAMS); } float Plugin::getParameter (int index) { if (index == kProgram) { return static_cast(current_program / (kNumPrograms - 1)); } else { return parameters->param[index]; } } const String Plugin::getParameterName (int index) { return parameters->getParameterName(index); } const String Plugin::getParameterText (int index) { if (index == kProgram) { return String(current_program + 1); } else return parameters->getParameterText(index); } std::vector Plugin::getScaleNames() { return granulator->grain_param_generator->pitch_quantizer->getNames(); } bool Plugin::isMetaParameter(int parameterIndex) const { if (parameterIndex == kProgram) { return true; } else return false; } bool Plugin::silenceInProducesSilenceOut(void) const { return false; } void Plugin::setParameter(int index, float new_value) { if (index != kNone) { if (index == kProgram) { if (progchange_param_enabled) { int selected_program = static_cast(new_value * (kNumPrograms - 1)); if (current_program != selected_program) { setCurrentProgram(selected_program); } } } else { parameters->setParameter(index, new_value, false); } setParametersChangedState(); } } void Plugin::toggleProgchangeEnabled() { progchange_param_enabled = !progchange_param_enabled; } bool Plugin:: isProgchangeEnabled() { return progchange_param_enabled; } void Plugin::setMatrixSource(int index, int param) { parameters->setMatrixSource(index, param); } void Plugin::setMatrixDest(int index, int param) { parameters->setMatrixDest(index, param); } void Plugin::setMatrixMode(int index, int param) { parameters->setMatrixMode(index, param); } const String Plugin::getProgramName(int index) { return program_bank->getProgramName(index); } void Plugin::changeProgramName(int index, const String& newName) { program_bank->setProgramName(index, newName); editor_program_update_pending = true; } int Plugin::getCurrentProgram() { return current_program; } bool Plugin::getSavedState() { return saved_state; } void Plugin::setSavedState(bool state) { if (saved_state == true && state == false) { editor_program_update_pending = true; } saved_state = state; } bool Plugin::getParametersChangedState() { if (editor_parameter_update_pending) { editor_parameter_update_pending = false; return true; } else return false; } void Plugin::setParametersChangedState() { editor_parameter_update_pending = true; } bool Plugin::getProgramChangedState() { if (editor_program_update_pending) { editor_program_update_pending = false; return true; } else return false; } int Plugin::getNumPrograms() { return kNumPrograms; } void Plugin::initCurrentProgram() { program_bank->initProgram(current_program); program_bank->loadProgramState(current_program); setSavedState(true); editor_program_update_pending = true; } void Plugin::saveProgramTo(int index) { String current_program_name = program_bank->getProgramName(current_program); program_bank->saveProgramState(index); program_bank->setProgramName(index, current_program_name); current_program = index; setSavedState(true); editor_program_update_pending = true; } void Plugin::setCurrentProgram(int index) { program_bank->loadProgramState(index); current_program = index; setSavedState(true); editor_program_update_pending = true; } void Plugin::getCurrentProgramStateInformation(MemoryBlock& destData) { //save current settings program_bank->saveProgramState(current_program); saveProgramTo(current_program); //output program to host XmlElement* program = program_bank->createProgramXml(current_program); copyXmlToBinary (*program, destData); delete program; } void Plugin::setCurrentProgramStateInformation(const void* data, int sizeInBytes) { //load program from host XmlElement* const xml_state = getXmlFromBinary(data, sizeInBytes); if (xml_state != 0) { program_bank->loadProgramFromXml(current_program, xml_state); setCurrentProgram(current_program); delete xml_state; editor_program_update_pending = true; } } void Plugin::getStateInformation (MemoryBlock& destData) { // save current program program_bank->saveProgramState(current_program); // output program_bank to host XmlElement* bankXml = program_bank->createBankXml(); copyXmlToBinary(*bankXml, destData); editor_program_update_pending = true; } void Plugin::setStateInformation (const void* data, int sizeInBytes) { //load bank from host XmlElement* const xml_state = getXmlFromBinary(data, sizeInBytes); if (xml_state != 0) { program_bank->loadBankFromXml(xml_state); setCurrentProgram(current_program); delete xml_state; editor_program_update_pending = true; } } void Plugin::loadBankXml(File* file) { //load bank from file XmlDocument xml_document(*file); XmlElement* xml_state = xml_document.getDocumentElement(); if (xml_state != 0) { program_bank->loadBankFromXml(xml_state); setCurrentProgram(current_program); delete xml_state; editor_program_update_pending = true; } } void Plugin::saveBankXml(File* file) { // save current program program_bank->saveProgramState(current_program); // output bank to file XmlElement* bankXml = program_bank->createBankXml(); file->replaceWithText(bankXml->createDocument(String())); delete bankXml; editor_program_update_pending = true; setSavedState(true); } void Plugin::loadCurrentProgramXml(File* file) { //load program from file XmlDocument xml_document(*file); XmlElement* xml_state = xml_document.getDocumentElement(); if (xml_state != 0) { program_bank->loadProgramFromXml(current_program, xml_state); setCurrentProgram(current_program); delete xml_state; editor_program_update_pending = true; } } void Plugin::saveCurrentProgramXml(File* file) { //save current settings program_bank->saveProgramState(current_program); saveProgramTo(current_program); //output program to file XmlElement* program = program_bank->createProgramXml(current_program); file->replaceWithText(program->createDocument(String())); delete program; }