M-AUDIO iControl for GarageBand

USB Descriptors:

Device Descriptor:
bcdUSB:             0x0100
bDeviceClass:         0x00
bDeviceSubClass:      0x00
bDeviceProtocol:      0x00
bMaxPacketSize0:      0x40 (64)
idVendor:           0x0763
idProduct:          0x0118
bcdDevice:          0x0103
iManufacturer:        0x01
0x0409: "M-Audio"
iProduct:             0x02
0x0409: "iControl"
iSerialNumber:        0x00
bNumConfigurations:   0x01

ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x02
Open Pipes:              2

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
wInterval:          0x0000
bSyncAddress:         0x00

Endpoint Descriptor:
bEndpointAddress:     0x00
Transfer Type:     Control
wMaxPacketSize:     0x0509 (1289)
wInterval:          0x0202
bSyncAddress:         0x40

Configuration Descriptor:
wTotalLength:       0x0075
bNumInterfaces:       0x02
bConfigurationValue:  0x01
iConfiguration:       0x03
0x0409: "Audio Class"
bmAttributes:         0x80 (Bus Powered )
MaxPower:             0x82 (260 Ma)

Interface Descriptor:
bInterfaceNumber:     0x00
bAlternateSetting:    0x00
bNumEndpoints:        0x00
bInterfaceClass:      0x01
bInterfaceSubClass:   0x01
bInterfaceProtocol:   0x00
iInterface:           0x00

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x09
09 24 01 00 01 09 00 01 01 

Interface Descriptor:
bInterfaceNumber:     0x01
bAlternateSetting:    0x00
bNumEndpoints:        0x02
bInterfaceClass:      0x01
bInterfaceSubClass:   0x03
bInterfaceProtocol:   0x00
iInterface:           0x00

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x07
07 24 01 00 01 41 00 

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x06
06 24 02 01 01 00 

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x06
06 24 02 02 02 00 

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x06
06 24 02 02 05 00 

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x09
09 24 03 01 03 01 02 01 00 

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x09
09 24 03 01 06 01 05 01 00 

Unknown Descriptor:
bDescriptorType:      0x24
bLength:              0x09
09 24 03 02 04 01 01 01 00 

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
wInterval:          0x0000
bSyncAddress:         0x00

Unknown Descriptor:
bDescriptorType:      0x25
bLength:              0x06
06 25 01 02 03 06 

Endpoint Descriptor:
bEndpointAddress:     0x02
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
wInterval:          0x0000
bSyncAddress:         0x00

Unknown Descriptor:
bDescriptorType:      0x25
bLength:              0x05
05 25 01 01 01 

MIDI Messages

Buttons (and LED's)

b0 61 7f/00	Volume
" 62 "		Pan
63	Track Info
64	Generator
65	Effect 1
66	Effect 2
67	EQ
60	Option
68	Up Arrow
69	Down Arrow
6a	Record (dot)
6b	RTZ (return to zero)
6c	Rewind
6d	Play
6e	Ffwd
6f	Loop

58-5f	Sel (track 1-8)
41-47	Arm (track 1-8)
51-57	Play (track 1-8)
48-4f	Monitor (track 1-8)

Encoders

b0 10-17 xx	value for track 1-8
	CW	01, 02, 04, 0c, 14, 28, 3c, 3e, 3f (faster and faster)
	CCW	7f, 7e, 7c, 78, 74, 6c, 44, 43, 41 (faster and faster)

b0 18 xx	data knob

Slider

b0 07 00-7f	Master Volume

We bought an M-Audio iControl to check out. This is their GarageBand  specific control surface. To my surprise, it's not a HID device. It uses the standard "USB MIDI device class." 

On the Mac, it shows up as two ports:  1) a MIDI In + Out port, and 2) a second MIDI In port (for the MIDI in jack on the back of the unit). 

GarageBand automatically recognizes and uses it. If you disconnect it, GB complains "now no inputs are available."  When you plug it in, it says "now two inputs are available." 

