Technology Update 2021

Hey All,

Things might have seemed quiet on the Cantabile development front lately but I’ve been busy and thought I’d provide an update.

The main thing I’ve been working on is a new version of GuiKit - the UI library that Cantabile uses. Since this is a pretty big change, I’ve been reluctant to do anything major in Cantabile that will then need to be ported. As of yesterday I basically got GuiKit finished to the point where it’s ready for use in Cantabile.

Also, .NET 5 is out now and looking pretty slick so I’ve decided to roll a whole bunch of things into one biggish update that I’m calling “Technology Update 2021”. This will include .NET 5, GuiKit 3 and various other library and toolchain and updates.

Most of these changes won’t bring new features per se but they will provide a good foundation to build upon soon after. In the meantime the main improvements will be:

  • .NET 5 - considerable performance improvements.
  • GuiKit 3 - cleaner, simpler, leaner and better in so many ways (I can’t wait till Cantabile is moved to this)
  • New theming engine makes pretty much everything themeable.
  • Theme hot swapping - no need to restart to switch themes
  • UI hot scaling - no need to restart to adjust scaling (and possibly independent scaling for different parts of the UI).
  • Pixel accurate layout engine will fix various display artifacts in the current version.
  • Improved touch screen support.
  • Improved hi-dpi and multi-monitor support
  • New JSON serialization library (JsonKit) supports trimming which should reduce the size of song and set list files considerably.
  • New language translation tools and library (TranslateKit) will make things easier for translators.
  • Better native control hosting should improve the plugin editor dialog and in future allow hosting of plugin editors in Cantabile’s main window.
  • Much improved UIAutomation support will make Cantabile’s UI programmable from third party tools and will improve support for accessibility tools like screen readers.
  • Better exception handling and a new crash reporter.

The biggest visible change will be the crisp new UI. Here’s a screen shot of one of the GuiKit3 test screens showing the new look. (there’s also a light theme and you can create your own if you’re keen)

Finally since all this is going to require a lot of testing this is a good opportunity to clean up some riskier areas that I’ve been putting off. ie: time to pay off some technical debt.

The next step is to port all of Cantabile’s custom controls to GuiKit 3 - things like the on-screen keyboard, the wiring view, midi activity indicators, level meters etc… I’m guesstimating that’ll take about a week or two.

If you’re interested, I’m tracking all this in Trello - see here and will post progress updates here too.



Progress Day 1

  • Re-organized the solution file, deleted a bunch of redundant projects
  • Updated core libraries to .net5
  • Setup framework for Cantabile theme
  • Exported all graphic resources from Sketch in preparation for moving to Inkscape
  • Start porting custom controls: BasicColorCombo, BeatIndicator, CCNumberField, CCValueField, ChannelCombo, DbField, IntervalField, MidiActivityIndicator, NoteField, PercentageField, ProgramMaskField, ProgramNumberField, RpnNumberField, TransportPositionField.

Also, since I can’t actually run Cantabile yet, I setup a test sandbox program and wrote test screens for all ported controls.


The custom controls now use GuiKit3’s new theming language:

// Cantabile GUI Theme

// Import the default GuiKit Dark theme

// The beat indicator in the main status panel
class BeatIndicator
	FirstBeatColor: #00FF00,
	OtherBeatsColor: #dfe1e5,

// MIDI Activity Indicator
class MidiActivityIndicator
	Indicator: select
        // Checked state is used for MIDI activity (bright led)
        checked: Image("LedSmallGreen.png", Gravity.Center),

        // Indeterminate state is used for MIDI sense activity (dim led)
        indeterminate: Image("LedSmallSense.png", Gravity.Center),

        // Any other state is displayed as "off".
        else: Image("LedSmallOff.png", Gravity.Center)

I’ve worked in IT for 25 years, and I’ve never worked with/bought software from a developer with more commitment and drive to deliver the best product possible. You put major companies to shame! Seriously, the whole industry could learn a lot from you. Thank you; Cantabile is a gem and you should be super proud of your work.

With that said, when are ya going to write some Lighting Control software? :slight_smile:


I’m glad you are paying off your technical debt - this is the first step to technical independence :grinning:

On a more serious note, I’ve been using an 11 inch Dell 2 in 1 in tablet mode and the touch experience is a bit wonky. I would be happy to beta test on that machine as soon as you’re ready.


