Weeklybeats is a 52 week long music project in which artists compose and publicly release 1 song a week for the entire year.
Starting January 1st 2024 GMT each participant will have one week to upload one finished composition. Any style of music or selection of instruments are welcomed and encouraged. Sign up or Login to get started or check our FAQ for any help or questions you may have.

SEDlock

By wangus on February 7, 2022 12:01 am

A """simpler""", scrappier track this week, because I spent way too much time pulling HOT TRASH in the M8.

All synthesized; not raw internal render, because I don't even know if the internal render is compatible with this track (and to make a synced video, I had to record real-time.)  Read on...

The tl;dr: randomized, generative arpeggiations of random length that are still roughly synced with the other (deterministic) tracks.  A technique to have cross-interactions on M8 track sequences.
I call it "SED-locking".


Part 1: the tempo-conditional table.

In the M8, the only commands for a track to directly affect another track are the VTx commands, controlling mixer volumes.  (I use this in this track for some sidechaining/ducking of the main random arp).  That's not useful for sequences though.
There are a few commands that have global effect, so they implicitly affect all tracks: SCG (global scale), TSP (global transpose), and TPO (global tempo).  The first two can be used for some interesting harmonic/melodic cross-influence, but that's not what I'm looking for.  TPO offers an interesting option.
The global tempo by default affects the speed of all chains/phrases/grooves, and tables.  But tables uniquely have one non-tempo-synced option: TICFF, 400Hz tick rate. 

We can set up a table like this (one FX column shown here):

0: ---00
1: REP0F
2: ---00
... [more ---00]
A: ---00
B: TIC00
C: xxxxx
D: HOPFB
E: HOP00
F: TICFF

The final TICFF sets this FX lane to run at 400Hz (M8 shortcut; a TICxx at the end of an FX lane is equivalent to putting it at the start of the table).

