Antialiasing… updated graph

I’d never pretend that graphic design is something that I’m good at. Good thing I have a graphic designer!
Still, I take ages to answer even his simpler questions… so, we’ve been working really hard on the new UI for the last few weeks.

Part of the UI update includes revamping the graph. As you can see, the new graph is neatly antialiased, and looks a lot smoother than the last.
You might notice that the yellow band has a different opacity (and larger handle) to the others; that’s because I had the pointer over it (to adjust it) while taking the screenshot.. 😉


In the worst of the crazy UK weather in decades, I got stranded on the Isle of Wight for a week and a half. That was fun.
Internet was shakey, but I’m back in the saddle now, and there’s a sexy UI design being worked on.

TL;DR: Sorry for the disappearance; back now 🙂

Another busy day!


Today I’ve been busy fixing things.

It’s not particularly usual for people to publish details of what gets fixed in beta (it’s like dirty linen), but what the hell, it’s been a great day!

v0.01 was the first beta candidate.

Here’s the changelog:
fixed bypass
fixed latency reporting
fixed GUI controls synch
fixed memory leaks / uninitialised memory issues
added version number to UI

All the dumb bugs got fixed first 🙂 v0.02 is like 0.01, except it works 😀

That was the morning… then the afternoon…

don’t break with notches!
improve adaptive transform routine
optimise the crap out of it, part 1 [SIGNIFICANT speed improvements]
optimise the crap out of it, part 2 [SIGNIFICANT speed improvements in non-Digital mode]
improve all prototype estimation pre-optimiser [SIGNIFICANT speed+accuracy improvements]
redo the shelf handling (implement adaptive xform pre-optimiser)
fixed optimiser stability
increased band ranges upto 22k
improved filters to be analogue
tuned filters so that Analogue sounds good for sweeps!

So, eQuality got a LOT faster, much less CPU to use.
The shelves sound better, the filters are analogue style now, and the notches work correctly.
It feels stable (to me) now, and CPU usage went right down 🙂

Hopefully the rest of beta can be about adding neat features now :D:D

Time for me to sleep.


How to build eQuality (technical angle)

Some of you might find it interesting to know what goes into making a product.
What I mean by that is, I think it’s interesting, so I’m going to tell you. 🙂

Starting at the bottom, working up:
1) Steinberg’s VST SDK.
Can’t really make a VST without this one…
2) My own VST->AU wrapper layer.
Since it’s compiled-in code, (and due to some other detail) this makes building an AU really fast and efficient.
The first version of this was built for the original TBK… a looong time ago! 🙂
Since then it’s grown, so that it handles most things automatically. AU ports of my own code take about 5 minutes.
3) Plugin Baseclass
Most plugins have the same essential functionality – things like handling presets, automating things, synchronising
with the UI, converting parameter values to display text/values and back again. I have a base class that does all the legwork for this.
4) cJSON + PluginJSON baseclass
This is pretty geeky, but I’m very proud of it. Most plugins I’ve worked on have needed to gain a parameter here or there through their life.
Generally this means problems with sessions, but a while ago, as a programming exercise, I built a JSON library in plain C, called cJSON. JSON is a simple, stable format for storing data; it’s been described as “fat-free XML”. Some things make sense stored in XML, but most things do really well as JSON. JSON is almost the X in AJAX. Now, I have a class that saves presets and preset banks as JSON, which means that as I add features, there’s no breakage of old sessions!
5) VSTGUI, ezXML and my automatic UI system.
A lot of developers have strongly criticized VSTGUI; my friend Angus (FXpansion) is particularly vocal on it.
VSTGUI is not without its flaws, but I’ve concluded that VSTGUI is the right way forwards for two reasons:
– The flaws can be overcome
– EVERY SINGLE HOST is tested to support VSTGUI.
That last point is really the killer. With some work, you can get VSTGUI under control, and I think I’ve done this.
The sourcecode for the eQuality UI is 3 pages long. To put that in context, SV517mk2 had about 9 pages, and SV517mk1 had 60.
eQuality UI is more feature rich than 517mk2, which is more feature rich than 517mk1 (which was not my code).
This is thanks to the UI system I’ve built, that allows me to describe the UI using XML, using one line of text per control, formatted to reflect the onscreen hierarchy of the controls. It’s very similar to the mechanism I used in StudioDevil AMP, which has an extraordinary amount of UI functionality. To parse the XML I use a library called ezXML, which compiles very very small, and does a great job!
6) UI controls
The stock VSTGUI controls are great, but it’s usual to need to extend the functionality a little. I have a library with a raytracer built in, that re-raytraces the knobs as you turn them… fast! Admittedly that probably won’t make it into the finished product (to save CPU while you use it), but we’ll see! 🙂
You also need a chunk of code to build an EQ graph that’s draggable, shows the EQ curves, draws the spectrum analyser, etc.
7) FFTs, Convolvers and Spectral processors
I use the Ooura FFT. One day I’ll have enough money (it’s VERY expensive) to get the Intel Performance libraries. When I do, you’ll all get a CPU saving! 😀
There’s a library that converts responses to minimum phase (joint effort with Marc / StudioDevil),
an impulse windowing library, and a fast FFT-based zero-latency convolver (Marc discusses these extensively in his PhD thesis! He helped me out a lot!).
8) EQ code
This is the real meat of the DSP.
I have a library that has all the analogue prototypes (used for linear/minimum/analogue phase modes, and for designing the digital EQs),
and, because I collect these things, implementations of all the common digital prototypes that people use (RBJ, Orfanidis, etc). Nice to have them at least 😉 Don’t worry… anything unused gets stripped out at link time. 🙂
This also handles the “music” (gain-q) stuff, and drives the FFT/Spectral stuff.
It also drives the new digital design mechanism, that I’m going to post about in the coming weeks, which makes eQuality sound so smooth and sweet! 🙂
9) The special EQ design stuff.
… more to come…
10) The plugin code itself!
Finally, with all the hard stuff handled by a bunch of libraries its built on, 6 pages of code declare all the parameters, handle the special stuff, like Range and Shift, control all the EQ code, and trigger the DSP, handling the logging of samples for the spec-analyser, the VUs, the M/S pre/post-processing.

