#MadeWithSlint
Aava Convolution Plugin
Aava is a groundbreaking convolution plugin that allows you to adjust all IR parameters in real-time, even at audio rates. We asked Aava creator, Jussi Viiri, to share his thoughts on the Aava Convolution Plugin and his technical journey in bringing it to life. We're proud to announce that Aava is #MadeWithSlint
"Slint is a mature, production-ready UI solution and a joy to work with. The development team is friendly and responsive with issues, bugs and even requested features usually getting solved really quickly."
Jussi Viira
Creator, Aava Plugin
Interview with Jussi Viiri
Background
- A convolution plugin is an audio effect that uses convolution to apply the sound characteristics of one audio signal onto another. It uses an impulse response (IR), which is a short recording of how a space or system responds to a sound, like a cathedral, speaker, or microphone. The plugin then convolves (mathematically combines) that IR with an input audio. The result is the audio sounding like it was played in that space or through that device.
What was the inspiration behind creating Aava?
How hard could it be?
, that’s what I thought after playing with convolution several
years ago and getting frustrated by how static convolution effects felt. After a lot of prototyping, I
eventually found an academic paper describing a way to manipulate an impulse response in real time.
Features like IR recording and the explore map felt like natural extensions of what
this real-time manipulation would enable.
Why did you choose Rust for implementing Aava?
I actually started writing Aava in C++ but at some point grew frustrated with debugging
multi-threading issues and writing C++ in general. I had already heard about this magical language that
would make it all easier, so I decided that this would be a good opportunity to learn Rust. At
that point I didn't know the state of audio and UI in Rust so in addition to learning Rust, I ended up
writing a lot of code that I would have avoided if I had gone with JUCE for example, but I feel like the
end result is worth it.
I'm much more confident with the stability and quality of the Rust codebase than I
ever was with C++.
What led you to choose Slint?
I started writing Aava using Vizia which I really liked working with, but certain things
made me feel like it wouldn't be production-ready by the time I needed it to be. Same with Egui and Iced
that I evaluated, and none of the other UI frameworks were suitable to use with audio plugins, so Slint
felt like the only sensible option at that point.
This decision was made a few years ago so
things might have changed a lot since; I don't want to throw shade on any of the alternatives and I
think it's great that there are options that have clearly different approaches, strengths and
weaknesses.
Please share some of the challenges you faced.
Its the usual story with Rust: the borrow checker is a beginner's biggest enemy but now I
feel like it's my greatest friend even though sometimes its limitations still require awkward
workarounds. The state of audio and UI in Rust is still kinda work in progress although things have
advanced a bunch during the time I've been working on Aava.
With Slint, the biggest hurdle is the
native / DSL boundary. Slint requires things to be defined in the DSL to be exposed to native code, and
audio plugins want things to be defined in native code to be exposed to the plugin framework and host.
This results in a bunch of awkward boilerplate that I haven't found a good solution to yet. For complex UIs, Rust compile times can be rather long making iterations slower than ideal.
What is your wishlist of improvements in Rust and Slint?
For Rust, I would like the borrow checking situation to improve even further to reduce the
need for workarounds. SIMD improvements would make writing optimized code more straightforward. For the
Rust ecosystem, I would like interoperability between audio crates to improve; thankfully there have
already been some steps towards that with the audioadapter crate etc.
For Slint, reducing compile times
and improving the native / DSL boundary would help a lot. Other than that, some kind of support for
custom shaders without completely custom OpenGL surfaces would be nice although I don't know what form
it should take.
Why would you recommend Rust or Slint?
The biggest advantages with Rust are its memory and thread safety features; I've only had
memory bugs in low level unsafe code I've written myself and there's very little of that in my project.
With Rust I also feel like the compiler is guiding me towards writing better-quality code than I ever
did with C++.
Slint is still the most mature UI crate that can be used with audio plugins, and
the DSL is a joy to work with for the most part. Oh, and the development team is super friendly and
responsive.
What are your future plans?
I'm still recovering from the launch that happened a week ago as of writing. I just
released the first bug fix update and looking forward to starting work on new features and improvements.
I'm also thinking of ways to spread the word, as people who have tried Aava seem to really like it but
not many people yet know about it.
I have some ideas for future products but for now I'm
concentrating on supporting and further developing Aava.