Messages produced by first input port: 

iControl control          MIDI 
------------------------------------------------------------------------ ----- 
RECORD dn/up        0xb0 0x6a 0x7F/0x00 
RTZ dn/up            0xb0 0x6b 0x7F/0x00 
REW dn/up            0xb0 0x6c 0x7F/0x00 
PLAY dn/up            0xb0 0x6d 0x7F/0x00 
FFWD dn/up            0xb0 0x6e 0x7F/0x00 
CYCLE dn/up        0xb0 0x6f 0x7F/0x00 

DATAWHEEL clkwise    0xb0 0x18 0x01...0x3C  (max observed clkwise speed) 
DATAWHEEL c-clkw    0xb0 0x18 0x7F...0x43 (at max c-clkw speed) 

VOLUME Dn/Up         0xb0 0x61 0x7F/0x00 
PAN Dn/Up            0xb0 0x62 0x7F/0x00 
TRACK INFO Dn/Up     0xb0 0x63 0x7F/0x00 
GENERATOR Dn/Up    0xb0 0x64 0x7F/0x00 
EFFECT 1 Dn/Up        0xb0 0x65 0x7F/0x00 
EFFECT 2 Dn/Up        0xb0 0x66 0x7F/0x00 
EQ Dn/Up            0xb0 0x67 0x7F/0x00 

OPTION Dn/Up        0xb0 0x60 0x7F/0x00 
Up Arrow Dn/Up        0xb0 0x68 0x7F/0x00 
Dn Arrow Dn/Up        0xb0 0x69 0x7F/0x00 

SEL(n) Dn/Up        0xb0 0x5y 0x7F/0x00  n=1 -> y=8, n=2 -> y=9, ... 
REC ARM(n) Dn/Up    0xb0 0x5y 0x7F/0x00  n=1 -> y=0, n=2 -> y=1, ... 
MUTE(n) Dn/Up        0xb0 0x4y 0x7F/0x00  n=1 -> y=0, n=2 -> y=1, ... 
SOLO(n) Dn/Up        0xb0 0x4y 0x7F/0x00  n=1 -> y= 8, n=2 -> y=9, ... 

ENCODER(n) clkwise 0xb0 0x1y 0x01...0x3E n=1 -> y=0, n=2 -> y=1, ... 
ENCODER(n) c-clkw    0xb0 0x1y 0x7F...0x43  n=1 -> y=0, n=2 -> y=1, ... 

MASTER VOLUME      0xb0 0x07 0x00...0x7F    
========== 

Sending these same commands out the iControl's MIDI Out port turns  the corresponding LED's on and off. By the way, the LED implementation on this thing sucks! They're so dim you can't see them even in moderate room light! 

Messages produced by second input port:  pass-through for the MIDI In  port on the back of the iControl 

Response to MIDI Device Inquiry on the MIDI Out port: 
    a) I send Universal Device Inquiry:  F0 7E 7F 06 01 F7  to the  iControl's MIDI Out 
    b) I receive this in response on iControls MIDI In Port 1:  F0 7E 7F  06 02 00 20 08 63 0E 18 02 20 31 30 33 F7 
         "00 20 08" corresponds to the manufacturer ID. According the MMA web site, this ID is not assigned! 
        "63 0E"  is the "family code" 
        "18 02" is the "device code" 
        "20 31 30 33" is the version number:  " 1.03" 

The Mac's Audio MIDI Setup applet correctly gets the name of the iControl, presumably out of the USB Device Descriptor strings. 

I noticed that in Device Manager, Windows labels the device  "iControl" at plug-in ... right before it (stupidly) reverts to  calling it "USB Audio Device" and "USB Audio Device (2)"  (jerks!) 

It's possible that emulating the above MIDI messages, and presumably  the MIDI Device Inquiry command could fool GarageBand into thinking  that an iControl is at the other end of the wire. Not sure if this is worth doing for TranzPort or AlphaTrack, but FWIW...