Multipass - a framework for developing firmwares for monome eurorack modules

multipass is a framework that makes it easier to build alternative firmwares for monome eurorack modules: white whale, earthsea, meadowphysics, ansible and teletype. it’s a very lightweight layer over libavr32 monome library which abstracts hardware input/output and some of the system functions.

the 2 main goals are:

  • make it easy to start writing apps without having to figure out a lot of low level details
  • allow for re-using the same code for multiple modules (and perhaps eventually multiple platforms)

i’ve been meaning to document this properly for quite some time but with so many projects i’m going to post this for now so that people can start taking advantage of it, and hopefully this will create the momentum to expand it and add more functionality.

so, what is it? it’s basically a very lightweight framework that abstracts all the gritty details about how to implement things like outputting a CV, talking to MIDI devices, reading/writing to flash, using grid, arc and other various controllers. it also abstracts the notion of playing notes from how notes are actually played - you configure voices and use functions to play notes, and multipass will translate it into CV, or appropriate i2c commands - it knows how to talk to er-301, telexo, just friends etc.

it supports various controllers already: grid, arc, shnth, keyboard. screen support is available for teletype. you can see what is possible here: multipass/interface.h at main · scanner-darkly/multipass · GitHub

i’ve put together instructions on how to get started here: multipass/ at main · scanner-darkly/multipass · GitHub

a sample app: GitHub - scanner-darkly/multipass-simple: a sample app using multipass framework translates MIDI notes to CV/gate (didn’t have a chance to test it yet!).

for a more complex example, take a look at polyearthsea.

i’m hoping to add more functions at some point to support USB storage and more controllers - ideally, multipass could also implement some universal preset management system, scale editing and output mapping - but this is far future. for now though it should be very easy to start making apps with it!

several areas could use more documentation, namely, flash preset management and voice mapping - will try to add more soon!


@scanner_darkly, haven’t been this excited to try out a code in a long time! Thanks a whole lot for putting this together. Eagerly awaiting to build on top of it as well as see what more awesomeness this could lead to!


no exagerration
monumental step forward for the community

thanks @scanner_darkly !


Thanks a lot for putting so much of your time into making firmware development more accessible for all of us!

As I already wrote in this thread I’m very interested in trying out some ideas for alternative Teletype firmwares. But being relatively new to embedded/firmware development I haven’t found the time yet to dive into libavr32 and the low(er) level details of monome firmware development - at least not deep enough to really get started with actually prototyping or developing some of the applications I have in mind. I’m sure that your framework will make things significantly easier and I’ll give it a try as soon as possible!

By the way, the design of your framework’s API and it’s level of abstraction reminds me a bit of openFrameworks, which was my gateway into C++ and graphics programming some years ago.

1 Like

So I just discovered some definitions in interface.h that seem to be related to the Shbobo Shnth. Am I getting this right?

Searching the forum, I found Shnth support being mentioned in the polyphonic earthsea changelog. So I guess the Shnth can be connected to monome modules via USB. Is this also true for the Teletype, or does it only work with Ansible and the trilogy modules?

1 Like

Leeloo Dallas Multipass! :black_heart:


This is amazing, thank you for getting this going. Gonna see if I can pick up that secondhand meadowphysics afer all!

1 Like

This is so great!

At some point I want to take a stab at shifting the factory firmwares to multipass so I can drop the broad libavr32 shimming in monome-rack and just implement the multipass API for VCV Rack.

Have you considered a C++ version of the multipass? I know the avr32 compiler doesn’t fully support it (no new/free) but I think even the supported feature set could be really useful for encapsulation (and selfishly ease the VCV interop.)


Would be very interested in this. I am beginning to write some stuff on top of multipass for TT but I was hoping to port that to vcv at some point. This could help!

1 Like


Could a multi pass firmware be created to make any monome module act as an i2c expander (like the txi and txo)

For example, for teletype, give you access to an addition 8 trigger ins, 4 gate out, 4 cv out in your crow scripts?

I know there’s talk about addresses and stuff…I don’t know if that kind of thing makes this impossible?

correct, multipass already supports shnth, although button presses seem to be buggy, and due to the fact it uses piezos for pressure it might not be super precise but it can still provide for interesting results using it for modulating parameters.

it should work for all modules including teletype, although the older tt revision might not provide sufficient power, i doubt shnth needs much though.

yes! that was the inspiration for the name :black_heart:

that’d be amazing - vcvrack was on my mind as well, it’d be great to have it as a supported platform. a nice side effect of this would be being able to build any of the factory firmwares for any of the monome eurorack modules (taking hardware differences into account, of course).

in theory, we just need something that implements interface.h. but…

with this in mind perhaps it needs to be refactored - tbh my knowledge of C/C++ is pretty shallow, so not sure what approach would be best to support both C/libavr32 case and C++/vcvrack case (and potentially other platforms). some kind of a wrapper struct for interface.c and control?

added an issue for this - probably easier to discuss there!

yes, absolutely. i don’t remember if i tested using multipass in the follower mode, but in theory all you need to do is call set_as_i2c_follower(uint8_t address) (you could probably even change the address dynamically) - you could use your own address or have it respond to an existing address (so it could emulate txo in CV mode, for instance), and then in process_event you check for I2C_RECEIVED event, and interpret the data received (it will work with any message length).

for inputs if you’re using it in the follower mode you will need to poll for input states periodically using get_cv(uint8_t index) or get_gate(uint8_t index).


was planning on trying this at some point but not enough time - would love to see somebody take a stab at implementing a lua shim that would work as a wrapper for norns lua scripts and an adapter between interface.h and norns specific lua tables (grid etc). it could emulate some sound engines too and just translate them into CV or i2c commands.

the idea basically is to be able to take an existing norns script and run it on a module easily.


fixed an issue with teletype build (thanks to @shankzz for reporting!) . if you’re using the sample app make sure to run git submodule update to get the latest multipass version.

1 Like

there was an issue with meadowphysics build - fixed now (thanks @forrest - and thanks for adding flash commands!)


Whoa! This looks amazing! Thank you. Can’t wait until I can find some time to dig in. :slight_smile:

1 Like

Received my teletype today. Flashed my build of the multipass sample app and it works great! Additionally my green pcb teletype adequately powers that little arduino neotrellis controller I was talking about. So, I think I am all set to explore development on top of this. Thanks so much for this gamechanger! Feels ridiculously powerful to be able to write eurorack firmware so effortlessly, thanks to multipass :slight_smile:.


awesome, i’m surprised a bit it works, didn’t get a chance to test it.

will post another small multipass based app soon that will give a better idea of a typical app structure esp if you use grid (and would be easy to modify for MIDI controllers).


please add shnth support for this small app!
something like 2 antenae + 4 buttons sending cvs+triggers from ww would be great! :smiley:

That will be nice. It might also help in deciding how quickly I am going to jump on a grid :slight_smile:. Btw, screen functions work fine. Thanks for putting them together as well! I am currently using the screen as my debug interface until I start coding functionalities for the screen :stuck_out_tongue:. Gotta get one of them FTDI cables soon.

ha, screen is a luxury! i used to debug using grid ))

need to add more screen functions but need to figure out how to define an interface for them that isn’t teletype screen specific.

just pushed an update that fixes get_knob_value and get_cv for teletype and adds functions to read TXi inputs and knobs.

will try to add something soon!