sequence rows of beats with samples.




this norns script creates sequences of samples from a tape. you can load any tape and splice it into up to 26 samples (named a-z). samples can then be patterned into 16-subdivided measures. patterns can then be chained together.

this script was a hard one to make because at a certain point i kept getting caught up playing with for hours instead of making it “user friendly.” let me know if you find things to improve!

this script builds off others. it is inspired a lot from ideas in glitchlets (no realtime here) and a lot of code ideas from @mattbiddulph’s exquisite beets (initially i forked beets but i didn’t want to ruin the code with my hacks). also inspiration from the po-33. and, it is inspired by @csboling’s beautiful waveform renderings in the latest update.

future directions:

  • fix all the :bug::bug::bug:
  • add individual parameters for samples
  • add play trigger
  • ?? requests


  • norns (version 201023+)


any mode

  • K1+E1 changes mode

sample mode

  • E1 changes sample
  • E2/E3 change splice position
  • K1+K3 starts/stops chain
  • K2 zooms
  • K3 plays sample

pattern mode

  • E1 changes pattern
  • E2 selects sample
  • E3 positions sample
  • K2 patterns
  • K3 plays sample
  • K1+K2 erases position
  • K1+K3 plays pattern

chain mode

  • E2 positions
  • E3 selects pattern
  • K2/K3 does effects


v0.2.0 - https://github.com/schollz/abacus/archive/v0.2.0.zip


excited about this one. nice to see some longer form sample handling.


Ships with the amen break, how appropriate :slight_smile:


From the image, this almost reminds me of the beat slicer on my old Korg Triton (my first sampler). Looks like a lot of fun!


added a tutorial (up top) because the controls are a little funky. open to ideas on streamlining it.

@xmacex of course amen break lol :slight_smile: the waveform visualization basically came from seeing the db-force vst for the amen break and thinking can norns do that??

@fourhoarder same, had a bunch of 2-4 minute tapes that i wanted to splice up.


Ohhhhhhhh nelly. Add crow support for triggering and sweeping the buffer and you’ve replicated 90% of my ER-301 usage. This is so good!


introduced a small update (v0.1.2) to make things a little more responsive.

@mattlowery can you explain this a little more? i don’t do any modular and crow itself is still mysterious to me. do you mean to listen to the two crow inputs and set the play position based on one of the crow voltages (“sweeping the buffer”?) as well as starting/stopping playing based on the other crow voltage changes? i’m really happy to try implementing it just need more of an idea what i’m doing :slight_smile:


That sample…is that you, Lubomyr Melnyk?


i love this. quick idea to help with sample cutting… maybe holding k3 in sample mode could loop?


@hghrlearning done. its in updated v0.1.3.

@Cloud :slight_smile: i didn’t know Lubomyr Melnyk but I do now, thanks for sharing that. the sample is actually me playing around with philip glass etude 17.


I think if input one chose the position of the playback head, and input 2 engaged playback upon receiving a gate, it would be super cool!

But also it’s already super cool! Congrats!


I’d love to see this implemented too. Would be a whole heap of fun and also free up my 301 for some other duties.


Hi. This script looks awesome, but I’m getting an error init when trying to launch it, from both the norns and maiden. Is there something I’m missing ? Thanks

1 Like

Are you on the latest norns update? I believe this requires some changes that were made in the October release.

1 Like

Given that there’s 26 alphabetically named slots, are there plans to integrate keyboard control of sample playback?


Ohhh. Maybe that’s the thing. I’ll update then

1 Like

@PerVildman I was had the same problem. New version of the firmware have to solve it

1 Like

Now the script loads, but I can’t load a sample! I’m getting this in maiden:
lua: /home/we/norns/lua/core/screen.lua:215: bad argument #1 to ‘screen_text_extents’ (string expected, got nil)
stack traceback:
[C]: in field ‘screen_text_extents’
/home/we/norns/lua/core/screen.lua:215: in field ‘screen_text_right’
/home/we/norns/lua/core/screen.lua:158: in function ‘core/screen.text_right’
/home/we/norns/lua/core/menu/params.lua:406: in function ‘core/menu/params.redraw’
/home/we/norns/lua/core/menu/params.lua:567: in field ‘event’
/home/we/norns/lua/core/metro.lua:169: in function </home/we/norns/lua/core/metro.lua:166>

1 Like

This looks amazing but when I go in parameters and choose “save/load” it just hangs the whole parameters section. In Matron I see an endless stream of this sort of thing:

stack traceback:
[C]: in field 'screen_text_extents'
/home/we/norns/lua/core/screen.lua:215: in field 'screen_text_right'
/home/we/norns/lua/core/screen.lua:158: in function 'core/screen.text_right'
/home/we/norns/lua/core/menu/params.lua:406: in function 'core/menu/params.redraw'
/home/we/norns/lua/core/menu/params.lua:293: in function 'core/menu/params.enc'
/home/we/norns/lua/core/menu.lua:112: in function 'core/encoders.callback'
/home/we/norns/lua/core/encoders.lua:60: in function 'core/encoders.process'
lua: /home/we/norns/lua/core/screen.lua:215: bad argument #1 to 'screen_text_extents' (string expected, got nil)

I’m using a DIY norns shield and the latest update


@Cementimental @PerVildman i believe this error occurs when there are no files available to load so it has trouble being displayed. however, when you start abacus for the first time it automatically copies one file to a directory (~/dust/data/abacus) that can be loaded, so that should be able to prevent the error (i thought anyways).

if you can, try deleting and reinstalling this way:

rm -rf /home/we/dust/data/abacus && rm -rf /home/we/dust/code/abacus
git clone https://github.com/schollz/abacus /home/we/dust/code/abacus

and then run.

later today/thisweek i will fix my lazy initialization with something that is more robust. sorry about that!

@cosmicsoundexplorer @mattlowery i feel more confident about the crow support with that explanation! one clarification: which of the following two scenarios do you envision for crow?

  • input 1 sets position along entire sample. input 2 gates (gate on = starts playing at position and continue playing until end of entire sample)
  • input 1 sets id of spliced sample (e.g. of the currently spliced ones, labeled A-Z). input 2 gate turns on/off playback of that sample (gate on = continous looping of current sample).