3 ms·
Going to ask some really stupid questions, apologies in advance: This is mindblowing work. I'm having some trouble wrapping my head around all of it. Will lead
by gavinray 5y ago
Going to ask some really stupid questions, apologies in advance:
This is mindblowing work. I'm having some trouble wrapping my head around all of it. Will lead with the context that:
A) I am not very familiar with audio programming specifics, or DSP at all. I have done some things with VST2 + VST3, and looked into LV2.
B) I have very little background with C++
I am curious:
1. Is this targeted more towards the DSP and algorithm side of audio plugin development, or is there interest/use for the plugin side too (IE, generating VST/LV2 compatible interfaces)?
2. Would a byproduct of this be that you would be able to implement functionality + interact with C++ classes from other languages? Or generate C ABI's? I see the note: "Automatically generate Python bindings for a C++ class"
I ask about the second one because I have been trying to work towards getting a C ABI for VST3 so that language bindings can be codegen'ed. I know VST3 works through COM so you can use that, but the alternative is to emulate the VTable layouts in C structs. This can make it easier than implementing COM in a language.
-----
Edit: I also wanted to say that when reading your blogpost, the way you write C++ is very easy to understand. Not sure if it's a stylistic thing or a purposeful choice. I usually have to spend a second reading C++ code to comprehend it, but in your snippets, I was able to (mostly) grok it first pass.
Same for the example code in the repo.
- jcelerier 5y agoThanks ! I don't think those questions are stupid at all, if anything those are things I should put in the README ! > 1. Is this targeted more towards the DSP and algorithm side of audio plugin development, or is there interest/use for the plugin side too (IE, generating VST/LV2 compatible interfaces)? it does generate something compatible with VST2.x and I've been working on VST3 this week-end (and pulling a few hairs, that API is horrendous, the smallest example is a few thousand lines of codes). For LV2 I don't think it will be directly possible as LV2 requires separate .ttl files which describe the plug-in. Technically one could make a small program which from the C++ reflection, outputs the .ttl on stdout and kindly ask CMake to call it and generate the .ttl file from it. > 2. Would a byproduct of this be that you would be able to implement functionality + interact with C++ classes from other languages? yes, that's a goal, make your DSP processor in C++ and then write a small UI for it in python or QML without having to write binding code. I've tried to find ways to auto-generate a C ABI but sadly: - asm("...") only wants string literals, strings generated through constexpr don't cut it (otherwise it'd be possible and even relatively easy to generate e.g. asm(R"( .global foo_set_x .text foo_set_x: jmp _ZN3foo5set_xEi )"); to wrap for instance a foo::set_x(int) method. - I tried writing directly the binary code and appending it to the ELF sections but it seems that there's no easy way to do append to .symtab / .stringtab where the name of the symbols are without using a linker script.
- gavinray 5y ago> "it does generate something compatible with VST2.x and I've been working on VST3 this week-end (and pulling a few hairs, that API is horrendous, the smallest example is a few thousand lines of codes)." Oh that is awesome!!! If you want a tip about the smallest possible VST3 implementation, (and maybe you already know this) there is a class called "SingleComponentEffect", and an example called "AGainSimple" that uses it and is a fully self-contained single file full VST3 plugin: https://github.com/steinbergmedia/vst3_public_sdk/search?q=singlecomponenteffect https://github.com/steinbergmedia/vst3_public_sdk/search?q=s... Also, I spent some time trying to get VST3 SDK usable with vcpkg so you could just do: // vcpkg.json { "name": "my-audio-lib", "dependencies": [ { "name": "vst3sdk", "version>=": "3.7.3" } ] } And your CMake would just install it for you: https://github.com/microsoft/vcpkg/issues/5660#issuecomment-922508478 https://github.com/microsoft/vcpkg/issues/5660#issuecomment-... It ended up requiring more changes than this, but in the end I wound up fixing the CMake build so it spit out both the VST3 SDK (helper classes) shared lib and the almost-header-only lib ("pluginterfaces" directory). I ought to upload the patches somewhere in case it's useful for you/anyone else. > "yes, that's a goal, make your DSP processor in C++ and then write a small UI for it in python or QML without having to write binding code." That would be incredible! I think the industry focus on doing UI in C++ is a bit nutty, as an outsider (but what do I know). > "- asm("...") only wants string literals, strings generated through constexpr don't cut it (otherwise it'd be possible and even relatively easy to generate e.g." Waaay over my head!!
- gavinray 5y agoAlright, I tried to push my fixed version of the VST3 SDK to Github but because it uses a ton of Git Submodules it didn't quite work. What I did instead was do: git diff > vst3sdk-no-vstgui-cmake-compatible.patch Which has a patch with the changes (EXCEPT for the file "Config.cmake.in") https://github.com/GavinRay97/vst3sdk/blob/master/vst3sdk-no-vstgui-cmake-compatible.patch https://github.com/GavinRay97/vst3sdk/blob/master/vst3sdk-no... I also just said fuck it and zipped up the whole project, you can download it here: https://github.com/GavinRay97/vst3sdk/blob/master/vst3sdk.zip https://github.com/GavinRay97/vst3sdk/blob/master/vst3sdk.zi... With this fixed version, using the VST3 SDK becomes much much easier. All you have to do is add it as a vendored subproject in CMake: project(VST3Example CXX) add_subdirectory(vendor/vst3sdk) add_executable(VST3Example src/main.cpp) target_compile_features(VST3Example PRIVATE cxx_std_20) target_include_directories(VST3Example PRIVATE vendor/vst3sdk) # This links SDK if you want to use the "SingleComponentEffect" target_link_libraries(VST3Example PUBLIC sdk) Where the project looks something like $ tree -L 2 . ├── CMakeLists.txt ├── src │ └── main.cpp └── vendor └── vst3sdk And then here's your VST3 in "main.cpp": #include "public.sdk/source/main/pluginfactory.h" #include "public.sdk/source/vst/vstsinglecomponenteffect.h" using namespace Steinberg; using namespace Steinberg::Vst; class MyVST : Steinberg::Vst::SingleComponentEffect {}; __declspec(dllexport) IPluginFactory* GetPluginFactory() {} Hope this helps! I am relatively clueless about C++ though!