Hello,
I’m trying to use a USB MIDI keyboard “GENERAL PIANO 88035” (VID: 0x7777, PID: 0x8899) with Arduino and the USB Host Shield 2.0 library, but unfortunately, it is not recognized as a MIDI device.
What I’ve done:
I have manually added the VID and PID to the relevant places in the library (such as setupDeviceSpecific()).
The device is visible in Windows as “GENERAL Piano” and is detected as a USB composite device.
MIDI software (like MIDI-OX) on Windows can see and use the keyboard.
However, using the USB Host Shield on Arduino, it doesn’t show up as a MIDI device, and no MIDI messages are received.
Device info and descriptor:
I have extracted the full USB device descriptor using USB Device Tree Viewer:
---------------------- Device Descriptor ----------------------
bLength : 0x12 (18 bytes)
bDescriptorType : 0x01 (Device Descriptor)
bcdUSB : 0x110 (USB Version 1.1)
bDeviceClass : 0x00 (defined by the interface descriptors)
bDeviceSubClass : 0x00
bDeviceProtocol : 0x00
bMaxPacketSize0 : 0x08 (8 bytes)
idVendor : 0x7777 (Unknown Vendor)
idProduct : 0x8899
bcdDevice : 0x0100
iManufacturer : 0x00 (No String Descriptor)
iProduct : 0x01 (String Descriptor 1)
*!*ERROR String descriptor not found
iSerialNumber : 0x00 (No String Descriptor)
bNumConfigurations : 0x01 (1 Configuration)
------------------ Configuration Descriptor -------------------
bLength : 0x09 (9 bytes)
bDescriptorType : 0x02 (Configuration Descriptor)
wTotalLength : 0x0065 (101 bytes)
bNumInterfaces : 0x02 (2 Interfaces)
bConfigurationValue : 0x01 (Configuration 1)
iConfiguration : 0x00 (No String Descriptor)
bmAttributes : 0x80
D7: Reserved, set 1 : 0x01
D6: Self Powered : 0x00 (no)
D5: Remote Wakeup : 0x00 (no)
D4..0: Reserved, set 0 : 0x00
MaxPower : 0x32 (100 mA)
---------------- Interface Descriptor -----------------
bLength : 0x09 (9 bytes)
bDescriptorType : 0x04 (Interface Descriptor)
bInterfaceNumber : 0x00 (Interface 0)
bAlternateSetting : 0x00
bNumEndpoints : 0x00 (Default Control Pipe only)
bInterfaceClass : 0x01 (Audio)
bInterfaceSubClass : 0x01 (Audio Control)
bInterfaceProtocol : 0x00
iInterface : 0x00 (No String Descriptor)
---------------- Interface Descriptor -----------------
bLength : 0x09 (9 bytes)
bDescriptorType : 0x04 (Interface Descriptor)
bInterfaceNumber : 0x01 (Interface 1)
bAlternateSetting : 0x00
bNumEndpoints : 0x02 (2 Endpoints)
bInterfaceClass : 0x01 (Audio)
bInterfaceSubClass : 0x03 (MIDI Streaming)
bInterfaceProtocol : 0x00
iInterface : 0x00 (No String Descriptor)
- MIDI Adapter Class specific MS Interface Descriptor -
bLength : 0x07 (7 bytes)
bDescriptorType : 0x24 (Class Specific Interface Descriptor)
bDescriptorSubtype : 0x01 (MS Header)
bcdADC : 0x0100
wTotalLength : 0x0041 (65 bytes)
---------------- MIDI IN Jack Descriptor --------------
bLength : 0x06 (6 bytes)
bDescriptorType : 0x24 (Class Specific Interface Descriptor)
bDescriptorSubtype : 0x02 (MIDI_IN_JACK)
bJackType : 0x01 (Embedded)
bJackID : 0x01 (ID=1)
iJack : 0x00 (No String Descriptor)
...
and so on (full descriptor attached)
Summary:
The device uses the standard Audio/MIDI Streaming interface (InterfaceClass: 0x01, SubClass: 0x03)
Endpoints are Bulk IN/OUT, standard sizes
No string descriptors are available
Questions:
Is there anything in the USB Host Shield 2.0 library that would prevent full class-compliant MIDI devices with custom VID/PID from being recognized?
Are there any extra steps or patches required to support devices like this that do not have string descriptors or use generic vendor IDs?
Do you have any debug advice, or is it possible to implement a “force class” detection based only on Interface Class/SubClass rather than VID/PID?
Thank you for your project and for any advice you can provide!
I am happy to provide logs, debug output, or further device info if needed.
Best regards,
Alex.
usb.txt
Hello,
I’m trying to use a USB MIDI keyboard “GENERAL PIANO 88035” (VID: 0x7777, PID: 0x8899) with Arduino and the USB Host Shield 2.0 library, but unfortunately, it is not recognized as a MIDI device.
What I’ve done:
I have manually added the VID and PID to the relevant places in the library (such as setupDeviceSpecific()).
The device is visible in Windows as “GENERAL Piano” and is detected as a USB composite device.
MIDI software (like MIDI-OX) on Windows can see and use the keyboard.
However, using the USB Host Shield on Arduino, it doesn’t show up as a MIDI device, and no MIDI messages are received.
Device info and descriptor:
I have extracted the full USB device descriptor using USB Device Tree Viewer:
---------------------- Device Descriptor ----------------------
bLength : 0x12 (18 bytes)
bDescriptorType : 0x01 (Device Descriptor)
bcdUSB : 0x110 (USB Version 1.1)
bDeviceClass : 0x00 (defined by the interface descriptors)
bDeviceSubClass : 0x00
bDeviceProtocol : 0x00
bMaxPacketSize0 : 0x08 (8 bytes)
idVendor : 0x7777 (Unknown Vendor)
idProduct : 0x8899
bcdDevice : 0x0100
iManufacturer : 0x00 (No String Descriptor)
iProduct : 0x01 (String Descriptor 1)
*!*ERROR String descriptor not found
iSerialNumber : 0x00 (No String Descriptor)
bNumConfigurations : 0x01 (1 Configuration)
bLength : 0x09 (9 bytes)
bDescriptorType : 0x02 (Configuration Descriptor)
wTotalLength : 0x0065 (101 bytes)
bNumInterfaces : 0x02 (2 Interfaces)
bConfigurationValue : 0x01 (Configuration 1)
iConfiguration : 0x00 (No String Descriptor)
bmAttributes : 0x80
D7: Reserved, set 1 : 0x01
D6: Self Powered : 0x00 (no)
D5: Remote Wakeup : 0x00 (no)
D4..0: Reserved, set 0 : 0x00
MaxPower : 0x32 (100 mA)
bLength : 0x09 (9 bytes)
bDescriptorType : 0x04 (Interface Descriptor)
bInterfaceNumber : 0x00 (Interface 0)
bAlternateSetting : 0x00
bNumEndpoints : 0x00 (Default Control Pipe only)
bInterfaceClass : 0x01 (Audio)
bInterfaceSubClass : 0x01 (Audio Control)
bInterfaceProtocol : 0x00
iInterface : 0x00 (No String Descriptor)
bLength : 0x09 (9 bytes)
bDescriptorType : 0x04 (Interface Descriptor)
bInterfaceNumber : 0x01 (Interface 1)
bAlternateSetting : 0x00
bNumEndpoints : 0x02 (2 Endpoints)
bInterfaceClass : 0x01 (Audio)
bInterfaceSubClass : 0x03 (MIDI Streaming)
bInterfaceProtocol : 0x00
iInterface : 0x00 (No String Descriptor)
bLength : 0x07 (7 bytes)
bDescriptorType : 0x24 (Class Specific Interface Descriptor)
bDescriptorSubtype : 0x01 (MS Header)
bcdADC : 0x0100
wTotalLength : 0x0041 (65 bytes)
bLength : 0x06 (6 bytes)
bDescriptorType : 0x24 (Class Specific Interface Descriptor)
bDescriptorSubtype : 0x02 (MIDI_IN_JACK)
bJackType : 0x01 (Embedded)
bJackID : 0x01 (ID=1)
iJack : 0x00 (No String Descriptor)
...
and so on (full descriptor attached)
Summary:
The device uses the standard Audio/MIDI Streaming interface (InterfaceClass: 0x01, SubClass: 0x03)
Endpoints are Bulk IN/OUT, standard sizes
No string descriptors are available
Questions:
Is there anything in the USB Host Shield 2.0 library that would prevent full class-compliant MIDI devices with custom VID/PID from being recognized?
Are there any extra steps or patches required to support devices like this that do not have string descriptors or use generic vendor IDs?
Do you have any debug advice, or is it possible to implement a “force class” detection based only on Interface Class/SubClass rather than VID/PID?
Thank you for your project and for any advice you can provide!
I am happy to provide logs, debug output, or further device info if needed.
Best regards,
Alex.
usb.txt