Kolor

כל אור

every light sequences samples.

the words “כל אור” translate from Hebrew to English as “every light” and is pronounced “kol-or”. its meant to portray my attempt of using every light to sequence samples with the grid.

this script is born out an exploration of sampler sequencers. i drew inspiration from the op-z and model:samples (though i don’t own these i was inspired by how i think they are supposed to work). i had five goals making this sample sequencer:

  1. kolor will work as a standalone script and import as a library into most non-grid norns script, meaning you can use kolor from within another script (if you have a grid). i’ve made a lot of scripts and i want to plug in a grid and use it immediately as a “groove box” in addition to the original host script. to meet this goal, the norns screen actually doesn’t provide any information for kolor (except for providing the save/load screen in the parameters). currently you can get this branch of oooooo to use with kolor. i plan to add to other scripts as well
  2. step-specific parameter locks with lots of mods - volume, pitch, filters, sample positions, probability, etc. each mod has its own lfo. and an lfo for the lfo’s, because why not.
  3. easy pattern chaining and probabilistic chaining for automatically adding variation (markov chaining).
  4. as little menu-diving as possible, with very few “hold” buttons or “mode” screens. (have to do my best given 128 white lights…)
  5. stereo samples! because uncorrelated noise in both ears sounds awesome.

at the end i had to make compromises to reach these goals. the compromises mean that there is a list of things that kolor does not do (…yet, but maybe not at all):

  1. all the steps in one track must have the same sound. (this is not a technical limitation, but a menu-diving limitation as it would be hard to determine which step has which sound).
  2. mod parameters are limited to 4-bit resolution, because there are only 15 keys devoted to the selection scale. however, if you use a lfo the values will oscillate with supercollider’s bit-depth (32-bit resolution i believe). there may be ways of getting around the 4-bit with some menu diving or more button pushing.

i’m totally open to ideas to remove these limitations or improve in general.

demos

all drums in these samples provided by kolor. (these demos show the kolor script behavior, since i don’t have grid to actually use the grid part…yet).

demo1 (using grid, and sequencing the plinky synth with tmi at the same time):

demo2 (5/4 tempo cover of weird fishes, no grid here but kolor still works fine):

requirements

documentation

please see schollz.github.io/kolor.

download

get from maiden or from the latest norns image just do

;install https://github.com/schollz/kolor
57 Likes

i’m a bit confused what’s happening in the vids

seems to sound great!
are there two main pages?

where do you control samples? params?
how do you navigate between screens?

1 Like

in the videos i’m playing synths on my op-1 and all the drum parts (bass drum, snare drum, high hat, shaker) are samples that are being sequenced in the norns via kolor. there’s no cross-talk between these devices in this video.

i think the docs will answer lots of questions (i hope): https://schollz.github.io/kolor click/swipe left/right to go through the images which explain a lot (but maybe not all…).

i’ll answer your questions specifically though and i’m totally happy to help explain more. i think what i’m trying to do here is very hard - this is script for the grid that essentially doesn’t have a screen to display info…so all the information is in the grid’s light brightness and position. for some reason i find it intuitive but i understand others may not and i’m happy to guide and answer any questions :slight_smile:

here’s an image from the documentation:

those bottom buttons (s1-s6) in the lower left are the sounds - each is a stereo sample. in the videos above, s1 is a bass drum, s2 is a snare, s3 is a high hat, etc. you control them in various ways: muting via the mute buttons, you can place sounds as steps in the step area, you can sculpt sounds using the mod bar, you can switch samples using the bank button. this basic layout never really changes, except for row 5 - the scale bar will change depending on which parameter is set.

here’s another image from the docs:

basically, once you place a sound on a step you can then press any parameter on the mod bar (row 6). they correspond to different parameters - volume, rate, pan, low-pass, resonance, high pass, sample start, sample end, retrig, probability, lfo lfo, delay send, and delay feedback. once you press a parameter a scale bar will appear on row 5 with the current value of the parameter and you can change it here and it will update the step. there are more advanced ways of doing this (recording in parameters, adding lfos), but thats’ the basic idea.

in the videos above there is a screen of the grid - but the screen mirrors exactly what a grid will show/do. i don’t have a grid, but if you do use a grid you don’t need to use the norns screen (and thus you can run kolor within other scripts).

there aren’t really any “pages” - the steps will always be the top four rows, the scale bar (for the parameter scale or showing the beat scale) is always row 5, the parameters are always row 6, etc. however, there is a different set of steps for each sound, for each pattern so in that sense i guess there are “pages” but they all have the same layout on the grid.

please don’t hesitate to ask questions, any questions at all.

4 Likes

excellent descriptions

i’m reading now and will try later with my grid

1 Like

great :slight_smile: when i have a grid i can make a video tutorial because i think i can explain most everything visually/verbally in a few minutes. right now i’m using those pictures+words, but explaining/understanding the grid in pictures+words is tricky

2 Likes

@infinitedigits hey! was just curious if this is something you’re considering porting to work with 64 non-varibright grids? seems super cool and i’d love to give it a shot!

1 Like

This looks like it’s going to be a great script, @infinitedigits

Unfortunately, having just updated my Norns Shield to 210114, I’m getting a similar error message to the one that @SPIKE was getting here:

Maiden output

norns.script.load(“code/kolor/kolor.lua”)

script load: /home/we/dust/code/kolor/kolor.lua

cleanup

script clear

lua: /home/we/norns/lua/core/script.lua:65: attempt to index a nil value (global ‘keyboard’)

stack traceback:

/home/we/norns/lua/core/script.lua:65: in function ‘core/script.clear’

/home/we/norns/lua/core/script.lua:155: in function ‘core/script.load’

(…tail calls…)

metro_stop(): pthread_cancel() failed; error: specified thread does not exist

metro_stop(): pthread_cancel() failed; error: specified thread does not exist

lua:

/home/we/dust/code/awake-mod/awake-mod.lua:610: attempt to index a nil value (global ‘one’)

stack traceback:

/home/we/dust/code/awake-mod/awake-mod.lua:610: in function ‘redraw’

/home/we/norns/lua/core/menu.lua:157: in field ‘set_mode’

/home/we/norns/lua/core/menu.lua:127: in function </home/we/norns/lua/core/menu.lua:117>

1 Like

i’d have to think about this - i basically try to use up the whole space on the 128 buttons. a 64-button one might be tricky as it would require paging or reduced functionality. i’ll know more when i have a grid in my hands.

do you also have awake-mod installed? it looks like the error is corresponding to that script…for some reason, see below

i installed the latest update and have no problems, but i don’t have awake-mod installed.

2 Likes

A-ha. Yes, I have awake-mod so will see what happens if I remove it… thanks for the tip.

Update: I did sleep after installing kolor - but running a second sleep seems to have got things started now! I can also report that adding local grid = include("midigrid/lib/mg_128") to the kolor.lua in kolor/lib lights up the 2x Launchpad Mini Mk3s I’m using in place of a grid proper.

Now to explore!

1 Like

version 0.0.2

  • initiating playing starts right on beat now (instead of being off by ~1/16th of beat)
  • can add time-synced loops by adding bpmX to the filename, e.g. my_loop_bpm120.wav will import as a 120bpm loop

here’s an example of using two time-synced drum loops:

oh cool! that’s great, i didn’t know you could do that.

5 Likes

It lights up the 2x Launchpads fine, but unfortunately is currently really slow with too much latency to be usable in the limited time I’ve had to test it this week - but I will try some more soon!

1 Like

since i was in the spirit for making short tutorials for tmi i went ahead and made one for kolor (soon maybe another video showing how these both work together):

its short, so it doesn’t cover everything, but might give a good idea of the workflow involved with it. there’s way more details in the docs, linked above. also, i didn’t mention much in the video, but this particular script is ideally run on a grid so that it can be run within another script! i don’t have a grid to demo that yet. so ideally, you can add both kolor and tmi to any other script so your sampler script can also have this drum machine and a midi sequencer running at the same time making norns a super performance sampler sequencer.

12 Likes

wonderful.
this one seems really deep.
It’s so nice to see rundowns of these scripts made by the authors.
Thanks for doing it.

3 Likes

I love the probability and sample start + end. So every step in one row can have different fragments of the same sample right?

2 Likes

yes, you can set every step to have different fragments from the same sample. the sample playback is done via Phasor in a BufRd in supercollider (code) which seems to be pretty accurate and quick to respond to changes.

some limitations though: there are only 15 selectable values for start/end which correspond to start/end+1/16th increments of the sample. this 4-bit resolution is limited because the grid interface only has so many buttons… however if you put an lfo on sample start/end the oscillation will happen between the entire 32-bit range of numbers. (each step can also have its own lfo… in case you want to get really crazy).

3 Likes

Interesting! So one thing that would be totally awesome is the ability to nudge the notes :open_mouth: Maybe 8 grid buttons for shifting it left and the other 8 for shifting right?

2 Likes

agreed :slight_smile: its actually on the top of my list of effects to add lol.

one thing i’m still deciding on is how to add more effects. again there is a button space issue (only 13 buttons dedicated to effects). one option is to remove an effect to add nudge. but i think i’m leaning towards making effect buttons assignable so you can always use any effect, but the 13 available on the grid can be selected from a menu.

2 Likes

@infinitedigits
digging into this tonight…a bit confusing at first but just kept working with it! :stuck_out_tongue:
got sounds playing…got FX going…even LFOs running!
things get weird FAST! (awesome)
another amazing script as always!

question…
so the rows 2, 3 & 4 in the manual shows as area to place steps.
but these don’t seem to do anything.
it’s all just the top row?

also…well ya know me…sync.
(always with the sync) hah!
so it doesn’t seem to respond to external MIDI clock.
(could we get start/stop in there as well?) :slight_smile:

i also noticed a hiccup while it was playing.
i had four on the floor Bass Drum with 8th note Hats.
it seems to have a hiccup kind of pause sort of thing from time to time at the end of a bar.

also…would it be possible to have the pop up displays last a wee bit longer?
for example…
i find myself having to hit PAN and then LPF over and over to catch which mod i selected because i missed what flashed on the screen and grid.

1 Like

yeah …sorry about that :frowning: . i actually have a grid coming in the mail :scream: so i can do another proper tutorial.

to change the step layout you press and hold any button on the 5th row and then, while holding that button, press any other button in the top 4 rows. (note: this doesn’t work if you are in an “effect” menu. deselect any effect by pressing a blinking light on row 6, if there is a blinking light.) then you will have a box which is your new step layout. you can make it anywhere from 1x1 to 4x16. of course, some of the layouts are identical (4x4 = 1x16, but maybe 4x4 is easier to think about).

a “gotcha” in the step layouts is that while each instrument can have its own step layout, only the instrument with the longest step layout will trigger the reset to start / move to next pattern when it gets to the end. this means that if you have a step layout of 1x4 and one at 1x5, then the first step of the 1x4 will always trigger every 5 beats (but then afterwards will be syncopated to every beat at 1/4 interval). so in that case you won’t actually get a 5/4 and 4/4 intermingled. but you can do 5/4 + 4/4, it just needs to be planned a little bit. for instance, if i wanted a 4/4 and 5/4 pattern i could do a step layout of 1x4 (4/4) and then a step layout of 4x5 (5/4, 20 beats so it resets at to rejoin 4/4 pattern). because of the reset though and the max size of the step layout (64 steps) you can never have two meters that have a lowest-common multiple greater than 64.

do you mean that you are setting your norns clock to “midi”? unfortunately this is not working yet: clock: crow + MIDI external clock sources double-trigger clock.sync(1) · Issue #1273 · monome/norns · GitHub

or…do you mean that you’d like kolor to respond to midi start/stop events? i haven’t added this yet but i will!

hmmm…thats strange. more questions - were they both the same subdivision? (e.g. 1x16 steps or 1x4 steps)? or were you using the external midi? i’ve never had problems with the internal clock, but i can’t get external midi to work yet.

but of course it could be a good old :bug: . lmk if you can reproduce it someway.

absolutely. i just pushed a fix that does this.

1 Like

yup!
i’m always just working with MIDI clock. :slight_smile:

yay! start/stop
Thank you!

i muted all other voices and just had the kick playing.
actually…i hadn’t gotten into mixed subdivisions yet.
:stuck_out_tongue:

will do!