Seaflex

seaflex

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.

Requirements

norns 2.x
grid

Documentation

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

Download

v1.0.0 - Download

32 Likes

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:

16 Likes

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

4 Likes

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.

5 Likes

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>
lua:
/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.

2 Likes

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 https://github.com/tehn/ash
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.

2 Likes

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

2 Likes

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

3 Likes

Hi from the future I really liked the look of this app, fixed it for myself and want to get that upstreamed.

I’m submitting a one line import change PR to seaflex tonight that you can merge at your leisure – I’m happily using a local modification with this awesome script :smiley:

re: turnaround time for norns script fixes

Community code is a gift and nothing in the Norns ecosystem (at least in 99% of the scripts I’ve read and parts of the stack I’ve researched) is so staggeringly complex that you should feel obligated to push updates.

As an exercise for myself I’ve thought through this a lot and it would be kind of annoying? to stall updates while being active in other norns scripts but other than that IMO you can walk away at any time without being considered a bad person or a bad developer if you no longer had the capacity. The exception is something that could negatively impact the work of others (they depend on what you maintain) but even then your only real obligation is to communicate the fact and make an attempt to pass the torch.

The idea that I needed to be ā€œresponsible enoughā€ to release a norns app is what has kept me away for a couple of years and I don’t want to benefit from that lesson alone.

I’ve been reframing it in my head like: I might sink a bunch of time into scripts, use them for a few years and then stop having the capacity to update them. I charged no money, told no lies, harmed nobody and the only potential harm is to myself if I try to exceed my capacity.

Idk how you want to approach the problem but I feel it’s one we all share and wanted to provide my approach. If you’d benefit from a partner and want to revisit seaflex beyond this fix (the feature suggestions in this thread are up my alley in some ways and excite me) or you just another set of hands that can merge little fixes in the repo I happily volunteer!

the fix for anyone looking to fix `seaflex` in the meantime

Just update the import of polycut to the new way found in ash/earthsea.

9 Likes

What a thoughtful response to a more-than-3-year-old message! I appreciate the fix and the offer for another set of hands. I gladly accept - you’re more than welcome to take on any feature developments that excite you, and please let me know if there is any support I can offer.

I’m happy to see new life breathed into one of my old projects :slightly_smiling_face:

3 Likes

Yeah dawg!

PR is up and I’m actually going to scratch my own itch first when I have time to contribute a feature.

I want to use HID to search and display chords. Probably will also look for easy wins where more current norns utilities could improve existing code.

Being able to go backwards from name to grid would really help me recement the theory I’ve forgotten since devoting most of my time to a career change for a couple years.

5 Likes