passthrough v2

passthrough v2


passthrough offers midi routing between connected ports on norns. it is similar to midi thru on hardware devices although it comes with some extra functionality.

new changes

v2 introduces a number of new changes

midi routing for all connected ports, simultaneously

where the previous version of passthrough allowed for midi data to be passed between just two selected devices, this limitation is no longer. all connected ports can have a unique passthrough configuration

target - all or specific device

the previous version of passthrough required an interface as output port. this nomenclature has been abandoned in favour of targets. incoming midi messages from a port can be routed to one or all other connected ports


passthrough has been updated to work with the new mods system introduced in norns: update 210927. as a mod, passthrough runs irrespective of current script. after installing, there will be a passthrough entry in the SYSTEM → MODS menu. the mod can be accessed within scripts, allowing for midi event callbacks to be defined.

midi panic

changing note quantization parameters such as scale / root note before a midi note_off has been received can cause hung notes. passthrough now offers a midi panic trigger to stop all active notes


norns running version 210927 + midi compatible hardware or virtual devices


passthrough is available from the maiden catalogue or by running the following command in the maiden repl ;install

breaking changes from v1

the new version of passthrough includes some api changes.

  • active a new parameter to enable/disable passthrough routing for a port
  • interface is no longer and is replaced by target
  • interface_channel is therefore no longer available
  • cc msg direction is no longer available, as v2 offers routing for all devices
  • user_interface_event method is no longer available
  • user_device_event method has been renamed user_event


  • the latest documentation will always be available on github
  • example scripts for running passthrough as a library or as a mod are included and ready to use after installation

reporting bugs and issues

i have been working on this new version of passthrough for a while, and have tested it with equipment i have access to. i do not, however, have the ability to test it comprehensively in the same way as releasing it publicly will manage. so, all bug reports and issues found are hugely appreciated. code and documentation contributions are always welcome.


Nice work, this is exactly what mods are going to be awesome for. Thanks <3


I’m up and running with passthrough and am extremely thankful for this contribution to the Norns community!

I am struggling with one thing that I would appreciate anyone’s insight into. Essentially, if I am running a synth based script on Norns that I would like to trigger directly with a midi controller that also passing midi elsewhere via passthrough, I am unable to trigger said script. To clarify this is partially true on some scripts (like Molly the Polly where if I go into the menus and change midi device from 1 to 2 and then back to 1 it seems then work fine, but I have to do this every time I load the script). Other scripts (like mx.samples) will not will not receive midi from the sending device while running passthrough at all. I would very much like to be able to still use the midi controller that I am passing data elsewhere from via passthrough to directly control Norns scripts.

Perhaps one would need to know more about my setup in order to begin to address this issue, but in case there is something obvious I should look into first, I’ll spare the details.

1 Like

This sounds like an issue I’m aware of - will post a new version once i have a fix


Is there a good way to disable routing passthrough on individual device basis? It seems that if I route MIDI from a device to itself, it won’t be passed to the other ones. If this is correct, then this is an implicit way to disable routing from a device. But does this do something weird like side-effects? I presume not, since it’s an affordance the UI gives.

I think OP-Z gets disconnected from Cheat Codes 2 if Passthrough v2 is activated as a mod, but unfortunately I don’t have a good triage and diagnosis to offer.

Not currently, but I will add it in to the next version.

I should remove the possibility of routing to itself in the UI. The code already ensures that incoming midi data won’t be passed back to its origin, but that’s not been reflected on the UI.

I’m aware of the disconnection issues, I’m sorry about that - I haven’t been near my Norns in the last couple of weeks so can’t test a fix just yet. Will be aiming to get that sorted this week.

1 Like

No worries at all, you (or anyone here) are under no obligations. Let me/us know if there is something we van help with, and thanks for a really super powerful feature! I’m using Digitone MIDI LFOs and a tiny breadboard controller to mess with NTS-1 phaser and arp settings :control_knobs:


I realised that use of Passthrough v2 has some breaking when playing notes from one MIDI to another. Sometimes there were delays which notes seemed to be cached and not played immediately on the target. Is that something you are aware of?
Meanwhile, I would like to install v1 as expecting it would be more stable. However, is it possible for me to do so as I could see the installation step only pointing to “passthrough” which would only be the latest I guess. If you can help me out on this, it would be great.

