less-concepts

less-concepts

@vicimity and i have agreed to merge our collective norns work on less concepts 3 and the original less concepts into a single main repository. i also wanted to add a few new bits to correct decisions i made in 2019 that he kindly did not disturb – so, very close to the 3 year anniversary of this script, i’m stoked to have another iteration of less concepts out in the wild!

less concepts is rooted in the idea that complexity is just a shit-ton of simplicity, chained together. at its core, less concepts holds 65,536 possible combinations of notes which can be gated, offset, and manipulated to create minimal sequences for improvisation. small changes to a single parameter can bring sweeping or subtle changes.

seek. think. discover.

support + thanks

this thread is the focal point for all norns less concepts support moving forward. the original two threads will be kept visible for historical context.

i cannot thank @vicimity enough for his generosity, care, and brilliant work on less concepts 3 – he has such a beautiful imagination, well-balanced with a practicality that roots all of his ideas into concrete action. his curiosity, both as an artist + developer, was such a pleasure and inspiration to watch unfold over his three months of constant development + the many months of support and iteration that followed.

i’m so grateful that his work is how i personally frame this script – linus is why i started playing with it again :revolving_hearts:

Requirements

norns 2.7.1 220321
Passersby engine installed (restart/reset after initial installation to activate engine)
grid (varibright 128 or 64, or midigrid), optional
crow, optional
just friends, optional
mannequins w/2 synth, optional

changelog

  • 220406: v.3.1.1 - PSET fix
  • 220403: v3.1 - olafur, ~ r e f r a i n, 64 grid, midigrid and (attempted) PSET updates

Documentation

from linus’s Less Concepts 3 thread:

1

at first you are met by a constructive concept built from the seed 36 and rule 30. root note is C and the scale is major. the sequence is fed through the built in sound engine “passersby” and midi device 1 / channel 1.

  • the combination of seeds and rules feed the sequencer with 8-bit numbers. this number is visualized by the eight squares top left on the screen / grid (in the screenshot above 11001111 = 207), a new number is seeded with every beat of the selected time signature. the two voices are individually triggered when they cross paths with the true value 1. the current 8-bit number (11001111 = 207) translates into a note by passing it through the limits for high / low and then transposed within the selected scale.

  • navigate the main performance screen by scrolling with E1, changing values with E2 and E3. adding snapshots with K2 and randomizing selected values with K3.

  • K3 takes on a different role when snapshots are selected (bottom left) or cycling sequencer direction / duration (bottom right). while snapshots are selected K3 will randomize all values (except time and duration). while direction / duration is selected K3 activates a ´destructive´mode, indicated by ‘*’. all changes to snapshots will be saved while in destructive mode. if you wish to delete a snapshot hold K2 and press K3, this results in the snapshot still playing but no snapshot is selected. you scroll through and select the snapshots with E2.

NEWS

  • time: change time signature for the sequencer. 1/8 - 1/32 (more options available in params).
  • a cycling sequencer that steps through saved snapshots and move when the indicated duration has passed. the cycling sequencer can move up ‘>’, down ‘<’ or random ‘~’.
  • midi notes can trigger snapshots. select “midi → snapshot root” and play away!

/ / / / / / / /

~ r e f r a i n

2

hold K1 to find the built in pitch, delay, micro looper.

NEWS

  • buffers are now visible (top right)
  • input mix (engine and adc) is editable on screen (prev. in params / adc is new)
  • K2 toggles state for both buffers ‘rec | play’

/ / / / / / / /

params → edit

3

‘historical load’

  • as of Apr 3 2022, presets are fully compatible with the norns PSET menu
  • you can still load historical saves, using this parameter – be sure to save a PSET after loading to migrate to the new save/load system

