Check the Requirements documentation for information about which VST3 SDK Jamba supports and how to get it.
- Fixed class name collision with Audio Unit
- Use
FetchContent_Populate
/FetchContent_MakeAvailable
withSOURCE_SUBDIR
option (see CMake discussion)
- Fixes issues with some DAWs on Windows when using the bundle format
- Fixes the
create-plugin.py
tool on Windows
- Fixed deprecated CMake warnings with
FetchContent_Populate
- Migrated Jamba to use VST3 SDK 3.7.12 (release notes)
- Use download url/hash in blank plugin
- Migrated Jamba to use VST3 SDK 3.7.8 (release notes). Please check other release notes to see what has changed since 3.7.5 (last Jamba supported version).
- As explained in issue #16, Jamba is no longer supporting VST2
- Added a way to patch the SDK by defining the CMake cache string
JAMBA_VST3SDK_PATCH_DIR
(Jamba uses it on Windows/DLL build to fix an issue withwin32resourcestream.cpp
, but you can also use it for your own purposes): by defining this variable, 2 things happen- Jamba copies the SDK inside the build folder
- Jamba copies all the files under
${JAMBA_VST3SDK_PATCH_DIR}
on top of this copy while never modifying a local version of the SDK
Remove the
option(JAMBA_ENABLE_VST2 "Use VST2" ON)
entry from yourCMakeLists.txt
(and you can clean up any references to vst2 if you want to).Note that if you do not remove it (or set it to
OFF
), anyvst2_sources
will try to get compiled and this will no longer work
- Fixed NaN issue with
stringToFloat
by changing its return convention (0
instead ofNaN
) due tofast-math
option which assumes that there is no NaN in the code. - Fixed invalid
version.h
file generated on Windows - Integrated with GitHub actions in order to do a matrix style testing (which uncovered the 2 previous issues)
- Windows 10 Visual Studio 2019 & 2022
- macOS 11 (Xcode 13.2) & macOS 12 (Xcode 14.2)
- Fixes compilation issues with XCode 14+
- Automatically adds libraries (
LINK_LIBRARIES
) to the universal build (M1 builds) - Removed most warnings coming from the SDK/Jamba
- Enhanced
AudioBuffer
API
- Added support for arrays of properties (see Plugin.h for a full example). For example, you can now write:
// Parameters VstParams<bool, 2> fArrayVst; // State RTVstParams<bool, 2> fArrayVst;
- Upgraded GoogleTest to 1.13.0 (and download a zip instead of cloning the repo)
- Fixed gtest crash on Apple M1 platform
- Migrated Jamba to use VST3 SDK 3.7.5 (introduces breaking changes)
- Requires CMake minimum version 3.19 (SDK requirement)
- Added
inspect
command to run theVST3Inspector
tool - Added
info
command to run themoduleinfotool
tool (new since SDK 3.7.5) - Generate and bundle
moduleinfo.json
(new since SDK 3.7.5) - On Windows, build a module (
.vst3
folder) instead of a DLL whenVST2
is disabled - Use json format instead of xml (new since SDK 3.7.2)
InitModule()
(resp.DeinitModule()
) cannot be used anymore (since the SDK now implements them). Instead, you need to useSteinberg::ModuleInitializer
(resp.Steinberg::ModuleTerminator
) concept. If your code simply has empty implementations for these functions, you can safely delete them.- You should provide the version of the plugin in the project definition (required by
moduleinfotool
)# From CMakeLists.txt project(MyPlugin VERSION "${PLUGIN_VERSION}")
- The
GlobalKeyboardHook::onKeyDown
andGlobalKeyboardHook::onKeyUp
methods have been replaced by a singleGlobalKeyboardHook::onKeyboardEvent
(due to changes in the SDK)
- Added support for snapshot
- Processes
Info.plist
through CMake replacement, thus allowing to inject dates, versions, etc... - Processes
Info.plist
through Xcode preprocessing when using Xcode generator - Fixed issue when plugin was generated without Xcode generator (macOS only) which lead to an
Info.plist
without proper version - Use latest version of GoogleTest (get rid of CMake warnings)
- Use
gtest_discover_tests
instead ofgtest_add_tests
to minimize CMake invocation when building tests - Make sure that
.rc
file gets regenerated properly when resource files change (Windows) - Fixed test issue
Due to the change in
Info.plist
processing, you should replace:<-- File mac/Info.plist --> <-- Replace this (processed only via Xcode preprocessing) --> <key>CFBundleExecutable</key> <string>$(EXECUTABLE_NAME)</string> <-- With this (processed with all generators) --> <key>CFBundleExecutable</key> <string>@MACOSX_BUNDLE_EXECUTABLE_NAME@</string>Note that since Audio Unit plugins are only generated with the Xcode generator, this change is not necessary for
audio-unit/Info.plist
- Fixed issue #11: create-plugin.py instructions point to wrong configure script
- Fixed issue #10: jamba is for python 3.7+
- Fixed compilation issue on Windows
- Added support for Apple Silicon / universal build and macOS target deployment (no code change)
- Added (optional)
ARCHIVE_FILENAME
andARCHIVE_ARCHITECTURE
to the mainjamba_add_vst_plugin
CMake api
- Apple Silicon support is optional but if you want to benefit from it you need to change your
CMakeLists.txt
- You can check the migration guide for more details and help.
- You can also go to Jamba Web Quickstart, generate a blank plugin and use the generated
CMakeLists.txt
as an example. - You can also check the documentation plugin for another example.
- Added
JambaPluginFactory::GetNonDistributableVST3PluginFactory
function to create a plugin that would not be distributable - Added default implementation to
IParamSerializer
methods - Fixed Audio Unit build (changes in VST 3.7.0)
- Added missing
uninstall-au
command tojamba.py
- Migrated Jamba to use VST3 SDK 3.7.1
- SDK 3.7.1 made a number of changes in the cmake based build files (mostly renaming) and it is all covered by Jamba unless you have been using those symbols directly in your own cmake build files
- SDK 3.7.1 renamed the define
EXPORT_FACTORY
intoSMTG_EXPORT_SYMBOL
. Jamba is adding it back for backward compatibility (inPluginFactory.h
) but you may want to update it.
- Migrated Jamba to use VST3 SDK 3.7.0
- Major refactoring of CMake files to make it easier to use and extend/customize (check CMake Build)
- Replaced main dev script implementation with a python script (with the added benefit that the Windows version is now on par with the macOS one). Note that the wrapper shell scripts (
jamba.sh
andjamba.bat
) are still the official way to invoke it andjamba.py
should be treated as an implementation detail. - Improved main script to run multiple commands (ex:
jamba.sh test validate
) - Replaced configure script with a python script (blank plugin now uses it)
- Added many new (cmake) targets so that you no longer have to rely on the script. For example running the editor can now simply be achieved by building the
jmb_run_editor
target. - Jamba itself has not changed (no new API) and only very few tweaks were required to migrate to 3.7.0
- You will need to migrate your main
CMakeLists.txt
to invokejamba_add_vst_plugin
which is the new (cmake) API to add a VST3 plugin (single call).- You can check the migration guide for more details and help.
- You can also go to Jamba Web Quickstart, generate a blank plugin and use the generated
CMakeLists.txt
as an example. - You can also check the documentation plugin for another example.
- Note that the zip file generated by the archive command / target is slightly different due to the use of
cpack
(but due to the CMake refactoring it is easy to turn it off entirely or implement your own)
- Because Jamba now uses VST3 SDK 3.7.0 there might be APIs that you were using from the SDK that have changed (for example Drag'n'Drop is handled differently)
- Because the latest VST3 SDK does not include VST2 anymore, you need to provide it as a separate path (
VST2_SDK_ROOT
) - Jamba now has a requirement on python (3) for the script (note that you can disable generation of the script by using the CMake option
JAMBA_ENABLE_DEV_SCRIPT
in which case python is not required) install
command no longer deletes the folder before installation. Use./jamba.sh uninstall install
if you want this behavior.prod
command has been removed from main dev script (equivalent tojamba.sh -r -b test validate archive
but check migration guide for details on how to add it back as a target if you really need it)- Requires CMake 3.19
- Tested on macOS 10.14.6 with Xcode 11.3.1 (may work with prior versions but untested). Note that there is no requirement changes for Windows.
- If you want to benefit from the new configure python script (
configure.py
), simply copy it from the blank plugin (it is 100% generic so it will work for any Jamba project)
-
Improved messaging (GUI <-> RT) and VST2 performance by using
FastWriteMemoryStream
(a faster implementation ofMemoryStream
) -
Added the ability to show and dismiss a dialog view (for example, an About view or an alert):
// Example from some controller (aboutButton is a TextButtonView) aboutButton->setOnClickListener([this] { fState->showDialog("about_dialog"); }); // From another controller tied to the about_dialog view (set via the sub-controller attribute) dismissButton->setOnClickListener([this] { fState->dismissDialog(); });
-
Updated loguru to latest (as of master on 2020-03-31)
-
Added missing
using
types andtoUTF8String()
methods toXXXParam
classes -
Added
resetToDefault()
method to all parameters (since a default value is provided when the parameter is created, it is a very convenient way to get back to it without having to know about it and using some global constant) -
Added
ExpiringDataCache
concept (usingTimer
from the VST3 SDK) -
Renamed the plugin file from the blank plugin to
Plugin.h
(instead of the name of the plugin) -
Changed the way the plugin gets registered to the VST3 world (implements the main
GetPluginFactory()
function) with an easier and less error prone syntax:EXPORT_FACTORY Steinberg::IPluginFactory* PLUGIN_API GetPluginFactory() { return JambaPluginFactory::GetVST3PluginFactory< pongasoft::test::jamba::RT::JambaTestPluginProcessor, // processor class (Real Time) pongasoft::test::jamba::GUI::JambaTestPluginController // controller class (GUI) >("pongasoft", // vendor "https://www.pongasoft.com", // url "[email protected]", // email stringPluginName, // plugin name FULL_VERSION_STR, // plugin version Vst::PlugType::kFx // plugin category (can be changed to other like kInstrument, etc...) ); }
-
This new syntax is optional and the old/macro based syntax is still valid and acceptable (new blank plugins will be created using this new methodology). If you want to migrate your codebase to the new factory you can check this commit for the
JambaSampleGain
project as an example.
- Handle state deprecation which allows a plugin to change the state saved by a previous version in a non backward compatible way (for example removing parameters)
- Added
StepPadView
to allow a parameter value to be changed by dragging the mouse (useful for lcd displays, etc...) - Fixed
MomentaryButtonView
to decouple the state of the button with the value of the parameter (which caused several rendering issues)
- Added
ParamImageView
to render a parameter value as an image (very useful for status LEDs, etc...) - Added
ImageView
to render an image (useful for static images, logos, decals, stickers, etc...) - Upgraded
googletest
to1.10.0
(due to CMake caching, this requires deleting the CMake build folder to take effect on existing projects)
-
Due to issues with implicit conversion triggering potential hard crash, deprecated implicit conversion to
T
for all params (RTRawVstParam
,RTParam
,GUIRawVstParam
,GUIVstParam
,GUIJmbParam
,GUIOptionalParam
). -
Added convenient dereference operator (
operator *
) to all params as a shortcut to invoke.value()
(which is the preferred way to fix the deprecated warnings) -
Added convenient equality and relational operators to all params so that the params still continue to behave like the underlying type (
T
) in many instances -
Handle
toUTF8String()
for Jmb parameter when no serializer is provided by checking the availability ofostream<<
forT
-
Allow the use of the template name
_
for the switch container view (for example to use as an overlay that is shown/hidden)
- Added Visual Studio Code configuration files for Windows 10
This release contains a lot of big changes. Although I tried my best to be backward compatible there may be a few changes that might be breaking.
-
Build requirements: Jamba now requires C++17 and Visual Studio Build Tools 2019 (for Windows) (note that XCode 9.2 remains the requirement for macOS)
-
Major GUI parameter refactoring:
- Introduced
IGUIParameter
and typed hierarchy (ITGUIParameter<T>
) as the base of all GUI parameters - Introduced
GUIOptionalParam
to handle Vst, Jmb or no parameter in a consistent fashion - Introduced the concept of discrete parameter (
IGUIParameter::asDiscreteParameter(int32 iStepCount)
) to convert (if possible) any parameter into a discrete parameter (which is a parameter backed by anint32
with a given number of steps) - Refactored most views to use the new optional and discrete parameter concepts, thus making them way more flexible
- Changed
MomentaryButtonView
andToggleButtonView
to use discrete parameter concept (thus allowing other types thanbool
) and allowing to override the value of the steps representing on and off. - Changed
SwitchViewContainer
to use discrete parameter concept, thus allowing to use any Vst or Jmb parameter that is (or can be interpreted as) a discrete parameter.
- Introduced
-
Major renaming: introduced
ParamAware
(formerlyGUIParamCxAware
) andStateAware
(formerlyPluginAccessor
) (added deprecation warnings for old names) and related. -
Jmb GUI parameters no longer needed to be explicitly added to
GUIState
(similar to Vst parameters) -
Added
IDiscreteConverter<T>
concept for Jmb parameters to be able to convert a Jmb parameter to a discrete parameter -
Added
ParamDisplayView
to display the value of any parameter (Vst or Jmb) -
Added
DebugParamDisplayView
to display and highlight the value of a parameter (very useful during development) -
Added
ListAttribute
to handle attributes backed by a list of values (for example enumeration)// Example (from StepButtonView.h) registerListAttribute<EArrowDirection>("arrow-direction", &StepButtonView::getArrowDirection, &StepButtonView::setArrowDirection, { {"auto", EArrowDirection::kAuto}, {"up", EArrowDirection::kUp}, {"right", EArrowDirection::kRight}, {"down", EArrowDirection::kDown}, {"left", EArrowDirection::kLeft} }
-
Simplified parameter initialization by allowing to use initializer list and added more generic
DiscreteTypeParamConverter
:// Example: with DiscreteTypeParamConverter, no need to specify size in advance. Also note the // use of the initializer list to initialize it. fEnumClassVst = vst<DiscreteTypeParamConverter<EEnumClass>>(EJambaTestPluginParamID::kEnumClassVst, STR16("EnumClassVst"), { {EEnumClass::kEnumClass0, STR16("kEC0 (vst)")}, {EEnumClass::kEnumClass1, STR16("kEC1 (vst)")}, {EEnumClass::kEnumClass2, STR16("kEC2 (vst)")}, {EEnumClass::kEnumClass3, STR16("kEC3 (vst)")}, }) .add();
-
Added
jamba-test-plugin
to the Jamba project as a unit test/development plugin for Jamba (demonstrates ALL available views) -
Added
test.sh
to conveniently run the jamba tests (which are declared byjamba-test-plugin
) from the command line -
Added
test_jamba
target to run the jamba tests from the IDE -
Added 2 different sets of UUIDs in blank plugin to handle Debug vs Release deployments
- Changed the way Jamba handles parameter registration:
- Introduced
ICustomViewLifecycle
which is now used instead ofGUIParamCxAware
(inCustomViewFactory
) - The default behavior is now to call
ParamAware::unregisterAll()
followed byParamAware::registerParameters()
- The consequence is that the
registerParameters
method that you implement in your view is much simpler because it does not have to handle previously registered parameters (which was not trivial to keep an accurate track of) - Allow multiple registrations per paramID. Prior to this release, registering multiple callbacks per paramID resulted in only the last one registered being called. Now all of them will be called.
- Introduced
StepButtonView
andDiscreteButtonView
now use discrete values only (no longerdouble
). Check the documentation on how to use it instead (ex: an increment of0.1
can be converted to an increment of1
with a step count of10
).- Changed
TagID
to be an unsigned int (ParamID
akauint32
) - Changed default template type for
DiscreteValueParamConverter
to be anint32
- Although care has been taken with renaming/adding deprecation warnings for old names, there is a chance (mostly with templated parameters) that it may impact compilation.
- fixed blank plugin
initialize
API to match superclass
- Implemented #6: added cmake targets
build_vst3
,test_vst3
,install_vst3
,install_vst2
,build_au
andinstall_au
- This change allows those targets to be used directly in an IDE and for example use them for debugging (ex: attach a DAW executable to
install_vst2
orinstall_vst3
) - Modified
jamba.sh
andjamba.bat
to use the new cmake targets (making the scripts more generic) - Added ability to customize (extend or completely override) the following targets:
build_vst3
by setting an optionalBUILD_VST3_TARGET
variabletest_vst3
by setting an optionalTEST_VST3_TARGET
variablebuild_au
by setting an optionalBUILD_AU_TARGET
variable
- released Jamba website with Quickstart section to make it very easy to generate a blank plugin (answer a few questions in the browser)
- added (optional) VST3 SDK automatic download to the blank plugin (web and command line)
- fixed blank plugin creation issue when no company was provided
- fixed
jamba.sh
script to handle filename with white spaces and install audio unit before validation (validation tool unfortunately works from an installed component, not a file...)
- added audio unit validation to
jamba.sh
script (jamba.sh validate-au
) which runs theauvaltool
utility on the audio unit plugin - added switch container view to handle tab like switching (check
Views::SwitchContainerView
) - added (optional) image for text buttons (
Views::TextButtonView
) - added (optional) disabled state for momentary buttons (
Views::MomentaryButtonView
) - added discrete button view (a button which is "on" only when the backing discrete parameter matches the
step
value). This button can be used for radio groups, tabs, etc... (checkViews::DiscreteButtonView
)
- There is a small potentially breaking API change with function
Views::createCustomView
(defined inViews/CustomViewCreator.h
). Check commit. The function takes an additional 2 parameters which can be safely ignored if you don't need them.
- added ability to conveniently register a global key hook (check
Views::registerGlobalKeyboardHook
) - parameters now copy the provided strings (title, short tile and units) so that they no longer have to be static and for example can be computed
- added convenient methods to
AudioBuffers
andChannel
(copyFrom
andforEachSample
). Definedconst
and nonconst
versions. - added Step Button view which is a button that increment/decrement a parameter by a fixed amount when clicked. Another amount (tied to shift click) can be provided.
- fixed minor bugs
- Use shallow cloning to avoid downloading the (unused) project history
-
This is a major release with many changes (a few breaking APIs)
-
Added
TextViewButton
on which you can register aonClickListener
or implementonClick
. Also handles disabled state. -
Added
ScrollbarView
which implements a scrollbar tied to 2 parameters (offset and zoom) -
Added
CustomController
to implement a custom controller tied into Jamba (access to Vst/Jmb parameters and state) -
Added ability to easily switch to a new view (
GUIController::switchToView
) -
Added
GUIJmbParameter::updateIf
to update the value in place when necessary -
Added callback APIs to
GUIParamCxAware
registerCallback<bool>(fParams->fMyParam, [this] (GUIVstParam<bool> &iParam) { flushCache(); });
-
Added registering callbacks and parameters on a view without inheriting from it (can be used from controllers
verifyView
method):auto button = dynamic_cast<Views::TextButtonView *>(iView); if(button) { auto callback = [] (Views::TextButtonView *iButton, GUIJmbParam<SampleData> &iParam) { iButton->setMouseEnabled(iParam->hasUndoHistory()); }; fState->registerConnectionFor(button) ->registerCallback<SampleData>(fState->fSampleData, std::move(callback), true); }
-
Added optional arguments to
Parameters::vst<>()
(resp.Parameters::jmb<>()
) that get passed through the converter (resp. serializer) allowing syntax likefPlayModeHold = vst<BooleanParamConverter>(1201, // param ID STR16("Play Mode"), // param title STR16("Trigger"), STR16("Hold")) // BooleanParamConverter args
-
Requires C++14
-
Added
EnumParamConverter
for Vst parameters backed by an enum -
Added
Range
concept -
Refactored
CustomViewCreator
code to simplify writing individual attributes. IntroducedMarginAttribute
,RangeAttribute
, andGradientAttribute
-
Refactored
Lerp
class to deal with type parameters differently (TFloat
for math precision,X
for type of x,Y
for type of y). IntroducedSPLerp
(single precision) andDPLerp
(double precision) as well as several convenient methods. Example:// this will interpolate (SP=single precision) // X -> the time (long) from the range [0, fFadeDuration] // Y -> to the alpha (uint8_t) range [255, 0] (opaque -> transparent) // Note that although X and Y types are integer flavors, the interpolation will use floats // and the value returned will be cast to uint8_t fColor.alpha = Utils::mapValueSPXY<long, uint8_t>(iTime, 0, fFadeDuration, 255, 0);
-
GUIParamCxAware
(which is the class used for registering parameters) has been simplified withregisterParam
methods (when the type is known). -
Moved
PluginAccessor
into its own header file -
Removed
CustomViewInitializer
AudioBuffers
now properly handles null buffers- Fixed issue with non Xcode build (Xcode generator is only required for audio unit building) and allow building with CLion
- Fixed #4: Generate AU Plugin Manufacturer code from name instead of company
- Implemented #1: Eliminate resource declaration duplication
- Implemented #2: Optionally generate audio unit wrapper
- Implemented #3: Make VST2 support truly optional
- Upgraded to cmake 3.12
- Consolidated dev scripts into a single
jamba.sh
(respjamba.bat
) script - Uses
Xcode
as the cmake generator on macOS
- Updated license terms
- Added ability to create a jamba enabled blank plugin: the plugin simply copies the input to the output and offers all the capabilities of jamba (build, test, edit, validate, install, etc...).
- Introduced Jamba parameters to handle non VST parameters and messaging RT <-> GUI
- Added
Debug::ParamTable
andDebug::ParamLine
to display parameters => example
| ID | TITLE | TYP | OW | TRS | SHA | DEF.N | DEF.S | STP | FLG | SHORT | PRE | UID | UNS |
--------------------------------------------------------------------------------------------------------------
| 1000 | Bypass | vst | rt | | | 0.000 | Off | 1 | 65537 | Bypass | 4 | 0 | |
--------------------------------------------------------------------------------------------------------------
| 2010 | Left Gain | vst | rt | | | 0.700 | +0.00dB | 0 | 1 | GainL | 2 | 0 | |
--------------------------------------------------------------------------------------------------------------
| 2011 | Right Gain | vst | rt | | | 0.700 | +0.00dB | 0 | 1 | GainR | 2 | 0 | |
--------------------------------------------------------------------------------------------------------------
| 2012 | Link | vst | ui | | | 1.000 | On | 1 | 1 | Link | 4 | 0 | |
--------------------------------------------------------------------------------------------------------------
| 2020 | Reset Max | vst | rt | | | 0.000 | Off | 1 | 1 | Reset | 4 | 0 | |
--------------------------------------------------------------------------------------------------------------
| 2000 | VuPPM | vst | rt | x | | 0.000 | 0.0000 | 0 | 1 | VuPPM | 4 | 0 | |
--------------------------------------------------------------------------------------------------------------
| 3000 | Stats | jmb | rt | x | x | | -oo | | | | | | |
--------------------------------------------------------------------------------------------------------------
| 2030 | Input Text | jmb | ui | | | | Hello from GUI | | | | | | |
--------------------------------------------------------------------------------------------------------------
| 3010 | UIMessage | jmb | ui | x | x | | | | | | | | |
--------------------------------------------------------------------------------------------------------------
- Implemented lock free, memory allocation free and copy free version of SingleElementQueue and AtomicValue
- Generate build, test, validate, edit and install scripts
- Added jamba-sample-gain documentation project
- first public release / free / open source