I thought I’d post a update about what happened with the 4400 series builds.
- Early last week I released build 4400 thinking it was pretty stable
- By mid week a few crash reports came in (thanks to those who tried it out) and I started fixing them one by one. This was going ok, nothing too unexpected.
- By Friday I was starting to see some very unexpected results.
I spent most of Friday trying to understand what was happening and realized that the changes in the higher level parts of the engine were bending the old audio engine in ways it wasn’t designed for. This is the problem with trusting code you wrote over a decade ago. ![]()
I then spent the rest of Friday and half of Saturday designing a new approach that would eliminate all these edge conditions.
I then spent the rest of Saturday, Sunday and Monday retrofitting this new design to the existing code base. But by the time I got about quarter of the way through I had about 3,000 build errors and no way to test anything until finished. This wasn’t going to end well.
Tuesday morning, I decided to stick with the new design but start with a clean slate. I created a new empty project and started moving things over one by one and will test as I go.
Current status is:
- New clean project
- About 80% of the basic plumbing in place
- Main engine object done
- Audio drivers done
- Threading support done
- Interop messaging done
- New execution planner done
- Object lifetime management done
- Lots of utilities moved over
- New - Mock execution node and Mock audio driver for testing
- Some basic unit tests
That leaves:
- about 50 main “execution nodes” - this is where the bulk of the work will be and includes things like audio mixers, MIDI routing and plugin hosting.
- a bunch of unit tests to be written.
- lots utility and support code that can be brought over mostly as is.
- updating the rest of Cantabile to any changes in the engine API (not too many)
Regarding that last point - this is mostly related to how MIDI objects are connected together.
- In the old design, audio is pulled from the end of the audio chain moving backwards to the start - while MIDI is pushed from the start of the chain forward. ie: audio connects through “Audio Sources” and MIDI connects using “MIDI Targets”.
- In the new model everything comes from a source - so everywhere in Cantabile that connects a MIDI provider to a MIDI target that code needs to be flipped so the receiving object connects to a MIDI source.
Besides fixing the issues with 4400, the new design also brings:
- Much reduced
UI -> RTthread messaging (guessing as much as 95% less) - More efficient
RT -> UIthread messaging - Smarter execution planning
- More efficient audio cycle execution
- More efficient multi-core CPU scheduling
- A simpler coding model
While I’m at it, I’m removing anything old, hacky, redundant.
- Removed the “double buffer” setting
(the added complexity is not worth it) - Removed the “multi-processor” mode
(if you’re using plugins that need this you need to move on) - Removed the “prevent memory paging” option
(I know it’s expensive right now, but just buy more memory) - Various redundant internal diagnostics, debug code etc…
- Miscellaneous refactoring and clean up of old code
- Where appropriate updating code to leverage new language features (both C++ and C#).
These settings will be going:
Finally, I got claude to knock together a little script to help me track how far through I am. (for comparison, the current audio engine is about 80,000 lines of code).
So I’m guessing I’ve got at least a couple of weeks work on this. Unless I burn out in the meantime and need to take some days. ![]()
I’ve also put the new show notes on the back burner while I get this sorted.
Will post updates here as things progress.
(Sorry for the long post, this is partly just me planning things out loud).




