Fehler Fabrik Modules - beta, code review

That’s the last module now added to the polyphony branch, a three band isolator with 4th order 24dB/Octave Linkwitz-Riley filters, inspired by classic rotary DJ mixers and PA crossovers. Use it to split a signal up for multi-band processing, or for more precise tonal balancing than a normal DJ EQ can give.

While it does work with polyphonic channels, it’s not well optimised for this yet - give me a little bit of time to learn about SIMD and we’ll see if we can squeeze some more out of it.

As always, please let me know if there’s any improvements to be made. This is my first time implementing a DSP filter (I don’t think the DC blocker in PSI-OP really counts), so the function for that is a mess. Hopefully I can neaten it up when I’m looking into the SIMD stuff.

2 Likes

Wow, some of these look really great so far. I hate to be a bother, but I can’t seem to get installing these modules to work for me, is there something that I need to do past the typical installation for packs not on the library? Is there somewhere else I should be downloading the zip from other than your github?
Thank you, and if this question has already been answered somewhere else, sorry.

What operating system are you trying to install on? I’ve just added the latest distribution ZIPs for all OSs here. You should just be able to add the ZIP files to your user folder as described on this page.

All the important stuff should be in those ZIPs. If you’re not having any luck after copying the relevant one to your user folder, please let me know what the content of log.txt in your user folder is after trying to install.

2 Likes

Thank you very much, I have it working now.

1 Like

This is a really minor point, but in your tags for the Psi Op in plugin.json you have “Drums”, “Drum”, and “Percussion”. Because “Drums” and “Percussion” are deprecated, they each get turned into a separate “Drum” tag in the module browser.

2 Likes

Any plans to push the plugin to the library?

Psi OP has never left my rack, and I think more people should get to play with it. I’m not sure how “done” the rest of the collection is, but unfinished modules can just be disabled in the manifest

1 Like

@hamptonio - Thanks, this has been fixed

@Aria_Salvatrice - I’m thrilled to hear you’re still using Psi Op. Further development has obviously slowed to glacial, a downside of going back to work post-lockdown. I think I’m happy enough with all the modules as they are now though, and they should be ready to be released onto the library. Hopefully I’ll get them up tonight, if not then by tomorrow for sure.

3 Likes

I’m not simply still using it, I like it enough I’m working on a companion module for it!

(Well - one that can be used for many other modules than Psi Op too, but it’s the one that inspired it, and that I obliquely refer to in the name. Details in my dev thread if you care :D)

Glad it’s gonna be available to a wider audience soon.

6 Likes

The modules are now on the VCV library. I’m not sure how progress is going to go from here tbh I’ve got a few ideas but I think it’ll be a while before I have the time to develop them properly.

7 Likes

absolutely love their design language, looks playable and fun!

2 Likes

I can’t recommend enough the source code for the Fundamental modules, and in turn the simd library that’s part of the VCV SDK. I guarantee you will get it really quickly. Almost all the Fundamentals use SIMD to speed up polyphonic stuff (and other things) in a way that is really easy to understand. Or maybe it’s because the SIMD stuff (esp the float_4 struct) is so good.

3 Likes

Unrelated to the code, I apologize, but these modules are super amazing.

2 Likes
1 Like

To elucidate on the change in Chi’s filter frequency knobs, previously the knobs ranged from 0 to 1, which were then scaled to the appropriate frequency sweeps for the low and high crossover points. I did this using a quadratic function for each, namely 540x2 + 20x + 80 for the low frequency point (0 -> 0.5 -> 1 becomes 80hz -> 225hz -> 640Hz) and 6800x2 + 200x + 1000 (0 -> 0.5 -> 1 becomes 1000z -> 2800Hz -> 8000Hz). I copied those frequency values from Ranes MP2015 rotary DJ mixer, and they cover the crossover points for most three band performance style isolators I’ve used (I have used an Isonoe isolator that had it’s mid/high crossover up at 12kHz, wasn’t my cup of tea).

All well and good and it sounded the way I wanted, but @Squinky correctly pointed out that it’d be better for the tooltips to show the actual value in Hz rather the arbitrary 0 to 1. configParam() has the capability to give a knob a separate display value from it’s actual value, which is used in lots of modules, e.g to display values in Hz for a knob that moves in semitone steps for VCOs. Passing paramters base, multiplier, and offset, to configParam() for a given knob with some actual value displays the value of that knob as:

display = multipier · base value + offset

if the given base paramter is greater than 0. For base = 0, it’s a linear relationship, for base < 0, it’s a logarithmic one. Since I was trying to approximate a sweep that was positively parabolic, the exponential function was the one for me. It turns out the functions

80 · 8x

and

1000 · 8x

approximate the original quadratic sweeps pretty well. The upper and lower limits of the knobs end up being the same, and the centre values are only slightly off what they originally were - 226.27Hz and 2828.4Hz, close enough to be almost inaudibly different, but frustratingly not round!

Just realised the silly solution to my very minor annoyance here - just set the default value to slightly less than 0.5 so it looks like the knob is in the centre position by default, but it’s actually whatever value the inverse of the display adjust function tells me I need to produce exactly 225Hz and 2800Hz!

configParam(LOW_X_PARAM, 0.f, 1.f, 0.49728f, "Low/Mid X Freq", "Hz", 8.f, 80.f);

It’s dumb but it works, and I’m happy to have a silly magic number in the code if it means the end result is a nice round number for the user.

I do things dumber than that! I’ll spend 20 minutes doing a binary search of a magic number for the knob rather than solve the equation. btw, thanks for the mention, and congrats on improving this cool modules.

2 Likes

I’ve added a new module to the development branch on Github - Nova, a sequenced sampler that can cut up, reverse, and shuffle it’s constituent parts.

Somewhat similar to a beat juggler type effect, it records to a new sample every time it receives a clock trigger (when the sequencer is running and the record is enabled of course). It can then play back those samples in regular order, reversed, bouncing back and forward, and randomly. Individual samples can be gained, muted, skipped, reversed, or jumped to. There’s global attack and release control, and hopefully I’ll be able to implement a global pitch control soon too.

There’s a lot to still figure out with it. The sampling is very naive, if Racks sample rate changes so does the playback rate of the audio. I’m not totally happy with how the recording starts and stops - I think it might need to be locked into when the sequencer steps? I’ve got no idea how to implement the pitch changing properly (skipping/holding individual sample values?) But the core idea is there and I’m already having fun with it.

As always, please let me know if there’s any bugs or crashes, or any glaring amateurism in the coding (I’ll add more comments to it shortly, honest!). I’d particularly like to know if the way that the recording works is intuitive or not or if there’s any behaviour that seems unexpected.

6 Likes

pretty cool concept! gonna give this a try. btw your module graphics are ace!

2 Likes

Back into toying with modules after an extended period of real life busyness. Here’s a clock module that generates a pair of phase-shifted gates:

Lilt

Lilt is a clock that generates a pair of coupled gates - a primary gate Alpha, and a phase-shifted copy Beta. Beta can have a phase relationship anywhere from 0˚ to 360˚ from Alpha. The pulsewidth of both gates can be adjusted. It has individual outputs for both gates as well as an OR’d output of both.

I made this as a warm up for a more complex module I’m working on. Really into the idea of adding more swing and groove to modular sequencing right now.

7 Likes

A quick little vid showing how it can add a subtle groove to a beat.

4 Likes