MIDI Control Surface Interface
Musical Instrument Digital Interface (MIDI) was originally developed to interconnect electronic musical instruments. This interface is flexible and has uses in applications far beyond musical instruments. Its simple unidirectional messaging protocol supports many different kinds of messaging. One kind of MIDI message is the Control Change message, which is used to communicate changes in controls, such as knobs, sliders, and buttons.
MIDI Control Surfaces
A MIDI control surface is a device with controls that sends MIDI Control Change messages when you turn a knob, move a slider, or push a button on its surface. Each Control Change message indicates which control changed and what its new position is.
Because the MIDI messaging protocol is unidirectional, determining a particular controller position requires that the receiver listen for Control Change messages that the controller sends. The protocol does not support querying the MIDI controller for its position.
The simplest MIDI control surfaces are unidirectional: They send MIDI Control Change messages but do not receive them. More sophisticated control surfaces are bidirectional: They can both send and receive Control Change messages. These control surfaces have knobs or sliders that can operate automatically. For example, a control surface can have motorized sliders or knobs. When it receives a Control Change message, the appropriate control moves to the position in the message.
Use MIDI Control Surfaces with MATLAB and Simulink
Audio Toolbox™ enables you to use MIDI control surfaces to control MATLAB® programs and Simulink® models by providing the capability to listen to Control Change messages. The toolbox also provides a limited capability to send Control Change messages to support synchronizing MIDI controls. This tutorial covers general MIDI functions. For functions specific to audio plugins in MATLAB, see MIDI Control for Audio Plugins. The Audio Toolbox general interface to MIDI control surfaces includes five functions and one block:
midiid–– Interactively identify MIDI control.
midicontrols–– Open group of MIDI controls for reading.
midiread–– Return most recent value of MIDI controls.
midisync–– Send values to MIDI controls for synchronization.
midicallback–– Call function handle when MIDI controls change value.
MIDI Controls (block) –– Output values from controls on MIDI control surface. The MIDI Controls block combines functionality of the general MIDI functions into one block for the Simulink environment.
This diagram shows a typical workflow involving general MIDI functions in MATLAB. For the Simulink environment, follow steps 1 and 2, and then use the MIDI Controls block for a user-interface guided workflow.
1. Connect MIDI Device and Then Start MATLAB
Before starting MATLAB, connect your MIDI control surface to your computer and turn it on. For connection instructions, see the instructions for your MIDI device. If you start MATLAB before connecting your device, MATLAB might not recognize your device when you connect it. To correct the problem, restart MATLAB with the device already connected.
2. Determine Device Name and Control Numbers
midiid function to determine the device name and
control numbers of your MIDI control surface. After you call
midiid, it continues to listen until it receives a
Control Change message. When it receives a Control Change message, it returns
the control number associated with the MIDI controller number that you
manipulated, and optionally returns the device name of your MIDI control
surface. The manufacturer and host operating system determine the device name.
See Control Numbers for an explanation of how MATLAB calculates the control number.
To set a default device name, see Set Default MIDI Device.
3. Create Listener for Control Change Messages
midicontrols function to create an object that
listens for Control Change messages and caches the most recent values
corresponding to specified controllers. When you create a
midicontrols object, you specify a MIDI control surface
by its device name and specific controllers on the surface by their associated
control numbers. Because the
midicontrols object cannot
query the MIDI control surface for initial values, consider setting initial
values when creating the object.
4. Get Current Control Values
midiread function to query your
midicontrols object for current control values.
midiread returns a matrix with values corresponding to
all controllers the
midicontrols object is listening to.
Generally, you want to place
midiread in an audio stream
loop for continuous updating.
5. Synchronize Bidirectional MIDI Control Surfaces
You can use
midisync to send Control Change messages to
your MIDI control surface. If the MIDI control surface is bidirectional, it
adjusts the specified controllers. One important use of
midisync is to set the controller positions on your
MIDI control surface to initial values.
Another important use of
midisync is to update your MIDI
control surface if control values are adjusted in an audio stream loop. In this
case, you call
midisync with both your
midicontrols object and the updated control
midisync is also a powerful tool in systems that also
involve user interfaces (UIs), so that when one control is changed, the other
control tracks it. Typically, you implement such tracking by setting callback
functions on both the
midicontrols object (using
midicallback) and the UI control. The callback for the
midicontrols object sends new values to the UI control.
The UI uses
midisync to send new values to the
midicontrols object and MIDI control surface. See
midisync for examples.
Alternative to Stream Processing
You can use
midicallback as an alternative to placing
midiread in an audio stream loop. If a
midicontrols object receives a Control Change message,
midicallback automatically calls a specified function
handle. The callback function typically calls
determine the new value of the MIDI controls. You can use this callback when you
want a MIDI controller to trigger an action, such as updating a UI. Using this
approach prevents having a MATLAB program continuously running in the command window.
Set Default MIDI Device
You can set the default MIDI device in the MATLAB environment by using the
setpref function. Use
midiid to determine the name of the device, and then
setpref to set the
[~,deviceName] = midiid
Move the control you wish to identify; type ^C to abort. Waiting for control message... done deviceName = BCF2000
If you do not set this preference, MATLAB and the host operating system choose a device for you. However, such autoselection can cause unpredictable results because many computers have "virtual" (software) MIDI devices installed that you might not be aware of. For predictable behavior, set the preference.
MATLAB defines control numbers as (MIDI channel number) × 1000 + (MIDI controller number).
MIDI channel number is the transmission channel that your device uses to send messages. This value is in the range 1–16.
MIDI controller number is a number assigned to an individual control on your MIDI device. This value is in the range 1–127.
Your MIDI device determines the values of MIDI channel number and MIDI controller number.
- What Are DAWs, Audio Plugins, and MIDI Controllers?
- Real-Time Audio in MATLAB
- MIDI Device Interface
- MIDI Control for Audio Plugins