Attempt to provide some factory presets, but getting messy...Readme changes.
This commit is contained in:
parent
22aaaeb836
commit
843af8a8f9
@ -317,7 +317,10 @@ void PaulstretchpluginAudioProcessorEditor::showSettingsMenu()
|
|||||||
bufferingmenu.addItem(105,"Huge",true,curbufamount == 5);
|
bufferingmenu.addItem(105,"Huge",true,curbufamount == 5);
|
||||||
menu.addSubMenu("Prebuffering", bufferingmenu);
|
menu.addSubMenu("Prebuffering", bufferingmenu);
|
||||||
menu.addItem(3, "About...", true, false);
|
menu.addItem(3, "About...", true, false);
|
||||||
int r = menu.show();
|
#ifdef JUCE_DEBUG
|
||||||
|
menu.addItem(6, "Dump preset to clipboard", true, false);
|
||||||
|
#endif
|
||||||
|
int r = menu.show();
|
||||||
if (r == 1)
|
if (r == 1)
|
||||||
{
|
{
|
||||||
processor.m_play_when_host_plays = !processor.m_play_when_host_plays;
|
processor.m_play_when_host_plays = !processor.m_play_when_host_plays;
|
||||||
@ -357,6 +360,15 @@ String juceversiontxt = String("JUCE ") + String(JUCE_MAJOR_VERSION) + "." + Str
|
|||||||
if (r > 100)
|
if (r > 100)
|
||||||
processor.setPreBufferAmount(r-100);
|
processor.setPreBufferAmount(r-100);
|
||||||
}
|
}
|
||||||
|
if (r == 6)
|
||||||
|
{
|
||||||
|
ValueTree tree = processor.getStateTree();
|
||||||
|
MemoryBlock destData;
|
||||||
|
MemoryOutputStream stream(destData, true);
|
||||||
|
tree.writeToStream(stream);
|
||||||
|
String txt = Base64::toBase64(destData.getData(), destData.getSize());
|
||||||
|
SystemClipboard::copyTextToClipboard(txt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WaveformComponent::WaveformComponent(AudioFormatManager* afm)
|
WaveformComponent::WaveformComponent(AudioFormatManager* afm)
|
||||||
|
@ -31,6 +31,20 @@ String g_plugintitle{ "PaulXStretch 1.0.0 preview 4" };
|
|||||||
|
|
||||||
std::set<PaulstretchpluginAudioProcessor*> g_activeprocessors;
|
std::set<PaulstretchpluginAudioProcessor*> g_activeprocessors;
|
||||||
|
|
||||||
|
struct PresetEntry
|
||||||
|
{
|
||||||
|
PresetEntry(String name, String data) : m_name(name), m_data(data) {}
|
||||||
|
String m_name;
|
||||||
|
String m_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const PresetEntry g_presets[] =
|
||||||
|
{
|
||||||
|
{"Factory reset","cGF1bHN0cmV0Y2gzcGx1Z2luc3RhdGUAASZtYWludm9sdW1lMAABCQQAAACAi1cewHN0cmV0Y2hhbW91bnQwAAEJBAAAACAAAPA/ZmZ0c2l6ZTAAAQkEAAAAYGZm5j9waXRjaHNoaWZ0MAABCQQAAAAAAAAAAGZyZXFzaGlmdDAAAQkEAAAAAAAAAABwbGF5cmFuZ2Vfc3RhcnQwAAEJBAAAAAAAAAAAcGxheXJhbmdlX2VuZDAAAQkEAAAAAAAA8D9zcHJlYWQwAAEJBAAAAAAAAAAAY29tcHJlc3MwAAEJBAAAAAAAAAAAbG9vcHhmYWRlbGVuMAABCQQAAABA4XqEP251bWhhcm1vbmljczAAAQkEAAAAAABAWUBoYXJtb25pY3NmcmVxMAABCQQAAAAAAABgQGhhcm1vbmljc2J3MAABCQQAAAAAAAA5QG9jdGF2ZW1peG0yXzAAAQkEAAAAAAAAAABvY3RhdmVtaXhtMV8wAAEJBAAAAAAAAAAAb2N0YXZlbWl4MF8wAAEJBAAAAAAAAPA/b2N0YXZlbWl4MV8wAAEJBAAAAAAAAAAAb2N0YXZlbWl4MTVfMAABCQQAAAAAAAAAAG9jdGF2ZW1peDJfMAABCQQAAAAAAAAAAHRvbmFsdnNub2lzZWJ3XzAAAQkEAAAAgBSu5z90b25hbHZzbm9pc2VwcmVzZXJ2ZV8wAAEJBAAAAAAAAOA/ZmlsdGVyX2xvd18wAAEJBAAAAAAAADRAZmlsdGVyX2hpZ2hfMAABCQQAAAAAAIjTQG9uc2V0ZGV0ZWN0XzAAAQkEAAAAAAAAAABtYXhjYXB0dXJlbGVuXzAAAQkEAAAAAAAAJEBudW1vdXRjaGFuczAAAQUBAgAAAGltcG9ydGVkZmlsZQABKAVDOlxNdXNpY0F1ZGlvXHNvdXJjZXNhbXBsZXNcc2hlaWxhLndhdgBudW1zcGVjdHJhbHN0YWdlcwABBQEIAAAAc3BlY29yZGVyMAABBQEDAAAAc3BlY29yZGVyMQABBQEAAAAAc3BlY29yZGVyMgABBQEBAAAAc3BlY29yZGVyMwABBQECAAAAc3BlY29yZGVyNAABBQEEAAAAc3BlY29yZGVyNQABBQEFAAAAc3BlY29yZGVyNgABBQEGAAAAc3BlY29yZGVyNwABBQEHAAAAcHJlYnVmYW1vdW50AAEFAQIAAABsb2FkZmlsZXdpdGhzdGF0ZQABAQIAzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzQ=="},
|
||||||
|
{"Chipmunk","cGF1bHN0cmV0Y2gzcGx1Z2luc3RhdGUAASZtYWludm9sdW1lMAABCQQAAACAi1cewHN0cmV0Y2hhbW91bnQwAAEJBAAAAAAAAOA/ZmZ0c2l6ZTAAAQkEAAAAAAAA4D9waXRjaHNoaWZ0MAABCQQAAAAAAAAoQGZyZXFzaGlmdDAAAQkEAAAAAAAAAABwbGF5cmFuZ2Vfc3RhcnQwAAEJBAAAAAAAAAAAcGxheXJhbmdlX2VuZDAAAQkEAAAAAAAA8D9zcHJlYWQwAAEJBAAAAAAAAAAAY29tcHJlc3MwAAEJBAAAAAAAAAAAbG9vcHhmYWRlbGVuMAABCQQAAABA4XqUP251bWhhcm1vbmljczAAAQkEAAAAAABAWUBoYXJtb25pY3NmcmVxMAABCQQAAAAAAABgQGhhcm1vbmljc2J3MAABCQQAAAAAAAA5QG9jdGF2ZW1peG0yXzAAAQkEAAAAAAAAAABvY3RhdmVtaXhtMV8wAAEJBAAAAAAAAAAAb2N0YXZlbWl4MF8wAAEJBAAAAAAAAPA/b2N0YXZlbWl4MV8wAAEJBAAAAAAAAAAAb2N0YXZlbWl4MTVfMAABCQQAAAAAAAAAAG9jdGF2ZW1peDJfMAABCQQAAAAAAAAAAHRvbmFsdnNub2lzZWJ3XzAAAQkEAAAAgBSu5z90b25hbHZzbm9pc2VwcmVzZXJ2ZV8wAAEJBAAAAAAAAOA/ZmlsdGVyX2xvd18wAAEJBAAAAAAAADRAZmlsdGVyX2hpZ2hfMAABCQQAAAAAAIjTQG9uc2V0ZGV0ZWN0XzAAAQkEAAAAAAAAAABtYXhjYXB0dXJlbGVuXzAAAQkEAAAAAAAAJEBudW1vdXRjaGFuczAAAQUBAgAAAGltcG9ydGVkZmlsZQABKAVDOlxNdXNpY0F1ZGlvXHNvdXJjZXNhbXBsZXNcc2hlaWxhLndhdgBudW1zcGVjdHJhbHN0YWdlcwABBQEIAAAAc3BlY29yZGVyMAABBQEAAAAAc3BlY29yZGVyMQABBQEBAAAAc3BlY29yZGVyMgABBQECAAAAc3BlY29yZGVyMwABBQEDAAAAc3BlY29yZGVyNAABBQEEAAAAc3BlY29yZGVyNQABBQEFAAAAc3BlY29yZGVyNgABBQEGAAAAc3BlY29yZGVyNwABBQEHAAAAcHJlYnVmYW1vdW50AAEFAQIAAABsb2FkZmlsZXdpdGhzdGF0ZQABAQIAzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzQ=="},
|
||||||
|
{"Chipmunk harmonic series","cGF1bHN0cmV0Y2gzcGx1Z2luc3RhdGUAASZtYWludm9sdW1lMAABCQQAAACAi1cewHN0cmV0Y2hhbW91bnQwAAEJBAAAAAAAAOA/ZmZ0c2l6ZTAAAQkEAAAAoJmZ2T9waXRjaHNoaWZ0MAABCQQAAAAAAAAoQGZyZXFzaGlmdDAAAQkEAAAAAAAAAABwbGF5cmFuZ2Vfc3RhcnQwAAEJBAAAAAAAAAAAcGxheXJhbmdlX2VuZDAAAQkEAAAAAAAA8D9zcHJlYWQwAAEJBAAAAAAAAAAAY29tcHJlc3MwAAEJBAAAAAAAAAAAbG9vcHhmYWRlbGVuMAABCQQAAABA4XqUP251bWhhcm1vbmljczAAAQkEAAAAQMTsSkBoYXJtb25pY3NmcmVxMAABCQQAAAAAAABQQGhhcm1vbmljc2J3MAABCQQAAAAAAAA5QG9jdGF2ZW1peG0yXzAAAQkEAAAAAAAAAABvY3RhdmVtaXhtMV8wAAEJBAAAAAAAAAAAb2N0YXZlbWl4MF8wAAEJBAAAAAAAAPA/b2N0YXZlbWl4MV8wAAEJBAAAAAAAAAAAb2N0YXZlbWl4MTVfMAABCQQAAAAAAAAAAG9jdGF2ZW1peDJfMAABCQQAAAAAAAAAAHRvbmFsdnNub2lzZWJ3XzAAAQkEAAAAgBSu5z90b25hbHZzbm9pc2VwcmVzZXJ2ZV8wAAEJBAAAAAAAAOA/ZmlsdGVyX2xvd18wAAEJBAAAAAAAADRAZmlsdGVyX2hpZ2hfMAABCQQAAAAAAIjTQG9uc2V0ZGV0ZWN0XzAAAQkEAAAAAAAAAABtYXhjYXB0dXJlbGVuXzAAAQkEAAAAAAAAJEBudW1vdXRjaGFuczAAAQUBAgAAAGltcG9ydGVkZmlsZQABKAVDOlxNdXNpY0F1ZGlvXHNvdXJjZXNhbXBsZXNcc2hlaWxhLndhdgBudW1zcGVjdHJhbHN0YWdlcwABBQEIAAAAc3BlY29yZGVyMAABBQEDAAAAc3BlY29yZGVyMQABBQEAAAAAc3BlY29yZGVyMgABBQEBAAAAc3BlY29yZGVyMwABBQECAAAAc3BlY29yZGVyNAABBQEEAAAAc3BlY29yZGVyNQABBQEFAAAAc3BlY29yZGVyNgABBQEGAAAAc3BlY29yZGVyNwABBQEHAAAAcHJlYnVmYW1vdW50AAEFAQIAAABsb2FkZmlsZXdpdGhzdGF0ZQABAQIAzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzQ=="}
|
||||||
|
};
|
||||||
|
|
||||||
template<typename F>
|
template<typename F>
|
||||||
void callGUI(AudioProcessor* ap, F&& f, bool async)
|
void callGUI(AudioProcessor* ap, F&& f, bool async)
|
||||||
{
|
{
|
||||||
@ -209,6 +223,83 @@ int PaulstretchpluginAudioProcessor::getPreBufferAmount()
|
|||||||
return m_prebuffer_amount;
|
return m_prebuffer_amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ValueTree PaulstretchpluginAudioProcessor::getStateTree()
|
||||||
|
{
|
||||||
|
ValueTree paramtree("paulstretch3pluginstate");
|
||||||
|
for (int i = 0; i<getNumParameters(); ++i)
|
||||||
|
{
|
||||||
|
auto par = getFloatParameter(i);
|
||||||
|
if (par != nullptr)
|
||||||
|
{
|
||||||
|
paramtree.setProperty(par->paramID, (double)*par, nullptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
paramtree.setProperty(m_outchansparam->paramID, (int)*m_outchansparam, nullptr);
|
||||||
|
if (m_current_file != File())
|
||||||
|
{
|
||||||
|
paramtree.setProperty("importedfile", m_current_file.getFullPathName(), nullptr);
|
||||||
|
}
|
||||||
|
auto specorder = m_stretch_source->getSpectrumProcessOrder();
|
||||||
|
paramtree.setProperty("numspectralstages", (int)specorder.size(), nullptr);
|
||||||
|
for (int i = 0; i < specorder.size(); ++i)
|
||||||
|
{
|
||||||
|
paramtree.setProperty("specorder" + String(i), specorder[i], nullptr);
|
||||||
|
}
|
||||||
|
if (m_use_backgroundbuffering)
|
||||||
|
paramtree.setProperty("prebufamount", m_prebuffer_amount, nullptr);
|
||||||
|
else
|
||||||
|
paramtree.setProperty("prebufamount", -1, nullptr);
|
||||||
|
paramtree.setProperty("loadfilewithstate", m_load_file_with_state, nullptr);
|
||||||
|
return paramtree;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PaulstretchpluginAudioProcessor::setStateFromTree(ValueTree tree)
|
||||||
|
{
|
||||||
|
if (tree.isValid())
|
||||||
|
{
|
||||||
|
{
|
||||||
|
ScopedLock locker(m_cs);
|
||||||
|
m_load_file_with_state = tree.getProperty("loadfilewithstate", true);
|
||||||
|
if (tree.hasProperty("numspectralstages"))
|
||||||
|
{
|
||||||
|
std::vector<int> order;
|
||||||
|
int ordersize = tree.getProperty("numspectralstages");
|
||||||
|
for (int i = 0; i < ordersize; ++i)
|
||||||
|
{
|
||||||
|
order.push_back((int)tree.getProperty("specorder" + String(i)));
|
||||||
|
}
|
||||||
|
m_stretch_source->setSpectrumProcessOrder(order);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < getNumParameters(); ++i)
|
||||||
|
{
|
||||||
|
auto par = getFloatParameter(i);
|
||||||
|
if (par != nullptr)
|
||||||
|
{
|
||||||
|
double parval = tree.getProperty(par->paramID, (double)*par);
|
||||||
|
*par = parval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tree.hasProperty(m_outchansparam->paramID))
|
||||||
|
*m_outchansparam = tree.getProperty(m_outchansparam->paramID, 2);
|
||||||
|
|
||||||
|
}
|
||||||
|
int prebufamt = tree.getProperty("prebufamount", 2);
|
||||||
|
if (prebufamt == -1)
|
||||||
|
m_use_backgroundbuffering = false;
|
||||||
|
else
|
||||||
|
setPreBufferAmount(prebufamt);
|
||||||
|
if (m_load_file_with_state == true)
|
||||||
|
{
|
||||||
|
String fn = tree.getProperty("importedfile");
|
||||||
|
if (fn.isEmpty() == false)
|
||||||
|
{
|
||||||
|
File f(fn);
|
||||||
|
setAudioFile(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
const String PaulstretchpluginAudioProcessor::getName() const
|
const String PaulstretchpluginAudioProcessor::getName() const
|
||||||
{
|
{
|
||||||
@ -250,22 +341,36 @@ double PaulstretchpluginAudioProcessor::getTailLengthSeconds() const
|
|||||||
|
|
||||||
int PaulstretchpluginAudioProcessor::getNumPrograms()
|
int PaulstretchpluginAudioProcessor::getNumPrograms()
|
||||||
{
|
{
|
||||||
return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs,
|
return 3; // NB: some hosts don't cope very well if you tell them there are 0 programs,
|
||||||
// so this should be at least 1, even if you're not really implementing programs.
|
// so this should be at least 1, even if you're not really implementing programs.
|
||||||
}
|
}
|
||||||
|
|
||||||
int PaulstretchpluginAudioProcessor::getCurrentProgram()
|
int PaulstretchpluginAudioProcessor::getCurrentProgram()
|
||||||
{
|
{
|
||||||
return 0;
|
return m_cur_program;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PaulstretchpluginAudioProcessor::setCurrentProgram (int index)
|
void PaulstretchpluginAudioProcessor::setCurrentProgram (int index)
|
||||||
{
|
{
|
||||||
|
index = jlimit(0, 2, index);
|
||||||
|
m_cur_program = index;
|
||||||
|
bool temp = m_load_file_with_state;
|
||||||
|
m_load_file_with_state = false;
|
||||||
|
MemoryBlock mb;
|
||||||
|
MemoryOutputStream stream(mb, true);
|
||||||
|
if (Base64::convertFromBase64(stream, g_presets[index].m_data)==true)
|
||||||
|
{
|
||||||
|
ValueTree tree = ValueTree::readFromData(mb.getData(), mb.getSize());
|
||||||
|
tree.setProperty("loadfilewithstate", false, nullptr);
|
||||||
|
setStateFromTree(tree);
|
||||||
|
}
|
||||||
|
m_load_file_with_state = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
const String PaulstretchpluginAudioProcessor::getProgramName (int index)
|
const String PaulstretchpluginAudioProcessor::getProgramName (int index)
|
||||||
{
|
{
|
||||||
return {};
|
index = jlimit(0, 2, index);
|
||||||
|
return g_presets[index].m_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PaulstretchpluginAudioProcessor::changeProgramName (int index, const String& newName)
|
void PaulstretchpluginAudioProcessor::changeProgramName (int index, const String& newName)
|
||||||
@ -306,6 +411,17 @@ void PaulstretchpluginAudioProcessor::startplay(Range<double> playrange, int num
|
|||||||
m_last_in_pos = playrange.getStart()*m_stretch_source->getInfileLengthSeconds();
|
m_last_in_pos = playrange.getStart()*m_stretch_source->getInfileLengthSeconds();
|
||||||
m_buffering_source->prepareToPlay(maxBlockSize, getSampleRateChecked());
|
m_buffering_source->prepareToPlay(maxBlockSize, getSampleRateChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PaulstretchpluginAudioProcessor::setParameters(const std::vector<double>& pars)
|
||||||
|
{
|
||||||
|
ScopedLock locker(m_cs);
|
||||||
|
for (int i = 0; i < getNumParameters(); ++i)
|
||||||
|
{
|
||||||
|
if (i<pars.size())
|
||||||
|
setParameter(i, pars[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
double PaulstretchpluginAudioProcessor::getSampleRateChecked()
|
double PaulstretchpluginAudioProcessor::getSampleRateChecked()
|
||||||
{
|
{
|
||||||
if (m_cur_sr < 1.0)
|
if (m_cur_sr < 1.0)
|
||||||
@ -523,31 +639,7 @@ AudioProcessorEditor* PaulstretchpluginAudioProcessor::createEditor()
|
|||||||
//==============================================================================
|
//==============================================================================
|
||||||
void PaulstretchpluginAudioProcessor::getStateInformation (MemoryBlock& destData)
|
void PaulstretchpluginAudioProcessor::getStateInformation (MemoryBlock& destData)
|
||||||
{
|
{
|
||||||
ValueTree paramtree("paulstretch3pluginstate");
|
ValueTree paramtree = getStateTree();
|
||||||
for (int i=0;i<getNumParameters();++i)
|
|
||||||
{
|
|
||||||
auto par = getFloatParameter(i);
|
|
||||||
if (par != nullptr)
|
|
||||||
{
|
|
||||||
paramtree.setProperty(par->paramID, (double)*par, nullptr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
paramtree.setProperty(m_outchansparam->paramID, (int)*m_outchansparam, nullptr);
|
|
||||||
if (m_current_file != File())
|
|
||||||
{
|
|
||||||
paramtree.setProperty("importedfile", m_current_file.getFullPathName(), nullptr);
|
|
||||||
}
|
|
||||||
auto specorder = m_stretch_source->getSpectrumProcessOrder();
|
|
||||||
paramtree.setProperty("numspectralstages", (int)specorder.size(), nullptr);
|
|
||||||
for (int i = 0; i < specorder.size(); ++i)
|
|
||||||
{
|
|
||||||
paramtree.setProperty("specorder" + String(i), specorder[i], nullptr);
|
|
||||||
}
|
|
||||||
if (m_use_backgroundbuffering)
|
|
||||||
paramtree.setProperty("prebufamount", m_prebuffer_amount, nullptr);
|
|
||||||
else
|
|
||||||
paramtree.setProperty("prebufamount", -1, nullptr);
|
|
||||||
paramtree.setProperty("loadfilewithstate", m_load_file_with_state, nullptr);
|
|
||||||
MemoryOutputStream stream(destData,true);
|
MemoryOutputStream stream(destData,true);
|
||||||
paramtree.writeToStream(stream);
|
paramtree.writeToStream(stream);
|
||||||
}
|
}
|
||||||
@ -555,49 +647,7 @@ void PaulstretchpluginAudioProcessor::getStateInformation (MemoryBlock& destData
|
|||||||
void PaulstretchpluginAudioProcessor::setStateInformation (const void* data, int sizeInBytes)
|
void PaulstretchpluginAudioProcessor::setStateInformation (const void* data, int sizeInBytes)
|
||||||
{
|
{
|
||||||
ValueTree tree = ValueTree::readFromData(data, sizeInBytes);
|
ValueTree tree = ValueTree::readFromData(data, sizeInBytes);
|
||||||
if (tree.isValid())
|
setStateFromTree(tree);
|
||||||
{
|
|
||||||
{
|
|
||||||
ScopedLock locker(m_cs);
|
|
||||||
m_load_file_with_state = tree.getProperty("loadfilewithstate", true);
|
|
||||||
if (tree.hasProperty("numspectralstages"))
|
|
||||||
{
|
|
||||||
std::vector<int> order;
|
|
||||||
int ordersize = tree.getProperty("numspectralstages");
|
|
||||||
for (int i = 0; i < ordersize; ++i)
|
|
||||||
{
|
|
||||||
order.push_back((int)tree.getProperty("specorder" + String(i)));
|
|
||||||
}
|
|
||||||
m_stretch_source->setSpectrumProcessOrder(order);
|
|
||||||
}
|
|
||||||
for (int i = 0; i < getNumParameters(); ++i)
|
|
||||||
{
|
|
||||||
auto par = getFloatParameter(i);
|
|
||||||
if (par != nullptr)
|
|
||||||
{
|
|
||||||
double parval = tree.getProperty(par->paramID, (double)*par);
|
|
||||||
*par = parval;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tree.hasProperty(m_outchansparam->paramID))
|
|
||||||
*m_outchansparam = tree.getProperty(m_outchansparam->paramID, 2);
|
|
||||||
|
|
||||||
}
|
|
||||||
int prebufamt = tree.getProperty("prebufamount", 2);
|
|
||||||
if (prebufamt==-1)
|
|
||||||
m_use_backgroundbuffering = false;
|
|
||||||
else
|
|
||||||
setPreBufferAmount(prebufamt);
|
|
||||||
if (m_load_file_with_state == true)
|
|
||||||
{
|
|
||||||
String fn = tree.getProperty("importedfile");
|
|
||||||
if (fn.isEmpty() == false)
|
|
||||||
{
|
|
||||||
File f(fn);
|
|
||||||
setAudioFile(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PaulstretchpluginAudioProcessor::setRecordingEnabled(bool b)
|
void PaulstretchpluginAudioProcessor::setRecordingEnabled(bool b)
|
||||||
|
@ -145,6 +145,8 @@ public:
|
|||||||
void setPreBufferAmount(int x);
|
void setPreBufferAmount(int x);
|
||||||
int getPreBufferAmount();
|
int getPreBufferAmount();
|
||||||
bool m_load_file_with_state = true;
|
bool m_load_file_with_state = true;
|
||||||
|
ValueTree getStateTree();
|
||||||
|
void setStateFromTree(ValueTree tree);
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
||||||
@ -181,6 +183,8 @@ private:
|
|||||||
bool m_last_host_playing = false;
|
bool m_last_host_playing = false;
|
||||||
AudioBuffer<float> m_input_buffer;
|
AudioBuffer<float> m_input_buffer;
|
||||||
std::vector<float> m_reset_pars;
|
std::vector<float> m_reset_pars;
|
||||||
|
int m_cur_program = 0;
|
||||||
|
void setParameters(const std::vector<double>& pars);
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessor)
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PaulstretchpluginAudioProcessor)
|
||||||
};
|
};
|
||||||
|
@ -37,4 +37,10 @@ History :
|
|||||||
-Slightly better GUI layout but still mostly just 2 columns of sliders
|
-Slightly better GUI layout but still mostly just 2 columns of sliders
|
||||||
-Remember last file import folder
|
-Remember last file import folder
|
||||||
-Added detection of invalid audio output sample values (infinities, NaN)
|
-Added detection of invalid audio output sample values (infinities, NaN)
|
||||||
|
12-27-2017 1.0.0 preview 4
|
||||||
|
-Added reset parameters (except main volume and input pass through) command to settings menu
|
||||||
|
-Added option to settings menu to ignore loading imported audio file when recalling state
|
||||||
|
-Added support for dropping audio files to GUI
|
||||||
|
-Removed an unnecessary level of buffering (doesn't reduce latency but should help a bit with CPU usage)
|
||||||
|
-Added About window
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user