a gathering— a group study where participants each create a script according to a prompt. scripts are submitted by an established deadline. discussion and help will be provided to facilitate completion of scripts.
construct an evolving expression of rhythmic time using provided synth drum samples, the new lfo library, and sequins.
7 sample groups with 9 variations are provided
no USB controllers, no audio input, no engines
visualization of data
parameters are subject to interpretation. “stability” could mean timbral parameter randomization, but perhaps something else. “horizon” could mean the navigation of changes to rhythmic balance, but perhaps something else. “relax” and “bind” could mean a stop/play mechanism, but perhaps something else.
see the lfo docs for additional details on the lfo library.
see the sequins docs for additional details on the sequins library.
see the softcut helper readme for additional details on the optional softcut helpers including in the lib file.
ok here we go. today, in about 30 minutes from now (7pm pst). coding a nc03 idea from scratch.
here is the url:
here is the gameplan:
look at guidelines of project.
prototype idea in daw with samples.
how to Github (forking, cloning, credentials)
get mvp working
goto step 6
I think that twitch will archive the feed so don’t worry about missing it.
edit: stream finished! I got stuck on #7 with a weird bug. the 85F and late time converts my brain to flatbread so I will clear the bug to move onto new things in another time. here is a link to the code written so far for this “benjamin button” style sample sequencer where samples always have their start on the beat but sometimes they begin at the end instead of the start: nc03-ds/infinitedigits.lua at main · schollz/nc03-ds · GitHub
next time: clearing a bug. adding a ui. adding controls.
dang, yeah, @infinitedigits that was such a treat – it’s so meaningful to be able to watch a brilliant artist problem-solve their way through a fantastic idea.
on the heels of zack’s walkthrough + @radioedit’s fantastic loud numbers workshop today, i’m going to spend a few hours in the #lua channel of the norns discord server tomorrow for synchronous (or drop a question in ahead of time and i’ll make sure it gets addressed!) text-based support for nc03. totally happy to answer q’s about the included files or lfo lib, chat through approaches / workflow planning, mess with some code sketches together, whatever’s helpful!
hope everyone’s having a nice sunday
used the two hours to build out a couple ‘studies’ detailing some approaches nc03’s constraints. hope these are helpful for folks as you approach your own scripts!
1: moving nc03 samples from project audio to dust audio
upon first download, the audio files for nc03 are bundled in the project’s audio folder. since folks typically expect audio files to live inside dust/audio , we need to migrate these files from the project to dust. even if you don’t choose to use the included softcut helper files, there’s a pre-wrapped function which performs this action that is useful to deploy for this single purpose:
^ that’ll print moving audio to matron and you’ll see the audio files have migrated from dust/code/nc03-ds/audio to dust/audio/nc03-ds . it’s totally fine for this function to get called every time a script is started – there’s a built-in check to see if dust/audio/nc03-ds exists before it tries to move files.
tho scarlet performs this migration, it’ll be helpful for every nc03 script to include this lil’ bit – it’ll ensure that the files are in the expected place no matter which script someone chooses first
2: quick + easy softcut parameters
if you’re just dipping into norns scripting, feeling confident about managing the many moving pieces of softcut may be an initial speedbump. i didn’t have much scripting background when i first dug into norns in 2018 and it took me a year to really feel like i understood softcut’s DNA. the softcut studies (softcut studies | monome/docs) are a super helpful primer on what’s initially possible – but since nc03 likely prompts crossover scripting needs across authors, it seemed helpful to provide a shortcut to build the ‘greatest hits’ parameters you’ll likely want to explore in your scripts.
to add a full parameter set for each of the six softcut voices to your script, simply include and invoke lib/sc_params, which will automatically build the following parameters for voice [x], where [x] is voices 1 to 6:
level (0% to 250%)
pan (i love the pan widget in the formatters library!)
semitone offset (+/- 48 semitones)
pitch control (+/- 12% variation on the current rate)
reverse (trigger to quickly reverse the current rate)
lowpass (0% to 100%, inits at 0%)
highpass (0% to 100%, inits at 0%)
bandpass (0% to 100%, inits at 0%)
dry (0% to 100%, inits at 100%)
filter cutoff (10hz to 12000hz)
filter q (0% to 100%)
once a file is loaded via the parameters UI, you can play it with sc_fn.play_slice(voice,1), where voice corresponds to the voice you’ve loaded a sample into
3: loading the provided drum files into softcut
each of the drum samples has 9 variations, which correspond to an organizing ‘kit’:
if you use the lib/sc_params helpers, you can mix and match audio files into each voice pretty easily via params:set scripting:
BUT you can also load a single kit into all 6 voices, eg:
the lfo library in the latest norns update was designed to give an easy on-ramp to scripting modulation. the docs cover a lot of usability, but here’s how we can expand our previous sketches with randomly-parameterized sine waves:
^ if we run that snippet and head to the PARAMETERS, we’ll see the panning and filter cutoff values for each voice changing in real-time.
pitch LFOs are super fun to quantize – we’ll expand our clock sequencer jumble a bit and add a bit of pitch quantization to a semitone_offset lfo, so we only switch between a -7, 0, or +12 semitone offset:
alright, we’ve been doing a lot of random jumbling to play these voices, which can be fun for exploration but rooting a bit of intention in our rhythms (with a way to subvert) might also be fun!
sequins is a sequencing library that trent originally wrote for crow, which @tyleretters helped port to norns. imo, it’s the easiest on-ramp to scripting a step sequencer. the docs have a lot of helpful waypoints, but for this snippet we’ll focus on getting a sequins set up for each voice and dynamically changing their step sizes:
overall, i harbor a tiny secret hope that thru preloading sequins (see scarlet for a nested approach, where sequins patterns can be switched out – a lattice or another sequins could meta-sequence), an nc03 entry could represent an entire song, able to be manipulated by the listener
this was fun… (no idea if i did anything correctly )
my entry is called ‘scattr’… it does lots of stuttery/cutup-type things with softcut… i based it off of the gist dan posted above(the final one for incorporating sequins).
i think i did not hit the ‘map’ part quite correctly: “E1 volume/E2 cadence/E3 horizon/K1 stability/K2 relax/K3 bind…” instead, the instructions for mine are:
Use E2 to select UI stuff,
then use E3 to change param values,
K3 starts/stops playback,
K2 turns on/off ‘stutter’(and jumps the UI selection to stutter so that enc3 can quickly apply changes to stutter timing there as well),
K1 does nothing!
enc1 sort of does something
…when you have ‘Seq#’ selected it will randomly choose to loop a certain voice, and cause it to be offset in rhythm as a result… to set it all back straight, rotate enc1 while anything else besides ‘Seq#’ is selected(weird interface i know ),
…the top-right ‘Rand’ (turned ‘on’/‘off’ by enc3 while selected) will randomize parameter changes once every ‘cycle’ (the ‘CycLn’ field below that determines the cycle-length in beats)… the other ‘rand’ will randomize a particular voice’s sequence(only works while selected and k2 is pressed; you can also hit k2 with the ‘Seq#’ field highlighted and it will randomize the sequence towards filling all steps with '1’s)… and the rest should be intuitively discovered based on using enc2 to select, and enc3 to change… my UI-design sucks. i’m sorry
hihi! hope everyone’s well
wowowow @sixolet , @rajaTheResidentAlien , and @zzsnzmn — these are such imaginative + fantastic submissions and the audio artifacts are all wicked compelling, thank you for these submissions and engaging with the prompt so whole-heartedly!!
considering the delays we’ve faced with getting the latest run of norns units out (namely hand-reworking the finish on every unit’s enclosure in our workshop), we figured there might be folks in our two latest shipment groups who might have planned to engage in the project but didn’t get a chance to. so, we’ll be extending the deadline to next saturday (oct 8th), just to give anyone who’s interested but didn’t have the opportunity to script a bit of extra time
i’m absolutely around all week to answer q’s and troubleshoot code, either here or discord, so please please feel free to post any and all stumbling blocks!!
This was a ton of fun, if a little stressful, because I ended up just being able to work for a few hours before each version of the deadline (twice.) I didn’t really have much of a cohesive idea going in, so it was a freeing experience to just follow what seemed interesting and doable quickly without thinking too much about whether it hung together as a tool, in contrast to my usual approach which is to overthink the system design and never reach a state of doneness.
The starting concept was a 2D bank of values that could drive both a scale degree and a selection from a pool of sequins, and the rest your can read in the script notes.
Folks in the norns discord pointed out that the interface owes a lot to nanoloop, which is perceptive because I 100% have nanoloop burned into my subconscious, but this controls very differently (i.e., not at all.)
Speaking of non-control: one design philosophy question I did indulge in was whether each voice should have its own copy of the sequins bank, so two voices pulling from the same bank wouldn’t interfere with each other’s phase. In the end I let them interfere, which makes things a lot less predictable in both good and bad ways.