n16o (nicks-tea-no)

i2c-based ER-301 control via korg nanoKONTROL2


  • norns (191230 or later)
  • crow (1.0.2 or later)
  • i2c-enabled er-301 (tested with v0.4.27-stable, probably will work with v0.3-stable, but not tested)
  • nanoKONTROL2 (or other CC-sending fader/knob/button controller).


  • The physical connections required are as followed: nk2 to norns via usb, norns to crow via usb, crow to er-301 via 3 or 6-pin i2c.
  • To enable n16o, you can either run the n16o script, or add 2 lines to any other script’s init function, as defined in the main n16o.lua file.
  • By default:
    • cv ports 1-8 correspond to the nk2 faders (left to right), range is 0-10v.
    • cv ports 9-16 correspond to the pan knobs (left to right), range is 0-10v.
    • tr ports 1-8 correspond to R buttons (left to right). These are momentary, meaning the go high when they are pressed, and low when they are released.
    • tr ports 9-16 correspond to M buttons (left to right). These are momentary.
    • tr ports 17-24 correspond to S buttons (left to right). These are momentary.
    • tr ports 25-35 correspond to transport buttons (all the buttons to the left of the fader). These are ordered left to right, bottom to top. In other words, the rewind button is 25, and the right arrow track button is 35. These are latching meaning they go high when pressed and stay high until they are pressed again. They will continually toggle states off and on with each press.





n16o is a norns script that turns a KORG nanoKONTROL2 into an i2c-enabled faderbank and button buffet (lol) for controlling an ER-301.


The norns script intercepts the midi messages from the nk2 and sends them as i2c commands to crow. Provided your crow and ER-301 are connected via an i2c cable, you can then use SC.CV and SC.TR devices on the ER-301 to listen for these messages.


I’m working to downsize my system, and will not have all the knobs of 3 Quadratts to control my ER-301 patches…which I tend to use a lot of! Since I don’t currently have a 16n, I wanted to be able to emulate similar functionality with the nk2 I had lying around.

Does this script work with other midi controllers?

Possibly not out of the box, but it could easily be edited to work with them…it’s just a matter of making sure the CC #'s each fader/knob/button sends corresponds to the correct ER-301 port this script maps it to.

For example, if you are trying to use this with 16n, you could set faders 1-8 to CC#'s 0-7 and faders 9-16 to CC#'s 16-23. See the image above for what the CC’s are set to for all buttons, faders and knobs on the nanoKONTROL2.

By default this scripts looks for what norns has configured to the first MIDI device, and listens on MIDI channel 1.

What are the default CC’s supported out of the box?

My nanoKONTROL2 is set to different CCs…how do I change the CC # each fader/knob sends to?

The KORG KONTROL editor for Mac or Windows

You can also set CCs of any non-nanoKONTROL2 controller to mimic those sent as the above screenshot shows (either fully or partially).

Instead of changing the CC values my controller sends, I’d rather change the script to accept a custom mapping of cc to cv/tr ports. Is that doable?

Definitely doable, but the code is written in a way that tries to map the nanoKONTROL2 very specifically in as few lines as possible…it’s gonna be a pain to try to get in there and tweak it as it is currently written. I could be up for adding new config parameters that allow you to pass tables or custom CC -> TR/CV port maps if it is needed.

This seems like a silly thing to tie up norns for…how do I use it in the background of another running script?

Yes, it’s a silly little utility. I tried to architect the code in a way that makes it super easy to run n16o in the background of any other script…you just import the lib and execute the init function (passing configuration params if you so desire). The main n16o.lua acts as documentation for how to do this, as well as all the possible params. This is really easy to do, you do not need to have any programming experience to do it. Happy to answer questions if they do arise though!

Does using n16o prevent me from using the controller for other users (such as mapping to parameters within a norns script)?

No, if you are running n16o in the background of another script, feel free to use the nanoKONTROL2 as you would and map any parameters using the midi-learn function…just be aware that if you also listen on a port that some fadder/knob/button is mapped to, it will effect both the 301 and the norns param.

Is this performant?

Maybe? It doesn’t seem to be causing any issues for me in practice, but note that currently I’m not throttling the number of i2c messages sent over the wire in any way (as during my tests, there hasn’t been any lagging even when I’m going really fast with the faders, trying to break it), but the throughput of messages does raise some concern. If anyone notices any performance issues, please let me know the scenario, and I will see if I need to implement any sort of debounce to lower the amount of messages sent.

The faders seem a bit steppy, especially at the lower values…is something wrong?

I’ve added 50ms of CV slew for the 16 ports the nk2 uses. In testing, this seems to fix the alias-y sound you get when moving the faders very slowly without introducing any sort of perception of lagginess. There seems to still be a distinct “on” value, for example, where you can hear a linear unipolar vca device go from “silent” to “not silent”. I’m not sure if this is a 301-thing or a thing with how my script works. Any additional bug reports or ideas of how to fix are greatly appreciated!

