Control Surface  1.2.0
MIDI Control Surface library for Arduino
Custom-MIDI-Sender.ino

Custom-MIDI-Sender

This is an example that demonstrates how to extend the library using your own MIDI Senders. It implements functionality similar to the built-in DigitalNoteSender class, but with support for different on and off velocities.

See also
MIDI Senders for different kinds of MIDI senders to start from.
Boards:
AVR, AVR USB, Due, Nano 33, Teensy 3.x, ESP32

Connections

The internal pull-up resistor for the button will be enabled automatically.

Behavior

Mapping

Select the Arduino as a custom MIDI controller in your DAW, and use the MIDI learn option to assign the button to a function.

Written by PieterP, 2020-04-18
https://github.com/tttapa/Control-Surface

// A custom sender to use later. It has to declare two methods:
// - sendOn(MIDIAddress): will be called when the button is pressed
// - sendOff(MIDIAddress): will be called when the button is released
// Other types of senders need to implement different methods.
// For example, a continuous CC sender just has a send(value, address)
// method.
class CustomNoteSender {
public:
CustomNoteSender(uint8_t onVelocity, uint8_t offVelocity)
: onVelocity(onVelocity), offVelocity(offVelocity) {}
void sendOn(MIDIAddress address) {
Control_Surface.sendNoteOn(address, onVelocity);
}
void sendOff(MIDIAddress address) {
Control_Surface.sendNoteOff(address, offVelocity);
}
private:
uint8_t onVelocity, offVelocity;
};
// Now tell the MIDIButton class template (included with the Control
// Surface library) that it has to use your custom sender class.
//
// We wrap it in another class so we can easily construct it later,
// without having to write `MIDIButton<CustomNoteSender>` all the time,
// and so we have more control over the constructor arguments.
// The colon (:) indicates inheritance.
struct CustomNoteButton : MIDIButton<CustomNoteSender> {
// Constructor
CustomNoteButton(pin_t pin, MIDIAddress address,
uint8_t onVelocity, uint8_t offVelocity)
: MIDIButton(pin, address, {onVelocity, offVelocity}) {}
// ^~~~~~~~~~ Initialization of the base class MIDIButton
};
using namespace MIDI_Notes;
// Now we can instantiate an object of our custom class.
// The four arguments match the ones of the CustomNoteButton
// constructor we wrote a couple of lines back.
CustomNoteButton button = {
5, // button pin
note(C, 4), // MIDI address
0x40, // on velocity
0x10, // off velocity
};
void setup() {
}
void loop() {
}
USBMIDI_Interface
A class for MIDI interfaces sending MIDI messages over a USB MIDI connection.
Definition: USBMIDI_Interface.hpp:41
MIDIAddress
A type-safe utility class for saving a MIDI address consisting of a 7-bit address,...
Definition: MIDIAddress.hpp:91
AH::pin_t
uint16_t pin_t
The type for Arduino pins (and ExtendedIOElement pins).
Definition: Hardware-Types.hpp:17
MIDI_Sender::sendNoteOn
void sendNoteOn(MIDIAddress address, uint8_t velocity)
Send a MIDI Note On event.
Definition: MIDI_Interface.ipp:49
Control_Surface.h
The main header file that includes all Control-Surface header files.
MIDIButton
An abstract class for momentary push buttons that send MIDI events.
Definition: Abstract/MIDIButton.hpp:17
Control_Surface_::loop
void loop()
Update all MIDI elements, send MIDI events and read MIDI input.
Definition: Control_Surface_Class.cpp:68
Control_Surface
Control_Surface_ & Control_Surface
A predefined instance of the Control Surface to use in the Arduino sketches.
Definition: Control_Surface_Class.cpp:203
MIDI_Notes::note
constexpr int8_t note(int8_t note, int8_t numOctave)
Get the MIDI note in the given octave.
Definition: Notes.hpp:35
MIDI_Sender::sendNoteOff
void sendNoteOff(MIDIAddress address, uint8_t velocity)
Send a MIDI Note Off event.
Definition: MIDI_Interface.ipp:55
MIDI_Notes
MIDI note names.
Definition: Notes.hpp:16
MIDI_Notes::C
constexpr int8_t C
Definition: Notes.hpp:18
Control_Surface_::begin
void begin()
Initialize the Control_Surface.
Definition: Control_Surface_Class.cpp:25