Files
JaySynth/Source/PluginProcessor.h
T
jens ca353251f4 - refactored XML structure
- new XML structure not compatible to old structure
2023-04-29 00:05:13 +02:00

381 lines
10 KiB
C++

/*
==============================================================================
This file was auto-generated!
It contains the basic startup code for a Juce application.
==============================================================================
*/
#ifndef __PLUGINPROCESSOR_H_20F201CA__
#define __PLUGINPROCESSOR_H_20F201CA__
#include "../JuceLibraryCode/JuceHeader.h"
#include "synth/synth_defs.h"
#include "JaySynthSound.h"
#include "JaySynth.h"
#include "JK_MidiClock.h"
#include <pluginterfaces/vst2.x/vstfxstore.h>
//==============================================================================
/**
*/
class JaySynthActionListener : public ActionBroadcaster
{
public:
enum
{
JAYSYNTH_CHANGED_PARAM = 0,
JAYSYNTH_CHANGED_MIDICC,
JAYSYNTH_CHANGED_NOTE_PRESSED,
JAYSYNTH_CHANGED_NOTE_RELEASED,
JAYSYNTH_CHANGED_NUM_VOICES_PLAYING,
JAYSYNTH_CHANGED_MIDICLOCK,
JAYSYNTH_CHANGED_PROGRAM,
JAYSYNTH_CHANGED_LIMITER,
JAYSYNTH_CHANGED_SIZE
};
void callParamChanged (int paramID)
{
String s;
s = String("type=") + String(JAYSYNTH_CHANGED_PARAM);
s = s + String(" ");
s = s + String("paramID=") + String(paramID);
s = s + String(" ");
sendActionMessage(s);
}
void callMidiControllerChanged (int channel, int controllerID, float value)
{
String s;
s = String("type=") + String(JAYSYNTH_CHANGED_MIDICC);
s = s + String(" ");
s = s + String("ch=") + String(channel);
s = s + String(" ");
s = s + String("id=") + String(controllerID);
s = s + String(" ");
s = s + String("value=") + String((float)value);
s = s + String(" ");
sendActionMessage(s);
}
void callMidiNotePressed (int midi_note, float velocity)
{
String s;
s = String("type=") + String(JAYSYNTH_CHANGED_NOTE_PRESSED);
s = s + String(" ");
s = s + String("note=") + String(midi_note);
s = s + String(" ");
s = s + String("velocity=") + String((float)velocity);
s = s + String(" ");
sendActionMessage(s);
}
void callMidiNoteReleased (int midi_note, float velocity)
{
String s;
s = String("type=") + String(JAYSYNTH_CHANGED_NOTE_RELEASED);
s = s + String(" ");
s = s + String("note=") + String(midi_note);
s = s + String(" ");
s = s + String("velocity=") + String((float)velocity);
s = s + String(" ");
sendActionMessage(s);
}
void callProgramChanged(void)
{
String s;
s = String("type=") + String(JAYSYNTH_CHANGED_PROGRAM);
s = s + String(" ");
sendActionMessage(s);
}
void callLimiterChanged (int value)
{
String s;
s = String("type=") + String(JAYSYNTH_CHANGED_LIMITER);
s = s + String(" ");
s = s + String("value=") + String(value);
s = s + String(" ");
sendActionMessage(s);
}
void callNumVoicesPlaying (int value)
{
String s;
s = String("type=") + String(JAYSYNTH_CHANGED_NUM_VOICES_PLAYING);
s = s + String(" ");
s = s + String("value=") + String(value);
s = s + String(" ");
sendActionMessage(s);
}
void callMidiClock (uint32_t bpm, uint32_t type)
{
String s;
s = String("type=") + String(JAYSYNTH_CHANGED_MIDICLOCK);
s = s + String(" ");
s = s + String("bpm=") + String(bpm);
s = s + String(" ");
s = s + String("brightness=") + String(type);
s = s + String(" ");
sendActionMessage(s);
}
void callBinary(void *pData, int size)
{
String s;
s.createStringFromData(pData, size);
sendActionMessage(s);
}
void add (ActionListener *listener)
{
addActionListener((ActionListener*)listener);
}
void remove (ActionListener *listener)
{
removeActionListener((ActionListener*)listener);
}
private:
};
class JaySynthAudioProcessor :
public Timer,
public AudioProcessor,
public JaySynthSound,
public JaySynthListener
{
public:
//==============================================================================
JaySynthAudioProcessor();
~JaySynthAudioProcessor();
//==============================================================================
void prepareToPlay (double sampleRate, int samplesPerBlock);
void releaseResources();
void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages);
//==============================================================================
AudioProcessorEditor* createEditor();
bool hasEditor() const;
//==============================================================================
const String getName() const;
int getNumParameters();
void setParameter (int index, float newValue);
float getParameter (int index);
void setParam(int index, synth_float_t param, bool doModifyPatch, bool doNotifyHost);
synth_float_t getParam(int index);
void controlParam(int index, synth_float_t newValue);
const String getParameterName (int index);
const String getParameterText (int index);
const String getInputChannelName (int channelIndex) const;
const String getOutputChannelName (int channelIndex) const;
bool isInputChannelStereoPair (int index) const;
bool isOutputChannelStereoPair (int index) const;
bool silenceInProducesSilenceOut() const
{
return false;
}
double getTailLengthSeconds() const
{
return 0;
}
bool acceptsMidi() const;
bool producesMidi() const;
//==============================================================================
int getNumPrograms();
int getCurrentProgram();
void setCurrentProgram (int index);
const String getProgramName (int index);
void changeProgramName (int index, const String& newName);
//==============================================================================
void copyXmlToBinary (const XmlElement& xml, juce::MemoryBlock& destData);
XmlElement* getXmlFromBinary (const void* data, const int sizeInBytes);
const String getParameterNameXML (int index);
void patch2xml(XmlElement *xml, JaySynthSound const *patch);
void xml2patch(const XmlElement *xml, JaySynthSound *patch);
void bank2xml(XmlElement *xml);
void xml2bank(const XmlElement *xml);
void getCurrentProgramStateInformation (MemoryBlock& destData);
void setCurrentProgramStateInformation (const void* data, int sizeInBytes);
void getStateInformation (MemoryBlock& destData);
void setStateInformation (const void* data, int sizeInBytes);
void loadPatch (const File &file, int index);
void savePatch (const File &file, int index);
void loadBank (const File &file);
void saveBank (const File &file);
void commitEditBuffer();
//==============================================================================
// These properties are public so that our editor component can access them
// A bit of a hacky way to do it, but it's only a demo! Obviously in your own
// code you'll do this much more neatly..
// this is kept up to date with the midi messages that arrive, and the UI component
// registers with it so it can represent the incoming messages
MidiKeyboardState keyboardState;
// this keeps a copy of the last set of time info that was acquired during an audio
// callback - the UI component will read this and display it.
AudioPlayHead::CurrentPositionInfo lastPosInfo;
// these are used to persist the UI's size - the values are stored along with the
// filter's other parameters, and the UI component will update them when it gets
// resized.
void synthChanged(int type, void *pData);
void addActionListener(ActionListener* listener)
{
actionListener.add(listener);
}
void removeActionListener(ActionListener* listener)
{
actionListener.remove(listener);
}
void sendParamChangeToHost(int index, float value)
{
AudioProcessor::sendParamChangeMessageToListeners(index, value);
}
JaySynth::midiCC_info_t* getLastMidiControllers(void)
{
return pSynth->getLastMidiCC_infos();
}
JaySynth::midi_note_info_t* getLastMidiNoteInfos(void)
{
return pSynth->getLastMidiNote_infos();
}
void setCurrentProgramName (String name)
{
changeProgramName(getCurrentProgram(), name);
updateHostDisplay();
}
const String getCurrentProgramName (void)
{
String s;
if (isPatchModified() || getMidiCC_editBuffer()->isMidiCCmodified())
{
s = getProgramName(getCurrentProgram()) + String(" [edited]");
}
else
{
s = getProgramName(getCurrentProgram());
}
return s;
};
bool isPatchModified(void)
{
return isModified;
}
void clearPatchModified(void)
{
isModified = false;
}
void setPatchModified(void)
{
isModified = true;
}
JaySynthMidiCC *getMidiCC_editBuffer(void)
{
return &midCC_editBuffer;
}
void applyMidiController(JaySynth::midiCC_info_t *pMidiCC_info, bool forceApply);
void applyCurrentMidiControllers(void);
void humanizeModeChanged(void)
{
pSynth->humanizeModeChanged();
}
void unisonoModeChanged(void)
{
pSynth->unisonoModeChanged();
}
void humanizeVarianceChanged_VCO(void)
{
pSynth->humanizeVarianceChanged_VCO();
}
void humanizeVarianceChanged_VCF(void)
{
pSynth->humanizeVarianceChanged_VCF();
}
void humanizeVarianceChanged_ENV(void)
{
pSynth->humanizeVarianceChanged_ENV();
}
void perVoiceControlChanged(int paramID)
{
pSynth->updateParameter(paramID);
}
void perVoiceControlsChanged(void)
{
pSynth->updateParameters();
}
String wavesGetPath();
bool isWavesAvailable();
void timerCallback();
private:
// the synth!
bool isModified;
bool m_isWavesAvailable;
int lastUIWidth, lastUIHeight;
synth_float_t master_volume, m_fs;
int currProgram;
JaySynthSound patches[NUM_PROGRAMS];
JaySynthSound *currpatch;
JaySynthActionListener actionListener;
JaySynth *pSynth;
void *the_editor;
JaySynthMidiCC midCC_editBuffer;
int m_limiter_active;
synth_float_t m_limiter_env;
JK_MidiClock m_JK_MidiClock;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JaySynthAudioProcessor);
};
//typedef JaySynthAudioProcessor::Listener JaySynthAudioProcessorListener;
#endif // __PLUGINPROCESSOR_H_20F201CA__