- refactored kml import/export
- added ability to import patch file with midicc defined without patch parameter - fixed notes cut off by calling getStateInformation() - disabled limiter - increased version to v1.1.0-pre
This commit is contained in:
@@ -3,7 +3,7 @@ include make/defaults.mk
|
|||||||
CONFIG ?= release
|
CONFIG ?= release
|
||||||
TARGET ?= JaySynth.so
|
TARGET ?= JaySynth.so
|
||||||
|
|
||||||
APP_VERSION := 1.0.1b
|
APP_VERSION := 1.1.0
|
||||||
APP_VERSION_HEX := 0x010001
|
APP_VERSION_HEX := 0x010001
|
||||||
LIBSRC_PATH ?= $(realpath ./submodule)
|
LIBSRC_PATH ?= $(realpath ./submodule)
|
||||||
JUCE_PATH := $(realpath ./sdk/juce/JUCE-3.1.1)
|
JUCE_PATH := $(realpath ./sdk/juce/JUCE-3.1.1)
|
||||||
|
|||||||
@@ -185,14 +185,13 @@ void JaySynthMidiCC::exportXML(String name)
|
|||||||
xml.writeToFile (/*const File &destinationFile*/file, /*const String &dtdToUse*/"JSYNTH_MIDICC_TABLE_FILE" /*, const String &encodingType="UTF-8", int lineWrapLength=60*/);
|
xml.writeToFile (/*const File &destinationFile*/file, /*const String &dtdToUse*/"JSYNTH_MIDICC_TABLE_FILE" /*, const String &encodingType="UTF-8", int lineWrapLength=60*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JaySynthMidiCC::exportXML(XmlElement *pXML_doc) const
|
void JaySynthMidiCC::exportXML(XmlElement *pXML_root) const
|
||||||
{
|
{
|
||||||
int paramID;
|
int paramID;
|
||||||
midiCC_container_t const *pMidiContainer;
|
midiCC_container_t const *pMidiContainer;
|
||||||
XmlElement *pXML, *pXML_root, *pXML_PARAM, *pXML_PARAM_INFO;
|
XmlElement *pXML, *pXML_PARAM, *pXML_PARAM_INFO;
|
||||||
|
|
||||||
// Store controller and slider infos
|
// Store controller and slider infos
|
||||||
pXML_root = pXML_doc->createNewChildElement (String("JSYNTH_MIDICONTROLLER_TABLE"));
|
|
||||||
pXML = pXML_root->createNewChildElement (String("TARGETS"));
|
pXML = pXML_root->createNewChildElement (String("TARGETS"));
|
||||||
for (paramID=0; paramID < SYNTH_NUM_PARAMS; paramID++)
|
for (paramID=0; paramID < SYNTH_NUM_PARAMS; paramID++)
|
||||||
{
|
{
|
||||||
@@ -267,30 +266,19 @@ void JaySynthMidiCC::exportXML(XmlElement *pXML_doc) const
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
int JaySynthMidiCC::importXML(String name)
|
int JaySynthMidiCC::importXML(XmlElement const *pXML_MidiCc)
|
||||||
{
|
|
||||||
File file(name);
|
|
||||||
XmlDocument xml(file);
|
|
||||||
|
|
||||||
ScopedPointer<XmlElement> pXML_root (xml.getDocumentElement());
|
|
||||||
|
|
||||||
return importXML(pXML_root);
|
|
||||||
}
|
|
||||||
|
|
||||||
int JaySynthMidiCC::importXML(XmlElement const *pXML_doc)
|
|
||||||
{
|
{
|
||||||
int i, paramID;
|
int i, paramID;
|
||||||
midiCC_container_t *pMidiContainer;
|
midiCC_container_t *pMidiContainer;
|
||||||
XmlElement *pXML, *pXML_root, *pXML_PARAM, *pXML_PARAM_INFO;
|
XmlElement *pXML, *pXML_PARAM, *pXML_PARAM_INFO;
|
||||||
|
|
||||||
for (i=0; i < NUM_MIDI_CONTROLLERS; i++)
|
for (i=0; i < NUM_MIDI_CONTROLLERS; i++)
|
||||||
removeDestinations(i);
|
removeDestinations(i);
|
||||||
|
|
||||||
pXML_root = pXML_doc->getChildByName ("JSYNTH_MIDICONTROLLER_TABLE");
|
|
||||||
// make sure that it's actually our type of XML object..
|
// make sure that it's actually our type of XML object..
|
||||||
if (pXML_root)
|
if (pXML_MidiCc)
|
||||||
{
|
{
|
||||||
pXML = pXML_root->getFirstChildElement();
|
pXML = pXML_MidiCc->getFirstChildElement();
|
||||||
while(pXML)
|
while(pXML)
|
||||||
{
|
{
|
||||||
pXML_PARAM = pXML->getFirstChildElement();
|
pXML_PARAM = pXML->getFirstChildElement();
|
||||||
|
|||||||
@@ -57,7 +57,6 @@ public:
|
|||||||
int findParamID_byName(String name);
|
int findParamID_byName(String name);
|
||||||
void exportXML(String name);
|
void exportXML(String name);
|
||||||
void exportXML(XmlElement *pXML_doc) const;
|
void exportXML(XmlElement *pXML_doc) const;
|
||||||
int importXML(String name);
|
|
||||||
int importXML(XmlElement const *pXML_doc);
|
int importXML(XmlElement const *pXML_doc);
|
||||||
void add(midiCC_container_t *pObj, int controllerID);
|
void add(midiCC_container_t *pObj, int controllerID);
|
||||||
void remove(midiCC_container_t *pObj, int controllerID);
|
void remove(midiCC_container_t *pObj, int controllerID);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include "PluginProcessor.h"
|
#include "PluginProcessor.h"
|
||||||
#include "JaySynthAudioProcessorEditor.h"
|
#include "JaySynthAudioProcessorEditor.h"
|
||||||
|
#include "synth/vco.h"
|
||||||
#include <synth/vector_utils.h>
|
#include <synth/vector_utils.h>
|
||||||
|
|
||||||
using namespace juce;
|
using namespace juce;
|
||||||
@@ -296,6 +297,10 @@ const String JaySynthAudioProcessor::getParameterText (int index)
|
|||||||
return "Tri";
|
return "Tri";
|
||||||
case OSC_WAVEFORM_SINE:
|
case OSC_WAVEFORM_SINE:
|
||||||
return "Sine";
|
return "Sine";
|
||||||
|
case OSC_WAVEFORM_WAVETABLE:
|
||||||
|
return "Wavetable";
|
||||||
|
case OSC_WAVEFORM_IMPULSE:
|
||||||
|
return "Impulse";
|
||||||
default:
|
default:
|
||||||
return "Unknown (" + String((int)pSynth->getParameter(index)) + ")";
|
return "Unknown (" + String((int)pSynth->getParameter(index)) + ")";
|
||||||
}
|
}
|
||||||
@@ -576,6 +581,8 @@ void JaySynthAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer
|
|||||||
|
|
||||||
m_limiter_active = 0;
|
m_limiter_active = 0;
|
||||||
|
|
||||||
|
synth_float_t master_gain = 0.5;
|
||||||
|
|
||||||
#ifdef WITH_LIMITER
|
#ifdef WITH_LIMITER
|
||||||
synth_float_t limiter_env[SYNTH_MAX_BUFSIZE];
|
synth_float_t limiter_env[SYNTH_MAX_BUFSIZE];
|
||||||
synth_float_t limiter_gain[SYNTH_MAX_BUFSIZE];
|
synth_float_t limiter_gain[SYNTH_MAX_BUFSIZE];
|
||||||
@@ -613,22 +620,22 @@ void JaySynthAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer
|
|||||||
|
|
||||||
for (i=0; i <numSamples; i++)
|
for (i=0; i <numSamples; i++)
|
||||||
{
|
{
|
||||||
buf1[i] = (float)(buf[0][i]*limiter_gain[i]);
|
buf1[i] = (float)(master_gain*buf[0][i]*limiter_gain[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i <numSamples; i++)
|
for (i=0; i <numSamples; i++)
|
||||||
{
|
{
|
||||||
buf2[i] = (float)(buf[1][i]*limiter_gain[i]);
|
buf2[i] = (float)(master_gain*buf[1][i]*limiter_gain[i]);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
for (i=0; i <numSamples; i++)
|
for (i=0; i <numSamples; i++)
|
||||||
{
|
{
|
||||||
buf1[i] = (float)(buf[0][i]);
|
buf1[i] = (float)(master_gain*buf[0][i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i <numSamples; i++)
|
for (i=0; i <numSamples; i++)
|
||||||
{
|
{
|
||||||
buf2[i] = (float)(buf[1][i]);
|
buf2[i] = (float)(master_gain*buf[1][i]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -734,7 +741,8 @@ void JaySynthAudioProcessor::patchEncodeXml(XmlElement *xml, JaySynthSound const
|
|||||||
synth_float_t value = patch->getParameter(i);
|
synth_float_t value = patch->getParameter(i);
|
||||||
xml_patch->setAttribute (getParameterNameXML(i), String(value, 10));
|
xml_patch->setAttribute (getParameterNameXML(i), String(value, 10));
|
||||||
}
|
}
|
||||||
patch->getMidiCC()->exportXML(xml_patch);
|
XmlElement *xml_midiCC = xml->createNewChildElement("MidiCC");
|
||||||
|
patch->getMidiCC()->exportXML(xml_midiCC);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JaySynthAudioProcessor::patchDecodeXml(const XmlElement *xml, JaySynthSound *patch)
|
void JaySynthAudioProcessor::patchDecodeXml(const XmlElement *xml, JaySynthSound *patch)
|
||||||
@@ -753,7 +761,11 @@ void JaySynthAudioProcessor::patchDecodeXml(const XmlElement *xml, JaySynthSound
|
|||||||
}
|
}
|
||||||
patch->setParameter(i, value);
|
patch->setParameter(i, value);
|
||||||
}
|
}
|
||||||
((JaySynthMidiCC*)patch->getMidiCC())->importXML(xml);
|
XmlElement *pXML_MidiCc = xml->getChildByName ("JSYNTH_MIDICONTROLLER_TABLE");
|
||||||
|
if (pXML_MidiCc)
|
||||||
|
{
|
||||||
|
((JaySynthMidiCC*)patch->getMidiCC())->importXML(pXML_MidiCc);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -782,12 +794,7 @@ void JaySynthAudioProcessor::bankDecodeXml(const XmlElement *_xml)
|
|||||||
}
|
}
|
||||||
JaySynthSound *pPatch = &patches[progID];
|
JaySynthSound *pPatch = &patches[progID];
|
||||||
{
|
{
|
||||||
XmlElement *xml2 = xml->getFirstChildElement();
|
patchImportXml(xml, pPatch);
|
||||||
if (xml2->hasTagName ("Patch"))
|
|
||||||
{
|
|
||||||
// Read patch
|
|
||||||
patchDecodeXml(xml2, pPatch);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
xml = xml->getNextElement();
|
xml = xml->getNextElement();
|
||||||
}
|
}
|
||||||
@@ -801,8 +808,6 @@ void JaySynthAudioProcessor::getStateInformation (MemoryBlock& destData)
|
|||||||
ScopedPointer <XmlElement> xml = new XmlElement("JSynth");
|
ScopedPointer <XmlElement> xml = new XmlElement("JSynth");
|
||||||
bankEncodeXml(xml);
|
bankEncodeXml(xml);
|
||||||
|
|
||||||
setCurrentProgram(getCurrentProgram());
|
|
||||||
|
|
||||||
MemoryOutputStream outputStream(destData, false);
|
MemoryOutputStream outputStream(destData, false);
|
||||||
MemoryBlock tmpBlock(destData.getSize(), /*initialiseToZero*/true);
|
MemoryBlock tmpBlock(destData.getSize(), /*initialiseToZero*/true);
|
||||||
GZIPCompressorOutputStream GZIPEnc(&outputStream, /*compressionLevel*/0, /*deleteDestStreamWhenDestroyed*/false, /*windowBits*/0);
|
GZIPCompressorOutputStream GZIPEnc(&outputStream, /*compressionLevel*/0, /*deleteDestStreamWhenDestroyed*/false, /*windowBits*/0);
|
||||||
@@ -933,24 +938,33 @@ void JaySynthAudioProcessor::loadPatchFromFile (const File &file, int index)
|
|||||||
else if (String(".xmp") == ext)
|
else if (String(".xmp") == ext)
|
||||||
{
|
{
|
||||||
ScopedPointer<XmlElement> xml = XmlDocument::parse(file);
|
ScopedPointer<XmlElement> xml = XmlDocument::parse(file);
|
||||||
patchImportXml(xml, currpatch);
|
if (xml->hasTagName ("JSynth"))
|
||||||
|
{
|
||||||
|
patchImportXml(xml, currpatch);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void JaySynthAudioProcessor::patchImportXml (const XmlElement *xml, JaySynthSound *patch)
|
void JaySynthAudioProcessor::patchImportXml (const XmlElement *xml, JaySynthSound *patch)
|
||||||
{
|
{
|
||||||
if (xml->hasTagName ("JSynth"))
|
XmlElement *xml2 = xml->getFirstChildElement();
|
||||||
|
while(xml2)
|
||||||
{
|
{
|
||||||
XmlElement *xml2 = xml->getFirstChildElement();
|
|
||||||
if (xml2->hasTagName ("Patch"))
|
if (xml2->hasTagName ("Patch"))
|
||||||
{
|
{
|
||||||
patchDecodeXml(xml2, patch);
|
patchDecodeXml(xml2, patch);
|
||||||
}
|
}
|
||||||
}
|
else if (xml->hasTagName ("JSYNTH_PATCH"))
|
||||||
else if (xml->hasTagName ("JSYNTH_PATCH"))
|
{
|
||||||
{
|
patchDecodeXml_legacy(*xml, patch);
|
||||||
patchDecodeXml_legacy(*xml, patch);
|
}
|
||||||
}
|
else if (xml2->hasTagName ("MidiCC"))
|
||||||
|
{
|
||||||
|
XmlElement *pXML_MidiCc = xml->getChildByName ("MidiCC");
|
||||||
|
((JaySynthMidiCC*)patch->getMidiCC())->importXML(pXML_MidiCc);
|
||||||
|
}
|
||||||
|
xml2 = xml2->getNextElement();
|
||||||
|
};
|
||||||
setCurrentProgram(getCurrentProgram());
|
setCurrentProgram(getCurrentProgram());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -980,7 +994,11 @@ void JaySynthAudioProcessor::setCurrentProgramStateInformation (const void* data
|
|||||||
ScopedPointer<XmlElement> xml = getXmlFromBinary(pData, size);
|
ScopedPointer<XmlElement> xml = getXmlFromBinary(pData, size);
|
||||||
if (xml)
|
if (xml)
|
||||||
{
|
{
|
||||||
patchImportXml(xml, currpatch);
|
if (xml->hasTagName ("JSynth"))
|
||||||
|
{
|
||||||
|
XmlElement *xml2 = xml->getFirstChildElement();
|
||||||
|
patchImportXml(xml2, currpatch);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1001,6 +1019,8 @@ void JaySynthAudioProcessor::savePatchToFile (const File &file, int index)
|
|||||||
|
|
||||||
// Write XML to file
|
// Write XML to file
|
||||||
xml->writeToFile (/*const File &destinationFile*/file, /*dtdToUse*/"");
|
xml->writeToFile (/*const File &destinationFile*/file, /*dtdToUse*/"");
|
||||||
|
setCurrentProgram(getCurrentProgram());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1039,7 +1059,8 @@ void JaySynthAudioProcessor::patchDecodeXml_legacy(const XmlElement& xml, JaySyn
|
|||||||
}
|
}
|
||||||
patch->setParameter(i, value);
|
patch->setParameter(i, value);
|
||||||
}
|
}
|
||||||
((JaySynthMidiCC*)patch->getMidiCC())->importXML(&xml);
|
XmlElement *pXML_MidiCc = xml.getChildByName ("JSYNTH_MIDICONTROLLER_TABLE");
|
||||||
|
((JaySynthMidiCC*)patch->getMidiCC())->importXML(pXML_MidiCc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JaySynthAudioProcessor::bankDecodeXml_legacy(const XmlElement& xml)
|
void JaySynthAudioProcessor::bankDecodeXml_legacy(const XmlElement& xml)
|
||||||
@@ -1055,7 +1076,8 @@ void JaySynthAudioProcessor::bankDecodeXml_legacy(const XmlElement& xml)
|
|||||||
|
|
||||||
JaySynthSound *pPatch = &patches[progID];
|
JaySynthSound *pPatch = &patches[progID];
|
||||||
patchDecodeXml_legacy(*pXML, pPatch);
|
patchDecodeXml_legacy(*pXML, pPatch);
|
||||||
((JaySynthMidiCC*)pPatch->getMidiCC())->importXML(pXML);
|
XmlElement *pXML_MidiCc = pXML->getChildByName ("JSYNTH_MIDICONTROLLER_TABLE");
|
||||||
|
((JaySynthMidiCC*)pPatch->getMidiCC())->importXML(pXML_MidiCc);
|
||||||
pXML = pXML->getNextElement();
|
pXML = pXML->getNextElement();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user