Befaco modules development blog

You either need to provide an implementation for all functions in your base class or declare them pure virtual, like this:

	virtual AudioStream& getStream() = 0;
	virtual unsigned char getPort() = 0;

protected:

	// subclass should process the audio graph and fill the supplied buffer
	virtual void processGraphAsBlock(TeensyBuffer& blockBuffer) = 0;

Then it works on Linux (and presumably macOS).

2 Likes

@cschol - Nice work! Awesome support as usual.

@hemmer Confirmed installed and working on Mac here too.

1 Like

Have pushed the fix, nightly builds should be up to date. Thanks all!

Please consider the module still in beta, might still be some minor changes. Release checklist is here.

3 Likes

By the way now that the dust settled a tiny bit: Noise plethora seems very cool - haven’t always been very able to gel with noise modules unless trying to emulate a snare but a few minutes in and I really dig this module and can see myself using it a lot. Very glad I could test this one!!!

2 Likes

Yeah I’m still getting my head round it a bit, but it’s great you can get (say pairing with Percall), kick, snare, hat, cymbal, vinyl crackle all from one module. I’ve also been modulating absolutely everything with noise, you can get some great textures.

3 Likes

FG_BefacoGurgler.vcvs (3.8 KB)

Here is a selection (load in Rack 2.0.1 via ‘Edit->Import Selection’ menu item) that makes some gurgly noises using the Noise Plethora. Careful, turn down gain on mixer before patching VCO out to mixer, and use a slow clock/lfo to trigger the adsr

This thing looks to be a lot of fun @hemmer , thanks for porting this over!

I’m in love with this new module! So many sounds, I can’t believe how much is packed in there. Looking forward to spending lots of time with this one.

It just caused Rack to crash. I was scrolling through the different programs or algorithms when it crashed. The log is long (68.8MB). I can send you the entire thing but it mostly consists of thousands of lines similar to this:

