Norns: studies

it is live:

thanks to @ppqq and @trickyflemming for last-second edits


(@tehn, old vid embedded in post above!)


Just in time for my latest project!

1 Like

Yay, I have been eagerly awaiting the midi study! Thanks, @tehn!


thanks @Dan_Derks!! fixed.

1 Like

Not sure if this should be asked here or in Norns Scripting:

The norns study part 4 “physical” says that this is the method to access grid keys:
g = grid.connect()
g.event = function(x,y,z)

Whereas the original AWAKE script (the only one that I’ve been modifying over and over so far) just uses:
function gridkey(x, y, z)

What’s the recommded way of accessing grid keys?

the new syntax is necessary. the original awake used an old method of accessing the grid, which was completely redesigned (hence the month lapse in studies).


Thanks much – that’s the final trigger for me to update (still on 180707 IIRC), as I love to do the studies.

I can’t manage to use (or receive?) incoming MIDI clock with beatclock. I tried the following:

beatclock = require ‘beatclock’
clk =
clk_midi = midi.connect(1)
clk_midi.event = clk.process_midi

function init()

clk.on_step = function() print(“step”) end
clk.on_select_internal = function() clk:start() end
clk.on_select_external = function() print(“external”) end

My ROLAND UM-One MKII is receiving MIDI clock from analog RYTM and is associated to the port1 in “devices”.

When using internal MIDI, “step” is printed in Matron, switching to external makes appear external but that is all, the ‘print step’ function is not activated anymore.

BTW i’ve got a big gig on Saturday and i would really like to use my norns but i need to figure that thing out first so… help anyone? :kissing_heart:

Can you confirm your roland device is showing up to norns as a MIDI device (in SYSTEM>DEVICES>MIDI ). Or that you can re-select it?

My Roland drum machines don’t show up at the moment due to the USB system getting pushed back to USB1.1 in the recent update (due to various errors on the USB system)

@okyeron Yes it is present in devices 1, I also tried to reselect it.

i don’t have a roland um-one but i’ll check with another device to ensure sync is working.

1 Like

The grid/midi tutorial is great. So simple and elegant.

If I want to update the studies on the device, is it safe to go a git fetch && git rebase origin/maser?

Hello all! I started documenting my own studies learning norns/supercollider/lua on medium that I’d like to share (is this the right place?)

Hopefully this is helpful to some newcomers, especially when it comes to hacking on the lower level Supercollider engines.


This is exactly what I am after - even starting with a Gendy engine - thanks for sharing :slight_smile:

1 Like

You’re welcome! Let me know if anything isn’t clear.

1 Like

polls. OSC. files.

vid: metallophone to mic, mic to inputs. pitch detect on inputs with key press, add oscillator with detected pitch. add up to 16 pitches, reset with other key. touchOSC running on phone, controlling filter and noise in x-y configuration.


this is stunning. wow. norns is growing.

Thanks much for the file operations, this is what I have been waiting for! One question regarding this example:

function print_file(filepath)
  if f==nil then
    print("file not found: "..filepath)
    for line in io.lines(filepath) do
      -- this is where you would do something useful!
      -- but for now we'll just print each line

It is confusing to me why f:close() is called before the for…in…do operation using io.lines(filepath). I would have expected that the file must be open in order to execute the for…in…do operation using io.lines(filepath), and that f:close() is called after that.

Please, can you help me understand? Still a Lua (and programming) novice…thanks much in advance!


I believe io.lines only checks the amount of lines in a file, regardless of whether or not it is open. If this is the case, it wouldn’t matter if f:close() came before or after, but it’s good practice to close files as early as possible.