JUCE 9 is Available Now

This post is taken from the JUCE email newsletter.

To get these delivered to your email inbox, sign up here: Newsletter - JUCE

Hi JUCE community,

We are delighted to announce the release of JUCE 9.

JUCE 9 focuses on UI features and performance, embedded support and, as always, cross-platform compatibility.

Pricing and licensing terms have been kept identical to JUCE 8, and all JUCE 8 subscriptions have been automatically upgraded to JUCE 9.

Improved SVG Parsing and Rendering

JUCE 9 now pulls in lunasvg as a dependency, bringing new features and improved SVG spec conformance.

More complex SVGs are now possible, including those that take advantage of radial gradients, blend modes, dashed strokes, stroked text, texture fills, miter limiting, clip paths and referenced elements.

SVGs are parsed into a tree of Drawable objects, which have been stripped of the Component base and moved into juce_graphics, streamlining JUCE compilation.

As a part of development, we built a custom app to test 70 specific features and regressions — including bugs you reported on the forum!

Variable Font Support

Modern fonts, especially those designed for the web, are frequently distributed as variable fonts.

Unlike traditional fonts, variable fonts bundle multiple styles (such as bold, italic, and condensed) into a single streamlined file.

Variable fonts allow font “axes” like weight, width, and slant to be set to custom values, giving designers full dynamic control over the appearance of the face.

For an example of JUCE 9’s new typographic capabilities, check out the FontVariablesDemo.

Improved macOS CoreAudio Support

The Core Audio implementation on macOS has been redesigned to use Apple’s aggregate device API, improving performance and reliability with aggregate devices.

JUCE 9 creates a private aggregate device that combines the selected physical devices into a single logical device presented to the framework. End users on aggregate devices get lower latency and more reliable drift-compensation than previous JUCE versions. We saw latency decreases of up to 11-25ms in our development, you can check out your hardware via JUCE’s AudioLatencyDemo (and let us know!)


Buffer size and latency reporting is also more accurate, helping to reduce unexpected behaviour and configuration mismatches for end users. In addition, channel naming has been improved when using aggregate devices: names now include the originating physical sub-device for greater clarity.

Software Renderer Improvements

JUCE 9 brings improvements to the software renderer, refactoring the internal structure of the PixelARGB class to better use auto-vectorised instructions when filling colours.

OpenGL ES Renderering on Linux

Embedded Linux devices typically use OpenGL ES rather than desktop OpenGL, and JUCE 9 now provides an automatic mechanism for selecting OpenGL ES on these platforms.

Easier Compilation for Embedded Linux

In addition to adding support for OpenGL ES the new SVG work has allowed us to remove dependencies from juceaide, JUCE’s CMake helper executable. This has both lowered CMake configuration time and made it trivial to run builds in headless environments without UI operating system components present.

Improved Multitouch and Gesture Support

JUCE 9 now supports XInput multitouch on Linux, so any devices running embedded Linux can make use of multi-touch enabled displays.

JUCE 9 Windows applications and plugins now receive and process gestures from touch screens and touch pads by default. The old mode (where multiple touch points are reported) can be explicitly requested via the TopLevelWindow and AudioProcessorEditor classes.

JUCE 9 Work In Progress

All of the work described above is available today, in JUCE 9.

We are currently working on AudioProcessor v2, the foundation for sample-accurate automation, unique CLAP features, and MIDI messages in UMP format.

APv2 will change how parameters are owned (and therefore how application code is written). In APv2, parameters live on the derived type (by value) instead of on the AudioProcessor. The current plan: existing AudioProcessor code will continue to work through a compatibility layer and adopting the new features requires porting your processor to APv2.

This is a large body of work that will land across followup releases. The piece most likely to ship first is multiple AudioProcessors in a single binary, useful for a synth and effects rack that share DSP, or for a “loader” binary that presents itself as several distinct products to the host.

18 Likes

This looks like a great release, congratulations on all your hard work.

Can I ask if there are any changes in store for AudioProcessorGraph? How will this be affected by the new APv2?

I assume this is also true for regular computers with touchscreens? (ie. many modern laptops have multitouch displays)

Yes, this is also true for desktop Linux too. We’ve just had a few specific requests from hardware manufacturers, so the announcement was targeted towards them.

1 Like

Congratulations on new release. I’ve found one problem so far: mouseWheelMove receives incorrect coordinates under UI scaling, when I use setGlobalScaleFactor.

Steps to reproduce:

  1. Create an interface with distinct components on the left and right sides of the window.

  2. Apply UI scaling greater than 100%.

  3. Hover the cursor over the right-side component and scroll the mouse wheel.

Expected behavior: The scroll event should be intercepted by the component physically under the cursor on the right side.

Actual behavior: The scroll event is incorrectly routed to the component on the left side of the window. It appears the framework is either double-scaling or miscalculating the global-to-local coordinate conversion specifically for wheel events. When hovering on the far right, the calculated X coordinate is erroneously shifted to the left half of the UI.