ESP32-S3 Midi over usb not working

Hello All!

I got an esp32-s3, to make an MIDI controller (i’m mostly interested in USB), but it only shows up as an USB JTAG/Serial unit or ESP32-S3 (even if it goes into the otg mode, it doesn’t initialise as an midi class device).
I had tried custom board.json, MANY build flags, additional .py scripts, and it just doesnt work. If this wasn’t frustraiting enough, it works perfectly when flashed from ArduinoIDE, or when i run the MIDI example from ESP-IDF (I don’t want to use either tool, becouse one doesnt have proper IDE funcionality, and other having unnatural sytax).
I tried using platformIO.ini from this thread, but it doesn’t work too.
This is my code:

#include <Arduino.h>
#include <Control_Surface.h>

USBMIDI_Interface midi;
CCPotentiometer pot {1, MIDI_CC::General_Purpose_Controller_1};

void setup() {
delay(100);
Control_Surface.begin();
}

void loop() {
Control_Surface.loop();
}

My Platformio.ini
v1

[env:esp32s3]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
lib_deps =
    tttapa/Control Surface@^2.1.0
build_flags =
  -D ARDUINO_USB_MODE=0
  -D ARDUINO_USB_CDC_ON_BOOT=0

v2

[env:esp32-s3-devkitc-1-midi]
platform = espressif32
board = esp32s3_midi
framework = arduino
lib_deps =
    tttapa/Control Surface@^2.1.0
upload_protocol = esptool
build_flags =
  -D USB_PRODUCT="S3_MIDI_Mixer"

v3

[env:esp32-midi]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
build_flags = -DARDUINO_USB_CDC_ON_BOOT=1
lib_deps =
  tttapa/Control Surface@^2.1.0

Custom esp32s3_midi.json

{
{
  "build": {
    "arduino": {
      "ldscript": "esp32s3_out.ld",
      "partitions": "default_8MB.csv"
    },
    "core": "esp32",
    "extra_flags": [
      "-DARDUINO_ESP32S3_DEV",
      "-DARDUINO_USB_MODE=0",
      "-DARDUINO_USB_CDC_ON_BOOT=0",
      "-DARDUINO_USB_DFU_ON_BOOT=0",
      "-DARDUINO_USB_MSC_ON_BOOT=0",
      "-DARDUINO_RUNNING_CORE=1",
      "-DARDUINO_EVENT_RUNNING_CORE=1"
    ],
    "f_cpu": "240000000L",
    "f_flash": "80000000L",
    "flash_mode": "qio",
    "hwids": [
      "0x303A",
      "0x1001"
    ],
    "mcu": "esp32s3",
    "variant": "esp32s3"
  },
  "frameworks": [
    "arduino",
    "espidf"
  ],
  "name": "ESP32-S3 MIDI",
  "upload": {
    "flash_size": "4MB",
    "maximum_ram_size": 327680,
    "maximum_size": 4194304,
    "require_upload_port": true,
    "speed": 921600
  },
  "vendor": "Espressif",
  "url": "anton.com"
}

Arduino build flags

USB CDC On Boot: “Disabled”
CPU Frequency: “240MHz (WiFi)”
Core Debug Level: “None”
USB DFU On Boot: “Disabled”
Erase All Flash Before Sketch Upload: “Disabled”
Events Run On: “Core 1”
Flash Mode: “QIO 80MHz”
Flash Size: “4MB (32Mb)”
JTAG Adapter: “Disabled”
Arduino Runs On: “Core 1”
USB Firmware MSC On Boot: “Disabled”
Partition Scheme: “Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)”
PSRAM: “Disabled”
Upload Mode: "UARTO / Hardware CDC”
Upload Speed: “921600”
USB Mode: “USB-OTG (TinyUSB)”
Zigbee Mode: “Disabled”

Thanks in advance!

You can’t set USB Mode 0 if 1 is the the default in the board definition.

Unset it properly with

build_unflags = 
  -DARDUINO_USB_MODE=1

first.

unfortunetly, it doesnt work - it’s still seen as an USB JTAG/Serial debaug unit (Bus 001 Device 008: ID 303a:1001 Espressif USB JTAG/serial debug unit).
This is persistent, and i had never been working, either when builded and uploaded on windows or linux.

So i found it my self - the problem was orginal platform from espressif. As it was working from arduino ide, I located an PIO platform for esp32, which is more strictly following the arduino esp32 board package.
Now my board is discoverd as an MIDI class device, and sends midi signals.
Working platformio.ini:

[env:esp32-s3-devkitc-1]
platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.37/platform-espressif32.zip
board = esp32-s3-devkitc-1
framework = arduino
lib_deps =
tttapa/Control Surface@^2.1.0
build_unflags =
  -DARDUINO_USB_MODE=1
build_flags =
  -DARDUINO_USB_MODE=0

full code: GitHub - ANTowski-1/MIDI-controller: An ESP32-S3 based MIDI controller, you can build yourself! · GitHub