This code shows how you can send USB MIDI messages using the Macropad.
Save the following to your CIRCUITPY drive as code.py.
Click the Download Project Bundle button below to download the necessary libraries and the code.py file in a zip file. Extract the contents of the zip file, find your CircuitPython version, and copy the matching entire lib folder and code.py file to your CIRCUITPY drive.
# SPDX-FileCopyrightText: 2022 John Park for Adafruit Industries
# SPDX-License-Identifier: MIT
# Macropad MIDI Tester
# Play MIDI notes with keys
# Click encoder to switch modes
# Turn encoder to adjust CC, ProgramChange, or PitchBend
from adafruit_macropad import MacroPad
from rainbowio import colorwheel
CC_NUM = 74 # select your CC number
macropad = MacroPad(rotation=180) # create the macropad object, rotate orientation
macropad.display.auto_refresh = False # avoid lag
# --- Pixel setup --- #
key_color = colorwheel(120) # fill with cyan to start
macropad.pixels.brightness = 0.1
macropad.pixels.fill(key_color)
# --- MIDI variables ---
mode = 0
mode_text = ["Patch", ("CC #%s" % (CC_NUM)), "Pitch Bend"]
midi_values = [0, 16, 8] # bank, cc value, pitch
# Chromatic scale starting with C3 as bottom left keyswitch (or use any notes you like)
midi_notes = [
57, 58, 59,
54, 55, 56,
51, 52, 53,
48, 49, 50
]
# --- Display text setup ---
text_lines = macropad.display_text("Macropad MIDI Tester")
text_lines[0].text = "Mode: Patch {}".format(midi_values[0]+1) # Patch display offset by 1
text_lines[1].text = "Press knob for modes"
text_lines.show()
last_knob_pos = macropad.encoder # store knob position state
while True:
while macropad.keys.events: # check for key press or release
key_event = macropad.keys.events.get()
if key_event:
if key_event.pressed:
key = key_event.key_number
macropad.midi.send(macropad.NoteOn(midi_notes[key], 120)) # send midi noteon
macropad.pixels[key] = colorwheel(90) # light up green
text_lines[1].text = "NoteOn:{}".format(midi_notes[key])
if key_event.released:
key = key_event.key_number
macropad.midi.send(macropad.NoteOff(midi_notes[key], 0))
macropad.pixels[key] = key_color # return to color set by encoder bank value
text_lines[1].text = "NoteOff:{}".format(midi_notes[key])
macropad.encoder_switch_debounced.update() # check the knob switch for press or release
if macropad.encoder_switch_debounced.pressed:
mode = (mode+1) % 3
if mode == 0:
text_lines[0].text = ("Mode: %s %d" % (mode_text[mode], midi_values[mode]+1))
elif mode == 1:
text_lines[0].text = ("Mode: %s %d" % (mode_text[mode], int(midi_values[mode]*4.1)))
else:
text_lines[0].text = ("Mode: %s %d" % (mode_text[mode], midi_values[mode]-8))
macropad.red_led = macropad.encoder_switch
text_lines[1].text = " " # clear the note line
if macropad.encoder_switch_debounced.released:
macropad.red_led = macropad.encoder_switch
if last_knob_pos is not macropad.encoder: # knob has been turned
knob_pos = macropad.encoder # read encoder
knob_delta = knob_pos - last_knob_pos # compute knob_delta since last read
last_knob_pos = knob_pos # save new reading
if mode == 0: # ProgramChange
midi_values[mode] = min(max(midi_values[mode] + knob_delta, 0), 127) # delta + minmax
macropad.midi.send(macropad.ProgramChange(midi_values[mode])) # midi send ProgramChange
key_color = colorwheel(midi_values[mode]+120) # change key_color as patches change
macropad.pixels.fill(key_color)
text_lines[0].text = ("Mode: %s %d" % (mode_text[mode], midi_values[mode]+1))
if mode == 1: # CC
midi_values[mode] = min(max(midi_values[mode] + knob_delta, 0), 31) # scale the value
macropad.midi.send(macropad.ControlChange(CC_NUM, int(midi_values[mode]*4.1)))
text_lines[0].text = ("Mode: %s %d" % (mode_text[mode], int(midi_values[mode]*4.1)))
if mode == 2: # PitchBend
midi_values[mode] = min(max(midi_values[mode] + knob_delta, 0), 15) # smaller range
macropad.midi.send(macropad.PitchBend((midi_values[mode]*1024))) # range * mult = 16384
text_lines[0].text = ("Mode: %s %d" % (mode_text[mode], midi_values[mode]-8))
last_knob_pos = macropad.encoder
macropad.display.refresh()
To test it out, load up a software synthesizer on your computer or iOS/Android device, and press the Macropad keys to play notes. You can find a good list of software to try here, but this will work with any MIDI capable software synth.
Modes
Click the knob to cycle among three modes:
- Patch select mode
- CC mode
- Pitch bend mode
In Patch select mode you can turn the knob to switch synth patch presets, and test out different sounds built into your synth.
In CC mode the knob sends ControlChange messages from 0-127 on CC #74 by default. This is often used to change filter frequency, but you can customize this in your software.
In Pitch Bend mode, turn the knob left and right to bend the pitch!
If you'd like to learn more about how it works, you can watch an in-depth look at things here:
Page last edited January 22, 2025
Text editor powered by tinymce.