I'm currently running a loop that compares the patterns bitwise based on kick,basskick, toms and snare (AND and XOR as same and difference values summed up as sum and diff, which then get subtracted from each other to make one value. The highest score is the one that has the least difference).
This then runs continuously at control rate, comparing pattern after pattern, swapping patterns and just redoing the same the next round over and over as long as the button is high... which it still is atm after writing this... I wonder how it's going XD
SirSickSik Contributions
Hehe. Cool. It always surprises me when people do this kind of thing on the Axoloti itself.
You'd be much better doing this with a little desktop C application or something like a Python script, and writing the results directly to a binary file (that's all an Axoloti table file is).
Your sorting method is ingenious, though. I wonder how the results sound.
Where did you source the patterns?
The patterns come from all over the internet.
About doing this on the computer.... I'm coding modules for the axoloti, but I'm no real coder, I just quickly know how to "get around stuff" in a basic environment Eg. I wouldn't know how to play a midi-file using code.. I was lucky to have a midi-play module in synthedit that I could abuse for this..
The sorting process did work more or less as after it, it just made dubstep/breakbeat for over an hour long after that and it sounded nice XD
Though actually sorting techno with techno and breakbeat with breakbeat, didn't go thát well, it's more like a continuous change within the rhythm, but keeping more or less the familiarity when playing the rhymthms one after another.
I'm going to put some more algorithms in there to make multiple sorting processes that I can use after each other and try to make actual groups of certain rhythms, so that you could actually know where for example the "D&B" patterns are in the list.
In the end, I hope to get a nice table that I can upload with the main play-module as a header (atm not sure how though haha Otherwise it will just be a file to put on your SDcard and load it manually). This way, you just need to load that module and have 2995 rhythms ready to use with a counter and selector and some drum modules
Making the actual midi2table converter available is not really useful atm as it depends on how the midi is played by synthedit, and, well, there'll be 2995 patterns already that you can combine in any way you want (just use a pattern on the select input). Though it's possible to make a vst out of the synthedit patch which might do the job, all the steps together to come to a nice table are probably a bit too much and complicated to explain.
Anyways, it should be seen as an 8-channel "grids" module (modular rhythm module with 4 channels), a quick access to try out your patch or to have something to quickly generate some pseudo random rhythm. The trigger outputs are fractional outputs that output a short pulse at a certain velocity. Envelope modules can be changed to have their trigger level set by the incoming trigger (eg. the decay envelope starts at "(1<<27)", which could be changed to "inlet_trigger" and change that inlet from bool to fractional). Most of my drum modules already have that input to allow these velocity-triggers.
I've rebuild the entire midi list and listed them, now currently recording all the midifiles (this will probably take a couple of hours)
current list:
techno 000-013
house 014-118
ambient 119-134
down tempo 135-142
triphop 143-239
D&B 240-354
breakbeat 355-689
glitch 690-772
world 773-861
african 862-936
country 937-048
latin 1049-1197
polka 1198-1207
R&B 1208-1230
hiphop 1231-1372
blues 1373-1429
jazz 1430-1554
funk 1555-1656
reggea 1657-1789
ska 1790-1792
pop 1793-1846
punk 1847-1894
doom 1895-1919
rock 1920-2374
hardrock 2375-2458
metal 2459-2557
kitloop 707 2558-2581
kitloop 808 2582-2606
kitloop 909 2607-2631
mixed 2632-2756
percussion 2757-2866
random left 2867-2912
Hi SirSickSik,
I've been using your polymidiXL object. It's really great (like always). Thank you so much!!
Is it possible to use your scaleLIVE object with polymidiXL (in stead of scale7bank)?
I tried some things, but so far no luck... Would be great!!
Any ideas? thanks!!
greetings
@SirSickSik thank you so much for all your hardwork and patches.
Any beginners who have problems with polymidiXL - read below for help:
I'm still a massive beginner with the Axo, it has taken me about 2 hours just to understand and make a basic midi looper patch with polymidiXL - but I got there!! (phew axo makes me sweat....for things that take me 2 seconds in pd)
in case anyone else (beginners) has the same problem, see the screen shot here of my working "basic" midi looper patch - I've also jst uploaded the patch here too. Hopefully that will save you a few hours.
(to help the search engine, here was the previous error I got, before I discovered the scale7bank issue)
error: 'class rootc' has no member named 'instancescale7bank__1_i'
DATA=(parent->instancescale7bank__1_i.note[DATA+scale]+octave*12)+key-4;}
The scale7bank object loads a custom table from your polymidiXL and to set the available notes for the "keyboard".
This scale has to be generated first by the generator (which is named in the overview of the scale7bank object), which then automatically saves to your SDcard. After this, you don't need the generator, as the table can load from SDcard automatically using the scale7bank object (which in it's turn is used by the 46scales7 and polymidiXL modules) .
The difference is that the scale7generator will generate it's list in the ram memory, eating up precious space that could be used for actual codes and the 46scale7 and polymidiXL modules will load the values in SDram (the part that's used for delays and tables).
I created the scale7bank object to allow a bigger range for pad-based midi-controllers (eg. 4x4 pads), used in their "factory setting" of a chromatic scale. So every note you play with the chromatic placed pads is a note within the scale. (eg. 0, 2,4,5,7,9,11 instead of 0, 1, 2, 3, 4, 5, 6)
It's also very useful for random melody generators as every 7 "steps" have their own note values assigned to it, so you always know that values 0 to 6 will be one octave and 0 to 13 will be 2 octaves, etc., but all in a certain scaling.
Thanks, yes I read the description for scale7bank, so it’s a bit clearer now.
My comments in the above patch/screenshot were aimed at a complete beginner who just wants to create a midi looper (where the scale7bank, is not required, but you do have to load it in to get the patch to compile).
I’m looking forward to exploring more of your objects/devices!
John
Hi SirSickSik
Youre stuff is great.
I've been trying your chainFx (12fx, no empty loaded) and the Flooper together,
and,
I'm experiencing -1 errors and disconnecting after a while (30 or so seconds)
when playing live or as startup.
But each playing alone is ok.
I'm not expecting anything from anyone.
I just wanted to report and say
thanxalottoanyofyou.
I will tell more when I know more.
Cheers Pol.
Hey SirSickSik, your turorial how to add M + D inlets to your riotCell worked!! thanks!
now I wanted to distribute those GATES generated by your many gate/rhythm-generation-modules freely through a matrix to different inputs.
your matrix16x16 seems to do the task, but I am not sure how it works.
can it do one source to many destinations & many sources to one destination?
it seems that when I change the destination via clicking it changes for ALL sources.
also it is not randomizable and needs every time a setting of source & destiny & gain = 3 steps for one configuration?
the same plan is for distributing quickly k-rate modulations through the whole system.
so one could have a big, randomizable, freely distributed web of gates & cv... the dream of every modular synthesist indeed. any tippz on how I could move in this direction?
something in this vein does the "smthRotator", but it switches in a circle & not "totally free" mux/demux distribution... I hope you know what I mean.
maybe it is possible to build a patcher with elementar objects like mux/demux, logic, switches....? I have to break down the core function of a matrix to wrap my head around it.
I also didn't understand what you meant with:
"useful in combination with the "autoSource" module, though it takes 14%!! ai....
so because of that, we also have the:
"matrix8x16"
8 x 16 modulation matrix for control signals
takes about 7% combined with 16 autoSource modules"
I didn't find "autoSource" - do you mean the "modsource auto" object? it has just one input & nothing else. I saw a couple of this kind of modules in the library with only inputs or only outputs & wondered where does the function "hide".
ha, I was drunk at the same time you posted
the randomizable routing-matrix (yellow & blue version) on the side -
I am currently in love with your rndPattF16 (listening to the output it reminds me of the Eurorack Modcan QuadLFO). I am wondering how to build a randomizer inside rndPattF16 to randomize all the params with one click.
As I looked up from your PolyCount, which has a randomizer, the core-randomizer-code should be:
int rnd=inlet_rnd+param_rnd+RND;
if((rnd>0)&&!strig){
RND=0;
max[0] = (int32_t)(GenerateRandomNumber());
max[0]=max[0]-max[0]/width*width;
max[0]=max[0]<0?max[0]+width:max[0];
max[0]=((((max[0]+param_min)/param_quant)*param_quant));
for(i=1;i<64;i++){
max[i] = (int32_t)(GenerateRandomNumber());
max[i]=max[i]-max[i]/width*width;
max[i]=max[i]<0?max[i]+width:max[i];
max[i]=((((max[i]+param_min)/param_quant)*param_quant))+max[i-1];
}
strig=1;}
else if (!(rnd>0)){strig=0;}
I am trying to make sense of it how to put it into other modules...
Why are so many "max" inside it? I don't know where to start, there is no easier way where I can copy&paste the parameters of a respective module I want to customize, right?
Thanks for your work SirSickSik, almost everytime I dig through the library I land at one of your modules!
You can randomise knobs&lists adding your own code:
-create a "rnd" button
-enter "bool rnd;" at local data
-enter "rnd=0;" in init data
-enter this in the k-rate data:
"
if((param_rnd>0)&&!rnd){
rnd=1;
PExParameterChange(&parent->PExch[PARAM_INDEX_attr_legal_name_NAME],VALUE,0xFFFD);
}
else if(param_rnd<1){rnd=0;}
"
now copy&paste this part a couple of times:
"PExParameterChange(&parent->PExch[PARAM_INDEX_attr_legal_name_NAME],VALUE,0xFFFD);"
You need one line of this for each knob on the module you want to be able to randomise.
Then change the "NAME" into the name of the parameter.
For "VALUE" you can enter a random value using this code:
Unipolar "normal" knob:
"(int32_t)(GenerateRandomNumber()>>5)"
Bipolar "normal" knob:
"(int32_t)(GenerateRandomNumber())>>4"
Unipolar "big size" knob (eg. decaytime and gain knobs):
"(int32_t)(GenerateRandomNumber()>>1)"
Integer between 4 and 99:
"(int32_t)(GenerateRandomNumber()%(99-4))+4"
A set amount of bits (eg. 12, unipolar)
"(int32_t)(GenerateRandomNumber()>>32-12)"
ps. Johannes and technobear will probably tell you this isn't the right way to do it as with "the new update" this won't be usable anymore. But I was also told this over a year ago and that update still ain't here..so..when the time is there, I guess we'll need to do some re-coding..
oh, that means all my mods will be deleted in the most recent update? how do you deal with that? you must have made tons of mods...
thanks for the tutorial!
works... almost!
only the Parameter I put in the first part of the k-code works normally
if((param_rnd>0)&&!rnd){
rnd=1;
PExParameterChange(&parent->PExch[PARAM_INDEX_attr_legal_name_NAME],VALUE,0xFFFD);
}
else if(param_rnd<1){rnd=0;}
all the parameter in the re-pasted
"PExParameterChange(&parent->PExch[PARAM_INDEX_attr_legal_name_NAME],VALUE,0xFFFD);"
randomize very fast all the time with k-rate speed, I suppose. so logically I tried to re-paste the working part for all the parameters but then no randomization happened at all, except again for the parameter in the first part of code...
I equiped all other lines with their own "else if(param_rnd<1){rnd=0;}" - but know they simply do nothing at all. just some poking in the dark...
you have to paste that part directly under the other "PExPar..." line, between the first two brackets.
the "if((param_rnd>0)&&!rnd)" will prevent it from retriggering as soon as rnd becomes 1. As soon as you release the param_rnd, it will go back to zero, without retriggering the randomisation
thanks, it works great!
is it a good idea to make a copy of an object & edit that, so that it won't overwritten with the next update?
Yes i is a very good idea, if you want to save it. If you dont embed it and just edit it directly and then save it before leaving the patch, you can end up in probems next time you uådate the community library. It ill then download the version from the community lib and overwrite your object. So always save as new ir embed
yes, if you want to use your editted module also in other patches, just save it to your own contributions-folder or home-folder. If you only need the edit for just one patch, you can just embed the module and do the edit. In this case only this patch will have the module with the changed code.