form!matter

Form, without matter. A drum-sequencer for Norns, Grid, N.B. and Crow.

screenshot

Supports N.B. et al. (installed to /dust/code/nb) and crow.

Four tracks. 96 ppqn. Full access to every sub-step. Edit steps in time on the grid or program each sub-step as desired. Play unquantized. Multiple flavours of entropy on tap. Audio-rate fills. Can genereate a large amount of notes rapidly. Adjust speed limit to achieve desired level of downstream stability.

form!matter strives to be entropically inclusive.

Notes

There are two major things going on here, one is a four track, sixteen step sequencer where you toggle steps as you want, the other is a 384 step event recorder - they share the same space and are the same thing. The interface lets you interact with it/both as you want, either playing steps using the trigger buttons, programming each sub-step, generating fills or just hitting one, five, nine, and thirteen for a straight four/four beat.

Parts of this comes from a failed attempt to get a swung 16 step sequence, realizing there is a three by eight area on the grid for each sub-step and finding the play between order and disorder this enables deeply satisfying.

I wanted a sequencer that erased well, so there are eight ways to get rid of notes.

Randomness is accessible from E2 and E3 on Norns, one adds notes in time, the other anywhere there is a free sub-step. Turning them the other way removes any notes entered in any way in reverse chronological order.

Four pattern-slots lets you capture snapshots as you go. These remember their note-stack and these can be returned to the void using the encoders. Lot of fun can be had combining these two aspects.

Fills can reach audio-rates. Hold more buttons in the fill-area for higher rates. K1 and E1 sets a limit of how small the space between steps can be, so you don’t crash things downstream.

The rec toggles decouple the controls from the sequence, so you can play nondestructively over a running beat. Use it to perform fills or randomize only some tracks.

This is the 7th(?) iteration of this i have written since august, and I think it might be ready to use. The urge to delete all of it and write it again still persists, I still want to find a way to get crow to output triggers at 96ppqn/300bpm, but i also want to just play my synth for a while.

Thanks

@sixolet for N.B. et al.
@zbs for Oilcan
@tyleretters for Goldeneye (from where i stole the randomizer)
@postsolarpunk for help taming crows

Requirements

Norns, Grid, Crow / N.B. voices (Oilcan!) / sound sources of choice.

Documentation

Controls, Norns:

enc 1: bpm 
enc 2: add(cw) random 16th steps or remove(ccw) steps  
enc 3: add(cw) random substeps or remove(ccw) substeps  
key 1 + enc 1: speed limit
key 2: play/pause  
key 3: reset

Controls, Grid:

loop and fill change with number of buttons held:

fill1-6 + trig:     adds steps if rec is on, plays if off
  loop1 + tracks:   repeats single steps or jumps between held
  loop2 + tracks:   loop single track, press above or below for one step
  loop3 + tracks:   loop all tracks, press above or below for one step
  clear + tracks:   clear any pressed steps
  clear + substeps: clear any pressed substeps
  clear + pattern:  clear pattern
  clear + loop1:    clear all loops
  clear + shift:    clear all steps
  shift + play:     change playback direction
  shift + pattern:  save pattern
speed limit, skips substeps after each trigger:

      0 = off
   5-10 = ok for norns, depending on bpm
     24 = max, 1 trigger every 16th

Download

from the project manager in maiden or:

;install https://github.com/imminentgloom/form_without_matter
62 Likes

ooooooooooo congrats this looks like a ton of fun, I’ll give it a go soon and see if I can get some oilcan blast beats going :smiley:

3 Likes

congrats on the release!!! this looks awesome!

5 Likes

Is there a install procedure order? I have Emplaitress and Oilcan mods turned on, but getting this fail on load.

### SCRIPT ERROR: load fail
/home/we/dust/code/form!matter/form_without_matter.lua:27: MISSING INCLUDE: nb/lib/nb

EDIT: OK this is unclear. nb needs to be installed at /dust/code/nb but there’s no way to install nb from maiden that I can see. nb docs say ā€œnb is the library. You import the library into your script (with a git submodule ).ā€

What’s the ā€œcorrectā€ procedure here?

1 Like

Nb will download along with the script when installed from maiden now. Which was probably the correct way to do it all along.

Pre-edit

If you download the nb-files and add then to dust/code the script will find them, you can probably even copy them from another script’s folder if you have any that includes it.

I went with putting it in its own folder because i have quite a few scripts that use it and bundles for each just seemed redundant. There might have been some trouble on my end adding it as a sub-module as well.

I’ll take a look at it shortly, there are a few things i want to tinker with still.

2 Likes

I do agree with you that having nb be included in every repo using it feels redundant and I feel it would make sense to have more of a global reference much like how when we install a script relying on an ugen we don’t have it will just fail.

2c

3 Likes

Made a small update. There are now 16 banks to save patterns in, accessed via the params menu. Loading patterns will not replace the playing sequence.

3 Likes

Just playing with this today…pretty cool script. One question though: Oilcan is monophonic correct? Is there a way to have the script use multiple instances of Oilcan so the notes don’t choke each other?

That could also lead perhaps to a per step note assignment feature, expanding the sound palette greatly (16 sounds available in a single pattern with 4-voice polyphony).

1 Like

Glad you like it!

I think we would need a polyphonic fork of oilcan? Started looking very briefly at the code for oilcan, but am pretty bad at SC, so no results.

