Project developed for the Arduino IDE.
This project provides a complete solution for receiving, interpreting, and displaying MIDI messages via USB and BLE on the ESP32 (especially ESP32-S3) using the T‑Display S3. The library is modular and can be easily adapted to other hardware by modifying the configuration file(s).
The ESP32_Host_MIDI library allows the ESP32 to:
- Act as a USB host for MIDI devices (via the USB_Conexion module),
- Function as a BLE MIDI server (via the BLE_Conexion module),
- Process and interpret MIDI messages (using the MIDI_Handler module), and
- Display formatted MIDI data on a display (via the ST7789_Handler module).
The core header ESP32_Host_MIDI.h integrates the pin configuration, USB/BLE connectivity, and MIDI handling functionalities.
-
ESP32_Pin_Config.h
Defines the pin configuration for USB communication, display control, and audio output.- Examples:
USB_DP_PIN,USB_DN_PIN,TFT_CS_PIN,TFT_DC_PIN,TFT_RST_PIN,TFT_BL_PIN.
- Examples:
-
USB_Conexion.h / USB_Conexion.cpp
Implements the USB host functionality to receive MIDI data from connected MIDI devices.- Key Functions:
begin(): Initializes the USB host and registers the client.task(): Handles USB events and processes incoming data.onMidiDataReceived(): Virtual function (to be overridden) for processing received MIDI messages (first 4 bytes).
- Key Functions:
-
BLE_Conexion.h / BLE_Conexion.cpp
Implements the BLE MIDI server, enabling the ESP32 to receive MIDI messages via Bluetooth Low Energy.- Key Functions:
begin(): Initializes the BLE server and starts advertising the MIDI service.task(): Processes BLE events (if needed).setMidiMessageCallback(): Registers a callback to handle incoming BLE MIDI messages.onMidiDataReceived(): Virtual function (to be overridden) for processing BLE MIDI messages.
- Key Functions:
-
MIDI_Handler.h / MIDI_Handler.cpp
Processes and interprets raw MIDI data (removing USB headers when necessary) and manages MIDI events:- Features:
- Handles MIDI events (NoteOn and NoteOff).
- Converts MIDI note numbers into musical notes (e.g., "C4").
- Maintains the state of active notes and an optional history buffer (using PSRAM).
- Provides utility functions to retrieve formatted MIDI event data.
- Key Functions:
begin(): Initializes the MIDI handler and associated USB/BLE connections.task(): Processes incoming USB and BLE MIDI events.handleMidiMessage(const uint8_t* data, size_t length): Interprets MIDI messages and categorizes them into NoteOn, NoteOff, etc.addEvent(const MIDIEventData& event): Stores MIDI events in an event queue.processQueue(): Manages the event queue, ensuring it stays within the configured limits.enableHistory(int capacity): Enables a history buffer in PSRAM for MIDI event storage.setQueueLimit(int maxEvents): Defines the maximum number of events stored in the queue.getActiveNotesString(): Returns a formatted string listing active MIDI notes.getBlock(int block, const std::deque<MIDIEventData>& queue, const std::vector<std::string>& fields): Retrieves specific blocks of MIDI events.flushActiveNotes(unsigned long currentTime): Clears active notes when necessary.clearActiveNotesNow(): Immediately clears active notes.getAnswer(const std::vector<std::string>& fields, bool includeLabels): Returns MIDI event details based on requested fields.
- Features:
-
ST7789_Handler.h / ST7789_Handler.cpp
Manages the ST7789 display on the T‑Display S3 using the LovyanGFX library:- Key Functions:
init(): Initializes the display (rotation, font, colors, etc.).print()/println(): Displays text on the screen while minimizing flickering.clear(): Clears the display.
- Key Functions:
-
ESP32_Host_MIDI.h
The core header that includes the pin configuration, USB/BLE connectivity, and MIDI handling modules.
- Contains a sketch demonstrating:
- USB and BLE MIDI reception,
- Processing of MIDI messages using MIDI_Handler, and
- Display of formatted MIDI data on the T‑Display S3 using ST7789_Handler.
- The
examples/T-Display-S3/images/folder includes images showing the project in action.
-
MIDI USB-OTG Reception:
When a MIDI device is connected via USB, the USB_Conexion module captures the MIDI data and passes it to MIDI_Handler for processing. -
MIDI BLE Reception:
The BLE_Conexion module enables the ESP32 to operate as a BLE MIDI server, receiving MIDI messages from paired Bluetooth devices. -
MIDI Message Processing:
MIDI_Handler interprets incoming MIDI messages (handling NoteOn and NoteOff events), converts MIDI note numbers into musical notes, and optionally stores events in a history buffer. -
Display Output:
The ST7789_Handler module handles the display of formatted MIDI information on the T‑Display S3, ensuring smooth text rendering without flickering.
The library is designed to be modular:
- You can modify ESP32_Pin_Config.h to change the pin assignments according to your hardware.
- The modules USB_Conexion, BLE_Conexion, MIDI_Handler, and ST7789_Handler can be extended or replaced to suit specific application requirements.
-
Install Dependencies:
- Arduino IDE.
- LovyanGFX library for display management.
- Required BLE libraries (included in the ESP32 core).
-
Load the Example:
Open the example sketch fromexamples/T-Display-S3/in the Arduino IDE, adjust the pin configuration if necessary, and upload it to your ESP32-S3 board. -
Connect a MIDI Device:
Use a USB MIDI device or pair a BLE MIDI device to test MIDI message reception and display.
Contributions, bug reports, and suggestions are welcome!
Feel free to open an issue or submit a pull request on GitHub.
This project is released under the MIT License. See the LICENSE file for details.
