Fehler Fabrik Modules - beta, code review

@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.


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.


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.


absolutely love their design language, looks playable and fun!


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.


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

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


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.


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.


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


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 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.


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


Big, big fan of Nova. I had a primary patch built around it that I recorded over an hour’s worth of material from last week.

1 Like

For those of us who build this stuff on our own, would you please fix the array initializer in Fax.c:101. You want double braces around the constant.

Would you please share a few clips demonstrating the capabilities you like? No tutorial, just some sounds, noises & demo. I have hard time inserting Nova into the mix…

This should be fixed now, thanks for pointing it out!

I’ve just pushed an update for Rack V2 for Fehler Fabrik to github, which comes with the addition of a new module called Botzinger - an arbitrary time step generator that can either be clocked or totally free running. Very weird!

1 Like

I’ve built your v2 branch and have been testing it out because PSIOP is a must-have in my setup. No issues to report, and Botzinger is very fun for making polyrhythms, I notice it seems to have very different behavior when it’s clocked or not (I was sort of expecting the clock to make timings clock-relative), but perhaps this is a deliberate choice.