3 ms·
Thanks ! 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 DS
by jcelerier 5y ago
Thanks ! 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!
- gpderetta 5y agoUsing gcc extended asm you can pass literal constants to the asm and they will be expanded textually (or at least their address will). I don't think the details are fully documented anywhere and I had to use intel syntax to make it work, but it might be possible even wit AT&T syntax. Take a look a this[1] for example. See how trampoline, the destructor and the size are passed in with the 'i' constraint and are referred to their value with the %cX constraint (yes, the code is write only and even with a lot of comments I have only the most vague idea of what I was trying to do here). Probably more work is require for PIC though. [1] https://github.com/gpderetta/delimited/blob/7e755d643ee458973e941b982fb7945b23804d9d/delimited.hpp#L115 https://github.com/gpderetta/delimited/blob/7e755d643ee45897...
- drmr 5y agoRe 1: Why not create a DPF wrapper for this and have DPF create the ladspa/dssi/vst2/vst3/lv2 for you? -> https://github.com/DISTRHO/DPF https://github.com/DISTRHO/DPF
- jcelerier 5y agoI had looked into it ! but it seemed that making a DPF plug-in involved a lot of boilerplate, while I really wanted to do something where I can just include a couple headers and get going, without any particular compilation hassle (the whole library is header-only as it is pretty much entirely templates).
- gavinray 5y agoThis is the absolute worst part of VST3. These 2 soul-crushing lines in the build file: https://github.com/steinbergmedia/vst3_pluginterfaces/blob/master/CMakeLists.txt#L2-L3 https://github.com/steinbergmedia/vst3_pluginterfaces/blob/m... # pluginterfaces should actually be a header-only library, # but it has some sources as well which need compilation. Should theoretically be fixable right, so that it's purely the interfaces and doesn't need compilation? Why on earth did they do it like this?...
- jcelerier 5y agoYeah, until now I had resigned myself to linking against stmg_common in cmake. But maybe they can be split out to simplify that whole... Thing. I almost have it working, will push tomorrow after some sleep and then will add vcpkg as you showed :)
- gavinray 5y ago> "I almost have it working, will push tomorrow after some sleep and then will add vcpkg as you showed :)" Bless, the hero we needed but didn't deserve
- spacechild1 5y ago