💾 Archived View for thrig.me › blog › 2023 › 08 › 08 › least-recently-used.gmi captured on 2024-05-12 at 15:28:55. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-11-14)
-=-=-=-=-=-=-
A technique for algorithmic composition is to pick something least recently used. This could be deterministic, or one might randomize the selection. Atonality uses this with a pitch set, say of C D E G, where if you use C then D E G are available because they are the least recently used. Computers can help with this.
#!/usr/bin/perl use 5.36.0; use List::Util 'shuffle'; # given an array reference, picks one item randomly from the front, # and returns that item after moving said item to the end sub picker ( $ref, $shuffle = 1, $bounds = ~0 ) { if ( !$bounds or $bounds > $#$ref ) { $bounds = $#$ref } elsif ( $bounds < 1 ) { $bounds = 1 } my @intervals = $shuffle ? shuffle @$ref : @$ref; my $last = $#intervals; sub () { my $pick = rand $bounds; @intervals[ $pick, $last ] = @intervals[ $last, $pick ]; return $intervals[$last]; } } my $fn = picker [ 1, 2, 3 ]; say $fn->() for 1 .. 10;
Choices here are how much of the list to use when picking a new value, and whether to shuffle the list in advance. A downside of a closure is that modifying the original list is then difficult, though the callback sub could modify the items somehow.
$ perl least-recently-used.pl 3 2 1 2 1 3 2 1 3 2
One use for this is to construct random scales comprised of minor, major seconds and minor thirds, though the values could also be used to pick a rhythm or a chord to use. Here's descending made-up scales that reset up to some random high starting note whenever the drop has gone on for too long. The length of the drop is also randomized.
Someone who actually knows music called it "Kraftwerkian".
The following version of the code modifies the intervals on the fly, and picks a random duration, though it takes a longer run to see how wacky the results can get. Probably for a background pad you would want something short and then to repeat that, maybe with variations.
Mostly this is fiddling with the code and re-rolling the random numbers until something not quite terrible emerges.
Here a priority queue ranks what pattern to use, though again there is randomization on where a used item is stuck into the queue. The code sometimes gets stuck on particular patterns, though.
tags #composition #music