Files
Shadowtrance dbf850c434 Fixes and new apps (#30)
- M5 Unit Modules library + M5 Unit Test app
- Minor fixes for TodoList, TwoEleven, Snake, Brainfuck and Breakout
- Fixed SerialConsole to use the uart controller as it was broken in one of the many updates
- Fixed keyboard input in TwoEleven, Breakout, Magic8Ball and Snake
- Bluetooth Media Keys app, supports pressing physical keys to trigger the corresponding buttonmatrix button
- Epub Reader app
2026-06-07 15:56:32 +02:00

61 lines
2.0 KiB
C++

/*
* UnitMidi.h - M5Stack MIDI Unit / Synth Unit (SAM2695, UART 31250 bps)
*
* Both the MIDI Unit and the Synth Unit use the SAM2695 audio synthesizer IC
* connected via a standard MIDI UART link. This driver covers both.
*
* SAM2695 specs:
* - 64-voice polyphony (38 with effects)
* - 16 MIDI channels
* - MIDI 1.0 protocol, 31250 bps, 8N1
*
* Usage:
* Device* uart = device_find_by_name("uart1");
* UnitMidi midi;
* if (midi.begin(uart)) {
* midi.programChange(0, 0); // channel 0, Grand Piano
* midi.noteOn(0, 60, 100); // middle C, velocity 100
* vTaskDelay(pdMS_TO_TICKS(500));
* midi.noteOff(0, 60);
* }
*/
#pragma once
#include <tactility/device.h>
#include <cstddef>
#include <cstdint>
class UnitMidi {
public:
UnitMidi() = default;
~UnitMidi() { end(); }
UnitMidi(const UnitMidi&) = delete;
UnitMidi& operator=(const UnitMidi&) = delete;
UnitMidi(UnitMidi&&) = delete;
UnitMidi& operator=(UnitMidi&&) = delete;
// Pass a UART controller device
// begin() opens the controller, sets baud rate to 31250, and issues a system reset.
[[nodiscard]] bool begin(Device* dev);
void end();
bool isPresent() const { return ready_; }
// Send raw MIDI bytes.
void send(const uint8_t* data, size_t len);
// MIDI 1.0 message helpers
void reset(); // 0xFF - system reset
void noteOn(uint8_t channel, uint8_t note, uint8_t velocity); // 0x90|ch, note, vel
void noteOff(uint8_t channel, uint8_t note); // 0x80|ch, note, 0
void programChange(uint8_t channel, uint8_t program); // 0xC0|ch, program
void controlChange(uint8_t channel, uint8_t controller, uint8_t value); // 0xB0|ch, ctrl, val
void pitchBend(uint8_t channel, int16_t value); // 0xE0|ch, LSB, MSB (-8192..+8191)
void allNotesOff(uint8_t channel); // CC 123 = 0
private:
Device* dev_ = nullptr;
bool ready_ = false;
};