Weird Constructor / Posts / HexoSynth Modular Synthesizer in Rust - Devlog #11: VST3/CLAP Plugin Integration

HexoSynth Modular Synthesizer in Rust - Devlog #11: VST3/CLAP Plugin Integration

The HexoSynth modular synthesizer (programmed in Rust) has now a completed VST3/CLAP plugin integration.

If you don't want to dig through the detailed log:

TLDR: Skip to the Devlog 11 Conclusion Section

Detailed Log

This is the day by day log of my progress. If this is too verbose for your interest, please skip down to the Devlog 11 Conclusion Section.


HexoSynth: Started working on the external parameter GUI inside HexoSynth. Many DAWs don't show a list of parameters if the plugin has too many of them. So they rely on the plugin GUI to emit parameter changes when the user wiggles a button. For this HexoSynth now needs a big panel with 24 knobs for the ExtA1 to ExtF3 parameters.


HexoSynth: External parameter prototype/proof of concept is done, ExtA1 can now be used to drive the external parameters properly:

HexoSynth external plugin parameter proof of concept

I tested it using Bespoke as VST3 host, and it works smoothly:

HexoSynth in Bespoke, automating the ExtA1 parameter

HexoSynth: I've finally added a pre-commit git hook, which checks for formatting and if I accidentally try to check in a patched Cargo.toml somewhere.

HexoSynth: On the evening, I finished off the external parameter integration by adding the remaining 23 parameters up to ExtF3. Here is a stress test, where I wanted to see if updating all 24 parameters per frame works fine and does not hit pathological performance problems in HexoTK:

HexoSynth external parameter automation GUI stress test


WLambda: Added std:sys:env:var to access environment variables. This has a reason:

HexoSynth: Tests can now be enabled using an environment variable: HEXOSYNTH_TEST=1. For selecting only specific tests, you can set it to a string, like: HEXOSYNTH_TEST=move*.

HexoSynth: Finished the external parameter GUI integration now with a proper piece of help text, that explains what this "Ext" tab in the right panel is about. It's also neat to be able to shrink the oscilloscope to make these knobs bigger - but that was possible before too.

HexoSynth external parameter help text

HexoDSP: Next I finished the VST3/CLAP plugin integration by adding an Inp node. With this node you get access to the two audio input channels of HexoSynth. You can build your own custom effects now using this.


I've released some crates to

HexoTK: I've started working on a Markdown to WichText translator. I decided it's best to go for a more standard format when documenting stuff in HexoDSP. I don't want to make HexoDSP depend directly on the WichText widget from HexoTK. It will also provide a more pleasant syntax for placing images for the documentation of the mouse gestures in HexoSynth.


HexoTK: Started rewrite of the Markdown to WichText translator, because the markdown crate is not maintained anymore and did not even properly handle horizontal rules. So I started again with the pulldown-cmark crate, which has been working amazingly so far. Did not expect the pull (SAX style) API would simplify the code and formatting a bit. Or maybe it was just the experience from the first try.


HexoTK: I finished the work on the Markdown to WichText translator. Still need to use it in HexoSynth though. So no update images yet.

YouTube Sound Demos

Devlog 11 Conclusion

The VST3/CLAP plugin integration has been finished this week. Big thanks to the nih-plug framework at this point. What does an integration mean at this point?

  • MIDI note input
  • MIDI CC input
  • (Automateable) plugin parameters
  • Audio input (for making audio effects with HexoSynth)

With that the following remaining items have been crossed off the list now:

  • Add a bank of knobs for the 24 external parameters, so that you can wiggle them from inside HexoSynth. This is important for a lot of DAWs. It also makes the external parameters even more useful, by controlling them directly from inside the DAW.
  • Adding an input DSP node to receive audio data from the DAW in HexoSynth.

This finishes work on this area of HexoSynth. Aside from the release of some utility crates/libraries nothing much interesting happened this week. Most notably I started with the work on the online help by writing that Markdown to WichText translator. That will come into play in future when I write the introduction tutorial and other documentation.

That leaves us with the following items for the future until a more refined release of HexoSynth:

  • Rewrite the online help.
  • Add a getting started tutorial.
  • Add more automated test cases for the UI workflow.
  • Add inserting DSP chains that are to be pre-defined. And also inserting random DSP chains for a more explorative/experimental workflow.
  • Add back editing CV widgets.


In case you find this project interesting or have questions, you can reach me via Discord these days, check out the #hexosynth channel in the Rust Audio Discord. Optionally I'm also online on IRC (via Matrix) in the Linux Audio Developer channel #lad (nickname 'wct') on Libera.Chat:


Weird Constructor Avatar
Weird Constructor

Nice end 30 y/o guy, geek and F(L)OSS developer that messes with: Linux, Windows, Networking, Interpreters/Compilers, Games, Audio, Music, GUIs, C/C++, Rust, Scheme/Lisp, 3D printing, electronics and more.

For updates follow me on Mastodon

All the F(L)OSS development on my projects happens in my spare time. If you find what I do useful, entertaining or just want to support me, you can do this via Liberapay:

Donate using Liberapay