Wiimote/Extension Controllers/Guitar Hero World Tour (Wii) Drums
Note: This is different from Rock Band drums, which are USB.
The Drums are identified by the 6 bytes: 01 00 A4 20 01 03 at register address 0x(4)a400fa. The first 01 indicates that it is drums and not a guitar (which would be 00). To read these bytes unencrypted, you must first write 0x55 to 0x(4)a400f0, then 0 to 0x(4)a400fb. Trying to read the 6 bytes after initialising the old way will just return FF FF FF FF FF FF, like many other expansions.
Data Format
The drum kit reports its information as 6 bytes of data, readable at 0x(4)a40008 and streamable using Data Reporting Modes that include Extension bytes. The Guitar Hero World Tour game uses mode 0x37 with continuous reporting. The data is packed into the six bytes as follows (after decryption):
Bit | ||||||||
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 0 | 0 | SX | |||||
1 | 0 | 0 | SY | |||||
2 | MIDI Note | Velocity<3> | ||||||
3 | Velocity<6:4> | 0110 | Velocity<2> | |||||
4 | Velocity<1> | 1 | 1 | B- | 1 | B+ | 1 | Velocity<0> |
5 | O | R | Y | G | B | Bass | 1 | 1 |
R, B, and G are the drum pads by colour (Red, Blue, and Green). O and Y are the cymbals. Bass is the pedal. B- and B+ are the black - and + buttons behind the Wii Remote. They will be 0 when hit, 1 when not.
SX and SY are the black analog stick behind the Wii Remote. 0x20 means centered.
The MIDI note and velocity data are based on MIDI standards, so they are 7-bit numbers. If there is no velocity data, bytes 2 and 3 will be FF FF and contain no data.
If there is velocity data, then "MIDI Note" tells you which midi note it is for. It is inverted, so 0x7F is MIDI note 0 and 0x00 is MIDI note 127. If a MIDI device is plugged into the MIDI port, than any notes are passed directly through. The following notes are used for the built-in pads:
MIDI Note | Standard Midi Value | Raw Value | Name |
---|---|---|---|
C2 | 36 | 0x5B | Kick Pedal |
D2 | 38 | 0x59 | Red |
A2 | 45 | 0x52 | Green |
A#2 | 46 | 0x51 | Yellow |
C3 | 48 | 0x4F | Blue |
C#3 | 49 | 0x4E | Orange |
E7 | 100 | 0x1B | Hi-hat pedal |
"Velocity" is the velocity in which the pad is hit. It is inverted, so 0x7F is the softest value and 0x00 is the hardest hit.
For the hi-hat pedal (unmarked 3.5mm jack above bass pedal jack), the velocity varies according to how far the pedal is pressed. The pedal to connect to the jack is not the same as the bass drum pedal; it must be a some sort of variable resistor (varying between 20k Ohms when down and 40 Ohms when up seems to give a good spread of velocity values). The drums seem to only send a value when they detect you pressing the pedal, and once you do then the pedal will send its changing value for a few seconds. This means if you are testing with a variable resistor, you will only see a velocity when turning it in one direction but not the other.
"0110" is 0110 if there is velocity information, or 1111 if there is not. Its meaning is unknown.
Thanks to Metallica1969, death_au, l0stsign, MonkeyJamboree and Carl Kenner.
Sensitivity adjustment
The sensitivity of the pads, cymbals and pedal can be adjusted via MIDI Control Change messages sent to the MIDI IN jack. Activision released a "Drum Tuning Kit" program for this purpose.
The first byte is always 0xBF (Control Change message on channel 16).
The second byte determines which sensitivity to adjust: 0x68 for red, 0x69 for yellow, 0x66 for blue, 0x6A for orange, 0x67 for green, and 0x64 for the pedal.
The third byte determines the sensitivity, with lower values representing higher sensitivities. Activision's software offers 21 different sensitivity levels, which are then scaled to this byte as follows:
Sensitivity level = 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 20 Byte (Pads) = 28 1E 19 16 14 13 12 11 10 0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 Byte (Cymbals) = 3C 35 2E 29 26 22 1E 1B 18 16 14 12 0F 0D 0B 09 08 07 06 05 04 Byte (Pedal) = 33 2D 28 24 21 1E 1C 1A 18 16 14 12 10 0E 0C 0A 09 08 07 06 05
Sensitivity adjustments will reset once powered off unless manually saved. To do this, the software sends 0xBF6503, waits 750ms, then sends 0xBF7777.