HexoSynth 2022 - Devlog #3 - Chunk of GUI Work
The HexoSynth modular synthesizer (programmed in Rust) got back basic DSP matrix editing.
This week I worked primarily on many little things in the GUI. From porting widgets from the old code base, implementing proper live signal feed back to fixing up some loose ends in the GUI code. The GUI is finally back in a state where very basic editing of the DSP matrix is possible again. Lots of editing features are still missing of course.
- HexoSynth: Implemented connection editing with the recently added connection popup. You can setup new connections and clear exiting connections. Even error detection and rollback are handled in case you connect two outputs to one input (which is not possible in HexoSynth without additional mixing/crossfading nodes).
- HexoSynth: Added WichText widget for multi line texts to HexoSynth WLambda API and quickly connected the hover callbacks for the DSP node picker to it.
- HexoSynth: Display parameter help texts in the new help text panel:
- HexoTK: Put more work in the TestDriver for the GUI toolkit HexoTK, also added the corresponding WLambda API to HexoSynth. So that I can soon start the test suite for the HexoSynth GUI.
- HexoSynth: Improved the GUI testing framework that is built into HexoTK and HexoSynth. The Painter abstraction in HexoTK now records drawn elements such as labels or special debug areas including meta information. Meta information such as: Widget IDs, tags, pixel positions of the element on the screen and the corresponding widget position. Also a complete path that currently consists of styling class names is recorded. WLambda with it's special data structure selectors fits perfectly to search in this data structure for the right element: The testing framework works by executing a WLambda script/function before each frame, which can inject mouse and keyboard events and inspect the recorded meta information of the previous frame (the Painter abstraction records text labels and widget specific debug areas, with their position and more annotated information). Here you can see how the script relates to the drawn GUI:
- WLambda: To be able to provide a HexoSynth binary, I need to include the WLambda sources for HexoSynth at compile time. For this I added a way for the WLambda module resolver to preload files.
- HexoSynth: Experimented around with nih-plug today, to check if I could easily make a VST3 and/or CLAP plugin from HexoSynth. Porting the code worked so far. Just making it all work took some debugging, but in the end it worked out:
- HexoSynth Bugfix: Today I fixed a bug, when dragging in a new node over an existing selected node, the parameter panel would not update. For this I added the MatrixRecorder, which would record changes in the Matrix. And added a callback to the UI, for querying it. Later I wrote a test case for testing exactly this bug. I also added the functionality to place complete DSP chain templates. This is not only useful for test fixtures, but also later I want to base a user exposed feature on this functionality.
- HexoDSP: Added a hint to the atom settings, to provide the UI with a hint to determine which kind of widget to use.
- HexoDSP: Fixed a test case for the matrix serialized representation, I switched to storing denormalized values at some point but forgot to update that test.
- HexoSynth: Added mode selector widgets for the atom settings in the parameter panel.
- HexoSynth: Implemented also very basic cluster movement, but without any error handling yet.
- HexoTK: Wired up the per frame drawing, to draw the LEDs of the hex tiles. Unfortunately I still got some work to do, to render the layers of the GUI properly.
- HexoTK: Still got some fundamental thing wrong in HexoTK about the layered and cached drawing. Now the children widgets are also properly drawn into their parent cache image. With that now in place, the per frame drawn live LEDs are not visible through the layers above them anymore!
- HexoSynth: The signal connections between the hexgrid cells are now properly drawn and animated too. The synthesizer finally comes back to life!
- HexoTK: Ported over the old Octave Keys widget from my old Tuix code base to HexoTK.
- HexoDSP: Fixed a bug in the CQnt node. Some changes on the keys were not recognized correctly.
- HexoSynth: Added save and load buttons for the "init.hxy".
- HexoSynth: Added the octave keys widget to the WLambda API and wired it into the parameter panel.
- HexoTK: Graph widget reimplemented/ported now. Next up is making it available in HexoSynth.
- HexoSynth: Graphs are finally back and implemented:
- HexoSynth: The node picker was slightly improved by color coding the button borders. This will maybe help finding the right category easier.
YouTube Sound Demos
In case you are wondering, how does it sound? Here I collected the YouTube videos I uploaded this week:
The first one is not really listen worthy:
The second one got back the keyboard for the quantizer, which lead to much more melodic sounds:
An older video on YouTube:
One or two other videos you will also find on the first Devlog.
Devlog 3 Conclusion
This week brought progress on so many fronts. I'm really pushing forward these days, to restore the old GUI functionality. Once proper patch/preset management has been implemented, I can also work on new GUI features. Like inserting whole chains of DSP nodes. More randomization functionality in creating patches, such as creating random DSP chains to incite creativity with signal flows. I want the GUI make you experiment around with sound design and discover new signal flows.
The DSP core in HexoDSP is quite solid and stable already. The whole graph works flawlessly and I can't wait to add more DSP nodes/modules. There is a looong list of DSP nodes/modules I want to implement.
A very important thing in HexoSynth is also the built in online help for all the nodes and parameters. That is something I found very off putting in VCV Rack. You had no quick reference for all the parameters or how they were supposed to work.
Many points from the last week have been crossed off the immediate list. These are remaining however:
- Implement more graph editing mouse gestures to the DSP matrix.
- Show input/output signal graphs of the selected DSP node.
- Reimplement the in depth DSP node documentation with texts in HexoDSP.
- Add back editing CV widgets.
- Bring back the pattern sequencer editor.
- Implement a basic sample browser to load samples in the Sampl node.
Especially the pattern sequencer is an important feature I will concentrate on the next days. It's still the only sequencer HexoSynth got, even though I will add many more types of sequencers eventually.
In case you find this project interesting or have questions,
you can reach me via Discord these days, check out the
in the Rust Audio Discord. Optionally I'm also online
on IRC (via Matrix) in the Linux Audio Developer channel
on Libera.Chat: irc:#firstname.lastname@example.org.