Skip to content

@franky47 franky47 released this Apr 28, 2020

This release fixes the missing macro MIDI_CREATE_CUSTOM_INSTANCE, by @Rolel in #150.

Assets 2

@franky47 franky47 released this Apr 24, 2020

This release fixes Software Thru being enabled by default in non-Serial transports.

Software Thru forwards received messages to the MIDI output, it's useful for serial MIDI to simulate the action of a hardware Thru port, but can cause problems if enabled for USB, BLE or other non-serial transports, where the MIDI stream would feedback to the computer. Therefore, SoftThru is only active by default on Serial transports (HardwareSerial and SoftwareSerial).

Assets 2

@franky47 franky47 released this Apr 20, 2020

This release, a major version update, reworks the way the library works with Transports.

It is only a breaking change for users of the integrated UsbTransport of 4.3, which has now been replaced by a dedicated USB transport.


  • Dedicated transports
  • Active Sensing


Transports are the physical layer of the MIDI transmission, whatever hardware your MIDI messages will go through. By default, it's the HardwareSerial port of an Arduino, for communicating with instruments through DIN connections.

But MIDI supports more transports, such as:

Each transport is provided as a separate library, generously contributed by @lathoub. Check out the examples in each transport library to get started.

Assets 2

@franky47 franky47 released this Nov 4, 2016

This release only addresses a mismatch in the Arduino library file.

Fixed Issues

#62 - Mismatching version in

Assets 3

@franky47 franky47 released this Nov 2, 2016

This release brings support for RPN/NRPN sending, as well as an experimental external parser for RPN and NRPN input messages (provided in an example).

One of the major changes under the hood is that Running Status is now disabled by default, as it caused a lot of issues for some people. If your receiving hardware supports it and you want to enable it again for the extra performance, have a look at how to use custom settings.

It also adds a very early experimental native USB demo by tapping into MIDIUSB (therefore will require the dependency to run the example). Full-fledged low-latency native USB MIDI is planned for the next release.

Most of the changes were internal, to fit into the new Arduino library structure guidelines and to leverage modern FLOSS development facilities (unit testing, code coverage, continuous integration).


New Features

  • #37 - Send RPN & NRPN (select controller number, send plain values or increment/decrement directives).

Bug Fixes

  • #53 - Fixed sendPitchBend(-1.0) which did not output a zero value.
  • #58 - Fix detection of interleaved Undefined bytes.
  • #61 - Don't invalidate Running Status when not sending anything (invalid send data).

API Changes

Breaking Changes

  • Negative range of float/double signature of sendPitchBend extended to fix #53.
  • Sending Tune Requests through sendRealTime is no longer supported. Replace MIDI.sendRealTime(midi::TuneRequest); with MIDI.sendTuneRequest();


  • Replaced midi::RPN with midi::RPNLSB
  • Replaced midi::NRPN with midi::NRPNLSB
  • Replaced midi::DataEntry with midi::DataEntryMSB

Non-Breaking Changes

The following changes mark the following old parts of the API as deprecated.

They are kept for backwards compatibility, but should not be used for new sketches. The old definitions will be removed in the next release.

  • Added sendAfterTouch with note, value and channel arguments as an alias of sendPolyPressure (now deprecated).
  • Moved Thru definitions to own sub-scope.
    • Replaced midi::Off with midi::Thru::Off
    • Replaced midi::Full with midi::Thru::Full
    • Replaced midi::SameChannel with midi::Thru::SameChannel
    • Replaced midi::DifferentChannel with midi::Thru::DifferentChannel

Other Changes

  • Default value for UseRunningStatus setting is now false. To benefit from Running Status again, use custom settings.
Assets 3

@franky47 franky47 released this Jun 11, 2014


  • Fix bug when receiving large SysEx messages - Issue #22
  • Fix Thru bug - Issue #13
  • Removed preprocessor-based settings, replaced by an overridable template-based struct. This allows to change settings without editing the library code.



The default MIDI object has been removed, so you will need to create it using one of the following macros:

For straightforward compatibility with sketches written with v4.1 and older:


To specify which serial port to use:

MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, MIDI);

To override settings - see

struct MySettings : public midi::DefaultSettings
   static const bool UseRunningStatus = false; // Messes with my old equipment!

MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial, MIDI, MySettings);

SysEx Callback

The SysEx callback has a new signature:

void handleSysEx(byte* data, unsigned size);

This fixes a bug when receiving SysEx messages larger than 255 bytes.

Assets 3

@franky47 franky47 released this Apr 16, 2014

This release fixes a bug that occurred with 2 byte messages (ProgramChange, Aftertouch Channel) when using Running Status, where some messages were dropped.

Documentation is left unchanged from version 4.0.

You can also find a little python project in the res/validator directory to test the library (building the examples using Arduino CLI for several boards, installing the library).
Please note that this piece of code is at a very early stage of development, and should be used with this in mind (at your own risks, etc.. you know the drill).
So far it's been tested on Mac OS X only. If you want to experiment with it, you'll need the latest Arduino IDE (with CLI support), and python-rtmidi installed.

Assets 3

@franky47 franky47 released this Feb 13, 2014


Version 4.0 brings the following changes:

  • Multiple instances: create multiple MIDI ports for merger/splitter applications
  • Support for SoftwareSerial
  • Bug fixes


When upgrading from v3.2, you might need to add the midi namespace to message types (like NoteOn, ControlChange etc..)

Eg: the following code:

if (MIDI.getType() == NoteOn)

will become:

if (MIDI.getType() == midi::NoteOn)
Assets 3
Sep 6, 2012
May 22, 2012