companion app for earthsea

(sorry for the poorly lit iPhone photo)

This project started with me wanting to get better at playing chords on the grid layout of earthsea, and struggling to figure them out on the fly. So I built a tool to practice, and thought other folks might find it useful too.

In particular I wanted to build up my muscle memory for common chord shapes in various voicings, which seaflex helps with. Options for scale, scale guides, voicing complexity, as well as two-handed vs one-handed play are available in the params page.

Instructions for navigating the app structure are on the norns display.

Just tapping out chords all day can get a little dull, so there is a game mode where you can go for a high score, which is based on speed and accuracy. Separate high scores are saved based on your combination of initial settings (number of hands, voicing complexity, scale type, light/dark mode).

At any time you can toggle between light and dark modes. Chord shapes are displayed in light mode only. In light mode, to advance chords or finish a round (in game mode), all the lit keys must be pressed (and no other keys). Whereas in dark mode any voicing of the chord or chords displayed on screen will be accepted, meaning if all the keys (and no others) belonging to those chords are pressed, anywhere on the keyboard (i.e. any octave), the chord(s) will advance.

The norns encoders don’t do anything except modify a few parameters of the PolySub engine.

Some code has been copied over from the earthsea implementation shipped with norns 2.0.

I’ve got no significant future developments planned at the moment, but I’m open to suggestions! If you’d like to add your own scales, chords, or voicings, it’s as simple as changing a few constants at the top of the seaflex.lua file, no real Lua knowledge required.


norns 2.x


The app is mostly self-documenting, just follow the instructions onscreen.


v1.0.0 - Download


wow i had just started trying to work on my earthsea chops “the old fashioned way”—just playing scales and starting over every time i mess up—this week. get out of my brain, but thank you!

1 Like

for some mysterious reason i read this as “sexflea”

seriously: really fun that you are digging into, eh, “gamified” music-theory training applications :+1:


Sex positivity thread at the forefront of your mind, @zebra :joy:


so can we officially call norns a gaming platform now?

lots of thanks for this, definitely struggled the same with chords on Earthsea and it’s great to have a direct way to learn.


this is a really cool idea and much appreciated, been wanting to improve my earthsea fluency for a while!

1 Like

hi there getting errors when opening another script after seaflex as follows from maiden repl:
stack traceback:
/home/we/dust/code/seaflex/seaflex.lua:182: in function </home/we/dust/code/seaflex/seaflex.lua:175>
/home/we/dust/code/seaflex/seaflex.lua:182: attempt to call a nil value (global ‘toggle_note’)
any ideas ?

It sounds like there’s some kind of namespace conflict, I’m guessing the other script also has a method named “toggle_note”. I should have made all the functions (except the norns system ones) local functions (sorry, first time I’ve published a norns script!). I will push a PR to fix that when I have some time. In the meantime, I bet if you replaced this line (line 189)

function toggle_note(x, y, on)

with this

local function toggle_note(x, y, on)

It would resolve the conflict with the other script.

1 Like

@lylem I think the conflict is with line 175 because you’re using the global norns namespace grid object.

i.e instead of norns.grid.key(id, x, y, s) you would use g.key(x, y, s) to use local grid object you instantiated with grid.connect.

The issue with using the global one is that when your script is unloaded the function associated with key doesn’t get reset. So when someone uses another script that uses the grid, it’s still calling your callback.


this still has the same issue tried jaredperieras suggestion but script wont load. :wink:

@martindunne could you provide a link to the other script which causes the conflict so I can attempt to reproduce this?

sure thing its eathsea here
thanks for looking into this :slight_smile:

I was just passing by, but yeah - @jaredpereira is absolutely right, the issue is in how you redefining global norns.grid.key(id, x, y, s) function.
There are plenty of examples this being done correctly in other scripts, but the basic concept is described in study 4.
Also, it is a good practice to keep all your functions local, except init(), key(), enc() and redraw()

1 Like

came into this thread to point out the nors.grid.key thing but i see that’s covered.

while i’m here though, i might as well throw out my idle day dreams for this script. i think it would be cool if, instead of using random chords, the next chord could be based off of some music theory driven set of rules. basically i’m thinking of the ways that jazz folks i’ve known practiced. every inversion of every ii-V-I in every key etc.

obviously that gets into a huge rabbit hole quick in terms of what theory rules are valid or desirable for which people. but since grid voicing are alway going to be the same figuring regardless of the key, to me knowing common relationships between chord shapes would actually be better to learn than the exact placement of a gsus4 starting in the 5th octave of a grid with a root of c.

and then after that the next “logical” step would be to figure out how to read midi files and translate them to the grid lights and bam – guitar hero but for monome grids.

just spitballing here, this is my first day back looking at the norns since my work life took a crazy turn. but if the idle time continues i may take a swing at a PR.


If anything, you could use some of the guiding Principles behind things like the Kordbot

Or Mike Gao’s PolyPlayground:

There’s a lot of reference material out there, but Seaflex could incorporate some of that pretty easily


Apologies all for the incredibly slow turnaround time on a fix. I have no good excuse, life just got in the way and I haven’t prioritized norns development lately. The grid key method has been updated, and I will get this into the maiden project manager ASAP. I promise to be much more responsive next time I release a norns app.

@ypxkap and @kasselvania - thanks for the ideas, they definitely sound like cool extensions. I’m working on some other norns apps right now but if I get inspired to circle back to seaflex I’ll certainly try to incorporate some of your suggestions, and of course in the meantime PRs are quite welcome!

EDIT: update - it was already in the maiden project manager! Whoops