twin granulators. watch them race.

one file, two granulators

one granulator per channel

make them phase, make them harmonize, make them race


  • norns 2.0
  • 2-channel audio
  • arc optional
  • restart norns after installing (new engine)


enc 1: select param
enc 2: modify L param
enc 3: modify R param

key 1: hold to modify both params with ENC 2
key 2: start/stop
key 3: reset granulators

1: choose param
2: modify L
3: modify R
4: modify both


v1.0.0 -

(Waffles and Pastrami approved)


need a sound demo!! this sounds so cool.

here’s one - it’s a great app, thank you!


Can’t wait to play with this!

Waffles and Pastrami are so cute!!

1 Like

hi @trickyflemming,
i’m getting an error: init with this error messag in maiden:
do you know what i’m doing wrong?

stack traceback:
[C]: in function ‘error’
/home/we/norns/lua/core/paramset.lua:194: in function ‘core/paramset.lookup_param’
/home/we/norns/lua/core/paramset.lua:153: in function ‘core/paramset.get’
/home/we/dust/code/gemini/gemini.lua:279: in global ‘arc_redraw’
/home/we/dust/code/gemini/gemini.lua:293: in field ‘event’
/home/we/norns/lua/core/metro.lua:165: in function </home/we/norns/lua/core/metro.lua:162>
/home/we/norns/lua/core/paramset.lua:194: invalid paramset index: jitterL

I think it tosses that error briefly because arc starts redrawing before the parameters are fully initialized. Does it still work otherwise? I need to push a fix when I find a chance.

Really enjoying playing with this today.

It would be nice to add a volume param to the list. Perhaps I should take a look at making that change as a learning exercise.

1 Like

Thanks @trickyflemming. Is there any chance you could add start end points change option?

Very useful script! Great work on it.

I’ve been playing around with it and noticed that the default preset doesn’t seem to load when starting it.

Also, is there a way to reduce how sensitive the left most arc encoder is? It can be tricky to switch params.

If you don’t have time to work on these, they are very minor. It may be something I could contribute to at some point when I can take a look at the Lua code.

+1 oversensitivity…

master branch throws an exception. will begin to debug and update this post if I find anything helpful.

The exception is moving so fast it’s hard to read. It looks like it says the symbol “durationL” is an invalid paramset.

Yes, sorry! Just had a kid a month ago and am very busy. I’ll accept pull requests.

  1. Exception error: The Arc timer is starting before the main thread. Just move one to after the other and that should fix it.

  2. First knob being super jumpy: This will require more lines. Essentially, if a delta is sensed, it will change pages. What should happen is that you should multiply the page counter by 10 or so (let’s say n), and then selecting the page by dividing the current delta count by n (bounding the delta count to [0, n*pages]), if that makes sense.


I get a new exception now, which is curious because it says the value of phase_poll is nil but it seems this value originates in the engine. I made a diff of the change that caused this new exception. I don’t really understand what’s going on here and I’ve only been looking at the code for 30 minutes :woman_shrugging:

Update, I think I might have found a bug in how crone loads engines. Getting coffee before I look into it more

# script init
### SCRIPT ERROR: init
/home/we/dust/code/gemini/gemini.lua:28: attempt to index a nil value (local 'phase_poll')
stack traceback:
	/home/we/norns/lua/core/norns.lua:185: in metamethod '__newindex'
	/home/we/dust/code/gemini/gemini.lua:28: in function 'init'
	/home/we/norns/lua/core/script.lua:71: in function 'core/script.init'
	[C]: in function 'xpcall'
	/home/we/norns/lua/core/norns.lua:186: in field 'try'
	/home/we/norns/lua/core/engine.lua:83: in function </home/we/norns/lua/core/engine.lua:82>
>> reading PMAP /home/we/dust/data/gemini/gemini.pmap

update: it looks like the engine can’t be found and crone defaults to loading the previously successful engine, which in my case is FM7, which doesn’t have a poll with the correct name

/me reboots windows

WARNING: Bus has already been freed
WARNING: Bus has already been freed
FAILURE IN SERVER /n_free Node 1018 not found
warning: didn't find engine: Engine_Gemini

Rebooting “fixed the problem”, though this is a weird one. Moving over to the development thread. Meanwhile, I made a PR with my arc fix. Thanks for the great script!


Awesome! Thank you for looking into that. I just merged your PR in.

Digging this script thank you!

1 Like

was gonna ask how i missed this but it came out a few months after my wedding

what a phenomenal script!