‘time, midi & outputs’

  • select time range(‘legacy 1/8 - 1/32’, ‘slow 1/1 - 1/16’ and ‘full 2/1 - 1/32’ (locked with snapshots)
  • default length (cycle) 1x - 32x (cycle duration for new snapshots)
  • olafur mode (overwrite loaded scale with realtime MIDI input)
  • midi (choose midi device and channels) turn midi/link transport on / off
  • midi → snapshots root (play your snapshots with a midi keyboard)
  • outputs, choose outputs for voice 1 & 2.

‘scaling & randomization’

  • choose scale and global transpose
  • set transpose randomization
  • clamp the values for randomization with ‘randomization limits’

+ params for ~refrain, passersby and w/syn

Grid operation

128:

64:
the script now detects whether a connected monome grid has 8 or 16+ columns and will auto-resize the interface to match! has most of the 128 functionality packed into a tighter space.

rows 1 + 2: cols 1-8 selects bit per voice
rows 3 + 4: random generators

  • 3.1 + 3.2: seed + rule
  • 3.4 + 3.5: bit v1 + v2
  • 3.7 + 3.8: low + high
  • 4.1 + 4.2: octave v1 + v2
  • 4.4 + 4.5: time + (time + ALL parameters)
  • 4.8 + 3.8: ALL parameters

row 5: blank
row 6: snapshot management (presented in reverse for easier conceptual on-boarding)

  • 6.8: press to create a snapshot
  • 6.7: hold to delete the selected snapshot
  • 6.6: hold to delete all snapshots
  • 6.1 - 6.3: sequencer step directions – down, random, up
    • long press for destructive mode

rows 7 + 8: snapshots – recall a stored snapshot by selecting it from the bank of snapshots

Download

the combined + updated script is housed under less-concepts (instead of the older less_concepts and linus’s less_concepts_3). you can add it to your norns by:

  • searching for and installing less-concepts in maiden’s project manager
  • by executing ;install https://github.com/vicimity-dndrks/less_concepts in maiden’s repl
38 Likes

220403: less concepts v3.1

requires norns update 220321+
if you’ve already installed norns: new image 220306, then this update is available via SYSTEM > UPDATE

olafur mode

olafur mode

inspired by the self-playing pianos of Olafur Arnalds, olafur mode bypasses the chosen scale and builds note pools from direct MIDI input.

to get started:

  • connect a MIDI note source to norns + launch the script
  • head to PARAMS > time, midi & outputs > midi and hit K3 on enable olafur mode
  • identify your device and hold notes on it
  • rather than rely on a built-in scale, the notes you’re holding will be cycled through the rule/seed combo
  • you can optionally MIDI map hold to ignore your external device’s ‘note off’ messages
  • if things get stuck, you can also hit panic to clear the scale
  • by default, snapshots will not collect olafur notes – they’ll just restore the other parameters, so you use snapshots as a companion to your playing on the external device. if you want to collect these notes with your snapshots, then turn on save with snapshots

this mode totally changes the player’s relationship to the rule/seed combos. even though there are 65,536 possibilities of notes and rhythms, it doesn’t take long to hone in on your favorites – for me, this stagnates things a bit. by having an additional input source, i can focus less on exploring the melodies of certain rule/seed combos and focus more on the energetic interplay of an automated process being informed by / informing a manual process.

~ r e f r a i n

~ r e f r a i n: filters, sample loading, fixes

~ r e f r a i n, the script’s softcut-powered stereo delay that gets triggered by the same rule/seed combos as the note sequencer, has gotten a bit of TLC as well.

  • under PARAMS > ~ r e f r a i n, you’ll find finer-grain control over each the voice’s filters
    • these are also now post-voice, which is much more expressive – the previous versions affected the signal as it was recorded into the delay line
  • under PARAMS > ~ r e f r a i n, you’ll also find a place to load a sample into each of the 8 second delays – super fun to load a complementary drum/textural sample and mess around with the note -> param and gate prob settings to manipulate playback!
    • to clear a sample and get back to delay mode just hit K3 on the clear sample parameter
  • i realized that the softcut fade time parameter was turned way way up, which offset the playheads weirdly – this has been fixed + things sound a lot tighter!
64 grid

64 grid

the script now detects whether a connected monome grid has 8 or 16+ columns and will auto-resize the interface to match! has most of the 128 functionality packed into a tighter space.

rows 1 + 2: cols 1-8 selects bit per voice
rows 3 + 4: random generators

  • 3.1 + 3.2: seed + rule
  • 3.4 + 3.5: bit v1 + v2
  • 3.7 + 3.8: low + high
  • 4.1 + 4.2: octave v1 + v2
  • 4.4 + 4.5: time + (time + ALL parameters)
  • 4.8 + 3.8: ALL parameters

row 5: blank
row 6: snapshot management (presented in reverse for easier conceptual on-boarding)

  • 6.8: press to create a snapshot
  • 6.7: hold to delete the selected snapshot
  • 6.6: hold to delete all snapshots
  • 6.1 - 6.3: sequencer step directions – down, random, up
    • long press for destructive mode

rows 7 + 8: snapshots – recall a stored snapshot by selecting it from the bank of snapshots

edit: oh, dang, @2197 !! i didn’t realize you were working on this with linus – please lmk if you want to migrate in, it’d be fantastic to add you as a collaborator to the script!

midigrid

midigrid

midigrid is now baked into the script and initializes if the following conditions are met at script launch:

  • the midigrid script is installed at dust/code/midigrid
  • no monome grid is currently plugged in

the script defaults to the 64 grid size, but you can adjust for 128 by changing this line:

https://github.com/dndrks/less_concepts/blob/main/less_concepts_3.lua#L42

to:

local midigrid_size = 128

after that change, a quick restart of the script will give you the full 128 layout

PSET save/load

PSET save/load!

i’ve removed the previous save functionality, which did not allow for meaningful naming – this function was written before @infinitedigits added save + load callbacks to PSETs, which i recently expanded in the latest norns update to include deletion. so, i rewrote all the save/load functionality to piggyback off of normal PSETs – as you work with the script, you can just do normal PSET management and it’ll handle everything else.

for folks who have worked with the script in the past and have saved work, PARAMS > historical load will allow you to load up your past saves. once you load one, please re-save it as a PSET :gem:

23 Likes

Wonderful!!! And thank you for the 64 support!!! Very much appreciated.

1 Like

no worries! it’s been a sleeping project for more than a year i think (too much on my hands), so I’m very happy to see 64 grid support finally added. and a lot of other brilliant new features as well — lovely update of this brilliant script!

i also reckon i will learn a lot from comparing your 64 grid code to the attempt i started. thanks : )

