Home

Awesome

vintage - a declarative API for C++ audio plug-ins

This is an experiment in seeing how far modern C++ features allow to write purely declarative code and introspect this code through various reflection-like features.

Building plug-ins

$ g++ \
  examples/audio_effect/distortion.cpp \
  -std=c++20 \
  -I include/ \
  -fPIC \
  -shared \
  -o Distortion.so

Building very very smol plug-ins

The example plug-in can be as small as 6.4kb on Linux:

$ clang++ \
  examples/audio_effect/distortion.cpp \
  -I include/ \
  -O3 \
  -march=native \
  -std=c++20 \
  -shared \
  -s \
  -Bsymbolic \
  -fvisibility=internal \
  -fvisibility-inlines-hidden \
  -fvisibility-inlines-hidden-static-local-var \
  -fstruct-path-tbaa \
  -fstrict-aliasing \
  -fstrict-vtable-pointers \
  -fno-semantic-interposition \
  -fno-stack-protector \
  -fno-ident \
  -fno-unwind-tables \
  -fno-asynchronous-unwind-tables \
  -fno-plt \
  -fvirtual-function-elimination \
  -flto \
  -fno-exceptions \
  -fno-rtti \
  -ffunction-sections \
  -fdata-sections \
  -fuse-ld=lld \
  -Wl,-O2 \
  -Wl,--lto-O3 \
  -Wl,-z,defs \
  -Wl,--as-needed \
  -Wl,--no-undefined \
  -Wl,--gc-sections \
  -Wl,--icf=all \
  -o Distortion.so

$ du -b Distortion.so
6368	Distortion.so

$ nm -C -D Distortion.so
w __cxa_finalize@GLIBC_2.2.5
w __gmon_start__
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
U memmove@GLIBC_2.2.5
U snprintf@GLIBC_2.2.5
U tanh@GLIBC_2.2.5
U tanhf@GLIBC_2.2.5
0000000000001940 T VSTPluginMain
U operator delete(void*)@GLIBCXX_3.4
U operator new(unsigned long)@GLIBCXX_3.4