[2500.614 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using 
[2500.614 debug src/NoisePlethora.cpp:485 setAlgorithm] Didn't find  in programSelector
[2500.614 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using 
[2500.614 debug src/NoisePlethora.cpp:485 setAlgorithm] Didn't find  in programSelector
[2500.614 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using 
[2500.614 debug src/NoisePlethora.cpp:485 setAlgorithm] Didn't find  in programSelector
[2500.614 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using 
[2500.614 debug src/NoisePlethora.cpp:485 setAlgorithm] Didn't find  in programSelector
[2500.614 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using 
[2500.614 debug src/NoisePlethora.cpp:485 setAlgorithm] Didn't find  in programSelector
[2500.614 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using 
[2500.614 debug src/NoisePlethora.cpp:485 setAlgorithm] Didn't find  in programSelector
[2500.614 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using 
[2500.614 debug src/NoisePlethora.cpp:485 setAlgorithm] Didn't find  in programSelector
[2500.614 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using 
[2500.614 debug src/NoisePlethora.cpp:485 setAlgorithm] Didn't find  in programSelector

The log ends with this:

[2505.814 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using BasuraTotal
[2505.814 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 2, program: 0, name: BasuraTotal)
[2505.878 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using clusterSaw
[2505.878 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 1, program: 0, name: clusterSaw)
[2505.985 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using radioOhNo
[2505.985 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 0, program: 0, name: radioOhNo)
[2506.463 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2507.189 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2508.054 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using clusterSaw
[2508.054 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 1, program: 0, name: clusterSaw)
[2508.466 info src/patch.cpp:192 saveAutosave] Saving autosave /Users/kylegrayyoung/Documents/Rack2/autosave/patch.json
[2508.477 info src/settings.cpp:437 save] Saving settings /Users/kylegrayyoung/Documents/Rack2/settings.json
[2509.089 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using BasuraTotal
[2509.089 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 2, program: 0, name: BasuraTotal)
[2510.123 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using clusterSaw
[2510.123 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 1, program: 0, name: clusterSaw)
[2510.262 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using radioOhNo
[2510.262 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 0, program: 0, name: radioOhNo)
[2510.810 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2511.086 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2511.225 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2512.295 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2512.398 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2513.846 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2513.915 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2513.984 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2514.087 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2514.640 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2515.883 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2516.368 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2516.854 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 0, program: 1, name: Rwalk_SineFMFlange)
[2517.367 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2520.095 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2520.928 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 0, program: 2, name: xModRingSqr)
[2521.442 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2523.480 info src/patch.cpp:192 saveAutosave] Saving autosave /Users/kylegrayyoung/Documents/Rack2/autosave/patch.json
[2523.491 info src/settings.cpp:437 save] Saving settings /Users/kylegrayyoung/Documents/Rack2/settings.json
[2523.996 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2524.896 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 0, program: 3, name: XModRingSine)
[2525.375 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2529.336 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2529.856 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 0, program: 4, name: CrossModRing)
[2531.439 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2533.275 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2533.514 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 0, program: 5, name: resonoise)
[2534.032 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2538.488 info src/patch.cpp:192 saveAutosave] Saving autosave /Users/kylegrayyoung/Documents/Rack2/autosave/patch.json
[2538.500 info src/settings.cpp:437 save] Saving settings /Users/kylegrayyoung/Documents/Rack2/settings.json
[2538.663 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2538.943 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 0, program: 6, name: grainGlitch)
[2539.522 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2553.507 info src/patch.cpp:192 saveAutosave] Saving autosave /Users/kylegrayyoung/Documents/Rack2/autosave/patch.json
[2553.516 info src/settings.cpp:437 save] Saving settings /Users/kylegrayyoung/Documents/Rack2/settings.json
[2558.780 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2559.273 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 0, program: 7, name: grainGlitchII)
[2560.197 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2560.991 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2561.513 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 0, program: 8, name: grainGlitchIII)
[2562.058 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2568.516 info src/patch.cpp:192 saveAutosave] Saving autosave /Users/kylegrayyoung/Documents/Rack2/autosave/patch.json
[2568.527 info src/settings.cpp:437 save] Saving settings /Users/kylegrayyoung/Documents/Rack2/settings.json
[2583.543 info src/patch.cpp:192 saveAutosave] Saving autosave /Users/kylegrayyoung/Documents/Rack2/autosave/patch.json
[2583.556 info src/settings.cpp:437 save] Saving settings /Users/kylegrayyoung/Documents/Rack2/settings.json
[2590.656 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2590.898 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 0, program: 9, name: basurilla)
[2592.212 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2592.767 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2593.907 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2594.319 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2594.738 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using phasingCluster
[2594.738 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 1, program: 9, name: phasingCluster)
[2595.214 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2597.290 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2598.269 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using Rwalk_LFree
[2598.269 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 2, program: 9, name: Rwalk_LFree)
[2598.570 info src/patch.cpp:192 saveAutosave] Saving autosave /Users/kylegrayyoung/Documents/Rack2/autosave/patch.json
[2598.578 info src/settings.cpp:437 save] Saving settings /Users/kylegrayyoung/Documents/Rack2/settings.json
[2598.709 debug src/NoisePlethora.cpp:549 onDragEnd] onDragEnd 0
[2603.574 debug src/NoisePlethora.cpp:532 onDragStart] onDragStart 0 0
[2603.751 debug src/NoisePlethora.cpp:447 setAlgorithmViaBank] setAlgorithmViaBank: using TeensyAlt
[2603.751 debug src/NoisePlethora.cpp:462 setAlgorithm] Setting algorithm[1] (bank: 3, program: 2, name: TeensyAlt)
[2603.751 debug src/noise-plethora/plugins/P_TeensyAlt.hpp:24 init] init finished
[2603.968 fatal adapters/standalone.cpp:60 fatalSignalHandler] Fatal signal 11 SIGSEGMENTATION FAULT. Stack trace:
11: 1   Rack                                0x00000001093344b3 _ZL18fatalSignalHandleri + 275
10: 2   libsystem_platform.dylib            0x00007fff203bbd7d _sigtramp + 29
9: 3   libsystem_c.dylib                   0x00007fff8066f320 usual + 0
8: 4   plugin.dylib                        0x000000000ec2d86f _ZN4Bank14getProgramNameEi + 31
7: 5   plugin.dylib                        0x000000000ec189ae _ZN13NoisePlethora19setAlgorithmViaBankEi + 126
6: 6   plugin.dylib                        0x000000000ec1837b _ZN13NoisePlethora27processProgramBankKnobLogicERKN4rack6engine6Module11ProcessArgsE + 75
5: 7   plugin.dylib                        0x000000000ec17970 _ZN13NoisePlethora7processERKN4rack6engine6Module11ProcessArgsE + 2032
4: 8   libRack.dylib                       0x000000010946959f _ZN4rack6engine6Module9doProcessERKNS1_11ProcessArgsE + 143
3: 9   libRack.dylib                       0x0000000109466e31 _ZN4rack6engine12EngineWorker3runEv + 273
2: 10  libRack.dylib                       0x0000000109467a1d _ZNSt3__114__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEZN4rack6engine12EngineWorker5startEvEUlvE_EEEEEPvSC_ + 45
1: 11  libsystem_pthread.dylib             0x00007fff203768fc _pthread_start + 224
0: 12  libsystem_pthread.dylib             0x00007fff20372443 thread_start + 15

Good catch, looks like that’s just an easy ‘off by one’ error to fix. It reminds me I need to remove the test bank D, and also remove debug messages soon (although in this case it was useful!). EDIT: fix pushed

Nice! You’re quick! This has become my favorite noise module. I don’t think I’ve even scratched the surface yet.

Since the last post, for Noise Plethora, I’ve:

  • added soft clipping to outputs (-5 → +5V), like hardware
    • includes assymetric nonlinearity for bottom section to get even/odd harmonics with high resonance
  • added DC blocker, like hardware
  • tuned/calibrated playability of resonances and grit quantity
  • couple of fixes to make sure Teensy objects sound (roughly) the same at different sample rates
  • various refactoring/cleanup

Just wondering if there is any other feedback before we move this towards a release in the library? I was maybe thinking of making DC block always on (and just removing the menu item). This is my first time releasing something with filters in a musical context (i.e. beyond DC/antialising) so any feedback there especially welcome.

Nightly builds: Releases · hemmer/Befaco · GitHub

5 Likes

I’d say do it, but maybe the feedback you should be soliciting is: Is there ANY context in which you can use DC-offset for anything useful? I don’t know of any, so…

2 Likes

Possibly with LP filter all the way down you could get some interesting chaotic LFO stuff? As always it’s the tradeoff between complex/dense menus and feature completeness.

I vote for an option to turn off the DC-filter.

Correct me if I’m wrong, but If VCF had a DC filter always turned on, this would not have been possible.

Didn’t watch the whole thing, and correct me if I’m wrong, but aren’t we talking about whether to block DC on the audio rate signal or not? Because for that I’d say yes. Of course if we’re also talking about potentially slow LFO, then no. Forgive me if I’m confused, I don’t know the module so… but I’m guessing there’s a good reason the DC-block is on the hardware.

You’re right - I mistook Noise Plethora for a filter… Now that I have tried it, I see that my previous post was irrelevant.

2 Likes

It’s not just your modules that click when changing eg. filter mode and bypass on/off - could you make very short fades between states (1 audio-buffer?) ? Analog modules don’t click to the same extent i think.

no on DC filter always on

Do you suspect the noise distribution is deviating from gravity center in time ?

This is probably a good idea (also for when algorithm is changed). Maybe not for filter bypass though, as that’s a bit of a niche option to use. Is there a particular compact way to implement this that you (or others) can reference? I was also thinking of this for Muxlicer.

Both white / gritty noise are fine from my checks, but the top section algorithms sometimes have DC (e.g. clusters of pulsewidth modulated square waves).

I’m thinking of “clickfilters” - But I don’t know…

1 Like

noooo, my gurgler would fail to work if you turn it off (which is fine, as long as I can turn it on again to return to current state) and remove the context menu item (not fine, leave it there please!!!)