Cantabile build 3687 is now available. This post covers what's new and improved.

Automatically Open New Plugins

This new option is self explanatory. It's off by default but can be turned on here:

Reloading Media Files

Right clicking on a media player has a new command “Reload”.

  • For MIDI files it re-reads the MIDI file
  • For Audio files is rebuilds the audio peak data.

Usage Report for Plugins, Racks and Media Files

Set list verification reports now include usage information for plugins, media files and racks showing where and by who they’re used:

  • For each plugin, a list of songs/racks that use it
  • For each media file, a list of songs/racks that use it
  • For each linked rack, a list of songs that use it

For plugins it separates the list into plugins known in the plugin database (ie: scanned plugins), and plugins that are only known by their saved path. For known plugins it also includes details like whether it’s a VST 2 or 3 and x86 vs x64.

Improved Set List Verification Report Look

I always thought those red/green dots in the verification report were fairly ugly, so made them prettier by converting to much nicer ticks and crosses.

Battery State Variables

I don’t recommend performing with your laptop on battery, but a number of people have asked for this. At the very least they can be used to put up a label confirming you’re running on mains power.

New variables: $(BatteryState), $(BatteryLevel), $(BatteryTime), $(IsBatteryCharging) and $(IsMainsPowered)

Recorder State Variables

New variables $(IsRecording) and $(IsAutoRecord) should be self explanatory.

Advanced Variables Usage Tip

Nothing new here, but some usage tips for using some of the above variables.

Originally Cantabile’s variable replacements only supported simple string variables. For while though it’s supported expressions and I’ve started using properly typed variables instead of plain string values.

This means a variable like $(IsRecording) which is a boolean will appear as True or False.

If you want to display a different string for each value, you can use the expression engine’s ternary operator:

$(IsRecording ? "Recording" : "Not Recording")

or similarly:

$(IsAutoRecord ? "Recorder Armed" : "")

Also, the $(BatteryTime) variable returns a .NET TimeSpan and you can access its properties like TotalMinutes:


or call its ToString method


Improvements to MIDI Support for VST 3 Plugins

This build includes a couple of improvements to MIDI handling with VST 3 plugins:

  1. There was a bug causing Program Change events to always be incorrectly sent to VST 3 plugins on channel 16.
  2. I’ve added support for VST 3 plugins that send MIDI Control Change, Program Change, Pitch Bend, Pressure Change and After Touch events.

The second fix hasn’t been well tested yet - if you know of VST 3 plugins that can send MIDI events please give it a test and let me know if you find any issues.

Internal Library Update

For this build I've updated to the latest versions SkiaSharp and HarfBuzz Sharp. These libraries are used for rendering Cantable’s UI.

Unfortunately this also required including some additional standard .NET dll files in the installation directory and the installation package has grown from about 13.5Mb to about 15.5Mb.

These are local files to the Cantabile installation folder and don’t affect your standard .NET installation.

It’s Experimental

This build should be considered experimental for the moment (primarily because of the updates to Skia), but otherwise, enjoy!