45da050344
Code cleanup for custom XML skin.
390 lines
16 KiB
C++
Executable file
390 lines
16 KiB
C++
Executable file
/*
|
|
==============================================================================
|
|
|
|
This file was auto-generated by the Introjucer!
|
|
|
|
It contains the basic startup code for a Juce application.
|
|
|
|
==============================================================================
|
|
*/
|
|
#include "PluginProcessor.h"
|
|
#include "PluginEditor.h"
|
|
#include <utility>
|
|
// #include "GUI/BinaryData.h"
|
|
|
|
|
|
//==============================================================================
|
|
ObxdAudioProcessorEditor::ObxdAudioProcessorEditor (ObxdAudioProcessor& ownerFilter)
|
|
: AudioProcessorEditor (&ownerFilter), processor (ownerFilter)
|
|
{
|
|
rebuildComponents (processor);
|
|
}
|
|
|
|
ObxdAudioProcessorEditor::~ObxdAudioProcessorEditor()
|
|
{
|
|
processor.removeChangeListener (this);
|
|
// deleteAllChildren(); // WATCH OUT!
|
|
}
|
|
|
|
void ObxdAudioProcessorEditor::placeLabel (int x, int y, String text)
|
|
{
|
|
Label* lab = new Label();
|
|
lab->setBounds (x, y, 110, 20);
|
|
lab->setJustificationType (Justification::centred);
|
|
lab->setText (text,dontSendNotification);
|
|
lab->setInterceptsMouseClicks (false, true);
|
|
addAndMakeVisible (lab);
|
|
}
|
|
|
|
ButtonList* ObxdAudioProcessorEditor::addNormalButtonList (int x, int y, int width, ObxdAudioProcessor& filter, int parameter, String /*name*/, Image img)
|
|
{
|
|
ButtonList *bl = new ButtonList (img, 24);
|
|
bl->setBounds (x, y, width, 24);
|
|
//bl->setValue(filter->getParameter(parameter),dontSendNotification);
|
|
addAndMakeVisible (bl);
|
|
// bl->addListener (this);
|
|
|
|
return bl;
|
|
|
|
}
|
|
|
|
Knob* ObxdAudioProcessorEditor::addNormalKnob (int x, int y, ObxdAudioProcessor& filter, int parameter, String /*name*/, float defval)
|
|
{
|
|
Knob* knob = new Knob (ImageCache::getFromMemory (BinaryData::knob_png, BinaryData::knob_pngSize), 48);
|
|
//Label* knobl = new Label();
|
|
knob->setSliderStyle (Slider::RotaryVerticalDrag);
|
|
knob->setTextBoxStyle (knob->NoTextBox, true, 0, 0);
|
|
knob->setRange (0, 1);
|
|
addAndMakeVisible (knob);
|
|
//addAndMakeVisible(knobl);
|
|
knob->setBounds (x, y, 48, 48);
|
|
// knob->setValue (filter.getParameter (parameter), dontSendNotification);
|
|
//knobl->setJustificationType(Justification::centred);
|
|
//knobl->setInterceptsMouseClicks(false,true);
|
|
//knobl->setBounds(x-10,y+40,60,10);
|
|
//knobl->setText(name,dontSendNotification);
|
|
knob->setTextBoxIsEditable (false);
|
|
knob->setDoubleClickReturnValue (true, defval);
|
|
// knob->addListener (this);
|
|
knobAttachments.add (new Knob::KnobAttachment (filter.getPluginState(),
|
|
filter.getEngineParameterId (parameter),
|
|
*knob));
|
|
|
|
return knob;
|
|
}
|
|
|
|
Knob* ObxdAudioProcessorEditor::addTinyKnob (int x, int y, ObxdAudioProcessor& filter, int parameter, String /*name*/, float defval)
|
|
{
|
|
//Knob* knob = new Knob(ImageCache::getFromMemory(BinaryData::knobssd_png,BinaryData::knobssd_pngSize),42);
|
|
Knob* knob = new Knob (ImageCache::getFromMemory (BinaryData::knob_png, BinaryData::knob_pngSize), 48);
|
|
//Label* knobl = new Label();
|
|
knob->setSliderStyle (Slider::RotaryVerticalDrag);
|
|
knob->setTextBoxStyle (knob->NoTextBox, true, 0, 0);
|
|
knob->setRange (0, 1);
|
|
addAndMakeVisible (knob);
|
|
//addAndMakeVisible(knobl);
|
|
knob->setBounds (x, y, 36, 36);
|
|
// knob->setValue(filter.getParameter(parameter),dontSendNotification);
|
|
//knobl->setJustificationType(Justification::centred);
|
|
//knobl->setInterceptsMouseClicks(false,true);
|
|
//knobl->setBounds(x-10,y+25,50,10);
|
|
//knobl->setText(name,dontSendNotification);
|
|
knob->setTextBoxIsEditable (false);
|
|
knob->setDoubleClickReturnValue (true, defval);
|
|
// knob->addListener (this);
|
|
knobAttachments.add (new Knob::KnobAttachment (filter.getPluginState(),
|
|
filter.getEngineParameterId (parameter),
|
|
*knob));
|
|
|
|
return knob;
|
|
}
|
|
|
|
TooglableButton* ObxdAudioProcessorEditor::addNormalTooglableButton (int x, int y, ObxdAudioProcessor& filter, int parameter, String name)
|
|
{
|
|
TooglableButton* button = new TooglableButton (ImageCache::getFromMemory (BinaryData::button_png, BinaryData::button_pngSize));
|
|
// button->setButtonStyle(DrawableButton::ButtonStyle::ImageAboveTextLabel);
|
|
addAndMakeVisible (button);
|
|
button->setBounds (x, y, 19, 35);
|
|
button->setButtonText (name);
|
|
// button->setValue(filter.getParameter(parameter),0);
|
|
// button->addListener(this);
|
|
toggleAttachments.add (new TooglableButton::ToggleAttachment (filter.getPluginState(),
|
|
filter.getEngineParameterId (parameter),
|
|
*button));
|
|
|
|
return button;
|
|
}
|
|
|
|
TooglableButton* ObxdAudioProcessorEditor::addNormalTooglableButtonClassic (int x, int y, ObxdAudioProcessor& filter, int parameter, String name)
|
|
{
|
|
TooglableButton* button = new TooglableButton (ImageCache::getFromFile (skinFolder.getChildFile ("button.png")));
|
|
// button->setButtonStyle(DrawableButton::ButtonStyle::ImageAboveTextLabel);
|
|
addAndMakeVisible (button);
|
|
button->setBounds (x, y, 28, 35);
|
|
button->setButtonText (name);
|
|
// button->setValue(filter.getParameter(parameter),0);
|
|
// button->addListener(this);
|
|
toggleAttachments.add (new TooglableButton::ToggleAttachment (filter.getPluginState(),
|
|
filter.getEngineParameterId (parameter),
|
|
*button));
|
|
|
|
return button;
|
|
}
|
|
|
|
void ObxdAudioProcessorEditor::rebuildComponents (ObxdAudioProcessor& ownerFilter)
|
|
{
|
|
skinFolder = ownerFilter.getCurrentSkinFolder();
|
|
//bool useClassicSkin = skinFolder.getChildFile ("legato.png").existsAsFile();
|
|
|
|
ownerFilter.removeChangeListener (this);
|
|
|
|
// deleteAllChildren(); // WATCH OUT!
|
|
|
|
setSize (1440, 450);
|
|
cutoffKnob = addNormalKnob (893, 77, ownerFilter, CUTOFF, "Cutoff", 0.4);
|
|
resonanceKnob = addNormalKnob (990, 77, ownerFilter, RESONANCE, "Resonance", 0);
|
|
filterEnvelopeAmtKnob = addNormalKnob (1088, 77, ownerFilter, ENVELOPE_AMT, "Envelope", 0);
|
|
multimodeKnob = addNormalKnob (990, 167, ownerFilter, MULTIMODE, "Multimode", 0.5);
|
|
|
|
volumeKnob = addNormalKnob (56, 77, ownerFilter, VOLUME, "Volume", 0.4);
|
|
portamentoKnob = addNormalKnob (188, 77, ownerFilter, PORTAMENTO, "Portamento", 0);
|
|
osc1PitchKnob = addNormalKnob (593, 77, ownerFilter, OSC1P, "Osc1Pitch", 0);
|
|
pulseWidthKnob = addNormalKnob (691, 77, ownerFilter, PW, "PW", 0);
|
|
osc2PitchKnob = addNormalKnob (788, 77, ownerFilter, OSC2P, "Osc2Pitch", 0);
|
|
|
|
osc1MixKnob = addNormalKnob (597, 237, ownerFilter, OSC1MIX, "Osc1", 1);
|
|
osc2MixKnob = addNormalKnob (788, 237, ownerFilter, OSC2MIX, "Osc2", 1);
|
|
noiseMixKnob = addNormalKnob (691, 237, ownerFilter, NOISEMIX, "Noise", 0);
|
|
|
|
xmodKnob = addNormalKnob (656, 324, ownerFilter, XMOD, "Xmod", 0);
|
|
osc2DetuneKnob = addNormalKnob (800, 324, ownerFilter, OSC2_DET, "Detune", 0);
|
|
|
|
envPitchModKnob = addNormalKnob (728, 324, ownerFilter, ENVPITCH, "PEnv", 0);
|
|
brightnessKnob = addNormalKnob (586, 324, ownerFilter, BRIGHTNESS, "Bri", 1);
|
|
|
|
attackKnob = addNormalKnob (1182, 165, ownerFilter, LATK, "Atk", 0);
|
|
decayKnob = addNormalKnob (1246, 165, ownerFilter, LDEC, "Dec", 0);
|
|
sustainKnob = addNormalKnob (1309, 165, ownerFilter, LSUS, "Sus", 1);
|
|
releaseKnob = addNormalKnob (1373, 165, ownerFilter, LREL, "Rel", 0);
|
|
|
|
fattackKnob = addNormalKnob (1182, 75, ownerFilter, FATK, "Atk", 0);
|
|
fdecayKnob = addNormalKnob (1246, 75, ownerFilter, FDEC, "Dec", 0);
|
|
fsustainKnob = addNormalKnob (1309, 75, ownerFilter, FSUS, "Sus", 1);
|
|
freleaseKnob = addNormalKnob (1373, 75, ownerFilter, FREL, "Rel", 0);
|
|
|
|
lfoFrequencyKnob = addNormalKnob (293, 77, ownerFilter, LFOFREQ, "Freq", 0);
|
|
lfoAmt1Knob = addNormalKnob (390, 77, ownerFilter, LFO1AMT, "Pitch", 0);
|
|
lfoAmt2Knob = addNormalKnob (488, 77, ownerFilter, LFO2AMT, "PWM", 0);
|
|
|
|
lfoSinButton = addNormalTooglableButton (309, 162, ownerFilter, LFOSINWAVE, "Sin");
|
|
lfoSquareButton = addNormalTooglableButton (309, 252, ownerFilter, LFOSQUAREWAVE, "SQ");
|
|
lfoSHButton = addNormalTooglableButton (309, 335, ownerFilter, LFOSHWAVE, "S&H");
|
|
|
|
lfoOsc1Button = addNormalTooglableButton (406, 162, ownerFilter, LFOOSC1, "Osc1");
|
|
lfoOsc2Button = addNormalTooglableButton (406, 252, ownerFilter, LFOOSC2, "Osc2");
|
|
lfoFilterButton = addNormalTooglableButton (406, 335, ownerFilter, LFOFILTER, "Filt");
|
|
|
|
lfoPwm1Button = addNormalTooglableButton (504, 162, ownerFilter, LFOPW1, "Osc1");
|
|
lfoPwm2Button = addNormalTooglableButton (504, 252, ownerFilter, LFOPW2, "Osc2");
|
|
|
|
hardSyncButton = addNormalTooglableButton (730, 162, ownerFilter, OSC2HS, "Sync");
|
|
osc1SawButton = addNormalTooglableButton (587, 162, ownerFilter, OSC1Saw, "S");
|
|
osc2SawButton = addNormalTooglableButton (782, 162, ownerFilter, OSC2Saw, "S");
|
|
|
|
osc1PulButton = addNormalTooglableButton (632, 162, ownerFilter, OSC1Pul, "P");
|
|
osc2PulButton = addNormalTooglableButton (827, 162, ownerFilter, OSC2Pul, "P");
|
|
|
|
pitchQuantButton = addNormalTooglableButton (684, 162, ownerFilter, OSCQuantize, "Step");
|
|
|
|
filterBPBlendButton = addNormalTooglableButton (1082, 162, ownerFilter, BANDPASS, "Bp");
|
|
fourPoleButton = addNormalTooglableButton (1127, 162, ownerFilter, FOURPOLE, "24");
|
|
filterHQButton = addNormalTooglableButton (932, 162, ownerFilter, FILTER_WARM, "HQ");
|
|
|
|
filterKeyFollowButton = addNormalTooglableButton (887, 162, ownerFilter, FLT_KF, "Key");
|
|
unisonButton = addNormalTooglableButton (205, 162, ownerFilter, UNISON, "Uni");
|
|
|
|
tuneKnob = addNormalKnob (30, 252, ownerFilter, TUNE, "Tune", 0.5);
|
|
transposeKnob = addNormalKnob (90, 252, ownerFilter, OCTAVE, "Transpose", 0.5);
|
|
|
|
voiceDetuneKnob =addNormalKnob (188, 252, ownerFilter, UDET, "VoiceDet", 0);
|
|
|
|
bendLfoRateKnob = addTinyKnob (928, 300, ownerFilter, BENDLFORATE, "ModRate", 0.4);
|
|
veloFltEnvKnob = addTinyKnob (1013, 300, ownerFilter, VFLTENV, "VFE", 0);
|
|
veloAmpEnvKnob = addTinyKnob (1111, 300, ownerFilter, VAMPENV, "VAE", 0);
|
|
|
|
midiLearnButton = addNormalTooglableButton (74, 162, ownerFilter, MIDILEARN, "LEA");
|
|
midiUnlearnButton = addNormalTooglableButton (122, 162, ownerFilter, UNLEARN, "UNL");
|
|
|
|
pan1Knob = addTinyKnob (914, 368, ownerFilter, PAN1, "1", 0.5);
|
|
pan2Knob = addTinyKnob (977, 368, ownerFilter, PAN2, "2", 0.5);
|
|
pan3Knob = addTinyKnob (1040, 368, ownerFilter, PAN3, "3", 0.5);
|
|
pan4Knob = addTinyKnob (1103, 368, ownerFilter, PAN4, "4", 0.5);
|
|
|
|
pan5Knob = addTinyKnob (1165, 368, ownerFilter, PAN5, "5", 0.5);
|
|
pan6Knob = addTinyKnob (1228, 368, ownerFilter, PAN6, "6", 0.5);
|
|
pan7Knob = addTinyKnob (1290, 368, ownerFilter, PAN7, "7", 0.5);
|
|
pan8Knob = addTinyKnob (1353, 368, ownerFilter, PAN8, "8", 0.5);
|
|
|
|
bendOsc2OnlyButton = addNormalTooglableButton (228, 335, ownerFilter, BENDOSC2, "Osc2");
|
|
bendRangeButton = addNormalTooglableButton (183, 335, ownerFilter, BENDRANGE, "12");
|
|
asPlayedAllocButton = addNormalTooglableButton (25, 162, ownerFilter, ASPLAYEDALLOCATION, "APA");
|
|
|
|
filterDetuneKnob = addTinyKnob (1228, 300, ownerFilter, FILTERDER, "Flt", 0.2);
|
|
portamentoDetuneKnob = addTinyKnob (1291, 300, ownerFilter, PORTADER, "Port", 0.2);
|
|
envelopeDetuneKnob = addTinyKnob (1353, 300, ownerFilter, ENVDER, "Env", 0.2);
|
|
|
|
voiceSwitch = addNormalButtonList (124, 338, 17, ownerFilter, VOICE_COUNT, "VoiceCount", ImageCache::getFromMemory (BinaryData::voices_png, BinaryData::voices_pngSize));
|
|
|
|
for (int i = 1; i <= 32; ++i)
|
|
{
|
|
voiceSwitch->addChoice (String (i));
|
|
}
|
|
|
|
legatoSwitch = addNormalButtonList (25, 338, 65, ownerFilter, LEGATOMODE, "Legato", ImageCache::getFromMemory (BinaryData::legato_png, BinaryData::legato_pngSize));
|
|
legatoSwitch->addChoice ("Keep All");
|
|
legatoSwitch->addChoice ("Keep Filter Envelope");
|
|
legatoSwitch->addChoice ("Keep Amplitude Envelope");
|
|
legatoSwitch->addChoice ("Retrig");
|
|
|
|
buttonListAttachments.add (new ButtonList::ButtonListAttachment (ownerFilter.getPluginState(),
|
|
ownerFilter.getEngineParameterId (VOICE_COUNT),
|
|
*voiceSwitch));
|
|
|
|
buttonListAttachments.add (new ButtonList::ButtonListAttachment (ownerFilter.getPluginState(),
|
|
ownerFilter.getEngineParameterId (LEGATOMODE),
|
|
*legatoSwitch));
|
|
|
|
ownerFilter.addChangeListener (this);
|
|
repaint();
|
|
}
|
|
|
|
//void ObxdAudioProcessorEditor::buttonClicked(Button * b)
|
|
//{
|
|
//}
|
|
|
|
//void ObxdAudioProcessorEditor::comboBoxChanged (ComboBox* cb)
|
|
//{
|
|
// ButtonList* bl = (ButtonList*)(cb);
|
|
// ObxdAudioProcessor* flt = getFilter();
|
|
// #define cp(T) {flt->setParameterNotifyingHost(T,bl->getValue());}
|
|
//#define handleCParam(K,T) if (bl == K) {cp(T)} else
|
|
// handleCParam(voiceSwitch,VOICE_COUNT)
|
|
// handleCParam(legatoSwitch,LEGATOMODE)
|
|
// {};
|
|
//}
|
|
|
|
//void ObxdAudioProcessorEditor::sliderValueChanged (Slider* c)
|
|
//{
|
|
//}
|
|
|
|
//==============================================================================
|
|
void ObxdAudioProcessorEditor::changeListenerCallback (ChangeBroadcaster* source)
|
|
{
|
|
repaint();
|
|
}
|
|
|
|
void ObxdAudioProcessorEditor::mouseUp(const MouseEvent& e)
|
|
{
|
|
if (e.mods.isRightButtonDown() || e.mods.isCommandDown())
|
|
{
|
|
PopupMenu menu;
|
|
PopupMenu skinMenu;
|
|
PopupMenu bankMenu;
|
|
PopupMenu progMenu;
|
|
|
|
Array<File> skins;
|
|
const Array<File>& banks = processor.getBankFiles();
|
|
|
|
int skinStart = 0;
|
|
{
|
|
DirectoryIterator it(processor.getSkinFolder(), false, "*", File::findDirectories);
|
|
while (it.next())
|
|
{
|
|
skins.addUsingDefaultSort(it.getFile());
|
|
}
|
|
|
|
for (int i = 0; i < skins.size(); ++i)
|
|
{
|
|
const File skin = skins.getUnchecked(i);
|
|
skinMenu.addItem(i + skinStart + 1, skin.getFileName(), true, skin.getFileName() == skinFolder.getFileName());
|
|
}
|
|
|
|
menu.addSubMenu("Skins", skinMenu);
|
|
}
|
|
|
|
int bankStart = 1000;
|
|
{
|
|
const String currentBank = processor.getCurrentBankFile().getFileName();
|
|
|
|
for (int i = 0; i < banks.size(); ++i)
|
|
{
|
|
const File bank = banks.getUnchecked(i);
|
|
bankMenu.addItem(i + bankStart + 1, bank.getFileNameWithoutExtension(), true, bank.getFileName() == currentBank);
|
|
}
|
|
|
|
menu.addSubMenu("Banks", bankMenu);
|
|
}
|
|
|
|
int progStart = 2000;
|
|
{
|
|
for (int i = 0; i < processor.getNumPrograms(); ++i)
|
|
{
|
|
progMenu.addItem(i + progStart + 1, processor.getProgramName(i), true, i == processor.getCurrentProgram());
|
|
}
|
|
|
|
menu.addSubMenu("Programs", progMenu);
|
|
}
|
|
|
|
const Point<int> pos = e.getMouseDownScreenPosition();
|
|
|
|
int result = menu.showAt(Rectangle<int>(pos.getX(), pos.getY(), 1, 1));
|
|
if (result >= (skinStart + 1) && result <= (skinStart + skins.size()))
|
|
{
|
|
result -= 1;
|
|
result -= skinStart;
|
|
|
|
const File newSkinFolder = skins.getUnchecked(result);
|
|
processor.setCurrentSkinFolder(newSkinFolder.getFileName());
|
|
|
|
rebuildComponents (processor);
|
|
}
|
|
else if (result >= (bankStart + 1) && result <= (bankStart + banks.size()))
|
|
{
|
|
result -= 1;
|
|
result -= bankStart;
|
|
|
|
const File bankFile = banks.getUnchecked(result);
|
|
processor.loadFromFXBFile (bankFile);
|
|
}
|
|
else if (result >= (progStart + 1) && result <= (progStart + processor.getNumPrograms()))
|
|
{
|
|
result -= 1;
|
|
result -= progStart;
|
|
processor.setCurrentProgram (result);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ObxdAudioProcessorEditor::paint(Graphics& g)
|
|
{
|
|
g.fillAll (Colours::white);
|
|
|
|
const File mainFile(skinFolder.getChildFile("main.png"));
|
|
|
|
if (skinFolder.exists() && mainFile.exists())
|
|
{
|
|
const Image image = ImageCache::getFromFile(mainFile);
|
|
|
|
g.drawImage (image,
|
|
0, 0, image.getWidth(), image.getHeight(),
|
|
0, 0, image.getWidth(), image.getHeight());
|
|
}
|
|
else
|
|
{
|
|
const Image image = ImageCache::getFromMemory(BinaryData::main_png, BinaryData::main_pngSize);
|
|
|
|
g.drawImage (image,
|
|
0, 0, image.getWidth(), image.getHeight(),
|
|
0, 0, image.getWidth(), image.getHeight());
|
|
}
|
|
}
|