Pular para conteúdo

🔗 Ethernet MIDI

O exemplo Ethernet-MIDI implementa um hub MIDI sobre Ethernet cabeada (W5500 SPI), usando o protocolo AppleMIDI (RTP-MIDI). Ideal para racks de estúdio e instalações com rede gerenciada.


Hardware Necessário

Componente Detalhe
ESP32 (qualquer) ESP32, S3, S2, P4...
Módulo W5500 SPI Ethernet (ex: W5500 Mini)
Cabo RJ-45 Ethernet para switch/router

Conexão W5500 ↔ ESP32

W5500 ESP32 GPIO Notas
MOSI 23 SPI MOSI
MISO 19 SPI MISO
SCK 18 SPI Clock
CS (SCS) 5 Chip Select
RST 4 Reset (opcional)
VCC 3.3V Alimentação
GND GND Terra

W5500 com ESP32-S3

Para ESP32-S3, use os pinos SPI2: MOSI=11, MISO=13, SCK=12, CS=10.


Pré-requisito

Manage Libraries →
  "AppleMIDI" → Arduino-AppleMIDI-Library by lathoub (v3.x)
  "Ethernet" → Ethernet by Arduino (ou compatível com W5500)

Código

#include <SPI.h>
#include <ESP32_Host_MIDI.h>
#include "src/EthernetMIDIConnection.h"

// MAC único para o dispositivo (escolha qualquer valor único na rede)
static const uint8_t MAC[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// Pinos SPI para W5500
#define ETH_CS_PIN 5

EthernetMIDIConnection ethMIDI;

void setup() {
    Serial.begin(115200);

    Serial.println("Iniciando Ethernet MIDI...");

    // Registrar ANTES de begin()
    midiHandler.addTransport(&ethMIDI);

    // DHCP automático
    ethMIDI.begin(MAC);

    // Ou IP estático:
    // ethMIDI.begin(MAC, IPAddress(192, 168, 1, 100));

    midiHandler.begin();

    Serial.printf("Ethernet IP: %s\n",
        Ethernet.localIP().toString().c_str());
    Serial.println("Configure Audio MIDI Setup no macOS:");
    Serial.printf("  Host: %s  Porta: 5004\n",
        Ethernet.localIP().toString().c_str());
}

void loop() {
    midiHandler.task();

    for (const auto& ev : midiHandler.getQueue()) {
        Serial.printf("[ETH-MIDI] %s %s ch=%d vel=%d\n",
            ev.status.c_str(),
            ev.noteOctave.c_str(),
            ev.channel,
            ev.velocity);
    }
}

Configurar no macOS

Como o W5500 não suporta mDNS, configure o IP manualmente:

  1. Audio MIDI SetupWindow → Show MIDI Studio
  2. Clique em Network
  3. Em "My Sessions" → + → criar nova sessão
  4. Em "Directory" → +Host: [IP do ESP32] | Port: 5004
  5. Selecione a sessão → Connect

Bridge UART + Ethernet (Rack de Estúdio)

Conecte um sintetizador vintage via DIN-5 ao ESP32, que o publica na rede Ethernet para o DAW:

#include <SPI.h>
#include <ESP32_Host_MIDI.h>
#include "src/UARTConnection.h"
#include "src/EthernetMIDIConnection.h"

UARTConnection uartMIDI;
EthernetMIDIConnection ethMIDI;
const uint8_t MAC[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

void setup() {
    uartMIDI.begin(Serial1, 16, 17);     // DIN-5
    ethMIDI.begin(MAC, IPAddress(192, 168, 1, 50));

    midiHandler.addTransport(&uartMIDI);
    midiHandler.addTransport(&ethMIDI);
    midiHandler.begin();

    // Bridge automático! Qualquer MIDI do DIN-5 vai para Ethernet e vice-versa.
}

void loop() { midiHandler.task(); }

Latência Típica

Ambiente Latência Jitter
WiFi doméstico 8–25 ms ±5 ms
Ethernet cabeada 2–8 ms < 1 ms
Ethernet gerenciada (QoS) 1–3 ms < 0.5 ms

A Ethernet é mais previsível e consistente — fundamental para timing musical preciso em estúdio.


Próximos Passos