Psylab historic

If wanna read more about psylab historic..

Working for vfx industry since 2005 and using cubic beziers every day in every single soft we use, i would personally never consider using something else for my daily parameters animation.. so I naturally went looking for some tool using them in audio domain, and I was quite surprised that nearly no daw/vst/synth were providing this system, ie for envelopes, lfos or automations but always some more basic version of them. wondered why. Thought one of the reason was probably they were more complex to implement and/or manipulate at first..

In 2013 i started psytrance production. Psy Kick-bass combo quickly appeared to be  quite challenging aspect to design from scratch for me, yet important as the driving foundation, running nearly 80 percent of a track duration, defining a lot of its character, feel, power  and structure. 

To me things like kick generators could have benefited a lot of such true cubic beziers implementation for ex. That was one of the main reason i wasn’t fully happy with the ones i had.
also they didn’t have convenient zoom-scroll with 1:1 linear time match, had envelopes usually limited to amp /pitch only , offered a pretty basic set of layering/generating engines, were not 100% tight / sample accurate, ect…/rant…

but mostly i wanted to be able to design kick and bass TOGETHER if wanted to. tune them, phase them.. being able to easily A-B compare, edit, save, recall, several different kick bass combos tests in one place with an oscilloscope, rather than fire 3 plugins  (one for kick, one for bass, one for scope, and even one for sidechain sometimes..) and struggle or loose time to sync all the stuff and patches each time, merge in other projects ect…

So in 2015 I decided to start trying to give a shot at prototyping my own ‘simple’ kick generator first, using nodes in a modular software called sensomucic Usine ( which allows, among tons of things, user scripting, nodal patching, and C++ sdk coding of user ‘modules’ that allow to get results relatively fast).

usine 1rst iteration nodal patch
usine 1rst iteration nodal patch

That’s when i started to understand that cubic beziers were quite heavy on cpu for audio tasks… involving a lot of math operations.
( bezier formulas ).

P = (1−t)3P1 + 3(1−t)2tP2 +3(1−t)t2P3 + t3P4

Above cubic formula returns a curve point  from 4 input points  (2x in-out and 2x controls handles). this has to be 2x times computed, once to get X and once for Y coordinates… that’s already quite a few multiplications and additions for  a single sample..

While video content is usually working with ‘slow’ fps (25-60-120 at most), audio precision requires at minimum 44100 evaluations per second !, ..ok that’s maybe why they were not that used in audio domain..

That could be fairly descent and simple if ending here..

usine 2nd iteration scripted
usine 2nd iteration scripted

..But next problem is beziers are so-called « parametric equations », for a given t request (t being parameter on curve, not time) they return an xy coordinate as seen previously. While that’s cool for gfx usual  paths drawing, creating a dot on an xy canvas (and just connecting dots with edges, or computing more dots than pixel rez for lines ), that’s not ideal for audio/discrete time applications.

If we look at above picture, the bezier curve looks fine, but the dots aren’t evenly spaced on X axis, compressing/expanding depending on control point’s positions. Naively applying would ‘stretch’ the real positions.
Audio samples are evenly spaced in time (X axis), what is needed is to return Y ( sample value ) for a given X (sample time).
Non parametric, explicit form y=f(x) requires first to find t for given X, then Y for that t.

usine 3rd iteration
usine 3rd iteration

Solving this could look simple.. but revealed to be quite complex and expensive. After trying different ‘cheating’ methods (Newton iterative method, brute force binary search, pre calculated LUTs…), i wasn’t fully satisfied as those were lower cpu, but weren’t totally accurate in all possible scenarios, and involved a precision tolerance, or quite restricting pre-calcs. The only 100% accurate method at any requested resolution is a real cubic equation roots solving, using cardano’s method , which again adds a shit load of more complex computations layer.., but gives on the other side ultimate accuracy results.

Sooo.. that was way more complex than expected.. especially since im not that a math genius either.. but at this point the module finally had at last that ‘true cubic bezier at audio rate’ system i was after since along time, working perfectly, bit high on cpu, but without any quality compromise.
Since then refined the alg/optimisations as much as possible , and hopefully today’s computers have evolved a lot and are now able to handle such load.

usine 4th iteration module, C++ compiled
usine 4th iteration module, C++ compiled

Then « Psylab » was born as a more advanced continuity of this project, designed around implementing such system for driving several audio events « animations », with sample accurate, ultra tight, hi def bezier curves, to control a wider range of aspects of the sound over time, ie amplitude, frequency, oscillators shapes, filter, distort amount ect…

With the engine growing in abilities it became a full 4x parts multi-timbral with lot of sound design possibilities, even if more focused on kick-bass. The main idea now is to provide a way to quickly design /save/recall/scrub all-together a 4 parts ‘PGM’ that could make the foundation of a track. (ie kick-bass-perc-lead), or a coherent ‘idea set’ of sound playing well together.

Read more