MiniCommand Resurrection // MCLive


lol remember there is the option to load Kit Zero and regain the unsaved settings, to then save to the previous kit location.


The latency is not noticeable to me. I still need to do more testing here.

Because the sequencer events are trigged by the MD ext clock, there is little room for drift.


Covered quite a bit of ground on the MCL Firmware.

The GUI for the 6 track, external polyphonic sequencer is done. The sequencer is a bit different to what you’d be used to. There is no length for notes, instead you place parameter locks for note on and note off events. This is done by pressing a trigger/step button on the MD then with the A4 keyboard selecting the Midi notes. You then repeat the above for another step for the note off events.

Each step of each track can hold 4 note parameter locks which can be either note on or note off events.

In addition, I’ve doubled the resolution of the ext poly sequencer. In realtime record mode what you record in is what you get out. Legato, chords, overlapping notes etc… No awkward quantisation.


Added megacommand hardware test firmwares. I’d highly recommend running the tests after each portion of the build.


I’ve spent the last week or so refining the GUI and squashing nasty bugs.

The new sequencer feature set is complete and reliable, and it’s time to start making music.

Each of the 6 tracks of the polyphonic sequencer is now switchable between 2x and 1x resolution. In 1x resolution mode each track can have a maximum length of 128 step; this is perfect for long baselines or slow melodic progressions.

The difference between 1x and 2x mode is that in 1x mode you cannot have successive 16th notes with note lengths shorter than a 16th note. For example, if you wanted to play a short percussive note on every 16th note you need to be in 2x mode.

Both modes have 96th note precision and recording in both modes sounds better than the internal A4 sequencer.


Blade Runner 2049 Spoiler:

There are 2 MegaCommand HD44780 displays built in to the dashboard of Kay’s police cruiser.



In the last hour i build a MegaCommand. All hardware tests worked. But i have got Problems to get the Arduiono-IDE with the Megacommand Core to work (MacOS 10.11.6).

Can you tell me wich Arduiono-IDE-Version you work on? Any Advise?


:rocket: you must be the first one! Well done.

I’m running 1.8.3 here. What is the problem you are experiencing?
Do you see the “MegaCommand” core selectable under Tools -> Boards ?


There was a small problem in the instructions preventing the core from appearing under Tools.


Installing the MIDICtrl core.

(Instructions for OSX, should be similar for Windows)

  1. Download the Arduino IDE

  2. Get the MIDICtrl library and MegaCommand Core (same repo):

   cd ~/Applications/
   git clone


Alright 1.8.5 is working.

Follow the instructions above and you should be all good.
The MCL firmware will compile for you.

I’ll try to get some documentation out on the new sequencer functionality and Analog 4 integration.
Feel free to ask any questions in the meantime.


Easy fix. Thanks. MCL is up and running. As you can see, i am a total Arduino-Noob.
Later i will check it out further, now i have to work :frowning: .

In the Mouser Cart there are 6x 595-CD74HC4050EE4 and 1x 595-CD74HC4050E, but you need only one. The SD-Card Breakout is sold by Mouser, Part 485-25. Maybe @JustinValer can update the Mouser Cart.

The Display is not soldered to the MegaCommand, i will change it to a Red/Black one.

What kind of Powersupply shuold i use? As i see there are no voltage regulators i think 5V?


Excellent work! :grinning:

Thanks for the heads up about the Cart. I’ve removed the erronous values. If there are any other mistakes, or the documentation is not clear, let me know and I will update. (I noticed there were also 2 surplous diodes and an extra 220uF cap)

Did you end up buying any parts directly from Adafruit or all through mouser?

The power jack is routed to the regulators on the arduino board, which have rated input
9 to 12V DC, 250mA or more.


Also, the MCL manual can be found here:
MCL Manual

The 4 encoder buttons are now used to select the sequencer pages. In each sequencer page, you have an alternate sub page. The top left button activates the sub page.

Encoder 1) [ MD Step record | A4 Step Record ]
Encoder 2) [ MD Record Live | MD Record Parameter Locks Live ]
Encoder 3) [ MD Parameter Lock Page A, MD Parameter Lock Page B ]
Encoder 4) [ MD/A4 Pitch Mode, MD/A4 Pitch Record Mode ]

When in a sequencer page

Top Right button will erase the current track.
Top Right + Bottom Right will erase all tracks.

Just take note, that the MCL will often save your current kit (to get the current state of the MD) when entering the different pages. So backup your work!!


I have bought most Parts from Mouser. Resistors, Caps, Display were already here at home from other projects.

The SD-Breakout comes from another seller here in germany because i have seen to late that i can buy it at mouser.

The Buttons are from another seller too, mouser dont have them in stock right now.

Ok, i see, nice solution.

As i am not into Arduino, these things were a bit difficult for me. Besides the problems you fixed already in the documentation i think the following advise will be helpfull: You have to copy the downloaded “Sketch” (i think thats the name…) into the Sketch-Folder of the Arduino-IDE.


Will the Input-MIDI-Data (ext. Keyboard) be merged with the Megacommand-MIDI-Data and send out to the MD?


