I am mostly using custom written sequencers based on:
cellular automata (game of life, langton ant etc.)
Sequencers driven by opcodes (like in this norns study https://monome.org/docs/norns/study-3/ but with special opcodes that allow to change opcodes in other tracks or change their speed etc)
And right now my favourite algorithm is genetic algorithm with which it is very easy to create constantly changing rhythms (some examples here:
which still travel around the basic rhythm programmed by user in contrast to purely random walk etc which very fast starts to differ a lot from the starting point. And for me this “feeling” that everything revolves around some particular center makes it more interesting that just purely changing steps at random.
There are also very nice generative sequencers in Reaktor, my favourite is probably NOD-E
EDIT: I also forgot about this sequencer that I wrote: https://firmanty.com/zyjatka/ which is based on simulation of artificial life but is not as “discrete” as cellular automata. If someone knows some similiar sequencers that use simulation for musical sequencing I would be glad to hear about them.
I like your track. How do you prevent a genetic algorithm from straying too far from the original? I appreciate that a random walk can produce shitty results and that genetic algo can better guide progress, but given enough time, I would still expect it to deviate greatly from the seed.
I don’t know how much you are acquainted with how genetic algorithm works so excuse me if I will explain things that you already know.
Basically seed for genetic algorithm is population of random patterns and the target is most of the time constant. And the genetic algorithm makes it so that this random populations tries to arrive at the target so overtime the patterns is more and more similiar to the pattern created by user. In contrast to random walk there is a problem of population fitting to well to target and stopping evolving after arriving at target so there is a mechanism of inserting random mutations to ensure that there is always some change.
Maybe I will try with some example:
Assume that user entered simple four steps pattern (1 is on 0 is off):
At the beginning you start with random population:
You then need to have a function that for every pattern calculates how “far” it is from the target pattern. Even for such simple case there can be different functions but for this example we can assume that we calculate how many steps differ in pattern from steps in target pattern. So for our population we would have distances of:
0000 - 1
0111 - 4
0101 - 3
1101 - 2
We then need a function that creates a new population of patterns from the previous population and takes their distance into account. For example we can choose two patterns that are nearest to the target and then create new population from the by selecting at random bits from the two patterns that were selected:
So as a basis for our population we choose 1101 and 0000 and the next population created from them could be:
You can see that there is already a pattern that has the same steps as target pattern. But to prevent algorithm from getting constant stable results after some time there is also a small chance of random mutation that can happen that can flip some bits in already selected population.
If you will find someone how can do electronics then I can do the code no problem I was thinking about releasing it as a desktop app but I need to clean up code a bit and move it from processing to something like electron so everybody could run it without need for external software.