Fehler Fabrik Modules - beta, code review

Hello all. I’d like to share with you some modules I’ve been working on.

There’s a ARP 1601 style sequencer, a probabilistic trigger sequencer, a four operator FM percussion synth, and a few simple utility modules. I’m still not totally happy with the panels but the code is at the point where it’s all working the way I want it to.

I’d love to get some feedback on the code itself. I’m still pretty novice when it comes to programming in general and C++ in particular, so please take a look and let me know if there’s any bugs or improvements I could make.

6 Likes

Build failure on linux:

g++  -std=c++11 -Wsuggest-override   -fPIC -I../../include -I../../dep/include -MMD -MP -g -O3 -march=nocona -funsafe-math-optimizations -Wall -Wextra -Wno-unused-parameter -DARCH_LIN  -c -o build/src/Planck.cpp.o src/Planck.cpp
src/Planck.cpp:36:5: error: ‘BitDepthReducer’ does not name a type
     BitDepthReducer reducer;
     ^~~~~~~~~~~~~~~
src/Planck.cpp:37:5: error: ‘SampleRateCrusher’ does not name a type
     SampleRateCrusher crusher;
     ^~~~~~~~~~~~~~~~~
src/Planck.cpp: In member function ‘virtual void Planck::process(const rack::engine::Module::ProcessArgs&)’:
src/Planck.cpp:61:26: error: ‘reducer’ was not declared in this scope
         float depthOut = reducer.process(depthIn, depthAmount, 10.f);
                          ^~~~~~~
src/Planck.cpp:72:9: error: ‘crusher’ was not declared in this scope
         crusher.process(crushAmount, crushIn);
         ^~~~~~~
src/Planck.cpp:72:9: note: suggested alternative: ‘crushIn’
         crusher.process(crushAmount, crushIn);
         ^~~~~~~
         crushIn
../../compile.mk:69: recipe for target 'build/src/Planck.cpp.o' failed
make: *** [build/src/Planck.cpp.o] Error 1

I’m on a Mac, so I don’t have the ability to test a Linux build myself right now. I’ve moved the structs that weren’t declared from an external header to the files that use them, let me know if that helps.

1 Like

That works :slight_smile:

Nice one. I think the actual problem might be that the header that contained those struct definitions also included the plugin.hpp header, but as I say I can’t test that on a Linux machine right now. I do plan on using those structs in other modules in the future but for now they’ll be fine in their own files.

1 Like

Is there a way to externally clock the arp seq?

You can stop the sequencer, then connect a clock signal to the Step input. It won’t produce anything on the Clock output however. I might add a dedicated external clock input, but for now I’m happy to try and emulate the original ARP style behaviour.

2 Likes

Ha! I was nearly there, just neglected to hit stop - doh!

1 Like

I’ve just added a somewhat arcane CV recorder/sequencer. It’s somewhere between the ARP sequencer, the SH-101 sequencer, and a Sample & Hold. Definitely needs some thorough documentation for it to be usable for anyone but me! I think documentation in general is the next task.

1 Like

NOT WORKING ON MY MAC

Not a good first post to this forum.

What can i do? it’s the true . is the first time i have a problem with vcv since i started using it. That’s why is my first post

Come back in a week with more constructive behavior.

1 Like

@rcGLA whats not to like about the panel designs? they look nice.

2 Likes

I’m happy to help you get the plugin working but as @Vortico says, you’ll need to provide us with some more information so we can understand what’s going wrong. Are you building from source or using the zip package release?

I’m happy with the panels and aesthetics in general, there’s just a few wee things that need sorted.

  • Consistency of CV/knob relationship - should every CV port have an arrow pointing to it’s related knob?
  • Colours - should each module really have it’s own accent colour, or would it be cleaner to have a set palette for each module? At the moment whenever I need two colours, I’m using the same teal for the second. Should each module have it’s own second colour?
  • Some of the titles (Planck in particular) don’t set well within the “bounds” established by the screws
  • For snap knobs with discrete values, I tried to create a dot that matches each position the knob could take. I did this using Adobe Illustrators transform controls, and it didn’t quite work - the positions that the knobs sit at don’t match the dots. I could either change the movement range of the knobs or make new dots
  • Should the text have the same colour as the legend? Is it OK to use all-caps or abbreviations (CLK vs Clock)?