v1 can be downloaded here Release v1.0.0 · nattog/passthrough · GitHub

I’m not sure I follow exactly what you mean by “cached”. How big are the delays? Are using the quantize midi notes to scale functionality at all?

Sometimes breaking with one note or two.

Just tried some playing again. Breaking occurred sometime one or two notes, and key released but tone sustained. Sometimes pressed three or four keys and tone came after a note time or so.

Can you tell me some of your Passthrough settings please? And are the tones sustaining as a result of changes to Passthrough / Norns state - playing a new script or changing midi devices in a script?

Let me capture the Passthrough settings. My usage is simply connecting 2 USB MIDI device, one as keyboard and one as producing sound. Breaking occurred sometimes when I long pressed some keys and then released. When I have not been playing for a while and play again, the tone would not be coming out immediately.

K3 port MC-707
E2 scroll E3 select
Target: : all
Input channel : No change
Output channel : Device src.
Clock out : yes
quantize midi : no
Root : c
Scale : major
Midi panic : []


Target : MC-707
Input channel : 1
Output channel : Device src.
Clock out: no
Quantize midi : no
Root : c
Scale : major
Midi panic : []

I seemed finding out why. It is NOT about passthrough. It could be my MC-707 MIDI driver which I chose Vendor. I changed to use Generic and it is now having no problem. No more breaking!

Thank you for your help on this. Really appreciated.

(Being trapped by Roland software/digital Synth MIDI configuration, the driver! Plugging in a Korg or Arturia immediately seeing no problem.)


Okay great to hear that!

v2.1 released

First up, respect to @xmacex for his patience and generosity in helping me test this.


  • Overhauls how passthrough latches onto incoming midi events
  • Fix issue of disconnection when scripts define midi connect events
  • New active parameter to enable/disable passthrough per port
  • Remove possibility in UI of MIDI feedback

I’ve added the new documentation to


Receiving weird behavior on enabling passthrough as a systemwide mod. Everything locks up when I attempt to go into passthrough to edit its parameters once it is enabled. Any clues how to remedy? Matron repeatedly throws this message:

/home/we/dust/code/passthrough/lib/mod.lua:211: attempt to index a nil value (upvalue ‘state’)
stack traceback:
/home/we/dust/code/passthrough/lib/mod.lua:211: in function ‘device_event’
/home/we/dust/code/passthrough/lib/core.lua:25: in function </home/we/dust/code/passthrough/lib/core.lua:23>

Hi Brett,

can you share with me (maybe via PM) the contents of your passthrough.state file please? You can find this in dust/data

Also could you let me know a couple things:
Are you on the most recent version?
Did you recently change your MIDI devices setup? This could be as little a change as using the same midi hardware but in different ports to normal or plugging in fewer midi devices than you have done beforehand.

1 Like

Just for visibility for those who encounter the same issue as @Brett_Gershon above - try deleting passthrough.state found in dust/data. It has fixed it on Brett’s end.

1 Like

One more small question. While passthrough is enabled, it would appear that Norns’ system for prioritizing midi devices is not used. I am having a difficult time getting things setup so that upon loading a script the correct midi input device is chosen without having to monkey around in the menus every time I load a script. Is there a way to set this up while using passthrough that I’ve missed?

mod throws errors if there are no midi devices attached.

/home/we/dust/code/passthrough/lib/mod.lua:353: attempt to index a nil value (field '?')
stack traceback:
	/home/we/dust/code/passthrough/lib/mod.lua:353: in field 'redraw'
	/home/we/norns/lua/core/mods.lua:112: in field 'redraw'
	/home/we/dust/code/passthrough/lib/mod.lua:331: in field 'penc'
	/home/we/norns/lua/core/menu.lua:116: in function 'core/encoders.callback'
	/home/we/norns/lua/core/encoders.lua:60: in function 'core/encoders.process'

Works as expected once I have something plugged in


i’m not sure I understand fully the issue? v2.1 should not affect a script at all - it’s not adding connect events to midi devices like a script would, which otherwise would cause conflicts like this easily.