subharmoniclone - v0.3


A Moog Subharmonicon, but on Norns.

subharmoniclone page 1

This is rough but usable, so I’m sharing to start getting feedback.

There’s still a lot to do, including:

  • A fancier engine w/ attack in addition to decay (perhaps the extended Moonshine?)
  • Another UI page with engine params
  • Another UI page with modulation options
  • More sequencer controls
  • MIDI support
  • Grid support
  • Clean up the code a ton

As my first non-mod script, I’ve been learning a lot about the Norns libraries and I have to say: they really rule. Every time I found a new problem, there was a library ready to solve it. Thank you to the many authors of those libraries!

Quick start

  • E1 over to page 3, and hit K3 to connect rhythm 1 to sequence 1
  • E2 down to s2, then hit K3 to connect sequence 1 to oscillator 1
  • E1 back to page 2
  • E2 around the top row, using E3 to edit some sequencer values
  • Now mess with some other stuff


Move between the pages with E1.

Page 1: Oscillators & rhythms

Move with E2, adjust with E3.

On the left-ish side, there are dials for the oscillator groups:

  • a frequency dial for the main oscillator, which moves that groups base note up the scale
  • a subdivision dial for each suboscillator, from 1/1 through 1/16

One the right-ish side, the 4 rhythm divisions, each moving from 1/1 to 1/16.

Page 2: Sequences

Move with E2, adjust with E3. Press K2 to mute the highlighted step.

Hold K1 while adjusting E3 to randomize the current sequence.

Sequence 1 is on top, sequence 2 below.

Page 3: Routing

Select a left-hand source with E2, a destination with E3. Press K3 to toggle the connection.


See the params menu for way more options, including panning, filters, quantization, and more.


The top 4 rows control oscillators 1-3 and sequence 1. The bottom 4 rows control oscillators 4-6 and sequence 6.

Rows 4 and 8 control the page, which correspond to the pages on the Norns UI: oscillators, sequences, and routing.

The rightmost key of those rows 4 and 8 is the alt key.


grid p 1

  • Row 1 controls the root note
  • Row 2 controls the first subdivision
  • Row 3 controls the second subdivision
  • Hold alt to adjust oscillator levels

grid p 2

Sequence pitches are arranged left to right.

  • Pressing the top row increases that step’s pitch. While holding the alt key, it randomly increases all pitches.
  • Pressing the second row decreases that step’s pitch. While holding the alt key, it randomly decreases all pitches.
  • The third row shows the current step. While holding the alt key, pressing a step will adjust the sequence length.
  • The two buttons near the alt key switch between forward and backward sequence progression.

grid p 3

The three groups are oscillators, sequences, and rhythms.

Holding one will show valid routes. Pressing an option will connect or disconnect that route.


In maiden, run:


Or view the source on GitHub


Just Norns. No Grid support yet, but that’s on the roadmap


Thanks for this! I look forward to exploring. Grid support would definitely be awesome.


This is a pretty out there idea but maybe the grid could be used for patch points like the semi modular!


I like that idea! I have a vague thought for a grid UI and that might fit into it well. There’s also some prior art in patching LFOs to params in otis.


Only had a quick go with it but it sounds lovely! @kasselvania, maybe one Grid page for patch points and one for sequencing would be fun. @stvnrlly Thanks again - I’ve occasionally lusted after the Subharmonicon.

1 Like

That sounds cool! I think an interesting UX/UI idea would be achieved by holding on patch point and then pressing another to make a connection. Then, they could gently blink at a similar rhythm together,
Maybe tied to the “CV” data passing through. This way, you’d be able to have a couple of patch points all intertwined with each other and potentially be able to see visually what is attached to what


Wow, this is great! Funny, I started working on a script based on the same idea two weeks ago :slightly_smiling_face: mine is called justharmonicon and uses jf as sound source. Looking forward to dig into yours!


o-o-o from the amazing @infinitedigits utilizes patch points:

Maybe something like this could be adapted for use here?


Very much looking forward to this as well then haha!


This is awesome! Great fun, and great work! Got lost in a loop for ages once I found a sweet spot.

Excited to see how this grows and refines.

First note from me would be some numbers on the freq/div/r screen might be useful for reference (I moved away from something and lost myself a couple of times haha)

I’ve never used a SH so I’ll need to play with it more to fully understand what’s going on, but seems like an awesome thing for sampling to tape and idea starter.

With the actual synth do you also play notes into it and it shifts so you can make complex arps? Like shifting the root note immediately? Sequencing/triggering that would be ace!

Damn! I forgot to test, does the pset save everything?


Yeah, totally. This probably won’t be the next thing I tackle, but I think it’d be fun to work on.

Thanks, agreed. I couldn’t figure out how to do this within the UI library, but writing this out I realize that I should just set it blank and write it directly. So it should be there soon.

Most things are params, so they should get saved if you create a PSET. The only exception I can think of is sequences, which don’t yet get saved anywhere but will in the future.


A new version is up with some small changes. I’ve swapped in a new engine with more controls (it’s just Moonshine for now) and made some small UI improvements. This helped clean things up a lot, so future pushes should have more fun stuff.

EDIT: also tossed a softcut delay in there.


Okay, the new version finally has Grid support; see the top post for the rundown. The interface is likely to change, especially the super-basic routing interface, but first I’m going to spend some time to add modulation and make parameters more accessible.


This doesn’t seem to work on latest firmware - goes from the splash page straight back to the SELECT screen. Maiden shows


/home/we/dust/code/subharmoniclone/subharmoniclone.lua:422: attempt to index a nil value (global ‘rhythm_1’)

I found a little bug and submitted a quick pull request for @stvnrlly . Basically there has been a change in function naming of the lattice library, and a quick search/replace fixed it. Running the script says so.

'new_pattern' is deprecated; use 'new_sprocket' instead.
'new_pattern' is deprecated; use 'new_sprocket' instead.
'new_pattern' is deprecated; use 'new_sprocket' instead.
'new_pattern' is deprecated; use 'new_sprocket' instead.

The way clock division works might not be as intended, the sequences advance very slowly; my official BPM for the year 2023 is 145, I’m not sure slower speed are even safe :smiley: I suspect the division parameters of new_patternnew_sprocket, and their respective set_divisions in the lattice stuff which ought to, as I understand it, set the division as \frac{1}{x} rather than x.


Thanks to both of you for the reports (and the pull request!). I will get to this before too long, but it might be a bit slow to get up and running with script dev again.