3 Likes

Amazing, thanks…
Happy to see this script goes on & on!

1 Like

Amazing script. I just have a small issue, I’m unable to load saved PSET.
I’m on the latest firmware and I’ve tried reinstalling the script, but the same behavior persist.

thanks all for the kind energy :slight_smile:

huh! this is testing well on my side with a fresh install of the script and no pre-existing data.
just to confirm, this is a PSET made with the new version of the script?
if so, can you please share any messages from maiden when you try to load a PSET?

in the data folder, you should see a less-concepts folder with your PSET files in it, with a corresponding folder for each one which holds script_settings.data. for example, i have two PSETs saved here (less-concepts-01.pset + less-concepts-02.pset) which each have a numbered folder to match (01 and 02):

image

i’m curious if you have something similar in your data folder?
if not, do you see any messages print to maiden when you save a PSET?

thank you!

Yes, it was freshly installed as I got the new revision shield 2 weeks ago, and installed the script today.

This is what I get trying to load the PSET
pset >> read: /home/we/dust/data/less-concepts/less-concepts-01.pset

lua:

/home/we/dust/code/less-concepts/less-concepts.lua:2247: attempt to concatenate a nil value (local 'pset_number')

stack traceback:

/home/we/dust/code/less-concepts/less-concepts.lua:2247: in global 'loadstate'

/home/we/dust/code/less-concepts/less-concepts.lua:678: in field 'action_read'

/home/we/norns/lua/core/paramset.lua:493: in function 'core/paramset.read'

/home/we/norns/lua/core/menu/params.lua:268: in function 'core/menu/params.key'

/home/we/norns/lua/core/menu.lua:143: in function </home/we/norns/lua/core/menu.lua:120>

those folder for each do not appear under the less-concepts folder. This is the only thing I got.

Capture d’écran 2022-04-05 à 22.03.41

Yes, this one
pset >> write: /home/we/dust/data/less-concepts/less-concepts-03.pset

lua: /home/we/dust/code/less-concepts/less-concepts.lua:2068: attempt to concatenate a nil value (local 'pset_number')

stack traceback:

/home/we/dust/code/less-concepts/less-concepts.lua:2068: in global 'savestate'

/home/we/dust/code/less-concepts/less-concepts.lua:675: in field 'action_write'

/home/we/norns/lua/core/paramset.lua:449: in function 'core/paramset.write'

/home/we/norns/lua/core/menu/params.lua:116: in function 'textentry.callback'

/home/we/norns/lua/lib/textentry.lua:78: in function 'textentry.exit'

/home/we/norns/lua/lib/textentry.lua:107: in function 'textentry.key'

/home/we/norns/lua/core/menu.lua:143: in function </home/we/norns/lua/core/menu.lua:120>

Also, when I save a preset, it doesn’t add it to the list in the PSET page right away, it only appears if I go back and in the PSET page again. Thanks for your help!

1 Like

thank you for the detailed errors!

just to confirm, if you hit K2 on the SELECT / SYSTEM / SLEEP screen, do you see 220321 listed in the middle right under the script name, or do you see 220306?

220306 is the fresh installation image, which you would’ve installed onto your SD card, but 220321 is the latest norns system update, available via SYSTEM > UPDATE while connected to wifi. the PSET functionality is only available for norns system 220321 and beyond.

if you are running 220321, just lmk and i’ll keep digging – these function errors are expected for any unit running software earlier than that, but 220321 shouldn’t be giving trouble.

Yes, I’m on 220321
I thought it was the problem at first, but I ran the update yesterday and reinstalled the script, but alas I had the same problem.
Thank you for your help with this. I’m finding such good sounds/patterns, wish I could save them :slight_smile:

ah! totally found it, thank you for the report + patience! :gem:
i didn’t realize i had pulled the latest changes to the norns repository, instead of what was purely bundled in the update. cool, got it fixed in the script, if you wanna pull in the update and lmk how that goes?

1 Like

That totally did it.
A big thank you for your help, I’ll have lots of fun with this. Been listening to a handful of patterns I made this morning at random as background music. Now with the PSET, this will be just great.

1 Like

awesooooome, thanks so much for the help identifying that! i’m so glad to hear you’re finding nice zones – @vicimity 's snapshot sequencer is such a fantastic addition, especially nice for those longform sessions :slight_smile:

200406: v3.1.1

FIXED

  • PSET save/load now works as expected!
4 Likes

I think the monobright 64 misses a lot of the grid detail that is being set with g:led for any value other than 0 or 15. I may hazard a PR if I can figure out a neat way to handle this that doesn’t break varibright compatibility.

I wonder would a configurable monobright mod for norns scripts generally be a good idea…

2 Likes

Morning all! I’m new to less concepts (and norns in general). I’ve been playing around with yhis wonderful script for a bit now and am really enjoying it, but can’t find the doc or a tutorial to clarify a few (probably really obvious) things…

Snapshots - these seem to record a certain seed/rule combo. Then, if you change something (octave for example) it will snap back to the snapshot. But how do you determine how long the snapshot will be and use the function in general? I am using it with a 128 grid.

Also, what are the low/high bounds?

Thanks in advance!

I also have a question or two about how the script works. (just curious).

What is the “true value” mean in this context?

the two voices are individually triggered when they cross paths with the true value 1

And what does it mean to select a bit per voice using the grid? Does that mean I am setting that bit to be always on?

I’m just trying to wrap my head around how this works. But if it’s too complex to explain on a forum, I can get comfortable with not knowing, too!

hi hi, hope y’all are well :slight_smile:

correct!

if you have the pattern sequencer enabled (more on this in a sec), the sequencer will step along at the length specified for each s value. to adjust the length of the specific snapshot, use E1 to navigate down to the s_ length section of the main UI (_ representing the currently-selected snapshot) and use E2 to change the glyph to *. this opens up E3 to modify the step length of the specific snapshot.

you can also use E2 to specify the snapshot sequencer movement:

  • - indicates the sequencer is disabled
  • < is backwards motion
  • ~ is random selection
  • > is forwards motion

once that glyph leaves * or - state, it will start cycling through the snapshots, per their length values.
also, clock transport start + stop messages will reset the sequencer as long as the start/stop with transport value is set to on under PARAMS > time, midi & outputs > midi (it’ll work for Link as well!).

you can change the default length by changing the default length value under PARAMS > time, midi & outputs > time (locked with presets).


i’m realizing that the past iterations of this script and approach are likely buried – apologies for any opacity in the core functions!

i think the most approachable description i’ve committed re: the foundational stuff going on in the script is in the max for live device’s manual (link to device), which i’ll add modifications to in answering the remaining q’s:

in less concepts, scales have 32 values (which equals ~4 octaves for the diatonic scales). low and high fence the values you can generate notes from — you can think of them as the range of scale degrees. 1 to 14 is a full 2 octaves (for diatonic scales) and a nice place to start.

as less concepts iterates seeds through rules, it presents the 8-bit binary for each step. these 1’s and 0’s make perfect rhythm generators, so the script uses them as gates to calculate which note should play.

the ‘bit’ section comes alive with lit and dim blocks (1’s and 0’s, respectively). if you use E1 to navigate to this part of the main UI, E2 and E3 work to select which bit you’d like to use for gates. whenever a 1 appears (a block lights up), a note will occur. 0s (dim blocks) are rests. if you choose the position all the way to the right of the bit steams, then no notes will occur for that voice – if both voices are set to this 0 position, there will be silence.

as you play, you’ll find that some rules start off as very active and then terminate to silence (eg. rule 60). this is expected and intentional – simply re-seed the rule and you’ll get another burst of activity (great for flourishes). less concepts is full of parameters that can be tweaked and modulated to create complex sequences out of very simple decisions.

using a visual guide to the rules, you should be able to predict what the activity of a particular rule might be. to help guide your guesses, here’s a bit more about the four classes of rules:

• Class 1: rapidly converge to stasis (eg. rule 32)
• Class 2: rapidly converge to repetition (eg. rule 108)
• Class 3: longer-running + repeating (eg. rule 182)
• Class 4: complex structure that has varying convergences (eg. rule 110)

so, tl;dr:

yeah! a lit bit triggers the synth if it’s the one selected, and you can mix + match between two bit positions to generate unique rhythms + note selection.

hope this helps! please let me know if there’s any further ambiguity!

4 Likes

255 characters of forever love to SEP!

1 Like

That explains it beautifully. Thank you a bunch! I get it now!

Woof! i think I’ll print this… thanks so much!

1 Like