Eager to see it!!


When it’s ready it’ll be available for anyone who’s interested to test it. In the meantime, if you’d like to drop me an email explaining the wonkiness I can try to make sure they’re addressed.

1 Like

Progress Day 2

Today was mostly about automating the export and packaging of theme assets.

  • Extracted the webfolders stuff from the Themes repository to its own repo.
  • Started a new branch on the Themes repository.
  • Removed other unrelated files from the Thems repo.
  • Started moving graphic assets into Inkscape and tuned for export/render.
  • Updated the inkscape-export tool to support transparent item backgrounds.
  • Updated the inkscape-export tool to support multi-frame exports (used for the Knob sprites export).
  • New makefile to export theme assets, render the knob sprite strips and zip the theme files.
  • Fixed a couple of small bugs/missing bits in GuiKit
  • Ported the KeyRangeIndicator control (screenshot below).


Progress Day 3

  • Graphic assets for level meter, on-screen keyboard and slider
  • Updated GuiKit to support tile sets image assets for easier implementation of the knob control
  • Ported the LevelMeter control
  • Ported the Knob control


Also, spent about two hours trying to figure out why this little popup wasn’t centered correctly. (Turned out to be two lines of code in GuiKit in the wrong order).



This is really exciting stuff. Cantabile is already fabulous and this is setting the scene for its future.

It’s also interesting the hear of the progress, at least to an old IT warrior like me!

Great work, Brad!


Very excited about this Brad! You have always been way ahead of the competitors, but this puts Cantabile light years away. Many thanks for your dedication, and long hours of hard work. It doesn’t go unnoticed.


There are very few - if any- developers that share their work flow and planning in this way. I love this level of transparency and involvement with Cantabile users. This is one of the wonderful things about using Cantabile. Thanks @brad



I am getting a migraine just looking at this! Cucumber on the eyes may help @brad


Hi Brad,

I set up my phone tripod and got ready for the video and the touch inside Cantabile behaved itself. I realized that yesterday I had gone back into Windows 10 display settings and set the zoom back to 100% because the bottom of the UVI display for B5 was below the bottom of the screen (its where all the buttons for settings are). I’ll set it back to 125% and see if that indeed was what was causing the issue.

I’m going to velcro a case with reading glasses to the laptop :grinning:

1 Like

Thanks Doug… send through anything you manage to capture and I’ll check it out.

Progress Days 4-5 (aka the "weekend’)

Took a break from the Cantabile work and instead focused on the new theming language in GuiKit:

  • Refactored the code to decouple it from GuiKit and to make it more usable in other situations (ie: my son Mitch needs something similar for his game Sectors Edge).
  • Added an expression engine (eg: in theme files you can now write things like: FontSize: defaultFontSize * 1.2)
  • Added support for custom implicit type conversions (ie: smart type conversion/matching)
  • Added support for context aware evaluation (ie: no need to specify enum types so for example Gravity.Left becomes just Left when specifying alignments).
  • Rewrote the method overload selector so it too is context aware.

In other words, a bunch of changes to make the theme language more concise and easier to use for theme authors (ie: me and maybe you) and library easier to use for developers (me and Mitch :slight_smile:).

Now, back to Cantabile…


Progress Day 6

Made some good progress today:

  • Updated sandbox program and theme files for changes introduced over the weekend.
  • Slider control
  • RunMode button
  • SoloMode button
  • Tip Panel
  • Number Pad (if you’ve never seen this, you’re probably not using a touch screen).

One of the nice things I’m noticing about the new theming approach is that for most controls I’m actually deleting more code than I’m writing and moving the functionality to the theme file - where it’s much more concise, not to mention customizable.


@brad …so, this looks fun - can we have some new bindings so we can play this using midi from within Cantabile? Just an idea…:face_with_hand_over_mouth:

1 Like

Excellent job brad! Thank you for your always incredible efford for this amazing software :slightly_smiling_face:

1 Like

Extremely excited to see this technology update coming together like this! Hopefully it’ll provide a great platform for even more interesting and exciting advancements in the months and years to come!

The UI controls are looking fantastic!



Good to see you on the forum again…missed your presence and replies. Hoping everything is good in your life.