20 Commits

Author SHA1 Message Date
Xaymar e9fcf1408b Host 0x0E -> 0x0D: Missed one of the off-by-1 errors
This explains why my test code using the header wasn't working.
2025-08-08 02:38:09 +02:00
Xaymar d23a117ecc Add editorconfig file for automatically trimming whitespace 2025-08-08 02:38:09 +02:00
Xaymar c9629ad8d3 Fix all host opcodes being offset by 1 or two 2025-08-08 01:54:21 +02:00
Xaymar 87b3e2bcfc Hopefully fix documentation not updating on push 2025-08-06 05:19:28 +02:00
Xaymar 9dd8de817f Update README 2025-08-06 05:18:17 +02:00
Xaymar 41a24b0f07 Mac OS exclusivity isn't an important thing either 2025-08-06 04:21:22 +02:00
Xaymar 0049af4720 VST version changes aren't important enough to warrant red boxes 2025-08-06 04:17:56 +02:00
Xaymar 35125a732b Various fixes for documentation 2025-08-06 04:14:15 +02:00
Xaymar 21998dbbc0 Fix wrong reference to VST_HOST where we wanted VST_EFFECT 2025-08-06 04:07:08 +02:00
Xaymar fa02ffef09 Fix incorrect type definition in vst.hpp 2025-08-06 04:06:23 +02:00
Xaymar ce354e3824 Fix duplicate definition of VST_EFFECT_OPCODE_43 2025-08-06 04:05:31 +02:00
Xaymar 5e65ee89ca Fix incorrect definition for vst_host_callback_t 2025-08-06 03:56:51 +02:00
Xaymar 3c7322c90d Oops: VST_EFFECT_OPCODE_PARAM_PROPERTIES is actually 0x38
Late night coding while sleepy tends to invite mistakes.
2025-08-06 03:46:49 +02:00
Xaymar 3beabeef6d Add vst.hpp to automatically generated docs 2025-08-06 03:33:52 +02:00
Xaymar 6a1e5be101 Automatically generate documentation for hosting via Github Pages
In addition to the extensive header documentation available lets also have doxygen generate proper HTML for the web.
2025-08-06 03:22:14 +02:00
Xaymar f5779515c2 More documentation improvements 2025-08-06 02:51:57 +02:00
Xaymar 4b0f52863f More documentation improvments 2025-08-06 02:29:41 +02:00
Xaymar b49fb7872d More C99 compat improvements and doxygen support 2025-08-06 00:49:20 +02:00
Xaymar 06245409e8 Improve documentation for speakers and vkey op-codes 2025-08-05 23:56:02 +02:00
Xaymar adc0352d59 Float parameters are sometimes required to be normalized within 0.0 and 1.0 2025-08-05 15:58:38 +02:00
7 changed files with 3982 additions and 401 deletions
+17
View File
@@ -0,0 +1,17 @@
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file.
[*]
insert_final_newline = true
trim_trailing_whitespace = true
charset = utf-8
indent_style = tab
indent_size = 4
[*.{yml,yaml}]
insert_final_newline = true
trim_trailing_whitespace = true
charset = utf-8
indent_style = space
indent_size = 2
+86
View File
@@ -0,0 +1,86 @@
name: Generate Documentation
on:
push:
branches:
- 'root'
- '!documentation'
paths:
- '.github/workflows/documentation.yml'
- 'vst.h'
- 'vst.hpp'
- 'Doxyfile'
jobs:
docs:
name: "Generate Documentation"
runs-on: ubuntu-latest
steps:
- name: "Set up Git"
shell: bash
run: |
git config --global user.name 'GitHub Actions'
git config --global user.email 'xaymar@users.noreply.github.com'
git config --global pull.ff only
git config --global pull.rebase true
- name: "Clone"
uses: actions/checkout@v3
with:
submodules: 'recursive'
fetch-depth: 0
- name: "Clone Documentation Cache"
id: doc_cache
continue-on-error: true
uses: actions/checkout@v3
with:
ref: 'documentation'
path: 'build/docs/html'
submodules: 'recursive'
fetch-depth: 0
- name: "Initialize Documentation Cache"
if: steps.doc_cache.outcome == 'failure'
shell: bash
run: |
mkdir -p build/docs/html
pushd build/docs/html
git init
git switch --orphan documentation
git remote remove origin
git remote add -t documentation origin ${{ github.repositoryUrl }}
popd
- name: "Install Prerequisites"
shell: bash
run: |
sudo apt-get install -y clang-19 clang-tools-19 doxygen graphviz
- name: "Generate Documentation"
shell: bash
run: |
doxygen Doxyfile
- name: "Update Documentation"
shell: bash
run: |
pushd build/docs/html
git add .
git --no-pager diff --patch --minimal HEAD -- || true
git update-index --refresh
if ! git diff-index --quiet HEAD -- &> /dev/null; then
git commit -a -m "${{ github.sha }}"
# Only push from master branch.
if [[ "${{ github.ref }}" == "refs/heads/root" ]]; then
git push --set-upstream origin documentation
echo "Documentation has been updated!"
else
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
fi
else
echo "Documentation is still up to date."
fi
popd
+2
View File
@@ -0,0 +1,2 @@
/docs
/build
+2988
View File
File diff suppressed because it is too large Load Diff
+15 -7
View File
@@ -1,9 +1,14 @@
# About the Project
This is a completely "clean room" untainted reverse engineered "SDK" for the VST 2.x interface. It was reverse engineered from binaries where no license restricting the reverse engineering was attached, or where the legal system explicitly allowed reverse engineering for the purpose of interoperability.
## As seen in
[DISTRHO Plugin Framework](https://github.com/DISTRHO/DPF), [StompTuner](https://github.com/brummer10/StompTuner), [DF Zita Rev1](https://github.com/SpotlightKid/dfzitarev1), [TonPlugIns](https://github.com/Vhonowslend/TonPlugIns), [ToneTwistPlugs](https://github.com/brummer10/ToneTwistPlugs), [DF JPverb](https://github.com/SpotlightKid/dfjpverb), [CChorus](https://github.com/SpotlightKid/cchorus), [Dynation](https://github.com/vertver/Dynation) and likely more.
*(Want to be listed here? Open an Issue or Pull Request!)*
# Frequently Asked Questions
## Is this legal? Can I use this in my own product?
**Disclaimer:** I am not a lawyer. The information presented below is purely from available copyright laws that I could find about this topic. You should always consult with a lawyer first before including this in your product.
**Disclaimer:** I am not a lawyer. Consult a real lawyer before including this in a paid product. The information presented below is purely from available copyright laws that I could find about this topic. You should always consult with a lawyer first before including this in your product.
As this only enables interoperability with existing VST 2.x programs and addons, it is considered to be reverse engineering in the name of interoperability. In most of the developed world, this is considered completely legal and is fine to be used by anyone, as long as it is not the only function of the product.
@@ -12,10 +17,13 @@ Note that this does not grant any patent licenses, nor does it grant you any rig
## Why recreate an SDK for something officially abandoned by the creators?
There is a ton of software that is only capable of loading VST2.x audio effects, and Steinberg has made no effort to create a VST3-to-VST2-adapter for that software. Notable software includes Audacity and OBS Studio, which both likely felt restricted by the license additions Steinberg added to the GPL license.
## How did you reverse engineer this?
The reverse engineering was done with various tools (mostly disassemblers to x86 assembly code), hooking into system APIs, attempting to mimic functionality through observation and testing, and other methods. Primarily Visual Studio Code was used to write the header files, and Visual Studio 2019 Express was used to create fake VST plugins/hosts to figure out actual behavior.
## What was used to create this clean room project?
**Disclaimer:** I am not a lawyer. Consult a real lawyer before including this in a paid product.
### Which binaries were disassembled?
* A fake VST2 host (using this header) was created to verify against existing plugins.
* A fake VST2 plugin (using this header) was created to verify against existing hosts.
* OBS Studio and Audacity were used to verify compatability between closed source and open source VST hosts.
The initial version was created through the best available legal clean room reverse engineering method available. The whole process went through several rounds of the "telephone" game involving external developers and lawyers before the final document arrived on my desk. This initial version was barely functional as a lot of context ended up missing resulting in quite basic functionality.
This version went through several development cycles before settling on what I've now labelled as `v0.1.1`. It was stable and worked for the most part but lacked a lot of features. I've used it as a base for my own plug-ins and had quite a bit of success with it but the incompleteness of the recreated SDK was noticable. Eventually I recreated VST 3.x SDK compatible headers using the VST 3.x SDK which caused the license to upgrade from BSD 2-clause to BSD 3-clause - now known as `v0.2.0`.
As of late July/early August 2025, I had a found a bit of interest in this SDK again and didn't want to leave it in the incomplete state it was. I've recreated the fake plug-in and host that I used before and decided to automate behavior scanning: What do hosts or plug-ins expect us to do? What do they call? Etc. This was then let loose on several thousand available plug-ins and has resulted in the `v0.3.0` update to the SDK. As far as I can tell the SDK now has almost all functionality that VST 2.x plug-ins and hosts could want.
There's still a bit of work to do but it won't be easy as almost all of it involves structured data for which I can only guess. Progress is being made, but it's so much slower compared to when I had pages of telephone game documentation to work off of. Still better than nothing!
+872 -392
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -31,8 +31,8 @@
// Variable size variant of vst_speaker_arrangement.
template<size_t T>
struct vst_speaker_arrangement_dynamic_t {
VST_ARRANGEMENT_TYPE type; // See VST_SPEAKER_ARRANGEMENT_TYPE
int32_t channels; // Number of channels in speakers.
VST_SPEAKER_ARRANGEMENT_TYPE type; // See VST_SPEAKER_ARRANGEMENT_TYPE
int32_t channels; // Number of channels in speakers.
vst_speaker_properties_t speakers[T]; // Array of speaker properties, actual size defined by channels.
};