The ā€œbestā€ workaround i got so far has been putting sounds i prioritize on lower tracks. Hm, should probably trigger them in reverse so the first one gets priority.

Note per step could be done i think, just need another set of tables and a mode switch on norns - thinking hold k1 to swap e2+3 from randomizing to note/vel.

The first idea for the script was for patterns to be quite fragile, transient things. But, having the ability to save them makes affording the option for really detailed manual edits less like trolling and more like a feature.

I’ll make notes about both changes and have a look the next time i’m playing with the code.

Can’t make any promises about oilcan, but I want to use it in a similar way too.

1 Like

Thanks for the reply. I was also looking at NB port of Mutable Plaits. According to the documentation, the mod is 4 copies of Plaits in one, so that might be a better solution. The Plaits drum modes sound really good.

Now that I think about it that would make adding ā€˜key assignment per step’ feature even more powerful. Imagine setting each track as a different note of a scale, then having the ability in real time to modify the note on each step or perhaps have an ALT combo (or use for the second row) of the trigs on the grid to play a different note. You could make patterns containing different sound combos: kick, snare, hi-hat, and bass…or kick, hi-hat, bass, lead…or even full melodic phrases.

UPDATE: Plaits mod works pretty well. It’s 4 instances so no note choking, plus you can use both it and Oilcan at the same time within form!matter. Still trying to figure out why I can set the velocity and note in the NB parameters, but the Plaits parameters aren’t changing.

1 Like

getting this error upon first launch:

## SCRIPT ERROR: init
/home/we/dust/code/form_without_matter/form!matter.lua:515: attempt to index a number value (field '?')
stack traceback:
	/home/we/norns/lua/core/norns.lua:147: in metamethod '__newindex'
	/home/we/dust/code/form_without_matter/form!matter.lua:515: in field 'action'
	/home/we/dust/code/matrix/lib/matrix.lua:59: in function 'core/params/number.bang'
	/home/we/norns/lua/core/paramset.lua:600: in function 'core/paramset.bang'
	/home/we/dust/code/form_without_matter/form!matter.lua:587: in upvalue 'old_init'
	/home/we/dust/code/cybermidi/lib/mod.lua:303: in upvalue 'script_init'
	/home/we/dust/code/passthrough/lib/mod.lua:123: in upvalue 'old_init'
	/home/we/dust/code/semiconductor/lib/mod.lua:76: in global 'init'
	/home/we/norns/lua/core/script.lua:137: in function 'core/script.init'
	[C]: in function 'xpcall'
	/home/we/norns/lua/core/norns.lua:148: in field 'try'
	/home/we/norns/lua/core/engine.lua:91: in function </home/we/norns/lua/core/engine.lua:89>
debounced
mpv: no process found

please advise! this script looks neat and i’d love to get into it.

1 Like

If you have mods active, try disabling some and check if the error still occurs. I’m guessing you already restarted, maybe reinstall this script as well.

Haven’t had it crash that way before, and the error seems to occur at weirdly normal parts of the code that does routine parameter-stuff.

Sorry I can’t offer anything more concrete.

2 Likes

I would say, reading your error message, the order of suspiciousness of your enabled mods is

  1. semiconductor mod (beta)
  2. passthrough v2
  3. CyberMIDI - a mod to send MIDI between Norns over IP
  4. Mod Matrix for the Matrix Mod!!!

I don’t understand the paramset storage thing too well actually, but you might want to delete stored psets for form!matter and matrix maybe? Before that, does disabling those mods help, as @imminent_gloom suggested?

1 Like

You can make oilcan polyphonic if you comment out lines 49, 50 and 51 in:

code/oilcan/lib/oilcan.sc

Change:

if (voxs[idx] != nil) {
	voxs[idx].free;
};

To:

// if (voxs[idx] != nil) {
// 	voxs[idx].free;
// };

It seems to work, don’t know if there are unforeseen consequences though.

2 Likes

grateful for you and @xmacex ! sitting back down with norns today, will troubleshoot and report back with an edit to this post.

EDIT: after disabling mods, this is what i got:

### SCRIPT ERROR: init
/home/we/dust/code/form!matter/form!matter.lua:515: attempt to index a number value (field '?')
stack traceback:
	/home/we/norns/lua/core/norns.lua:147: in metamethod '__newindex'
	/home/we/dust/code/form!matter/form!matter.lua:515: in field 'action'
	/home/we/norns/lua/core/params/number.lua:64: in function 'core/params/number.bang'
	/home/we/norns/lua/core/paramset.lua:600: in function 'core/paramset.bang'
	/home/we/dust/code/form!matter/form!matter.lua:587: in global 'init'
	/home/we/norns/lua/core/script.lua:137: in function 'core/script.init'
	[C]: in function 'xpcall'
	/home/we/norns/lua/core/norns.lua:148: in field 'try'
	/home/we/norns/lua/core/engine.lua:91: in function </home/we/norns/lua/core/engine.lua:89>
debounced
mpv: no process found
1 Like

Unfortunately, I don’t know what to do about this. It might be a case for the ā€œnorns: helpā€ thread.


There is a version 1.2 that adds note editing. It is a bit messy, a first pass at getting it to work. But I am putting it in since i want to reorganise the code to make it a bit easier to work with before doing more with it.