And that’s how it’s made! Easy as 3.14159265358979323846 😉


In the last 48hrs I have…

… been working on eQuality… 😉

– Fixed the filters
– Implemented an autolisten facility
– Built some rudimentary VUs
– Improved mouse handling on the graph
– Built a hella sexy system so that when I add new parameters, it shouldn’t break old sessions (this is gonna need some testing… 😉 )
– Ensured that inactive bands don’t use cpu
– Built an autoscale mechanism for the graph
– Started building the Setup page
– Fixed redraw on Windows
– Redone (and properly checked) the “music” (gain/q) mechanism. It sounds/feels right now 🙂

– Built the beta candidate
– Setup the beta mailinglist
– Invited my testers to beta!


It’s been hectic. 😉


Here are some of the ideas that eQuality is based on:

1) Software should remove the need for pointless manual tasks.
2) Information is king.
3) EQs can, and will, sound better than the current generation.

You get a huge graph; you might have noticed that. High-res spec analyser.
4 bands of mid. If you don’t need them, leave them switched off, and you don’t pay a CPU cost.
If you do need them, you’ll be really glad of them. 😉

Most shelves are useless. If you could move the shelf resonance to where you need it, you’d be winning right?
Guess what those %age knobs in the shelf columns do… 😉

By now, I think we probably all know that the difference between, say, a Neve and an SSL is the Gain-Q interaction.
Turns out there’s actually an equation that allows you to specify it. You’ll find the control for that on the bottom-left.

Tell me.. why can’t I just hit a button to compare linear/minimum/analogue phase against what the normal EQ sounds like?
Why do linear phase EQs cost so much more?
No reason. Click on “Digital” on the menu to pick how you want it. Use whichever sounds best.

Ever wondered if you’re overbaking your EQ, but don’t want to have to write down what your settings were and test scaling it back, or even reversing the EQ shape? There’s a fader to the right of the graph that lets you do that.
The unexpected benefit of this turns out to be that if you set your EQ range to, say, 3dB, you get real easy, precise control (for mastering, for instance), or you could set the range to 48db and do something nuts.

Why do you always have to instance another plugin to automate filters? Surely that’s an EQ task?
I quite agree. So you get adjustable slope/resonance filters high and low.
Also, I know a lot of people who always keep a HPF on (nearly) every channel.. it’d be a pain if that interfered with your filter automation… so you get two HPFs; one for creative use, one for keeping the channel clean.