We set up a phrase with a note every step (constant 16th notes).  Normally, every note resets the table to step 0.
With the value of REP0F and the number of empty spaces ("..." above), at a tempo of 121BPM, the table never hits the "B: TIC00" line.
If we lower the tempo to 119BPM (more on this later...), the 16th notes slow down, but the table ticking doesn’t (fixed 400Hz), and the table hits "B: TIC00".  This changes the table ticking to stepwise.
On the next note in the sequence, the table begins repeating whatever is in the "xxxxx" step, for a limited number of steps ("HOPFB" hops to step B 15 times.  I didn't actually know about the left digit of table HOP till I was experimenting here...  In retrospect, I could have used REP0F?).  After 15 repeats, we step to "F: TICFF" which reverts to 400Hz tick rate.

This is "useful"* (not really; read on) because it creates persistent table behavior triggered by global tempo, which can be modified by another track[i] with TPO.


Part 2: the SED-lock

Now: what do we do with this?  We could affect any FX-controllable instrument parameter, which could be cool for some cross-track sound design.  But I wanted [i]sequence shenanigans.
We could do some scale/pitch stuff in the table, but space is limited.  The SNG command (hop to a song row) is apparently simply ignored in tables (understandable; sounds like a nightmare to handle robustly), so that’s no use.  GRV/DEL/KIL/RET might be fun, but they’re pretty specific (also I don’t even know if GRV works in tables?).

The most interesting option: SED.  If we put a “SEDxx” in the “xxxxx” slot in the table above, we can lock the RNG every step (for the duration of the “D: HOPFB”).  Any RANxx/CHAxx commands in the sequence suddenly have a guaranteed output, depending on the value we give to “SEDxx” in the table* (not exactly; more on this later…).
And CHAxx can affect arbitrary commands, so with TPO, the tempo-conditional table, and the RNG “SED-lock”, we can make any FX command cross-track influenced!

The SED-lock table can guarantee a certain CHA triggers only if that CHA has a non-zero base chance.  There’s no SEDxx seed that will make a CHA00 trigger.  (similarly, we can’t force a CHAFF not to trigger).
That might be OK, but if we’re trying to keep sequences synced, we don’t want any chance a CHA triggers/not-triggers when we don’t want it to.

So I used the following commands many times in this week’s track:

… ---00 SED07
… CHAFD SNG02
… ---00 SED00


with “SED01” in the “xxxxx” step in the table above.
“CHADF SNG02” never triggers after a “SED07” (trial-and-error to find this).  But it always triggers after a “SED01”, so if we put that in the instrument table, the global tempo controls whether the “SNG02” is triggered.  Otherwise, the sequence just passes over that step and proceeds normally.
We might want actually-(pseudo)-random behavior elsewhere in the sequence, so the final “SED00” reverts to a random seed.


Part 3: why would we want this

Because we like doing Dumb Shit(TM).  Specifically in this track:

1. Polymeter without having to do math to make things line up.  In this track, there are some patterns that are 15-sixteenth-notes long (16-step phrase, with a groove that has two “03”/thirtysecond-note steps).  Cool rhythmic phasing at play, but to make it with “standard” phrases, you’d have to figure out how many times 15 steps fits into the larger structure, and put a specific HOP/groove to keep things lined up.  With the SED-locked SNG jump above, the M8 can internally break a phrase out of an isolated loop.
2. And more interestingly, random-walk sequences.  If you put a “CHAF8 HOP00” on step 2 of a phrase, there’s a 50/50 chance whether step 1 will continue to step 2, or jump to step 0 of the next phrase.  If there’s only one phrase in the chain, and the chain is “disconnected” in the song, then step 1 effectively has a 50/50 chance to proceed forward or backward.  We can repeat this on every other step (adjusting the “HOPxx” value appropriately) to get a sequence that randomly walks forward and backward.  There’s no way we could normally sync this to a larger structure automatically, unless we locked in the RND with a phrase SED command and laid out exactly the right number of phrases (which would be tedious, and use up a lot of chains, since every “backward” step is actually 15 steps forward into the next phrase).  So the SED-lock concept helps here
2.5. At the end of this track, I use the same concept but with a fast groove (03 instead of 06, making 32nd-notes).  So instead of a melodic sequence, it’s more an arpeggiated harmony, advancing through chords with the TPO/SED-lock triggers.  The instrument table is condensed to reflect the faster notes (lower “1: REP0x” value, and fewer blank rows).

The SED/SNG combo above could help with both of these.  The sequence-break is restricted to the step that the SNG command sits, so the timing of the change might not be exactly on beat.  But that’s not really essential to keep a track flowing (you can accent the actual beat with other, deterministic tracks).  You could also scatter more SED/SNG combos for finer resolution (make every other step a SED/SNG “breakpoint”?).


Part 4: it’s actually ass

I love using the wrong tools for things.  It was super fun to “exploit” the M8 sequencer with this cross-track technique.  But I wouldn’t recommend using it; it’s too finicky, too much overhead, to be really useful.

First, as noted above, it’s hard to get it exactly synced with the sequence.  Specifically, I had some random-walk/polymeter sequences that had some 32nd-note steps, for a cool flutter/fill effect.  If the sequence-breaking landed at the wrong time, the SED-locked track would get misaligned by a 32nd-note, which sounds unacceptable.  At least one attempt at recording the track here failed for this reason.  (side note, I don’t even know if this works in the M8 internal render mode?  I wouldn’t be surprised if the 400Hz table behaved slightly differently there).

Second, the 400Hz table operation seems to be slightly non-deterministic (or at least dependent on hidden factors).  Through trial-and-error, I found that 121BPM and the TICFF table above would reliably not hit the “TIC00/SED01” table steps.  And it seemed that 119BPM did.  Except in some chains, the SED/SNG combo wouldn’t trigger unless I nudged the TPO commands around, or bumped to 118BPM or lower.  I wonder if the 400Hz table stepping isn’t actually guaranteed 400Hz.  (maybe it depends on CPU overhead doing the sequence stepping and such).
(Side note: I don’t know how, but I managed to get this project file in a weird state where the “T>xxx” tempo display read 1 lower than the “TEMPO” field.  Like it said “T>120” when the global tempo was “TEMPO: 121.00”.  I fixed it by setting the tempo to 999, at which point the “T>xxx” value was also pinned to 999, and it stayed lined up when I lowered the tempo back to 121).

Third, CHAxx has some very subtle unexpected behavior with SEDxx.  You’d only run into this while trying to hand-pick chance/seeds to manipulate RNG for whatever reason.
* CHADx, CHAEx is guaranteed to trigger the left side after any SEDxx.  CHA5x to CHA0x is guaranteed not to trigger.
* CHAxE is guaranteed to trigger the right side after any SEDxx.  CHAx2, CHAx1 are guaranteed not to trigger.
For example,

C4 … SED00
C5 … CHADx


The C5 should trigger most, but not all, of the time; more often than CHACx, but not 100%.  CHACx works as expected here, but CHADx triggers the note 100% of the time.
Similarly, if you go through all values SED01 - SEDFF here, the C5 always triggers.
Now, I wouldn’t necessarily say this is a “bug” (it’s pseudorandom, so this is technically possible.  But it feels super unlikely to have so many CHAxx values that don’t act randomly after a SED00)
But even if it’s a “bug”, it’s certainly not worth fixing.


Conclusion

I had a lot of fun making the M8 do these things it wasn’t meant to.  Feels like the time I got key-tracking working on the Elektron Analog Four (which does not have a key-tracking mod source for the filter cutoff or most other parameters).  https://anguslocke.wordpress.com/2020/0 … -2-days/3/

Unfortunately there’s too much fiddliness/inconsistency/overhead for this to actually be a useful technique.  It gets in the way of actually crafting music.
But WeeklyBeats is a great setting to dive into this sort of thing, a hard (ish) time limit that prevents slogging beyond what’s valuable/productive/fun.

Video, in which I haphazardly navigate around to try to show what's going on:

Audio works licensed by author under:
Copyright All rights reserved

Sounds pretty great! And super impressive work on smashing what's possible on the M8.
Can't wait to see the vid!

Listened to this without reading your M8 master's thesis, and thought the tune was great. Then went back, read through twice (second time after watching the video, because without the video, kinda hard to understand intended behavior from the table alone. Here's where my mind's blown -- the tune is convincing AF on its own merit, then I'm looking at how it's done and I'm following the stochastic tables trick, but am not following how you managed to make a piece of delightful music with it since synchrony is not-quite-but-kinda out-of-the-window in places...

Seriously bad-ass, I shall henceforth refer to all work that goes to surprising and inspiring extremes to achieve itself as wangusesque. heart

That's quite a read, trackers aren't my thing, so instead I'll just listen to this song a few times, it's nice

All I know is I'm proud to be part of generative gang, even if only a junior member, oh master. ;P
OH MY GOD THAT ENDING!!!

Good stuff, enjoyed this ride. Too late in the evening to try to read technical stuff, so that's on the musical merit alone. smile

this is soooooo freaking tight

You need to login to leave a comment.
Login Sign-up