v1.8
Parameter exposure (AU/iOS AUv3/VST/VST3) for host automation. iOS Universal build with iPhone support. Enhanced AUv3 GUI window display fit. AUv3 GUI scrolling using left and right border sides.
This commit is contained in:
parent
7aff1e75ed
commit
03b6d2c2ef
39 changed files with 1201 additions and 4894 deletions
64
OPL.jucer
64
OPL.jucer
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<JUCERPROJECT id="wUKQiT" name="OPL" projectType="audioplug" version="1.7.0"
|
||||
<JUCERPROJECT id="wUKQiT" name="OPL" projectType="audioplug" version="1.8.0"
|
||||
bundleIdentifier="com.discodsp.OPL" pluginName="OPL" pluginDesc="Digital sound synthesis chip developed by Yamaha in the mid 1980s"
|
||||
pluginManufacturer="discoDSP" pluginManufacturerCode="DDSP" pluginCode="OPL1"
|
||||
pluginChannelConfigs="{0, 2}" pluginIsSynth="1" pluginWantsMidiIn="1"
|
||||
|
@ -12,11 +12,21 @@
|
|||
companyName="discoDSP" companyEmail="contactus@discodsp.com"
|
||||
pluginRTASDisableBypass="0" pluginRTASDisableMultiMono="0" pluginAAXDisableBypass="0"
|
||||
pluginAAXDisableMultiMono="0" pluginAUMainType="'aumu'" pluginVST3Category="Instrument,Synth"
|
||||
pluginVSTCategory="kPlugCategSynth" pluginFormats="buildAU,buildStandalone,buildVST3"
|
||||
buildVST="0" buildVST3="1" buildAU="1" buildAUv3="0" buildRTAS="0"
|
||||
pluginVSTCategory="kPlugCategSynth" pluginFormats="buildAU,buildStandalone,buildVST,buildVST3"
|
||||
buildVST="1" buildVST3="1" buildAU="1" buildAUv3="0" buildRTAS="0"
|
||||
buildAAX="0" buildStandalone="1" enableIAA="0">
|
||||
<MAINGROUP id="TOefyq" name="OPL">
|
||||
<GROUP id="{DCA755EB-7953-0641-E719-95C7850E5B2B}" name="Source">
|
||||
<GROUP id="{8A2D4016-5C21-02E2-63A0-70230FA5D74F}" name="iOSPluginEditorWrapper">
|
||||
<FILE id="UGHvrG" name="iOSPluginEditorWrapper.cpp" compile="1" resource="0"
|
||||
file="Source/iOSPluginEditorWrapper/iOSPluginEditorWrapper.cpp"/>
|
||||
<FILE id="WVOOou" name="iOSPluginEditorWrapper.h" compile="0" resource="0"
|
||||
file="Source/iOSPluginEditorWrapper/iOSPluginEditorWrapper.h"/>
|
||||
<FILE id="RwYHJa" name="ScrollbarManager.cpp" compile="1" resource="0"
|
||||
file="Source/iOSPluginEditorWrapper/ScrollbarManager.cpp"/>
|
||||
<FILE id="Lk4bt4" name="ScrollbarManager.h" compile="0" resource="0"
|
||||
file="Source/iOSPluginEditorWrapper/ScrollbarManager.h"/>
|
||||
</GROUP>
|
||||
<FILE id="aNR5I9" name="icon.png" compile="0" resource="0" file="Media/icon.png"/>
|
||||
<FILE id="lWChlc" name="icon_ios.png" compile="0" resource="0" file="Media/icon_ios.png"/>
|
||||
<FILE id="AqQcu5" name="ChannelButtonLookAndFeel.cpp" compile="1" resource="0"
|
||||
|
@ -70,29 +80,31 @@
|
|||
</GROUP>
|
||||
</MAINGROUP>
|
||||
<MODULES>
|
||||
<MODULES id="juce_audio_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>
|
||||
<MODULES id="juce_audio_devices" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULES id="juce_audio_formats" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULES id="juce_audio_basics" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_audio_devices" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_audio_formats" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_audio_plugin_client" showAllCode="1" useLocalCopy="1"
|
||||
useGlobalPath="1"/>
|
||||
<MODULES id="juce_audio_processors" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULE id="juce_audio_utils" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULES id="juce_core" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULES id="juce_cryptography" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULES id="juce_data_structures" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULES id="juce_events" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULES id="juce_graphics" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULES id="juce_gui_basics" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULES id="juce_gui_extra" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULES id="juce_opengl" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
<MODULES id="juce_video" showAllCode="1" useLocalCopy="1" useGlobalPath="1"/>
|
||||
useGlobalPath="0"/>
|
||||
<MODULES id="juce_audio_processors" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULE id="juce_audio_utils" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_core" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_cryptography" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_data_structures" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_events" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_graphics" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_gui_basics" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_gui_extra" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_opengl" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
<MODULES id="juce_video" showAllCode="1" useLocalCopy="1" useGlobalPath="0"/>
|
||||
</MODULES>
|
||||
<JUCEOPTIONS JUCE_QUICKTIME="disabled" JUCE_WEB_BROWSER="0" JUCE_JACK="1"/>
|
||||
<EXPORTFORMATS>
|
||||
<XCODE_IPHONE targetFolder="Builds/iOS" iosScreenOrientation="landscape" iPadScreenOrientation="landscape"
|
||||
UIStatusBarHidden="1" iosBackgroundAudio="1" iosBackgroundBle="1"
|
||||
iosDeviceFamily="2" smallIcon="lWChlc" bigIcon="lWChlc" iosAppGroupsId="group.com.discodsp.opl"
|
||||
extraDefs="JUCE_DISABLE_NATIVE_FILECHOOSERS=1" customXcodeResourceFolders="sbi">
|
||||
smallIcon="lWChlc" bigIcon="lWChlc" iosAppGroupsId="group.com.discodsp.opl"
|
||||
extraDefs="JUCE_DISABLE_NATIVE_FILECHOOSERS=1" customXcodeResourceFolders="sbi"
|
||||
iCloudPermissions="0" UISupportsDocumentBrowser="0"
|
||||
UIFileSharingEnabled="0">
|
||||
<CONFIGURATIONS>
|
||||
<CONFIGURATION isDebug="1" name="Debug" iosCompatibility="11.0"/>
|
||||
<CONFIGURATION isDebug="0" name="Release" iosCompatibility="11.0"/>
|
||||
|
@ -115,8 +127,9 @@
|
|||
<MODULEPATH id="juce_audio_utils" path="modules"/>
|
||||
</MODULEPATHS>
|
||||
</XCODE_IPHONE>
|
||||
<XCODE_MAC targetFolder="Builds/MacOSX" vstLegacyFolder="modules/vstsdk2.4"
|
||||
vst3Folder="modules/vstsdk3" smallIcon="aNR5I9" bigIcon="aNR5I9">
|
||||
<XCODE_MAC targetFolder="Builds/MacOSX"
|
||||
vstLegacyFolder="modules/vstsdk2.4" vst3Folder="modules/vstsdk3"
|
||||
smallIcon="aNR5I9" bigIcon="aNR5I9">
|
||||
<CONFIGURATIONS>
|
||||
<CONFIGURATION isDebug="1" name="Debug"/>
|
||||
<CONFIGURATION isDebug="0" name="Release"/>
|
||||
|
@ -144,10 +157,11 @@
|
|||
extraLinkerFlags="-no-pie">
|
||||
<CONFIGURATIONS>
|
||||
<CONFIGURATION isDebug="0" name="Release" libraryPath="/usr/X11R6/lib/" linuxArchitecture="-m64"
|
||||
headerPath="../../JuceLibraryCode ../../Source ../../Modules/vstsdk2.4 /usr/include/freetype2 /usr/include"/>
|
||||
headerPath="../../JuceLibraryCode ../../Source ../Modules/vstsdk2.4 /usr/include/freetype2 /usr/include"
|
||||
binaryPath="Bin/Release"/>
|
||||
<CONFIGURATION isDebug="0" name="Demo" libraryPath="/usr/X11R6/lib/" linuxArchitecture="-m64"
|
||||
headerPath="../../JuceLibraryCode ../../Source ../../Modules/vstsdk2.4 /usr/include/freetype2 /usr/include"
|
||||
defines="DEMOVERSION=1"/>
|
||||
headerPath="../../JuceLibraryCode ../../Source ../Modules/vstsdk2.4 /usr/include/freetype2 /usr/include"
|
||||
defines="DEMOVERSION=1" binaryPath="Bin/Demo"/>
|
||||
</CONFIGURATIONS>
|
||||
<MODULEPATHS>
|
||||
<MODULEPATH id="juce_video" path="modules"/>
|
||||
|
|
0
Source/ChannelButtonLookAndFeel.cpp
Normal file → Executable file
0
Source/ChannelButtonLookAndFeel.cpp
Normal file → Executable file
0
Source/ChannelButtonLookAndFeel.h
Normal file → Executable file
0
Source/ChannelButtonLookAndFeel.h
Normal file → Executable file
0
Source/EnumFloatParameter.cpp
Normal file → Executable file
0
Source/EnumFloatParameter.cpp
Normal file → Executable file
0
Source/EnumFloatParameter.h
Normal file → Executable file
0
Source/EnumFloatParameter.h
Normal file → Executable file
0
Source/FloatParameter.cpp
Normal file → Executable file
0
Source/FloatParameter.cpp
Normal file → Executable file
0
Source/FloatParameter.h
Normal file → Executable file
0
Source/FloatParameter.h
Normal file → Executable file
1
Source/InstrumentLoader.h
Normal file → Executable file
1
Source/InstrumentLoader.h
Normal file → Executable file
|
@ -8,4 +8,5 @@ class InstrumentLoader
|
|||
public:
|
||||
virtual void loadInstrumentData(int n, const unsigned char* data, AdlibBlasterAudioProcessor *proc) = 0;
|
||||
virtual String getExtension() = 0;
|
||||
virtual ~InstrumentLoader() = default;
|
||||
};
|
||||
|
|
0
Source/IntFloatParameter.cpp
Normal file → Executable file
0
Source/IntFloatParameter.cpp
Normal file → Executable file
0
Source/IntFloatParameter.h
Normal file → Executable file
0
Source/IntFloatParameter.h
Normal file → Executable file
|
@ -2446,7 +2446,9 @@ void PluginGui::comboBoxChanged (ComboBox* comboBoxThatHasChanged)
|
|||
//[UserComboBoxCode_frequencyComboBox] -- add your combo box handling code here..
|
||||
int id = comboBoxThatHasChanged->getSelectedId();
|
||||
if (id > 15) id = 0;
|
||||
processor->beginChangeGesture("Modulator Frequency Multiplier");
|
||||
processor->setEnumParameter("Modulator Frequency Multiplier", id);
|
||||
processor->endChangeGesture("Modulator Frequency Multiplier");
|
||||
//[/UserComboBoxCode_frequencyComboBox]
|
||||
}
|
||||
else if (comboBoxThatHasChanged == frequencyComboBox2.get())
|
||||
|
@ -2454,35 +2456,45 @@ void PluginGui::comboBoxChanged (ComboBox* comboBoxThatHasChanged)
|
|||
//[UserComboBoxCode_frequencyComboBox2] -- add your combo box handling code here..
|
||||
int id = comboBoxThatHasChanged->getSelectedId();
|
||||
if (id > 15) id = 0;
|
||||
processor->beginChangeGesture("Carrier Frequency Multiplier");
|
||||
processor->setEnumParameter("Carrier Frequency Multiplier", id);
|
||||
processor->endChangeGesture("Carrier Frequency Multiplier");
|
||||
//[/UserComboBoxCode_frequencyComboBox2]
|
||||
}
|
||||
else if (comboBoxThatHasChanged == velocityComboBox.get())
|
||||
{
|
||||
//[UserComboBoxCode_velocityComboBox] -- add your combo box handling code here..
|
||||
int id = comboBoxThatHasChanged->getSelectedId() - 1;
|
||||
processor->beginChangeGesture("Modulator Velocity Sensitivity");
|
||||
processor->setEnumParameter("Modulator Velocity Sensitivity", id);
|
||||
processor->endChangeGesture("Modulator Velocity Sensitivity");
|
||||
//[/UserComboBoxCode_velocityComboBox]
|
||||
}
|
||||
else if (comboBoxThatHasChanged == velocityComboBox2.get())
|
||||
{
|
||||
//[UserComboBoxCode_velocityComboBox2] -- add your combo box handling code here..
|
||||
int id = comboBoxThatHasChanged->getSelectedId() - 1;
|
||||
processor->beginChangeGesture("Carrier Velocity Sensitivity");
|
||||
processor->setEnumParameter("Carrier Velocity Sensitivity", id);
|
||||
processor->endChangeGesture("Carrier Velocity Sensitivity");
|
||||
//[/UserComboBoxCode_velocityComboBox2]
|
||||
}
|
||||
else if (comboBoxThatHasChanged == keyscaleAttenuationComboBox2.get())
|
||||
{
|
||||
//[UserComboBoxCode_keyscaleAttenuationComboBox2] -- add your combo box handling code here..
|
||||
int id = comboBoxThatHasChanged->getSelectedId() - 1;
|
||||
processor->beginChangeGesture("Carrier Keyscale Level");
|
||||
processor->setEnumParameter("Carrier Keyscale Level", id);
|
||||
processor->endChangeGesture("Carrier Keyscale Level");
|
||||
//[/UserComboBoxCode_keyscaleAttenuationComboBox2]
|
||||
}
|
||||
else if (comboBoxThatHasChanged == keyscaleAttenuationComboBox.get())
|
||||
{
|
||||
//[UserComboBoxCode_keyscaleAttenuationComboBox] -- add your combo box handling code here..
|
||||
int id = comboBoxThatHasChanged->getSelectedId() - 1;
|
||||
processor->beginChangeGesture("Modulator Keyscale Level");
|
||||
processor->setEnumParameter("Modulator Keyscale Level", id);
|
||||
processor->endChangeGesture("Modulator Keyscale Level");
|
||||
//[/UserComboBoxCode_keyscaleAttenuationComboBox]
|
||||
}
|
||||
|
||||
|
@ -2608,145 +2620,241 @@ void PluginGui::buttonClicked (Button* buttonThatWasClicked)
|
|||
if (buttonThatWasClicked == sineImageButton.get())
|
||||
{
|
||||
//[UserButtonCode_sineImageButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Modulator Wave");
|
||||
processor->setEnumParameter("Modulator Wave", 0);
|
||||
processor->endChangeGesture("Modulator Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_sineImageButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == halfsineImageButton.get())
|
||||
{
|
||||
//[UserButtonCode_halfsineImageButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Modulator Wave");
|
||||
processor->setEnumParameter("Modulator Wave", 1);
|
||||
processor->endChangeGesture("Modulator Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_halfsineImageButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == abssineImageButton.get())
|
||||
{
|
||||
//[UserButtonCode_abssineImageButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Modulator Wave");
|
||||
processor->setEnumParameter("Modulator Wave", 2);
|
||||
processor->endChangeGesture("Modulator Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_abssineImageButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == quartersineImageButton.get())
|
||||
{
|
||||
//[UserButtonCode_quartersineImageButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Modulator Wave");
|
||||
processor->setEnumParameter("Modulator Wave", 3);
|
||||
processor->endChangeGesture("Modulator Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_quartersineImageButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == tremoloButton.get())
|
||||
{
|
||||
//[UserButtonCode_tremoloButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Modulator Tremolo");
|
||||
processor->setEnumParameter("Modulator Tremolo", buttonThatWasClicked->getToggleState() ? 1 : 0);
|
||||
processor->endChangeGesture("Modulator Tremolo");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_tremoloButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == vibratoButton.get())
|
||||
{
|
||||
//[UserButtonCode_vibratoButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Modulator Vibrato");
|
||||
processor->setEnumParameter("Modulator Vibrato", buttonThatWasClicked->getToggleState() ? 1 : 0);
|
||||
processor->endChangeGesture("Modulator Vibrato");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_vibratoButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == sustainButton.get())
|
||||
{
|
||||
//[UserButtonCode_sustainButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Modulator Sustain");
|
||||
processor->setEnumParameter("Modulator Sustain", buttonThatWasClicked->getToggleState() ? 1 : 0);
|
||||
processor->endChangeGesture("Modulator Sustain");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_sustainButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == keyscaleEnvButton.get())
|
||||
{
|
||||
//[UserButtonCode_keyscaleEnvButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Modulator Keyscale Rate");
|
||||
processor->setEnumParameter("Modulator Keyscale Rate", buttonThatWasClicked->getToggleState() ? 1 : 0);
|
||||
processor->endChangeGesture("Modulator Keyscale Rate");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_keyscaleEnvButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == sineImageButton2.get())
|
||||
{
|
||||
//[UserButtonCode_sineImageButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Wave");
|
||||
processor->setEnumParameter("Carrier Wave", 0);
|
||||
processor->endChangeGesture("Carrier Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_sineImageButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == halfsineImageButton2.get())
|
||||
{
|
||||
//[UserButtonCode_halfsineImageButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Wave");
|
||||
processor->setEnumParameter("Carrier Wave", 1);
|
||||
processor->endChangeGesture("Carrier Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_halfsineImageButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == abssineImageButton2.get())
|
||||
{
|
||||
//[UserButtonCode_abssineImageButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Wave");
|
||||
processor->setEnumParameter("Carrier Wave", 2);
|
||||
processor->endChangeGesture("Carrier Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_abssineImageButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == quartersineImageButton2.get())
|
||||
{
|
||||
//[UserButtonCode_quartersineImageButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Wave");
|
||||
processor->setEnumParameter("Carrier Wave", 3);
|
||||
processor->endChangeGesture("Carrier Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_quartersineImageButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == tremoloButton2.get())
|
||||
{
|
||||
//[UserButtonCode_tremoloButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Tremolo");
|
||||
processor->setEnumParameter("Carrier Tremolo", buttonThatWasClicked->getToggleState() ? 1 : 0);
|
||||
processor->endChangeGesture("Carrier Tremolo");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_tremoloButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == vibratoButton2.get())
|
||||
{
|
||||
//[UserButtonCode_vibratoButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Vibrato");
|
||||
processor->setEnumParameter("Carrier Vibrato", buttonThatWasClicked->getToggleState() ? 1 : 0);
|
||||
processor->endChangeGesture("Carrier Vibrato");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_vibratoButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == sustainButton2.get())
|
||||
{
|
||||
//[UserButtonCode_sustainButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Sustain");
|
||||
processor->setEnumParameter("Carrier Sustain", buttonThatWasClicked->getToggleState() ? 1 : 0);
|
||||
processor->endChangeGesture("Carrier Sustain");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_sustainButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == keyscaleEnvButton2.get())
|
||||
{
|
||||
//[UserButtonCode_keyscaleEnvButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Keyscale Rate");
|
||||
processor->setEnumParameter("Carrier Keyscale Rate", buttonThatWasClicked->getToggleState() ? 1 : 0);
|
||||
processor->endChangeGesture("Carrier Keyscale Rate");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_keyscaleEnvButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == alternatingsineImageButton.get())
|
||||
{
|
||||
//[UserButtonCode_alternatingsineImageButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Modulator Wave");
|
||||
processor->setEnumParameter("Modulator Wave", 4);
|
||||
processor->endChangeGesture("Modulator Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_alternatingsineImageButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == camelsineImageButton.get())
|
||||
{
|
||||
//[UserButtonCode_camelsineImageButton] -- add your button handler code here..
|
||||
processor->setEnumParameter("Modulator Wave", 5);
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Wave");
|
||||
processor->setEnumParameter("Carrier Wave", 5);
|
||||
processor->endChangeGesture("Carrier Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_camelsineImageButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == squareImageButton.get())
|
||||
{
|
||||
//[UserButtonCode_squareImageButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Modulator Wave");
|
||||
processor->setEnumParameter("Modulator Wave", 6);
|
||||
processor->endChangeGesture("Modulator Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_squareImageButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == logsawImageButton.get())
|
||||
{
|
||||
//[UserButtonCode_logsawImageButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Modulator Wave");
|
||||
processor->setEnumParameter("Modulator Wave", 7);
|
||||
processor->endChangeGesture("Modulator Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_logsawImageButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == alternatingsineImageButton2.get())
|
||||
{
|
||||
//[UserButtonCode_alternatingsineImageButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Wave");
|
||||
processor->setEnumParameter("Carrier Wave", 4);
|
||||
processor->endChangeGesture("Carrier Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_alternatingsineImageButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == camelsineImageButton2.get())
|
||||
{
|
||||
//[UserButtonCode_camelsineImageButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Wave");
|
||||
processor->setEnumParameter("Carrier Wave", 5);
|
||||
processor->endChangeGesture("Carrier Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_camelsineImageButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == squareImageButton2.get())
|
||||
{
|
||||
//[UserButtonCode_squareImageButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Wave");
|
||||
processor->setEnumParameter("Carrier Wave", 6);
|
||||
processor->endChangeGesture("Carrier Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_squareImageButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == logsawImageButton2.get())
|
||||
{
|
||||
//[UserButtonCode_logsawImageButton2] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Carrier Wave");
|
||||
processor->setEnumParameter("Carrier Wave", 7);
|
||||
processor->endChangeGesture("Carrier Wave");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_logsawImageButton2]
|
||||
}
|
||||
else if (buttonThatWasClicked == recordButton.get())
|
||||
|
@ -2917,49 +3025,81 @@ void PluginGui::buttonClicked (Button* buttonThatWasClicked)
|
|||
else if (buttonThatWasClicked == fmButton.get())
|
||||
{
|
||||
//[UserButtonCode_fmButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Algorithm");
|
||||
processor->setEnumParameter("Algorithm", 0);
|
||||
processor->endChangeGesture("Algorithm");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_fmButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == additiveButton.get())
|
||||
{
|
||||
//[UserButtonCode_additiveButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Algorithm");
|
||||
processor->setEnumParameter("Algorithm", 1);
|
||||
processor->endChangeGesture("Algorithm");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_additiveButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == bassDrumButton.get())
|
||||
{
|
||||
//[UserButtonCode_bassDrumButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Percussion Mode");
|
||||
processor->setEnumParameter("Percussion Mode", 1);
|
||||
processor->endChangeGesture("Percussion Mode");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_bassDrumButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == snareDrumButton.get())
|
||||
{
|
||||
//[UserButtonCode_snareDrumButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Percussion Mode");
|
||||
processor->setEnumParameter("Percussion Mode", 2);
|
||||
processor->endChangeGesture("Percussion Mode");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_snareDrumButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == disablePercussionButton.get())
|
||||
{
|
||||
//[UserButtonCode_disablePercussionButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Percussion Mode");
|
||||
processor->setEnumParameter("Percussion Mode", 0);
|
||||
processor->endChangeGesture("Percussion Mode");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_disablePercussionButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == tomTomButton.get())
|
||||
{
|
||||
//[UserButtonCode_tomTomButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Percussion Mode");
|
||||
processor->setEnumParameter("Percussion Mode", 3);
|
||||
processor->endChangeGesture("Percussion Mode");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_tomTomButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == cymbalButton.get())
|
||||
{
|
||||
//[UserButtonCode_cymbalButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Percussion Mode");
|
||||
processor->setEnumParameter("Percussion Mode", 4);
|
||||
processor->endChangeGesture("Percussion Mode");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_cymbalButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == hiHatButton.get())
|
||||
{
|
||||
//[UserButtonCode_hiHatButton] -- add your button handler code here..
|
||||
updateFromHost=false;
|
||||
processor->beginChangeGesture("Percussion Mode");
|
||||
processor->setEnumParameter("Percussion Mode", 5);
|
||||
processor->endChangeGesture("Percussion Mode");
|
||||
updateFromHost=true;
|
||||
//[/UserButtonCode_hiHatButton]
|
||||
}
|
||||
else if (buttonThatWasClicked == previousButton.get())
|
||||
|
@ -2982,6 +3122,193 @@ void PluginGui::buttonClicked (Button* buttonThatWasClicked)
|
|||
|
||||
|
||||
//[MiscUserCode] You can add your own definitions of your custom methods or any other code here...
|
||||
void PluginGui::sliderDragStarted (Slider* sliderThatWasMoved) {
|
||||
//[UsersliderValueChanged_Pre]
|
||||
DBG("Slider -> Start");
|
||||
updateFromHost=false;
|
||||
//[/UsersliderValueChanged_Pre]
|
||||
|
||||
if (sliderThatWasMoved == aSlider.get())
|
||||
{
|
||||
//[UserSliderCode_aSlider] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Modulator Attack");
|
||||
//[/UserSliderCode_aSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == dSlider.get())
|
||||
{
|
||||
//[UserSliderCode_dSlider] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Modulator Decay");
|
||||
//[/UserSliderCode_dSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == sSlider.get())
|
||||
{
|
||||
//[UserSliderCode_sSlider] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Modulator Sustain Level");
|
||||
//[/UserSliderCode_sSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == rSlider.get())
|
||||
{
|
||||
//[UserSliderCode_rSlider] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Modulator Release");
|
||||
//[/UserSliderCode_rSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == attenuationSlider.get())
|
||||
{
|
||||
//[UserSliderCode_attenuationSlider] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Modulator Attenuation");
|
||||
//[/UserSliderCode_attenuationSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == aSlider2.get())
|
||||
{
|
||||
//[UserSliderCode_aSlider2] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Carrier Attack");
|
||||
//[/UserSliderCode_aSlider2]
|
||||
}
|
||||
else if (sliderThatWasMoved == dSlider2.get())
|
||||
{
|
||||
//[UserSliderCode_dSlider2] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Carrier Decay");
|
||||
//[/UserSliderCode_dSlider2]
|
||||
}
|
||||
else if (sliderThatWasMoved == sSlider2.get())
|
||||
{
|
||||
//[UserSliderCode_sSlider2] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Carrier Sustain Level");
|
||||
//[/UserSliderCode_sSlider2]
|
||||
}
|
||||
else if (sliderThatWasMoved == rSlider2.get())
|
||||
{
|
||||
//[UserSliderCode_rSlider2] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Carrier Release");
|
||||
//[/UserSliderCode_rSlider2]
|
||||
}
|
||||
else if (sliderThatWasMoved == attenuationSlider2.get())
|
||||
{
|
||||
//[UserSliderCode_attenuationSlider2] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Carrier Attenuation");
|
||||
//[/UserSliderCode_attenuationSlider2]
|
||||
}
|
||||
else if (sliderThatWasMoved == tremoloSlider.get())
|
||||
{
|
||||
//[UserSliderCode_tremoloSlider] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Tremolo Depth");
|
||||
//[/UserSliderCode_tremoloSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == vibratoSlider.get())
|
||||
{
|
||||
//[UserSliderCode_vibratoSlider] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Vibrato Depth");
|
||||
//[/UserSliderCode_vibratoSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == feedbackSlider.get())
|
||||
{
|
||||
//[UserSliderCode_feedbackSlider] -- add your slider handling code here..
|
||||
processor->beginChangeGesture("Modulator Feedback");
|
||||
//[/UserSliderCode_feedbackSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == emulatorSlider.get())
|
||||
{
|
||||
//[UserSliderCode_emulatorSlider] -- add your slider handling code here..
|
||||
//[/UserSliderCode_emulatorSlider]
|
||||
}
|
||||
|
||||
//[UsersliderValueChanged_Post]
|
||||
//[/UsersliderValueChanged_Post]
|
||||
}
|
||||
void PluginGui::sliderDragEnded (Slider* sliderThatWasMoved) {
|
||||
//[UsersliderValueChanged_Pre]
|
||||
|
||||
//[/UsersliderValueChanged_Pre]
|
||||
|
||||
if (sliderThatWasMoved == aSlider.get())
|
||||
{
|
||||
//[UserSliderCode_aSlider] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Modulator Attack");
|
||||
//[/UserSliderCode_aSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == dSlider.get())
|
||||
{
|
||||
//[UserSliderCode_dSlider] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Modulator Decay");
|
||||
//[/UserSliderCode_dSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == sSlider.get())
|
||||
{
|
||||
//[UserSliderCode_sSlider] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Modulator Sustain Level");
|
||||
//[/UserSliderCode_sSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == rSlider.get())
|
||||
{
|
||||
//[UserSliderCode_rSlider] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Modulator Release");
|
||||
//[/UserSliderCode_rSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == attenuationSlider.get())
|
||||
{
|
||||
//[UserSliderCode_attenuationSlider] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Modulator Attenuation");
|
||||
//[/UserSliderCode_attenuationSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == aSlider2.get())
|
||||
{
|
||||
//[UserSliderCode_aSlider2] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Carrier Attack");
|
||||
//[/UserSliderCode_aSlider2]
|
||||
}
|
||||
else if (sliderThatWasMoved == dSlider2.get())
|
||||
{
|
||||
//[UserSliderCode_dSlider2] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Carrier Decay");
|
||||
//[/UserSliderCode_dSlider2]
|
||||
}
|
||||
else if (sliderThatWasMoved == sSlider2.get())
|
||||
{
|
||||
//[UserSliderCode_sSlider2] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Carrier Sustain Level");
|
||||
//[/UserSliderCode_sSlider2]
|
||||
}
|
||||
else if (sliderThatWasMoved == rSlider2.get())
|
||||
{
|
||||
//[UserSliderCode_rSlider2] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Carrier Release");
|
||||
//[/UserSliderCode_rSlider2]
|
||||
}
|
||||
else if (sliderThatWasMoved == attenuationSlider2.get())
|
||||
{
|
||||
//[UserSliderCode_attenuationSlider2] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Carrier Attenuation");
|
||||
//[/UserSliderCode_attenuationSlider2]
|
||||
}
|
||||
else if (sliderThatWasMoved == tremoloSlider.get())
|
||||
{
|
||||
//[UserSliderCode_tremoloSlider] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Tremolo Depth");
|
||||
//[/UserSliderCode_tremoloSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == vibratoSlider.get())
|
||||
{
|
||||
//[UserSliderCode_vibratoSlider] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Vibrato Depth");
|
||||
//[/UserSliderCode_vibratoSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == feedbackSlider.get())
|
||||
{
|
||||
//[UserSliderCode_feedbackSlider] -- add your slider handling code here..
|
||||
processor->endChangeGesture("Modulator Feedback");
|
||||
//[/UserSliderCode_feedbackSlider]
|
||||
}
|
||||
else if (sliderThatWasMoved == emulatorSlider.get())
|
||||
{
|
||||
//[UserSliderCode_emulatorSlider] -- add your slider handling code here..
|
||||
//[/UserSliderCode_emulatorSlider]
|
||||
}
|
||||
|
||||
//[UsersliderValueChanged_Post]
|
||||
updateFromHost=true;
|
||||
DBG("Slider -> End");
|
||||
//[/UsersliderValueChanged_Post]
|
||||
}
|
||||
//==============================================================================
|
||||
// These methods implement the FileDragAndDropTarget interface, and allow our component
|
||||
// to accept drag-and-drop of files..
|
||||
|
@ -3019,6 +3346,7 @@ void PluginGui::buttonClicked (Button* buttonThatWasClicked)
|
|||
for (int i = 0; i < Hiopl::CHANNELS; ++i) {
|
||||
channels[i]->setButtonText(processor->getChannelEnvelopeStage(i + 1));
|
||||
}
|
||||
syncGUI();
|
||||
}
|
||||
void PluginGui::loadPreNextFile(bool pre){
|
||||
if (pre){
|
||||
|
@ -3102,46 +3430,53 @@ void PluginGui::buttonClicked (Button* buttonThatWasClicked)
|
|||
bool hasFile = false;
|
||||
instrumentLoadDirectory.findChildFiles(dirs, File::findDirectories, false);
|
||||
dirs.sort();
|
||||
for (auto dir: dirs){
|
||||
for (auto dir: dirs)
|
||||
{
|
||||
Array<File> files;
|
||||
dir.findChildFiles (files, File::findFiles, false, "*.sbi");
|
||||
files.sort();
|
||||
if (files.size() > 0){
|
||||
if (files.size() > 0)
|
||||
{
|
||||
bool selectedSub = false;
|
||||
PopupMenu subMenu;
|
||||
for (auto file : files){
|
||||
for (auto file : files)
|
||||
{
|
||||
allSbiFiles.add(file);
|
||||
hasFile = true;
|
||||
if (processor->lastLoadFile == file.getFullPathName()){
|
||||
if (processor->lastLoadFile == file.getFullPathName())
|
||||
{
|
||||
selectedSub = true;
|
||||
subMenu.addItem(allSbiFiles.size(), file.getFileNameWithoutExtension(), true, true);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
subMenu.addItem(allSbiFiles.size(), file.getFileNameWithoutExtension());
|
||||
}
|
||||
}
|
||||
if(selectedSub){
|
||||
menuLoad.addSubMenu (std::move (dir.getFileName()), std::move (subMenu), true, nullptr, true, 0);
|
||||
}
|
||||
else{
|
||||
if(selectedSub)
|
||||
menuLoad.addSubMenu (dir.getFileName(), std::move (subMenu), true, nullptr, true, 0);
|
||||
else
|
||||
menuLoad.addSubMenu(dir.getFileName(), subMenu);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if(hasFile){
|
||||
if(hasFile)
|
||||
{
|
||||
//int id = menuLoad.show();
|
||||
menuLoad.showMenuAsync (PopupMenu::Options().withParentComponent (this->getTopLevelComponent()), [this](int id){
|
||||
if (id > 0) {
|
||||
processor->selectedIdxFile = id -1;
|
||||
if (this->allSbiFiles[processor->selectedIdxFile].existsAsFile()){
|
||||
this->loadandUpdateInstrument(allSbiFiles[processor->selectedIdxFile].getFullPathName());
|
||||
} else {
|
||||
menuLoad.showMenuAsync (PopupMenu::Options().withParentComponent (this->getTopLevelComponent()), [this](int id)
|
||||
{
|
||||
if (id > 0)
|
||||
{
|
||||
auto fileId = id - 1;
|
||||
processor->selectedIdxFile = fileId;
|
||||
auto sbiFile = this->allSbiFiles[fileId];
|
||||
|
||||
if (sbiFile.existsAsFile())
|
||||
this->loadandUpdateInstrument(sbiFile.getFullPathName());
|
||||
else
|
||||
this->loadBrowserFile();
|
||||
}
|
||||
|
||||
}
|
||||
// No select, return true to ignore the popup menu
|
||||
else{
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
@ -3157,6 +3492,12 @@ void PluginGui::buttonClicked (Button* buttonThatWasClicked)
|
|||
File file(path);
|
||||
loadButton->setButtonText(file.getFileNameWithoutExtension());
|
||||
}
|
||||
|
||||
void PluginGui::syncGUI(){
|
||||
if (updateFromHost){
|
||||
updateFromParameters();
|
||||
}
|
||||
}
|
||||
//[/MiscUserCode]
|
||||
|
||||
|
||||
|
|
|
@ -61,6 +61,12 @@ public:
|
|||
bool showLoadMenu();
|
||||
bool loadBrowserFile();
|
||||
void loadPreNextFile(bool pre = true);
|
||||
|
||||
void syncGUI();
|
||||
|
||||
void sliderDragStarted (Slider* sliderThatWasMoved) override;
|
||||
void sliderDragEnded (Slider* sliderThatWasMoved) override;
|
||||
|
||||
//[/UserMethods]
|
||||
|
||||
void paint (Graphics& g) override;
|
||||
|
@ -130,6 +136,8 @@ public:
|
|||
|
||||
private:
|
||||
//[UserVariables] -- You can add your own custom variables in this section.
|
||||
bool updateFromHost = true;
|
||||
|
||||
void loadandUpdateInstrument(String path);
|
||||
class OPLComboBoxLookAndFeelMethods:
|
||||
public OPLLookAndFeel
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -3,15 +3,33 @@
|
|||
#include "EnumFloatParameter.h"
|
||||
#include "IntFloatParameter.h"
|
||||
#include "SbiLoader.h"
|
||||
#include "iOSPluginEditorWrapper/iOSPluginEditorWrapper.h"
|
||||
|
||||
#include <iterator>
|
||||
|
||||
const char *AdlibBlasterAudioProcessor::PROGRAM_INDEX = "Program Index";
|
||||
|
||||
static String doubleToString(double val) { return String(val); }
|
||||
static double stringToDouble(String s){return std::stod(s.toStdString());}
|
||||
|
||||
static String volumeDoubleToString(double val) { return String(val*100); }
|
||||
static double volumeStringToDouble(String s){return std::stod(s.toStdString())/100.0;}
|
||||
|
||||
|
||||
//static String boolToString(float val) { return (val == 1.0f) ? "active" : "inactive"; }
|
||||
//static bool stringToBool(String s) { return (s == "active") ? true : false; }
|
||||
|
||||
static String intToString(int val) { return String(val); }
|
||||
static int stringToInt(String s) { return std::stoi(s.toStdString()); }
|
||||
|
||||
//==============================================================================
|
||||
AdlibBlasterAudioProcessor::AdlibBlasterAudioProcessor()
|
||||
: i_program(-1)
|
||||
{
|
||||
//
|
||||
undoManager.reset(new UndoManager());
|
||||
valueTree.reset(new AudioProcessorValueTreeState(*this, undoManager.get()));
|
||||
using Parameter = AudioProcessorValueTreeState::Parameter;
|
||||
// Initalize OPL
|
||||
velocity = false;
|
||||
Opl = new Hiopl();
|
||||
|
@ -24,107 +42,460 @@ AdlibBlasterAudioProcessor::AdlibBlasterAudioProcessor()
|
|||
params.push_back(new EnumFloatParameter("Carrier Wave",
|
||||
StringArray(waveforms, sizeof(waveforms)/sizeof(String)))
|
||||
);
|
||||
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Wave"),
|
||||
String("Carrier Wave"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(waveforms)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Modulator Wave",
|
||||
StringArray(waveforms, sizeof(waveforms)/sizeof(String)))
|
||||
);
|
||||
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Wave"),
|
||||
String("Modulator Wave"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(waveforms)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
|
||||
const String frq_multipliers[] = {
|
||||
"x0.5", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x10", "x12", "x12", "x15", "x15"
|
||||
};
|
||||
params.push_back(new EnumFloatParameter("Carrier Frequency Multiplier",
|
||||
StringArray(frq_multipliers, sizeof(frq_multipliers)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Frequency Multiplier"),
|
||||
String("Carrier Frequency Multiplier"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(frq_multipliers)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Modulator Frequency Multiplier",
|
||||
StringArray(frq_multipliers, sizeof(frq_multipliers)/sizeof(String)))
|
||||
);
|
||||
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Frequency Multiplier"),
|
||||
String("Modulator Frequency Multiplier"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(frq_multipliers)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
const String levels[] = {"0.00 dB", "0.75 dB", "1.50 dB", "2.25 dB", "3.00 dB", "3.75 dB", "4.50 dB", "5.25 dB", "6.00 dB", "6.75 dB", "7.50 dB", "8.25 dB", "9.00 dB", "9.75 dB", "10.50 dB", "11.25 dB", "12.00 dB", "12.75 dB", "13.50 dB", "14.25 dB", "15.00 dB", "15.75 dB", "16.50 dB", "17.25 dB", "18.00 dB", "18.75 dB", "19.50 dB", "20.25 dB", "21.00 dB", "21.75 dB", "22.50 dB", "23.25 dB", "24.00 dB", "24.75 dB", "25.50 dB", "26.25 dB", "27.00 dB", "27.75 dB", "28.50 dB", "29.25 dB", "30.00 dB", "30.75 dB", "31.50 dB", "32.25 dB", "33.00 dB", "33.75 dB", "34.50 dB", "35.25 dB", "36.00 dB", "36.75 dB", "37.50 dB", "38.25 dB", "39.00 dB", "39.75 dB", "40.50 dB", "41.25 dB", "42.00 dB", "42.75 dB", "43.50 dB", "44.25 dB", "45.00 dB", "45.75 dB", "46.50 dB", "47.25 dB"};
|
||||
params.push_back(new EnumFloatParameter("Carrier Attenuation",
|
||||
StringArray(levels, sizeof(levels)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Attenuation"),
|
||||
String("Carrier Attenuation"),
|
||||
"",
|
||||
// NormalisableRange<float>(0.0f, sizeof(levels)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Modulator Attenuation",
|
||||
StringArray(levels, sizeof(levels)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Attenuation"),
|
||||
String("Modulator Attenuation"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(levels)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
|
||||
const String depth[] = {"Light", "Heavy"};
|
||||
params.push_back(new EnumFloatParameter("Tremolo Depth",
|
||||
StringArray(depth, sizeof(depth)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Tremolo Depth"),
|
||||
String("Tremolo Depth"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(depth)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
|
||||
params.push_back(new EnumFloatParameter("Vibrato Depth",
|
||||
StringArray(depth, sizeof(depth)/sizeof(String)))
|
||||
);
|
||||
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Vibrato Depth"),
|
||||
String("Vibrato Depth"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(depth)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
const String onoff[] = {"Disable", "Enable"};
|
||||
params.push_back(new EnumFloatParameter("Carrier Tremolo",
|
||||
StringArray(onoff, sizeof(onoff)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Tremolo"),
|
||||
String("Carrier Tremolo"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(onoff)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Carrier Vibrato",
|
||||
StringArray(onoff, sizeof(onoff)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Vibrato"),
|
||||
String("Carrier Vibrato"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(onoff)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Carrier Sustain",
|
||||
StringArray(onoff, sizeof(onoff)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Sustain"),
|
||||
String("Carrier Sustain"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(onoff)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Carrier Keyscale Rate",
|
||||
StringArray(onoff, sizeof(onoff)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Keyscale Rate"),
|
||||
String("Carrier Keyscale Rate"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(onoff)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Modulator Tremolo",
|
||||
StringArray(onoff, sizeof(onoff)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Tremolo"),
|
||||
String("Modulator Tremolo"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(onoff)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Modulator Vibrato",
|
||||
StringArray(onoff, sizeof(onoff)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Vibrato"),
|
||||
String("Modulator Vibrato"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(onoff)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Modulator Sustain",
|
||||
StringArray(onoff, sizeof(onoff)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Sustain"),
|
||||
String("Modulator Sustain"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(onoff)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Modulator Keyscale Rate",
|
||||
StringArray(onoff, sizeof(onoff)/sizeof(String)))
|
||||
);
|
||||
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Keyscale Rate"),
|
||||
String("Modulator Keyscale Rate"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(onoff)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
const String ksrs[] = {"None","1.5 dB/8ve","3 dB/8ve","6 dB/8ve"};
|
||||
params.push_back(new EnumFloatParameter("Carrier Keyscale Level",
|
||||
StringArray(ksrs, sizeof(ksrs)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Keyscale Level"),
|
||||
String("Carrier Keyscale Level"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(ksrs)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Modulator Keyscale Level",
|
||||
StringArray(ksrs, sizeof(ksrs)/sizeof(String)))
|
||||
);
|
||||
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Keyscale Level"),
|
||||
String("Modulator Keyscale Level"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(ksrs)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
const String algos[] = {"Frequency Modulation", "Additive"};
|
||||
params.push_back(new EnumFloatParameter("Algorithm",
|
||||
StringArray(algos, sizeof(algos)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Algorithm"),
|
||||
String("Algorithm"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(algos)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
|
||||
params.push_back(new IntFloatParameter("Modulator Feedback", 0, 7));
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Feedback"),
|
||||
String("Modulator Feedback"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, 7.0f),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new IntFloatParameter("Carrier Attack", 0, 15));
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Attack"),
|
||||
String("Carrier Attack"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, 15.0f),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new IntFloatParameter("Carrier Decay", 0, 15));
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Decay"),
|
||||
String("Carrier Decay"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, 15.0f),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new IntFloatParameter("Carrier Sustain Level", 0, 15));
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Sustain Level"),
|
||||
String("Carrier Sustain Level"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, 15.0f),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new IntFloatParameter("Carrier Release", 0, 15));
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Release"),
|
||||
String("Carrier Release"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, 15.0f),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new IntFloatParameter("Modulator Attack", 0, 15));
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Attack"),
|
||||
String("Modulator Attack"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, 15.0f),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new IntFloatParameter("Modulator Decay", 0, 15));
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Decay"),
|
||||
String("Modulator Decay"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, 15.0f),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new IntFloatParameter("Modulator Sustain Level", 0, 15));
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Sustain Level"),
|
||||
String("Modulator Sustain Level"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, 15.0f),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new IntFloatParameter("Modulator Release", 0, 15));
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Release"),
|
||||
String("Modulator Release"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, 15.0f),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
|
||||
const String sensitivitySettings[] = {"None", "Low", "High"};
|
||||
params.push_back(new EnumFloatParameter("Carrier Velocity Sensitivity",
|
||||
StringArray(sensitivitySettings, sizeof(sensitivitySettings)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Carrier Velocity Sensitivity"),
|
||||
String("Carrier Velocity Sensitivity"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(sensitivitySettings)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
params.push_back(new EnumFloatParameter("Modulator Velocity Sensitivity",
|
||||
StringArray(sensitivitySettings, sizeof(sensitivitySettings)/sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Modulator Velocity Sensitivity"),
|
||||
String("Modulator Velocity Sensitivity"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(sensitivitySettings)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
|
||||
const String emulators[] = {"DOSBox", "ZDoom"};
|
||||
params.push_back(new EnumFloatParameter("Emulator",
|
||||
StringArray(emulators, sizeof(emulators)/sizeof(String)))
|
||||
);
|
||||
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Emulator"),
|
||||
String("Emulator"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(emulators)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
const String percussion[] = { "Off", "Bass drum", "Snare", "Tom", "Cymbal", "Hi-hat" };
|
||||
params.push_back(new EnumFloatParameter("Percussion Mode",
|
||||
StringArray(percussion, sizeof(percussion) / sizeof(String)))
|
||||
);
|
||||
valueTree->createAndAddParameter(std::make_unique<Parameter> (String("Percussion Mode"),
|
||||
String("Percussion Mode"),
|
||||
"",
|
||||
//NormalisableRange<float>(0.0f, sizeof(percussion)/sizeof(String)),
|
||||
NormalisableRange<float>(0.0f, 1.0f),
|
||||
0.0f,
|
||||
doubleToString,
|
||||
stringToDouble,
|
||||
false,
|
||||
true)
|
||||
);
|
||||
|
||||
for(unsigned int i = 0; i < params.size(); i++) {
|
||||
paramIdxByName[params[i]->getName()] = i;
|
||||
valueTree->addParameterListener (params[i]->getName(), this);
|
||||
}
|
||||
|
||||
valueTree->state = ValueTree (JucePlugin_Name);
|
||||
|
||||
initPrograms();
|
||||
|
||||
for(std::map<String,std::vector<float>>::iterator it = programs.begin(); it != programs.end(); ++it) {
|
||||
|
@ -453,7 +824,7 @@ void AdlibBlasterAudioProcessor::setIntParameter (String name, int value)
|
|||
int i = paramIdxByName[name];
|
||||
IntFloatParameter* p = (IntFloatParameter*)params[i];
|
||||
p->setParameterValue(value);
|
||||
setParameter(i, p->getParameter());
|
||||
setParameter(i, p->getParameter(), true);
|
||||
}
|
||||
|
||||
void AdlibBlasterAudioProcessor::setEnumParameter (String name, int index)
|
||||
|
@ -461,7 +832,7 @@ void AdlibBlasterAudioProcessor::setEnumParameter (String name, int index)
|
|||
int i = paramIdxByName[name];
|
||||
EnumFloatParameter* p = (EnumFloatParameter*)params[i];
|
||||
p->setParameterIndex(index);
|
||||
setParameter(i, p->getParameter());
|
||||
setParameter(i, p->getParameter(), true);
|
||||
}
|
||||
|
||||
int AdlibBlasterAudioProcessor::getIntParameter (String name)
|
||||
|
@ -483,12 +854,33 @@ bool AdlibBlasterAudioProcessor::getBoolParameter(String name)
|
|||
return 0 != getEnumParameter(name);
|
||||
}
|
||||
|
||||
void AdlibBlasterAudioProcessor::parameterChanged (const String& parameterID, float newValue) {
|
||||
int i = paramIdxByName[parameterID];
|
||||
DBG("Change: "<< parameterID);
|
||||
setParameter (i, newValue, false, false);
|
||||
}
|
||||
|
||||
void AdlibBlasterAudioProcessor::beginChangeGesture (String name) {
|
||||
getParameterPointer(name)->beginChangeGesture();
|
||||
}
|
||||
void AdlibBlasterAudioProcessor::endChangeGesture (String name) {
|
||||
getParameterPointer(name)->endChangeGesture();
|
||||
}
|
||||
// Parameters which apply directly to the OPL
|
||||
void AdlibBlasterAudioProcessor::setParameter (int index, float newValue)
|
||||
void AdlibBlasterAudioProcessor::setParameter (int index, float newValue, bool notify, bool updatetoHost)
|
||||
{
|
||||
FloatParameter* p = params[index];
|
||||
p->setParameter(newValue);
|
||||
String name = p->getName();
|
||||
if (updatetoHost) {
|
||||
if (notify) {
|
||||
valueTree->getParameter(name)->setValueNotifyingHost(newValue);
|
||||
} else {
|
||||
valueTree->getParameter(name)->setValue(newValue);
|
||||
}
|
||||
}
|
||||
|
||||
DBG("Parameter: " << name << " - " << newValue <<" - "<< p->getParameter() <<" Notify: " << String::formatted("%d", notify) << " updatetoHost" << String::formatted("%d", updatetoHost) );
|
||||
int osc = 2; // Carrier
|
||||
if (name.startsWith("Modulator")) {
|
||||
osc = 1;
|
||||
|
@ -672,9 +1064,14 @@ int AdlibBlasterAudioProcessor::getCurrentProgram()
|
|||
|
||||
void AdlibBlasterAudioProcessor::updateGuiIfPresent()
|
||||
{
|
||||
PluginEditor* gui = (PluginEditor*)getActiveEditor();
|
||||
if (gui) {
|
||||
gui->updateFromParameters();
|
||||
if (auto activeEditor = getActiveEditor())
|
||||
{
|
||||
#if JUCE_IOS
|
||||
if (auto editor = dynamic_cast<iOSPluginEditorWrapper*>(activeEditor))
|
||||
activeEditor = editor->getEditor();
|
||||
#endif
|
||||
if (auto editor = dynamic_cast<PluginEditor*>(activeEditor))
|
||||
editor->updateFromParameters();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -832,9 +1229,15 @@ bool AdlibBlasterAudioProcessor::hasEditor() const
|
|||
|
||||
AudioProcessorEditor* AdlibBlasterAudioProcessor::createEditor()
|
||||
{
|
||||
PluginEditor* gui = new PluginEditor(this);
|
||||
gui->updateFromParameters();
|
||||
return gui;
|
||||
|
||||
AudioProcessorEditor* editor = new PluginEditor(this);
|
||||
static_cast<PluginEditor*>(editor)->updateFromParameters();
|
||||
|
||||
#if JUCE_IOS
|
||||
editor = new iOSPluginEditorWrapper(*this, editor);
|
||||
#endif
|
||||
|
||||
return editor;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
@ -966,7 +1369,6 @@ const char* AdlibBlasterAudioProcessor::getChannelEnvelopeStage(int idx) const
|
|||
return isChannelEnabled(idx) ? Opl->GetState(idx) : CHANNEL_DISABLED_STRING;
|
||||
}
|
||||
|
||||
|
||||
//==============================================================================
|
||||
// This creates new instances of the plugin..
|
||||
AudioProcessor* JUCE_CALLTYPE createPluginFilter()
|
||||
|
|
68
Source/PluginProcessor.h
Normal file → Executable file
68
Source/PluginProcessor.h
Normal file → Executable file
|
@ -17,7 +17,7 @@
|
|||
|
||||
|
||||
//==============================================================================
|
||||
class AdlibBlasterAudioProcessor : public AudioProcessor
|
||||
class AdlibBlasterAudioProcessor : public AudioProcessor, public AudioProcessorValueTreeState::Listener
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
|
@ -27,29 +27,35 @@ public:
|
|||
~AdlibBlasterAudioProcessor();
|
||||
|
||||
//==============================================================================
|
||||
void prepareToPlay (double sampleRate, int samplesPerBlock);
|
||||
void releaseResources();
|
||||
void prepareToPlay (double sampleRate, int samplesPerBlock) override;
|
||||
void releaseResources() override;
|
||||
|
||||
void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages);
|
||||
void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) override;
|
||||
|
||||
//==============================================================================
|
||||
AudioProcessorEditor* createEditor();
|
||||
bool hasEditor() const;
|
||||
AudioProcessorEditor* createEditor() override;
|
||||
bool hasEditor() const override;
|
||||
|
||||
//==============================================================================
|
||||
const String getName() const;
|
||||
const String getName() const override;
|
||||
|
||||
static const int MAX_INSTRUMENT_FILE_SIZE_BYTES = 1024;
|
||||
|
||||
int getNumParameters();
|
||||
int getNumParameters() override;
|
||||
|
||||
float getParameter (int index) override;
|
||||
void setParameter (int index, float newValue, bool notify = false, bool updatetoHost= true);
|
||||
|
||||
float getParameter (int index);
|
||||
void setParameter (int index, float newValue);
|
||||
void setEnumParameter (String name, int newValue);
|
||||
void setIntParameter (String name, int newValue);
|
||||
|
||||
void beginChangeGesture (String name);
|
||||
void endChangeGesture (String name);
|
||||
|
||||
int getIntParameter (String name);
|
||||
int getEnumParameter (String name);
|
||||
bool getBoolParameter(String name);
|
||||
|
||||
void loadInstrumentFromFile(String filename);
|
||||
void saveInstrumentToFile(String filename);
|
||||
void setParametersByRegister(int register_base, int op, uint8 value);
|
||||
|
@ -63,29 +69,31 @@ public:
|
|||
|
||||
void updateGuiIfPresent();
|
||||
|
||||
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 acceptsMidi() const;
|
||||
bool producesMidi() const;
|
||||
bool silenceInProducesSilenceOut() const;
|
||||
double getTailLengthSeconds() const;
|
||||
const String getParameterName (int index) override;
|
||||
const String getParameterText (int index) override;
|
||||
const String getInputChannelName (int channelIndex) const override;
|
||||
const String getOutputChannelName (int channelIndex) const override;
|
||||
bool isInputChannelStereoPair (int index) const override;
|
||||
bool isOutputChannelStereoPair (int index) const override;
|
||||
|
||||
bool acceptsMidi() const override;
|
||||
bool producesMidi() const override;
|
||||
bool silenceInProducesSilenceOut() const override;
|
||||
double getTailLengthSeconds() const override;
|
||||
//==============================================================================
|
||||
int getNumPrograms();
|
||||
int getCurrentProgram();
|
||||
void setCurrentProgram (int index);
|
||||
const String getProgramName (int index);
|
||||
void changeProgramName (int index, const String& newName);
|
||||
int getNumPrograms() override;
|
||||
int getCurrentProgram() override;
|
||||
void setCurrentProgram (int index) override;
|
||||
const String getProgramName (int index) override;
|
||||
void changeProgramName (int index, const String& newName) override;
|
||||
|
||||
RangedAudioParameter* getParameterPointer(String parameterId) {
|
||||
return valueTree->getParameter(parameterId);
|
||||
}
|
||||
void parameterChanged (const String& parameterID, float newValue) override;
|
||||
//==============================================================================
|
||||
void getStateInformation (MemoryBlock& destData);
|
||||
void setStateInformation (const void* data, int sizeInBytes);
|
||||
void getStateInformation (MemoryBlock& destData) override;
|
||||
void setStateInformation (const void* data, int sizeInBytes) override;
|
||||
|
||||
public:
|
||||
String lastLoadFile;
|
||||
|
@ -106,6 +114,8 @@ private:
|
|||
std::deque<int> used_channels; // most recently used at end
|
||||
float currentScaledBend;
|
||||
|
||||
std::unique_ptr<UndoManager> undoManager;
|
||||
std::unique_ptr<AudioProcessorValueTreeState> valueTree;
|
||||
//==============================================================================
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AdlibBlasterAudioProcessor)
|
||||
};
|
||||
|
|
0
Source/SbiLoader.h
Normal file → Executable file
0
Source/SbiLoader.h
Normal file → Executable file
0
Source/adlib.h
Normal file → Executable file
0
Source/adlib.h
Normal file → Executable file
0
Source/config.h
Normal file → Executable file
0
Source/config.h
Normal file → Executable file
0
Source/dbopl.cpp
Normal file → Executable file
0
Source/dbopl.cpp
Normal file → Executable file
0
Source/dbopl.h
Normal file → Executable file
0
Source/dbopl.h
Normal file → Executable file
0
Source/dosbox.h
Normal file → Executable file
0
Source/dosbox.h
Normal file → Executable file
0
Source/drov1.cpp
Normal file → Executable file
0
Source/drov1.cpp
Normal file → Executable file
0
Source/drov1.h
Normal file → Executable file
0
Source/drov1.h
Normal file → Executable file
0
Source/hardware.h
Normal file → Executable file
0
Source/hardware.h
Normal file → Executable file
0
Source/hiopl.cpp
Normal file → Executable file
0
Source/hiopl.cpp
Normal file → Executable file
0
Source/hiopl.h
Normal file → Executable file
0
Source/hiopl.h
Normal file → Executable file
65
Source/iOSPluginEditorWrapper/ScrollbarManager.cpp
Normal file
65
Source/iOSPluginEditorWrapper/ScrollbarManager.cpp
Normal file
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
ScrollbarManager.cpp
|
||||
Created: 1 Jul 2020 2:59:58am
|
||||
Author: discoDSP
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "ScrollbarManager.h"
|
||||
|
||||
ScrollbarManager::ScrollbarManager(Viewport& vp) : viewport(vp)
|
||||
{
|
||||
viewport.addMouseListener(this, true);
|
||||
viewport.setScrollBarsShown(false, false, true, false);
|
||||
scrollEnabled(false);
|
||||
|
||||
};
|
||||
|
||||
ScrollbarManager::~ScrollbarManager()
|
||||
{
|
||||
viewport.removeMouseListener(this);
|
||||
};
|
||||
|
||||
void ScrollbarManager::mouseDown(const MouseEvent& event)
|
||||
{
|
||||
jassert(constraints.size() != 0);
|
||||
|
||||
auto e = event.getEventRelativeTo(&viewport);
|
||||
|
||||
auto position = e.getMouseDownPosition();
|
||||
|
||||
for (auto rectangle : constraints)
|
||||
{
|
||||
if (rectangle.contains(position))
|
||||
{
|
||||
scrollEnabled(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void ScrollbarManager::mouseUp(const MouseEvent& event)
|
||||
{
|
||||
if (viewport.isScrollOnDragEnabled())
|
||||
scrollEnabled(false);
|
||||
};
|
||||
|
||||
void ScrollbarManager::addConstraint(int initialX, int initialY, int width, int height)
|
||||
{
|
||||
constraints.emplace_back(initialX, initialY, width, height);
|
||||
};
|
||||
|
||||
void ScrollbarManager::removeAllConstraints()
|
||||
{
|
||||
if (!constraints.empty())
|
||||
constraints.clear();
|
||||
};
|
||||
|
||||
void ScrollbarManager::scrollEnabled(bool enabled)
|
||||
{
|
||||
viewport.setScrollOnDragEnabled(enabled);
|
||||
}
|
||||
|
43
Source/iOSPluginEditorWrapper/ScrollbarManager.h
Normal file
43
Source/iOSPluginEditorWrapper/ScrollbarManager.h
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
=============================================================================
|
||||
|
||||
ScrollbarManager.
|
||||
Created: 1 Jul 2020 2:59:58a
|
||||
Author: discoDSP
|
||||
|
||||
=============================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "JuceHeader.h"
|
||||
|
||||
/**
|
||||
* This enables/disables the scrollbar if the user clicks inside the area of a constraint
|
||||
* */
|
||||
|
||||
class ScrollbarManager : public MouseListener
|
||||
{
|
||||
public:
|
||||
|
||||
ScrollbarManager(Viewport& vp);
|
||||
|
||||
~ScrollbarManager();
|
||||
|
||||
virtual void mouseDown(const MouseEvent& event) override;
|
||||
|
||||
virtual void mouseUp(const MouseEvent& event) override;
|
||||
|
||||
void addConstraint(int initialX, int initialY, int width, int height);
|
||||
|
||||
void removeAllConstraints();
|
||||
|
||||
void scrollEnabled(bool);
|
||||
|
||||
private:
|
||||
|
||||
Viewport& viewport;
|
||||
|
||||
std::vector<Rectangle<int>> constraints;
|
||||
|
||||
};
|
164
Source/iOSPluginEditorWrapper/iOSPluginEditorWrapper.cpp
Normal file
164
Source/iOSPluginEditorWrapper/iOSPluginEditorWrapper.cpp
Normal file
|
@ -0,0 +1,164 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
iOSPluginEditorWrapper.cpp
|
||||
Created: 2 Sep 2020 8:09:38pm
|
||||
Author: Javier Andoni Aizpuru Rodríguez
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "iOSPluginEditorWrapper.h"
|
||||
|
||||
iOSPluginEditorWrapper::iOSPluginEditorWrapper(juce::AudioProcessor& p, juce::AudioProcessorEditor* e) :
|
||||
AudioProcessorEditor(p)
|
||||
{
|
||||
viewport = std::make_unique<Viewport>();
|
||||
|
||||
disableViewportDragOnSliderDrag(*e);
|
||||
|
||||
viewport->setViewedComponent(e, true);
|
||||
|
||||
scrollbarManager = std::make_unique<ScrollbarManager>(*viewport.get());
|
||||
|
||||
addAndMakeVisible(viewport.get());
|
||||
|
||||
initialW = e->getWidth();
|
||||
|
||||
previousW = initialW;
|
||||
|
||||
initialH = e->getHeight();
|
||||
|
||||
ratio = initialW / initialH;
|
||||
|
||||
if (p.wrapperType == juce::AudioProcessor::wrapperType_Standalone || hostType.isGarageBand())
|
||||
isStandaloneWrapper = true;
|
||||
|
||||
auto resizable = !isStandaloneWrapper;
|
||||
setResizable(resizable, resizable);
|
||||
|
||||
e->setResizable(false, false);
|
||||
|
||||
setSize(initialW, initialH);
|
||||
}
|
||||
|
||||
iOSPluginEditorWrapper::~iOSPluginEditorWrapper()
|
||||
{
|
||||
scrollbarManager.reset();
|
||||
viewport.reset();
|
||||
}
|
||||
|
||||
void iOSPluginEditorWrapper::paint (juce::Graphics& g)
|
||||
{
|
||||
g.fillAll(Colours::black);
|
||||
};
|
||||
void iOSPluginEditorWrapper::resized()
|
||||
{
|
||||
|
||||
if (hostType.isGarageBand())
|
||||
{
|
||||
auto parent = getParentComponent();
|
||||
auto parentWidth = parent->getWidth();
|
||||
|
||||
if (parentWidth != getWidth())
|
||||
setSize(parentWidth, getHeight());
|
||||
};
|
||||
|
||||
auto localBounds = getLocalBounds();
|
||||
|
||||
viewport->setBounds(localBounds);
|
||||
|
||||
auto editorWidth = localBounds.getWidth();
|
||||
|
||||
auto calculateHeight = [this, &editorWidth] ()
|
||||
{
|
||||
return ceil(static_cast<float>(editorWidth) / ratio);
|
||||
};
|
||||
|
||||
auto editor = viewport->getViewedComponent();
|
||||
auto factor = editorWidth / initialW;
|
||||
auto t = juce::AffineTransform::scale(factor);
|
||||
editor->setTransform(t);
|
||||
|
||||
//Set correct scrollbar view position
|
||||
|
||||
auto editorHeight = calculateHeight();
|
||||
auto scrollbarFactor = editorWidth / previousW;
|
||||
auto t2 = juce::AffineTransform::scale(scrollbarFactor);
|
||||
auto viewportPosition = viewport->getViewPosition();
|
||||
viewportPosition.applyTransform(t2);
|
||||
|
||||
auto containerHeight = localBounds.getHeight();
|
||||
|
||||
if (editorHeight > containerHeight)
|
||||
{
|
||||
auto diff = editorHeight - containerHeight;
|
||||
auto gapProportion = editorHeight * 0.05f;
|
||||
|
||||
if (diff < gapProportion)
|
||||
viewportPosition = juce::Point<int>();
|
||||
}
|
||||
|
||||
viewport->setViewPosition(viewportPosition);
|
||||
|
||||
//Adding scrollbar manager constrainers
|
||||
auto constraintWidth = initialScrollBarWidth * factor;
|
||||
|
||||
scrollbarManager->removeAllConstraints();
|
||||
scrollbarManager->addConstraint(0, 0, constraintWidth, editorHeight);
|
||||
scrollbarManager->addConstraint(editorWidth - constraintWidth, 0, constraintWidth, editorHeight);
|
||||
|
||||
if (isStandaloneWrapper)
|
||||
{
|
||||
//Center vertically if editor doesn't cover whole screen area
|
||||
auto height = getHeight();
|
||||
|
||||
if (editorHeight < height)
|
||||
viewport->setTopLeftPosition(0, (height - editorHeight) / 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Setting window resize limits
|
||||
auto minW = ceil(initialW * 0.25f);
|
||||
auto minH = ceil(initialH * 0.25f);
|
||||
auto maxW = initialW * 4;
|
||||
|
||||
if (editorHeight < minH)
|
||||
editorHeight = minH;
|
||||
|
||||
setResizeLimits(minW, minH, maxW, editorHeight);
|
||||
}
|
||||
|
||||
previousW = editorWidth;
|
||||
};
|
||||
|
||||
void iOSPluginEditorWrapper::setInitialScrollbarWidth(int width)
|
||||
{
|
||||
initialScrollBarWidth = width;
|
||||
}
|
||||
|
||||
void iOSPluginEditorWrapper::disableViewportDragOnSliderDrag(juce::Component& component)
|
||||
{
|
||||
auto sliderList = std::vector<Component*>();
|
||||
|
||||
std::function<void(Component&, std::vector<Component*>&)> addSlidersToVector;
|
||||
|
||||
addSlidersToVector = [&addSlidersToVector] (Component& c, std::vector<Component*>& v)
|
||||
{
|
||||
if (auto slider = dynamic_cast<juce::Slider*>(&c))
|
||||
v.push_back(slider);
|
||||
else for (auto child : c.getChildren())
|
||||
addSlidersToVector(*child, v);
|
||||
};
|
||||
|
||||
addSlidersToVector(component, sliderList);
|
||||
|
||||
for (auto slider : sliderList)
|
||||
slider->setViewportIgnoreDragFlag(true);
|
||||
|
||||
}
|
||||
|
||||
AudioProcessorEditor* iOSPluginEditorWrapper::getEditor()
|
||||
{
|
||||
return static_cast<AudioProcessorEditor*>(viewport->getViewedComponent());
|
||||
}
|
49
Source/iOSPluginEditorWrapper/iOSPluginEditorWrapper.h
Normal file
49
Source/iOSPluginEditorWrapper/iOSPluginEditorWrapper.h
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
iOSPluginEditorWrapper.h
|
||||
Created: 2 Sep 2020 6:31:15pm
|
||||
Author: Javier Andoni Aizpuru Rodríguez
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "JuceHeader.h"
|
||||
#include "ScrollbarManager.h"
|
||||
|
||||
class iOSPluginEditorWrapper :
|
||||
public juce::AudioProcessorEditor
|
||||
{
|
||||
public:
|
||||
|
||||
iOSPluginEditorWrapper(juce::AudioProcessor& p, juce::AudioProcessorEditor* e);
|
||||
|
||||
~iOSPluginEditorWrapper();
|
||||
|
||||
void paint (juce::Graphics& g) override;
|
||||
|
||||
void resized() override;
|
||||
|
||||
void setInitialScrollbarWidth(int);
|
||||
|
||||
AudioProcessorEditor* getEditor();
|
||||
|
||||
private:
|
||||
|
||||
void disableViewportDragOnSliderDrag(juce::Component& c);
|
||||
|
||||
double initialW, initialH, ratio, previousW;
|
||||
|
||||
int initialScrollBarWidth { 20 };
|
||||
|
||||
bool isStandaloneWrapper { false };
|
||||
|
||||
std::unique_ptr<juce::Viewport> viewport { nullptr };
|
||||
|
||||
std::unique_ptr<ScrollbarManager> scrollbarManager { nullptr };
|
||||
|
||||
juce::PluginHostType hostType;
|
||||
|
||||
};
|
0
Source/inout.h
Normal file → Executable file
0
Source/inout.h
Normal file → Executable file
0
Source/itoa.h
Normal file → Executable file
0
Source/itoa.h
Normal file → Executable file
0
Source/logging.h
Normal file → Executable file
0
Source/logging.h
Normal file → Executable file
0
Source/nkopl3.cpp
Normal file → Executable file
0
Source/nkopl3.cpp
Normal file → Executable file
0
Source/nkopl3.h
Normal file → Executable file
0
Source/nkopl3.h
Normal file → Executable file
0
Source/opl.h
Normal file → Executable file
0
Source/opl.h
Normal file → Executable file
0
Source/pic.h
Normal file → Executable file
0
Source/pic.h
Normal file → Executable file
0
Source/setup.h
Normal file → Executable file
0
Source/setup.h
Normal file → Executable file
0
Source/windows.h
Normal file → Executable file
0
Source/windows.h
Normal file → Executable file
Loading…
Reference in a new issue