A few people have asked how this is done.
The short answer: I write a lot of Python code to generate the files.
The long answer is:
Each synth/effect is a project in itself. Each patch file is a collection of parameters. Typically I start by reseting the device and saving out the Init patch. From there I examine each parameter in depth and how it effects the synth. Then I write rules to generate new parameters. These rules are mostly rules you would use when designing your own patches, like:
If the patch is a pad, generate longer attacks and decays.
If the patch is a bass, generate short attacks.
If the patch is a bass, make it monophonic.
If this filter is a low pass, generate the cutoff higher.
If this filter is a high pass, generate the cutoff lower.
If the filter is a comb, generate a lower resonance.
If the patch is a pad, don't modulate pitch.
If the patch is an FX, you can modulate pitch.
Don't modulate things that effect the volume.
Avoid combinations that cause silence or really loud patches.
etc
etc
etc
In Python these rules look like:
Code: Select all
s.np[ fltr + "type"] = choice([0,0,0,1,1,1,2,2,3])
s.np[ fltr + "velocity" ] = randint(0,40)
s.np[ fltr + "key_follow" ] = randint(0,127)
s.np[ fltr + "self_osc" ] = randint(0,1)
s.np[ fltr + "state_filter_notch" ] = randint(0,127)
s.np[ fltr + "state_filter_type" ] = randint(0,4)
s.np[ fltr + "ladder_slope" ] = randint(0,4)
s.np[ fltr + "comb_type" ] = randint(0,1)
s.np[ fltr + "formant_gender" ] = randint(0,127)
#s.np[ fltr + "invert" ] =
#s.np[ fltr + "drive" ] = randint(0,127) TODO, gain down
if ( s.np[ fltr + "type"] == 0 ):
s.np[ fltr + "cutoff" ] = randint(40,120)
s.np[ fltr + "resonance" ] = randint(0,118)
if ( s.np[ fltr + "type"] == 1 ):
s.np[ fltr + "cutoff" ] = randint(40,90)
s.np[ fltr + "resonance" ] = randint(0,115)
s.dests += [ "dst_" + fltr + "notch", ]
if ( s.np[ fltr + "type"] == 2 ):
s.np[ fltr + "cutoff" ] = randint(0,127)
s.np[ fltr + "resonance" ] = randint(40,100)
if ( s.np[ fltr + "type"] == 3 ):
s.np[ fltr + "cutoff" ] = randint(40,90)
s.np[ fltr + "resonance" ] = randint(0,20)
s.dests += [ "dst_" + fltr + "gender", ]
So you end up with a huge collection of rules for generating patches so they don't sound too terrible, and you end up with some of patches that actually sound good. Then you take all these generated parameters and dump them out to a file and save it. Then you generate a few thousand of them and build a refill.