Oh wow it has been a very long time since I’ve created a new blog post. Does the internet still have blogs? Well, anyway here goes. Let’s see if I remember how to type words.
I’ve been working pretty obsessively over some music production plug-ins over the past ~6 months. Created a company and everything. The company is called APU Software and I ended up creating a loudness meter and a loudness compressor to start things off.
The visuals are pretty similar to old school WinAMP visualizations like Geiss or Milkdrop (which were huge inspirations for me as a young programmer). I used to spend tons of time learning how to program delta fields just by experimenting. I wasn’t aware of any open source versions at the time, so I basically just fiddled around with moving pixels here and there based on formulas I’d come up with in my head. The results were sometimes pretty awesome, other times filled with weird artifacts. Such a fun learning situation.
Anyway, here’s an example video of how things look in the meter plug-in:
In WinAMP, visualizer plug-ins typically used waveform data to draw lines or shapes over a delta field. In this loudness meter, those effects are bars whose heights are determined by the LUFS, True Peak, RMS, or Peak loudness measurements over time. There’s also a histogram display which is similar, but represents the accumulated loudness range over time divided up into buckets.
The other key difference is this is now all written in GLSL (fragment shader). Fundamentally it’s the same, but everything occurs in parallel on the GPU. Much more efficient obviously. There are some variables passed from CPU land over to the GPU, parameters you can modify in the plug-in which can be adjusted in real-time to shift how the delta field behaves. Back in the early WinAMP days I had to precompute the delta field because even the most basic trig functions were much too expensive to run on every pixel. Now you can change every little aspect however often you want and performance isn’t really impacted. It’s bordering on boring 🙂 — much less time required optimizing. Which honestly was half the fun.
The meter plug-in I’ve got up for free, and I have a paid plug-in which is a loudness compressor. The visuals are much the same as with the meter plug-in, but it acts as a dynamic range compressor. But with a few key differences: Namely, the entire signal chain operates in LUFS units instead of traditional RMS/Peak. I had been thinking about such a tool for a long time so it was a natural thing to work on.
Back in the day, these types of effects were done with 8-bit palette-indexed pixels. So everything was basically greyscale but you could manipulate the palette over time to get some color in the mix. Nowadays, these plug-ins support 8-bit per-pixel at a minimum. So the full color spectrum is always available. But it gets even better, because most GPUs support floating-point pixels up to 32-bit per-pixel. This is great because there are less artifacts as the pixels get shifted around and distorted over time. Fun stuff.
Anyway, not sure where this plug-in company will take me in the future, but it’s been fun to work on and keeps me busy.
Leave a Reply