xref: /haiku/headers/os/drivers/usb/USB_midi.h (revision 454e28d9061f2a9096a8ecaf2488348ac28a4e2c)
1 #ifndef USB_MIDI_H
2 #define USB_MIDI_H
3 
4 #include <usb/USB_audio.h>
5 
6 // (Partial) USB Class Definitions for MIDI Devices, version 1.0
7 // Reference: http://www.usb.org/developers/devclass_docs/midi10.pdf
8 
9 #define USB_MIDI_CLASS_VERSION		0x0100	// Class specification version 1.0
10 
11 // USB MIDI Event Packet
12 
13 // ... as clean structure:
14 typedef struct {	// USB MIDI Event Packet
15 	uint8	cin:4;	// Code Index Number
16 	uint8	cn:4;	// Cable Number
17 	uint8	midi[3];
18 } _PACKED usb_midi_event_packet;
19 
20 
21 // MIDIStreaming (ms) interface descriptors (p20)
22 
23 enum { // MIDI Streaming descriptors subtypes
24 	USB_MS_HEADER_DESCRIPTOR = 0x01,
25 	USB_MS_MIDI_IN_JACK_DESCRIPTOR,
26 	USB_MS_MIDI_OUT_JACK_DESCRIPTOR,
27 	USB_MS_ELEMENT_DESCRIPTOR
28 };
29 
30 typedef struct usb_midi_interface_header_descriptor {
31 	uint8	length;
32 	uint8	descriptor_type;
33 	uint8	descriptor_subtype;	// USB_MS_HEADER_DESCRIPTOR
34 	uint16	ms_version;
35 	uint16	total_length;
36 } _PACKED usb_midi_interface_header_descriptor;
37 
38 
39 enum {
40 	USB_MIDI_EMBEDDED_JACK = 0x01,
41 	USB_MIDI_EXTERNAL_JACK
42 };
43 
44 typedef struct usb_midi_in_jack_descriptor {
45 	uint8	length;
46 	uint8	descriptor_type;
47 	uint8	descriptor_subtype;	// USB_MS_MIDI_IN_JACK_DESCRIPTOR
48 	uint8	type;	// USB_MIDI_{EMBEDDED | EXTERNAL}_JACK
49 	uint8	id;
50 	uint8	string_descriptor;
51 } _PACKED usb_ms_midi_in_jack_descriptor;
52 
53 
54 typedef struct usb_midi_source {
55 	uint8	source_id;
56 	uint8	source_pin;
57 } _PACKED usb_midi_source;
58 
59 typedef struct usb_midi_out_jack_descriptor {
60 	uint8	length;
61 	uint8	descriptor_type;
62 	uint8	descriptor_subtype;	// USB_MS_MIDI_OUT_JACK_DESCRIPTOR
63 	uint8	type;	// USB_MIDI_{EMBEDDED | EXTERNAL}_JACK
64 	uint8	id;
65 	uint8	inputs_count;
66 	usb_midi_source input_source[0];	// inputs_count times
67 	// uint8	string_descriptor;
68 } _PACKED usb_midi_out_jack_descriptor;
69 
70 
71 enum { // USB Element Capabilities bitmap (p23,25)
72 	USB_MS_ELEMENT_CUSTOM_UNDEFINED		= 0x0001,
73 	USB_MS_ELEMENT_MIDI_CLOCK			= 0x0002,
74 	USB_MS_ELEMENT_MIDI_TIME_CODE		= 0x0004,
75 	USB_MS_ELEMENT_MTC	= USB_MS_ELEMENT_MIDI_TIME_CODE,
76 	USB_MS_ELEMENT_MIDI_MACHINE_CONTROL	= 0x0008,
77 	USB_MS_ELEMENT_MMC	= USB_MS_ELEMENT_MIDI_MACHINE_CONTROL,
78 	// General MIDI System Level 1 compatible
79 	USB_MS_ELEMENT_GM1					= 0x0010,
80 	// General MIDI System Level 2 compatible
81 	USB_MS_ELEMENT_GM2					= 0x0020,
82 	// GS Format compatible (Roland)
83 	USB_MS_ELEMENT_GS					= 0x0040,
84 	// XG compatible (Yamaha)
85 	USB_MS_ELEMENT_XG					= 0x0080,
86 	USB_MS_ELEMENT_EFX					= 0x0100,
87 	// internal MIDI Patcher or Router
88 	USB_MS_ELEMENT_MIDI_PATCH_BAY		= 0x0200,
89 	// Downloadable Sounds Standards Level 1 compatible
90 	USB_MS_ELEMENT_DLS1					= 0x0400,
91 	// Downloadable Sounds Standards Level 2 compatible
92 	USB_MS_ELEMENT_DLS2					= 0x0800
93 };
94 
95 typedef struct usb_midi_element_descriptor {
96 	uint8	length;
97 	uint8	descriptor_type;
98 	uint8	descriptor_subtype;	// USB_MS_ELEMENT_DESCRIPTOR
99 	uint8	id;
100 	uint8	inputs_count;
101 	usb_midi_source input_source[0];	// inputs_count times
102 	// uint8	outputs_count;
103 	// uint8	input_terminal_id;
104 	// uint8	output_terminal_id;
105 	// uint8	capabilities_size;
106 	// uint8	capabilities[0];	// capabilities_size bytes
107 	// uint8	string_descriptor;	// see USB_MS_ELEMENT_* enum above
108 } _PACKED usb_midi_element_descriptor;
109 
110 // Class-Specific MIDIStream Bulk Data Endpoint descriptor (p26)
111 
112 #define USB_MS_GENERAL_DESCRIPTOR	0x01
113 
114 typedef struct usb_midi_endpoint_descriptor {
115 	uint8	length;
116 	uint8	descriptor_type;	// USB_DESCRIPTOR_CS_ENDPOINT
117 	uint8	descriptor_subtype;	// USB_MS_GENERAL_DESCRIPTOR
118 	uint8	jacks_count;
119 	uint8	jacks_id[0];		// jacks_count times
120 } _PACKED usb_midi_endpoint_descriptor;
121 
122 
123 #endif	// USB_MIDI_H
124