Can you make the nanoKONTROL2 (or other midi controller) button led states line up with the current state of the 301 device it’s mapped to?

No, I don’t think so…I don’t believe that norns supports bi-directional midi.


n16o is in the maiden package manager now should you want to download from there!


I’ve added a number of questions and answers in the top post for this script (thanks to @Brennanib for the push to document a bit more by asking if he could use his nanoKONTROL version 1 with this). Hopefully that is helpful if you have some other sort of midi controller you want to control ER-301 (via crow via norns) with.

Happy to answer any questions here too if they arise.


Thanks @jlmitch5 can’t wait to get this up and going!


Hello there!
Maybe a noob question but:
I’m trying to use my 16n (leader mode) plugged into Fates to speak with Crow. Finally Crow is in a i2c bus with: JF, W/ and Er-301.
Er is rightly set to speak with Teletype/Crow.
Scripts like Animator works well with SC/TR units but N160 not🤔
What I am missing??
Thank you!

hey @Alessio I believe @lilskullymane got this working with 16n so they might know.

just to check:

  • you have changed the CCs of 16n with the web config editor to what the nK2 has the faders and knobs set to (see image above in top post)
  • 16n is midi device 1 in the norns/fates settings
1 Like

Thanks for the reply!
Wow: no, I must check the cc’s!
Which midi channel nanoK is configured on (by default)??
By now seems that the first faders cc are the same for both 16n and Nano😕

@kasselvania this looks relevant to your interests

1 Like

Channel 1. 20 charsssssss

1 Like

When you are running the app and you move a fader you should see the ii commands that norns is sending in the bottom Right corner of the screen. If you are the issues is with norns -> crow or crow -> 301. If not the issues is with 16n -> norns

1 Like

Solved! @jlmitch5 suggestions are correct :slight_smile:
You might simply map 16 faders with the correct cc’s and they works properly with Er-301 via i2c !!
Now I can put apart 12 patch cables, really nice.


•if your controller have more than 8 faders (the 16n faderbank Eg.), you can map the values which correspond to Nanokontrol’s encoders.

1 Like

I have updated the top post to more or less have this now (specifically how to set up 16n).

1 Like

hey, just seeing this! glad you got it set up @Alessio. I went and added the n16o script to the other apps so I could use 16n alongside all the other good norns stuff. works like a dream with the er-301. do you know if there’s a way to bulk edit n16o in in maiden? took me a while to do every app individually and I’ve been hesitant to update apps where I’ll have to go back in and add it again.

1 Like

Ah cool. Unfortunately no I don’t think there’s a way to do this cleanly at the script level…you could go in and commit your change then when you update scripts, unless there’s some really big changes around the init function, it will probably cleanly pull in

@tehn do you know if there is some base lua file or something that runs where you could hook an across-all-apps snippet of code in?

I didn’t used Maiden: I‘ve simply copied the folder of the script that I want to modify from Cuberduck, and I’ve pasted it on a new version with n160 script integration.
For Eg. “Animator+n160”.
So put it in Dust etc🙂

A post was merged into an existing topic: Norns: development

Hi @jlmitch5

I’ve got everything set to go but I have 2 questions:

  1. Once I get it all hooked up (Norns>Crow>301) What do I have to do on the 301 to make it all work? The best I could tell from reading the er-301 post about connecting the 16n faderbank is that A. you have to enable Teletype control in the admin systems settings. And B. Once done you can then add a Teletype SV.CV unit and set it’s ports. Is this correct?

  2. You asked and answered this question above

Can you make the nanoKONTROL2 (or other midi controller) button led states line up with the current state of the 301 device it’s mapped to? No, I don’t think so…I don’t believe that norns supports bi-directional midi.

In the recent Cheat Codes 2 Beta I’ve been using Dan put in a Param for Midi Echo to be turned on (and I’m using it perfectly with a Midi Fighter Twister). Is this the same as Bi-directional comms? And if so then it may be possible which would be pretty awesome.

I can’t wait to hear your answers. So stoked you wrote this so a huge thank you! Also, I didn’t realize there was such a great i2c resource here! Thanks @okyeron for writing this up. It’s super helpful.

1 Like


  1. That sounds right!
  2. Honestly no idea on this one. It might be possible! I’ll have to take a look sometime. If you wanna get this in here I’d be happy to accept the PR

Thanks for the reply! I’ll hit Dan up when he’s less busy with the imminent Cheat codes 2 release next week and see what he thinks about #2.

1 Like

I forgot to ask, do you see any issue with this working on 301 firmware 0.5.03 or should I switch back to 0.4.27? I’m guessing nothing bad could happen to try the newer (though unstable) firmware except that N16o might not work?