MIDi Merge is currently disabled, but it’s possible to implement.
What did you have in mind?

Edit: You can merge external clock from MIDI-IN-2 and have that as master tempo for the MD


Where i can get the latest release?


I found it in your Github Repositories. But i got an error while compiling:

Arduino: 1.8.5 (Mac OS X), Board: “MegaCommand, ATmega2560 (Mega 2560)”

In file included from /Applications/,
from /Applications/,
from /Applications/,
from /Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:9:
/Applications/ In member function ‘void MidiUartParent::sendNoteOn(uint8_t, uint8_t, uint8_t)’:
/Applications/ warning: narrowing conversion of ‘(int)(channel | 144u)’ from ‘int’ to ‘uint8_t {aka unsigned char}’ inside { } [-Wnarrowing]
MIDI_NOTE_ON | channel,
/Applications/ In member function ‘void MidiUartParent::sendNoteOff(uint8_t, uint8_t, uint8_t)’:
/Applications/ warning: narrowing conversion of ‘(int)(channel | 128u)’ from ‘int’ to ‘uint8_t {aka unsigned char}’ inside { } [-Wnarrowing]
MIDI_NOTE_OFF | channel,
/Applications/ In member function ‘void MidiUartParent::sendCC(uint8_t, uint8_t, uint8_t)’:
/Applications/ warning: narrowing conversion of ‘(int)(channel | 176u)’ from ‘int’ to ‘uint8_t {aka unsigned char}’ inside { } [-Wnarrowing]
In file included from /Applications/,
from /Applications/,
from /Applications/,
from /Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:9:
/Applications/ At global scope:
/Applications/ warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
SketchSwitchPage(char _name = “SELECT SKETCH:”,
In file included from /Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:11:0:
sketch/GridPage.h: In function 'const char
getMachineNameShort(uint8_t, uint8_t)’:
sketch/GridPage.h:168:18: warning: NULL used in arithmetic [-Wpointer-arith]
if (machine == NULL) { return NULL; }
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino: At global scope:
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:104:20: warning: converting to non-pointer type ‘int’ from NULL [-Wconversion-null]
int encodervalue = NULL;
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino: In function ‘void switchGlobal(uint8_t)’:
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:1642:49: warning: narrowing conversion of ‘(((int)global_page) & 127)’ from ‘int’ to ‘uint8_t {aka unsigned char}’ inside { } [-Wnarrowing]
uint8_t data[] = { 0x56, (uint8_t)global_page & 0x7F };
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino: In function ‘void md_setsysex_recpos(uint8_t, uint8_t)’:
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:2058:46: warning: narrowing conversion of ‘(((int)rec_type) & 127)’ from ‘int’ to ‘uint8_t {aka unsigned char}’ inside { } [-Wnarrowing]
uint8_t data[] = { 0x6b, (uint8_t)rec_type & 0x7F, position, (uint8_t) 1 & 0x7f };
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino: In function ‘uint32_t getGridModel(int, int, bool)’:
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:3152:14: warning: converting to non-pointer type ‘uint32_t {aka long unsigned int}’ from NULL [-Wconversion-null]
return NULL;
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:3156:12: warning: converting to non-pointer type ‘uint32_t {aka long unsigned int}’ from NULL [-Wconversion-null]
return NULL;
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino: In function ‘char* getTrackKit(int, int, bool, bool)’:
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:3176:14: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
return " ";
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:3180:14: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
return " ";
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino: In function ‘void turboSetSpeed(uint8_t)’:
mcl:4135: error: no matching function for call to ‘MidiUartClass::setSpeed(uint32_t&)’
MidiUart.setSpeed(tmSpeeds[speed ]);
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:4135:37: note: candidate is:
In file included from /Applications/,
from /Applications/,
from /Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:9:
/Applications/ note: void MidiUartClass::setSpeed(uint32_t, uint8_t)
void setSpeed(uint32_t speed, uint8_t port);
/Applications/ note: candidate expects 2 arguments, 1 provided
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino: In function ‘bool handleEvent(gui_event_t*)’:
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:4187:29: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
LCD.puts(“Please Wait”);
/Users/doerg/Desktop/MCL_V2_0_0-2.1/mcl/mcl.ino:4189:34: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
LCD.puts(“Creating Project”);
exit status 1
no matching function for call to ‘MidiUartClass::setSpeed(uint32_t&)’


Hi MonCalamari,

For simplicity, please ignore V2.0 release for now, and just use the latest commits.

I’ve realised there are a number of changes between MidiCtrl20 and the MCL2.0 firmware that will make the two incompatible (as you have discovered above).

Please checkout the latest commits for the two repositories found here.

I am updating these daily as I find bugs or feel the need to improve functionality or add features.

Once I am satisfied with the stability of the firmware I will tag releases in both repositories to avoid the above confusion.


I’m slowly porting the MCL V2.0 Manual over to google-docs and updating as I go along.

MCL Manual
(work in progress)


MIDI Clock merge functionality was broken,

You can now specify which port the MidiClock is to be received on, and optionally enable MidiClock transmit on MidiOut2.