Ever repitched a sample and found that your EQ sounds weird now? Please use the fader under the graph to shift the response left<->right to tune it back in. Saves a lot of time…

All these things might make you worry about CPU usage, but it uses a regular high-efficiency filter topology under the hood, so CPU usage is nice and low. This won’t hurt your channel counts.

What about the high-end response? Is it “cramped”?
This is a deep topic, and I might post something lengthy about it. If you’ve followed this in detail, you’ll know about Bilinear Transforms (which are crap) and the Orfanidis technique, which is much better (although not perfect), and is used in most “pro” EQs.
… but you might also be aware that there are some EQs (AirEQ, Digidesign EQ3, Focusrite d2, Focusrite Forte) which do something… else… which sounds even sweeter. I wrote Forte nearly a decade ago. Turns out you can go further still. I’m confident that you will be extremely pleased with the sound of eQuality.

However, no digital EQ can be perfect, using low-cpu topologies. There are cases (center frequencies above 19k, high Q) which just can’t be done digitally… It would have been really annoying if that was the end of the story. Rather than accept defeat to the maths, you’ll find that eQuality has “digital+” mode which patches in a VERY small FIR filter which eats up any error. In general usage, you won’t find a difference, but if you torture test eQuality, you’ll find that switching in the “digital+” mode will, for a very small CPU cost (about 3 bands worth), the error is gone, and you’re back in the world of lush analogue curves.

Also, do you find that you either open your EQ and automatically change a few settings before you even start using it? Or you have a preset that you always open on instancing? eQuality has a button to save the default state (it’s in setup).

I want to have eQuality in your hands by the end of January, which will give me about 4 weeks of beta. In a perfect world, we’d go for February, which will give me time to add in any suggestions you have.

A new UI is on the way too, so it will look as good as it sounds. 🙂

I’m going to link to this post from KVR and Gearslutz (or find someone to do it for me 😀 ). I need feedback! 😀

Oh, nearly forgot to mention… not only can you switch your shelves to be parametrics, if you need that, you can also switch your parametrics to be notches. When you actually need a Q=50 notch, not much else will do; so now you can have it. 🙂

OH! Also, it does M/S processing. Instance, and pick whether you want to process the Stereo image, or the Mid, the Side, the Left or Right channels. Instance two and have M on the left and S on the right of the screen; no clutter to the interface. 🙂

I’m probably forgetting something, but I think those are most of the key features.

Hope to hear from you soon!



New Year, New Blog, New Company, New Products!

I’m back 😀

If you’re finding this site, you might remember me as Dave from Sonalksis Dev Blog, or if your memory is even better, you might remember me from the days when I worked at Focusrite/Novation. I left Sonalksis a couple of years ago with the intention of setting up my own small dev shop. I’ve been working freelance for a bunch of great companies in the meantime, to pay the bills to get something together that I can release… I set myself the deadline of 1/1/2010. I’ve pretty much made it.

I’ve been blogging sporadically on other sites in the meantime; you might have seen Harmony Box which was a fun collaboration between my friend Mike and I. You may even have stumbled onto the (deeply techy, and badly neglected) DMGSound Blog. I announced the plan there a while ago… but then came up as a domain, so I grabbed it and here we are!

In the next few days, I’m going to be shipping my first product to beta.
Those of you who know/remember me won’t find it particularly out of character that I’d very much like to get feedback on it from as many of you as possible, because together we can make it into what I want it to be- the finest EQ in the world.

Let’s cut to the chase. Meet eQuality:

Before I start to describe it, I should mention that I’ve also put together a small site where I can collect all the salient information.
We’ll do license files for copy protection (I’m working on building integrated installers too!), and you get a user area where you can log in and download your software whenever.

Should also mention that this UI is my… programmer art… (excepting the logo, by a talented friend of mine, who will be making this look pretty and a lot more professional!). Incidentally, when I say programmer art, what I mean is that the entire UI is generated using a realtime raytracing engine. 😉

So… how to go about building the finest EQ in the world?
I had a few ideas, and a lot of people have helped me with some other great ideas.
Let’s make that another post.

I’m back! 😀