- 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:
2026-05-09 08:34:01 +02:00
parent 0de8c05f00
commit c392104aec
4 changed files with 54 additions and 45 deletions
+1 -1
View File
@@ -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)
+6 -18
View File
@@ -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();
-1
View File
@@ -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);
+42 -20
View File
@@ -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);
if (xml->hasTagName ("JSynth"))
{
patchImportXml(xml, currpatch); 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(); XmlElement *xml2 = xml->getFirstChildElement();
while(xml2)
{
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();
} }
} }