This is all pedantry really! I have more of a background in graphic design than I do in programming, so it’s very easy for me to spend 10x the time on a panel than on the actual working of a module. I’ve mostly worked on things like posters and animation though, so these modules are as much an attempt to learn about user interface design as they are C++ and DSP.

Built for windows, they’re really nice!

Getting a lot of good sounds out of Psi Op. I am not familiar with (what I think is) the original module, but I seem to get similar sounds. Definitely a new fave.

With most settings I dial I seem to have ton of DC offset, like most output being 0V~10V, is it normal? Seems primarily dependent on the Waves knob.

Also, how does Luigi’s Noise/Dust work? The correlated noise seems like it’s very useful musically, but I don’t understand what it does.

I also couldn’t figure out Fax at all, haha. And have yet to explore the rest.

1 Like

Psi Op is indeed killer - its full of great percussion sounds. The tiniest of knob tweaks can change the sound entirely. It’s almost too sensitive - I had great sound, turned the knob and tried to go back to where I was and couldn’t find the sound again :slight_smile:

What do you think is the original module? One of the Taiko’s?

1 Like

@Aria_Salvatrice

With most settings I dial I seem to have ton of DC offset, like most output being 0V~10V, is it normal? Seems primarily dependent on the Waves knob.

Yes, the wavetable used is based on the Yamaha YMF262 FM chips. As an aside, I think these were mostly used in soundcards rather than proper synths, units like the TX81Z and DX11 used chips like the YM2414 which had fewer waveforms. The 262’s (also called OPL3’s) went beyond the sine waves used in earlier FM like the DX7 by including a selection of asymmetrical waves:

B2ELzisCYAAAkos.png small

The actual wavetable I’m using is taken from ValleyRacks Dexter synth, where it’s called Opal Table.

The waves knob will assign various combinations of these waves to the operators. If, for a given wave combination, all operators are using an asymmetrical wave, the output will be all positive volts. If it’s a combination of a symmetrical and asymmetrical wave, there’ll be an offset for as long as the asymmetrical wave is present.

I’ve tried to set it so that for most settings, even with an offset, the voltage is around 10V peak to peak, but there will be times where it exceeds that, especially when accents are applied. Do you think it’s worth adding a level control, or just to recommend that users run it into an attenuator/VCA?

Also, how does Luigi’s Noise/Dust work? The correlated noise seems like it’s very useful musically, but I don’t understand what it does.

For every tick of it’s clock (either external or internal), Luigi generates a random voltage between -5V and 5V, which is sent to the Dust output and the Noise output. The difference between the two is that the voltage on the Noise output is held until the next value is generated. The Dust output essentially outputs that voltage for one sample, then defaults back to 0V, which gives it it’s sparse, digital character. The Random Clock output simply outputs a high gate whenever the generated value is positive.

I also couldn’t figure out Fax at all, haha.

Yeah, I think I’ll need to make a video to demonstrate Fax. It’s exactly what I want it to be, but it’s probably too weird to be much use to anyone else.

@steve

The tiniest of knob tweaks can change the sound entirely. It’s almost too sensitive

Tuning the parameter values to increase the amount of sweet spots is definitely the next priority with PSI OP. I like that it’s quite chaotic and wide-ranging, but there’s definitely some chaff to be culled in the Release and Ratio knobs.

With regards to it’s original inspiration, I messaged it’s creator to let them know I was planning on releasing something that’s essentially a carbon copy of their hardware module, and they gave me the go ahead, provided there was no infringement on any copyrighted names or intellectual property. It’s pretty obvious I think, especially with the parameter/input names, but I’d still prefer for it to remain unsaid out of respect and to avoid any implication of endorsement on their part.

I’ve actually never gotten my hands on the unit in question myself either, so it’s all just based on watching videos and reading the manual. For a while I was thinking of calling it “Overload”, as a nod to the track Talking Heads made inspired by what they thought Joy Division might sound like, based on descriptions of them in the press.

3 Likes

Thanks for the detailed replies!

I think it’s worth making it so every wave is centered automatically! I’ll make my case best with a fun patch:

psiop-test.vcv (47.2 KB)

It’s fun to use a single instance to make an entire modulating beat like this, because save for that issue, it’s hard to dial the module in such a way it will sound bad. But the user would have to program an offset manually for every single wave used to integrate it to a mix!

Many users won’t look at things through a scope or understand how DC offset affects their headroom. I think it’d be best if it were corrected by default and the “hardware-accurate” mode were a right-click option (should it have a use case).

1 Like