a god damn doozy
This commit is contained in:
parent
a8d3b6177f
commit
3927d073e9
|
|
@ -26,6 +26,32 @@ int main() {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
cs-midi is a static library meant to be included in a pico-sdk project:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
add_subdirectory(lib/cs-midi)
|
||||||
|
target_link_libraries(your_target cs_midi)
|
||||||
|
```
|
||||||
|
|
||||||
|
CMake options (set before `add_subdirectory()`):
|
||||||
|
|
||||||
|
| Option | Default | Description |
|
||||||
|
|--------|---------|-------------|
|
||||||
|
| `CS_MIDI_BLE` | ON | BLE MIDI via BTstack |
|
||||||
|
| `CS_MIDI_USB` | OFF | USB MIDI via TinyUSB |
|
||||||
|
| `CS_MIDI_SERIAL` | OFF | Serial MIDI over UART |
|
||||||
|
| `CS_MIDI_APPLEMIDI` | OFF | AppleMIDI (RTP-MIDI over WiFi) |
|
||||||
|
|
||||||
|
USB MIDI requires `tusb_config.h` and `usb_descriptors.c` in your project — see `templates/` for reference files.
|
||||||
|
|
||||||
|
To compile-verify all examples standalone:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd lib/cs-midi && make tests
|
||||||
|
```
|
||||||
|
|
||||||
## Differences from Control Surface
|
## Differences from Control Surface
|
||||||
|
|
||||||
- `#include <cs_midi.h>` replaces `#include <Control_Surface.h>`
|
- `#include <cs_midi.h>` replaces `#include <Control_Surface.h>`
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,10 @@ These classes are available in cs-midi and work identically to their Control Sur
|
||||||
|
|
||||||
| Class | Template | Description |
|
| Class | Template | Description |
|
||||||
|-------|----------|-------------|
|
|-------|----------|-------------|
|
||||||
| `BluetoothMIDI_Interface` | | BLE MIDI interface |
|
| `BluetoothMIDI_Interface` | | BLE MIDI via BTstack |
|
||||||
|
| `USBMIDI_Interface` | | USB MIDI device via TinyUSB |
|
||||||
|
| `HardwareSerialMIDI_Interface` | | 5-pin DIN MIDI over UART |
|
||||||
|
| `AppleMIDI_Interface` | | RTP-MIDI over WiFi (AppleMIDI/Bonjour) |
|
||||||
|
|
||||||
### MIDI Routing
|
### MIDI Routing
|
||||||
|
|
||||||
|
|
@ -201,7 +204,6 @@ Full Mackie Control protocol support — VU meters, V-Pots, LCD, time display, e
|
||||||
|
|
||||||
| Class | Description |
|
| Class | Description |
|
||||||
|-------|-------------|
|
|-------|-------------|
|
||||||
| `USBMIDI_Interface` | USB MIDI device interface |
|
|
||||||
| `USBHostMIDI_Interface` | USB Host MIDI interface |
|
| `USBHostMIDI_Interface` | USB Host MIDI interface |
|
||||||
| `GenericUSBMIDI_Interface` | Configurable USB MIDI backend |
|
| `GenericUSBMIDI_Interface` | Configurable USB MIDI backend |
|
||||||
| `USBDebugMIDI_Interface` | Serial monitor debug output |
|
| `USBDebugMIDI_Interface` | Serial monitor debug output |
|
||||||
|
|
@ -210,7 +212,6 @@ Full Mackie Control protocol support — VU meters, V-Pots, LCD, time display, e
|
||||||
|
|
||||||
| Class | Description |
|
| Class | Description |
|
||||||
|-------|-------------|
|
|-------|-------------|
|
||||||
| `HardwareSerialMIDI_Interface` | 5-pin DIN MIDI over UART |
|
|
||||||
| `SoftwareSerialMIDI_Interface` | Software serial MIDI |
|
| `SoftwareSerialMIDI_Interface` | Software serial MIDI |
|
||||||
| `HairlessMIDI_Interface` | Hairless MIDI serial bridge |
|
| `HairlessMIDI_Interface` | Hairless MIDI serial bridge |
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
# USB MIDI
|
||||||
|
|
||||||
|
USB MIDI device interface via TinyUSB.
|
||||||
|
|
||||||
|
Requires `tusb_config.h` and `usb_descriptors.c` in the project — see `lib/cs-midi/templates/` for reference files. Link `tinyusb_device` and `tinyusb_board` in CMake.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include "pico/stdlib.h"
|
||||||
|
#include "tusb.h"
|
||||||
|
#include <cs_midi.h>
|
||||||
|
|
||||||
|
using namespace cs;
|
||||||
|
|
||||||
|
USBMIDI_Interface midi;
|
||||||
|
|
||||||
|
NoteButton button {5, {MIDI_Notes::C[4], Channel_1}};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
stdio_init_all();
|
||||||
|
tusb_init();
|
||||||
|
Control_Surface.begin();
|
||||||
|
while (true) {
|
||||||
|
Control_Surface.loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
# Serial MIDI
|
||||||
|
|
||||||
|
Classic 5-pin DIN MIDI over hardware UART at 31250 baud.
|
||||||
|
|
||||||
|
Constructor: `HardwareSerialMIDI_Interface(uart_inst_t *uart, uint tx_pin, uint rx_pin)`
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include "pico/stdlib.h"
|
||||||
|
#include <cs_midi.h>
|
||||||
|
|
||||||
|
using namespace cs;
|
||||||
|
|
||||||
|
HardwareSerialMIDI_Interface midi {uart0, 12, 13};
|
||||||
|
|
||||||
|
CCRotaryEncoder enc {{0, 2}, {16, Channel_1}, 1, 4};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
stdio_init_all();
|
||||||
|
Control_Surface.begin();
|
||||||
|
while (true) {
|
||||||
|
Control_Surface.loop();
|
||||||
|
sleep_ms(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
# Dual MIDI (BLE + USB)
|
||||||
|
|
||||||
|
Multiple MIDI interfaces with pipe routing. Elements send to both transports simultaneously.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include "pico/stdlib.h"
|
||||||
|
#include "pico/cyw43_arch.h"
|
||||||
|
#include "tusb.h"
|
||||||
|
#include <cs_midi.h>
|
||||||
|
|
||||||
|
using namespace cs;
|
||||||
|
|
||||||
|
BluetoothMIDI_Interface ble;
|
||||||
|
USBMIDI_Interface usb;
|
||||||
|
|
||||||
|
MIDI_PipeFactory<2> pipes;
|
||||||
|
|
||||||
|
NoteButton button {5, {MIDI_Notes::C[4], Channel_1}};
|
||||||
|
CCRotaryEncoder enc {{0, 2}, {16, Channel_1}, 1, 4};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
stdio_init_all();
|
||||||
|
if (cyw43_arch_init()) return 1;
|
||||||
|
tusb_init();
|
||||||
|
|
||||||
|
Control_Surface >> pipes >> ble;
|
||||||
|
Control_Surface >> pipes >> usb;
|
||||||
|
|
||||||
|
Control_Surface.begin();
|
||||||
|
while (true) {
|
||||||
|
Control_Surface.loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
# AppleMIDI (RTP-MIDI over WiFi)
|
||||||
|
|
||||||
|
RTP-MIDI over WiFi — appears as a Bonjour MIDI device in macOS Audio MIDI Setup,
|
||||||
|
Windows rtpMIDI, and iOS. Requires WiFi connection before `Control_Surface.begin()`.
|
||||||
|
|
||||||
|
Build with `CS_MIDI_APPLEMIDI=ON`.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include "pico/stdlib.h"
|
||||||
|
#include "pico/cyw43_arch.h"
|
||||||
|
#include <cs_midi.h>
|
||||||
|
|
||||||
|
using namespace cs;
|
||||||
|
|
||||||
|
AppleMIDI_Interface midi {"PicoW-MIDI", 5004};
|
||||||
|
|
||||||
|
NoteButton button {5, {MIDI_Notes::C[4], Channel_1}};
|
||||||
|
CCRotaryEncoder enc {{0, 2}, {16, Channel_1}, 1, 4};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
stdio_init_all();
|
||||||
|
if (cyw43_arch_init()) return 1;
|
||||||
|
|
||||||
|
cyw43_arch_enable_sta_mode();
|
||||||
|
cyw43_arch_wifi_connect_blocking("SSID", "PASS", CYW43_AUTH_WPA2_AES_PSK);
|
||||||
|
|
||||||
|
Control_Surface.begin();
|
||||||
|
while (true) {
|
||||||
|
Control_Surface.loop();
|
||||||
|
sleep_ms(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
# Dual Transport (BLE + AppleMIDI)
|
||||||
|
|
||||||
|
BLE for direct iOS/macOS connection, AppleMIDI for DAW integration over WiFi.
|
||||||
|
Elements send to both transports simultaneously via pipe routing.
|
||||||
|
|
||||||
|
Build with `CS_MIDI_BLE=ON CS_MIDI_APPLEMIDI=ON`.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include "pico/stdlib.h"
|
||||||
|
#include "pico/cyw43_arch.h"
|
||||||
|
#include <cs_midi.h>
|
||||||
|
|
||||||
|
using namespace cs;
|
||||||
|
|
||||||
|
BluetoothMIDI_Interface ble;
|
||||||
|
AppleMIDI_Interface applemidi {"PicoW-MIDI", 5004};
|
||||||
|
|
||||||
|
MIDI_PipeFactory<2> pipes;
|
||||||
|
|
||||||
|
NoteButton button {5, {MIDI_Notes::C[4], Channel_1}};
|
||||||
|
CCRotaryEncoder enc {{0, 2}, {16, Channel_1}, 1, 4};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
stdio_init_all();
|
||||||
|
if (cyw43_arch_init()) return 1;
|
||||||
|
|
||||||
|
cyw43_arch_enable_sta_mode();
|
||||||
|
cyw43_arch_wifi_connect_blocking("SSID", "PASS", CYW43_AUTH_WPA2_AES_PSK);
|
||||||
|
|
||||||
|
Control_Surface >> pipes >> ble;
|
||||||
|
Control_Surface >> pipes >> applemidi;
|
||||||
|
|
||||||
|
Control_Surface.begin();
|
||||||
|
while (true) {
|
||||||
|
Control_Surface.loop();
|
||||||
|
sleep_ms(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
@ -44,6 +44,9 @@ Extraction status of [tttapa/Control-Surface](https://github.com/tttapa/Control-
|
||||||
|
|
||||||
### MIDI Interfaces
|
### MIDI Interfaces
|
||||||
- [x] `BluetoothMIDI_Interface` — BLE MIDI via BTstack (pico-native)
|
- [x] `BluetoothMIDI_Interface` — BLE MIDI via BTstack (pico-native)
|
||||||
|
- [x] `USBMIDI_Interface` — USB MIDI device via TinyUSB
|
||||||
|
- [x] `HardwareSerialMIDI_Interface` — 5-pin DIN MIDI over UART (31250 baud)
|
||||||
|
- [x] `AppleMIDI_Interface` — RTP-MIDI over WiFi with mDNS/Bonjour discovery
|
||||||
- [x] `MIDI_Pipe` / `MIDI_PipeFactory<N>` / `BidirectionalMIDI_PipeFactory<N>`
|
- [x] `MIDI_Pipe` / `MIDI_PipeFactory<N>` / `BidirectionalMIDI_PipeFactory<N>`
|
||||||
- [x] `Control_Surface` singleton — declarative begin/loop lifecycle
|
- [x] `Control_Surface` singleton — declarative begin/loop lifecycle
|
||||||
|
|
||||||
|
|
@ -66,8 +69,6 @@ Extraction status of [tttapa/Control-Surface](https://github.com/tttapa/Control-
|
||||||
output-side examples.*
|
output-side examples.*
|
||||||
|
|
||||||
### Additional MIDI Interfaces
|
### Additional MIDI Interfaces
|
||||||
- [ ] USB MIDI Interface (TinyUSB)
|
|
||||||
- [ ] Serial/Hardware MIDI Interface
|
|
||||||
- [ ] Debug MIDI Interface (serial monitor output)
|
- [ ] Debug MIDI Interface (serial monitor output)
|
||||||
|
|
||||||
### Display Elements
|
### Display Elements
|
||||||
|
|
@ -84,4 +85,4 @@ output-side examples.*
|
||||||
### Advanced Features
|
### Advanced Features
|
||||||
- [ ] MIDI input fine-grained callbacks (per-message-type)
|
- [ ] MIDI input fine-grained callbacks (per-message-type)
|
||||||
- [ ] SysEx send/receive helpers
|
- [ ] SysEx send/receive helpers
|
||||||
- [ ] AppleMIDI (RTP-MIDI over WiFi)
|
- [x] AppleMIDI (RTP-MIDI over WiFi)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue