mockband/docs/tech-notes.md

182 lines
4.3 KiB
Markdown
Raw Permalink Normal View History

2024-01-04 13:51:38 -07:00
Technical Notes
===============
It took me a lot of time digging around the Internet to find some of this stuff.
I'm writing down the highlights here,
so that when original sources fall off the net,
hopefully at least my notes will still be around.
2024-01-01 12:19:50 -07:00
Sample Rate
-----------
2024-01-07 21:30:19 -07:00
If `DEBUGY0' is defined,
the number of samples taken since the last HID report
is sent as Y axis on hat 0.
2024-01-07 15:55:26 -07:00
You can use the
2024-01-01 12:19:50 -07:00
[included gamepad tester](gamepad.html),
2024-01-07 15:55:26 -07:00
to see the approximate number of samples as an integer.
2024-01-01 12:19:50 -07:00
This is approximate,
because the browser encodes the value as a real number between -1 and 1.
We convert it back, but may lose a little precision.
It's close enough for me,
hopefully it's close enough for you.
2024-01-07 15:55:26 -07:00
This number will not be very useful
unless you are polling the wammy bar,
since without that input,
updates are only sent when a button state changes.
2024-01-01 12:19:50 -07:00
Debouncing
----------
Using `millis()` time to debounce the switch
roughly halved my sample frequency.
So instead, I do some preprocessor arithmetic
to calculate how many samples to take after an edge,
in order to debounce switches.
The drum controller was a partcular pain:
in addition to the switch bouncing,
the stick was bouncing on the rubber pad.
I settled on a 40ms silence window as feeling pretty good.
You can adjust this if you want to.
2024-01-04 13:10:56 -07:00
USB Junk
========
Gamepad Buttons
---------------
The `buttons` struct member is a bitmap,
each bit mapping to one of the 12 buttons reported through HID.
Here's what each bit means:
2024-01-04 13:10:56 -07:00
* 0o00: Blue
* 0o01: Green
* 0o02: Red
* 0o03: Yellow
* 0o04: Orange
* 0o05: Tilt Switch / 2x kick
* 0o06: Solo modifier (second row of buttons on guitar)
* 0o07: ???
* 0o10: Minus
* 0o11: Plus
* 0o12: Drum pad modifier
* 0o13: Cymbal modifier
* 0o14: Select
2024-01-07 21:28:02 -07:00
Hats
----
2024-01-07 21:28:02 -07:00
I guess "hats" are what I would have called "joysticks and dpads".
2024-01-07 21:28:02 -07:00
### Hat 0: unknown
This doesn't appear to be sent or used.
### Hat 1: guitar analog controls
The X axis is the position of the wammy bar.
The Y axis is the pickup selector.
I believe this was a 5-position switch on some guitars.
Only Rock Band 1 seems to use this.
### Hat 2: navigation
Sent by the dpad on the controller,
as `hatAndConstant`.
Guitars send up/down for the up/down strum buttons.
Drums send up/down on the blue/yellow cymbal pads.
The position of this digital input is reported in only 3 bits:
Squashed commit of the following: commit 13825855d3baeb456fa9577b224625d0c0e2f3b3 Author: Neale Pickett <neale@woozle.org> Date: Sat Jan 6 15:08:12 2024 -0700 twiddling things trying to get drums working on CH commit e54595e6302f793811fbf9819f8580f2a9cf761f Merge: 63bd067 703b070 Author: Neale Pickett <neale@woozle.org> Date: Fri Jan 5 18:18:18 2024 -0700 Merge branch 'main' into builder commit 63bd0672500631b8c47f24f041693e642ab32533 Author: Neale Pickett <neale@woozle.org> Date: Fri Jan 5 09:29:16 2024 -0700 More idiomatic (to me) Makefile commit 9f0c0711a85ca1ce9c2b5a285c779148a63acb55 Author: Neale Pickett <neale@woozle.org> Date: Fri Jan 5 09:10:28 2024 -0700 fancypants flash target commit efc67e9fe551475b4beb0757606dacb494cb92df Author: Neale Pickett <neale@woozle.org> Date: Fri Jan 5 09:06:59 2024 -0700 Also publish zip file commit ce7d6107cf79553c1a7d325132f9a9ca30b2d478 Author: Neale Pickett <neale@woozle.org> Date: Fri Jan 5 09:04:51 2024 -0700 stop using removed `make publish` commit 48d245051454bc353f963cddbbb85359986ab3b3 Author: Neale Pickett <neale@woozle.org> Date: Fri Jan 5 09:02:53 2024 -0700 make dist commit 5f448321518a8a950330cab88277318455e5da32 Author: Neale Pickett <neale@woozle.org> Date: Fri Jan 5 08:50:10 2024 -0700 move to Makefile commit da45584955a4a5ae13e7aebcac4570c95a312243 Author: Neale Pickett <neale@woozle.org> Date: Fri Jan 5 08:37:03 2024 -0700 Makefile commit 50ce7c245ac89336ea340ccb3152239176ee9c13 Author: Neale Pickett <neale@woozle.org> Date: Thu Jan 4 23:16:08 2024 -0700 Fix quoting commit f767eb6e23f6153f0f09e02b9e3d984a79a9b949 Author: Neale Pickett <neale@woozle.org> Date: Thu Jan 4 23:15:05 2024 -0700 Build log formatting commit 7495bfd20fe5676c00becf80109792a0447fa664 Author: Neale Pickett <neale@woozle.org> Date: Thu Jan 4 23:12:51 2024 -0700 Try preserving package versions commit 5fa607d6b093cfafbf4b9b52e4686acd3e3625f6 Author: Neale Pickett <neale@woozle.org> Date: Thu Jan 4 22:59:14 2024 -0700 build and code cleanup commit 855ad3ba60c9a527dbf4fb40958f680a0993a5a6 Author: Neale Pickett <neale@woozle.org> Date: Thu Jan 4 22:48:20 2024 -0700 fix: change quoting? commit 25a917dc81313d1ff9f144d8029a5c70fc4132ae Author: Neale Pickett <neale@woozle.org> Date: Thu Jan 4 22:42:11 2024 -0700 directly specify gcc flags commit a8d4918e05327049232a994cd7ba607cc778c2f2 Author: Neale Pickett <neale@woozle.org> Date: Thu Jan 4 22:23:03 2024 -0700 variables expand again commit 544ffa8ced48c6bee445bd6ec73e48662168e3e9 Author: Neale Pickett <neale@woozle.org> Date: Thu Jan 4 22:21:25 2024 -0700 quote stuff commit a3d8262e017c352e4bf1120fc7b30e05775260e1 Author: Neale Pickett <neale@woozle.org> Date: Thu Jan 4 22:19:58 2024 -0700 fix build on non-default branch commit 0ba9c0957a44cc1d01b51263607f366cc81fd323 Author: Neale Pickett <neale@woozle.org> Date: Thu Jan 4 22:16:36 2024 -0700 Clever vid/pid settings?
2024-01-06 15:13:19 -07:00
7 0 1
6 8 2
5 4 3
0 is up,
2 is right,
4 is down,
6 is left,
and 8 is centered.
2024-01-04 13:10:56 -07:00
velocity
--------
I don't know how I can verify that I'm setting this right,
but the `rbdrum2midi` program looks at these bytes to detect hits.
I set them to 127 when a hit is detected on the digital pin.
2024-01-04 13:51:38 -07:00
Sending these values does not seem to cause problems with my Wii games.
Product ID (PID)
----------------
2024-01-07 21:28:02 -07:00
The following USB PIDs are recognized by various things:
2024-01-04 13:51:38 -07:00
2024-01-07 21:28:02 -07:00
* 0x0003: XBox Drum
* 0x0004: Wii Guitar
* 0x0005: Wii Drums - Rock Band 1
* 0x3110: Wii Drums - Rock Band 2
2024-01-04 13:51:38 -07:00
2024-01-07 21:28:02 -07:00
There are some quirks to note:
* Rock Band 3 won't recognize cymbal hits on PID=0x0005,
but the same program with PID=0x3110 works fine.
* Wii games don't appear to recognized PID=0x0003.
Maybe Rock Band 3 does: I didn't test that one.
2024-01-04 13:51:38 -07:00
Drum Velocity
--------
I split the 12 "reserved" bytes from Nicholas's
`struct InstrumentButtonState`
2024-01-07 21:28:02 -07:00
into 4 bytes of I-Don't-Know,
4 bytes of velocity,
2024-01-04 13:51:38 -07:00
and 4 more bytes of I-Don't-Know.
Whenever a pad is hit,
I send 127 on the corresponding velocity.
I did this because a program called `rbdrum2midi`
ignores the button press events,
and looks only at the velocity values.
None of the Wii games I have
seem to care what these values are set to.
2024-01-07 21:28:02 -07:00
Clone Hero also does not care.
2024-01-04 13:51:38 -07:00
2024-01-07 15:55:26 -07:00
Clone Hero
==========
2024-01-07 21:28:02 -07:00
Clone Hero wants Hat 2 up on yellow cymbal hit,
and Hat 2 down on blue cymbal hit.
2024-01-07 15:55:26 -07:00
2024-01-07 21:28:02 -07:00
If it doesn't see these while mapping drum pads,
then hitting any color bad will trigger both drum and cymbal for that color.
2024-01-07 15:55:26 -07:00
2024-01-04 13:51:38 -07:00
References
2024-01-07 15:55:26 -07:00
==========
2024-01-04 13:51:38 -07:00
The most valuable sources of information I found were:
* [Nicholas Angle's reverse-engineering write-up](https://www.niangames.com/articles/reverse-engineering-rockband-guitar-controllers)
* [Nicholas Angle's guitar controller program](https://github.com/NianZo/WiiGuitarController)
* [Clone Hero Wiki: Drum Mapping Guide](https://wiki.clonehero.net/books/guitars-drums-controllers/page/drum-mapping-guide)
* [rbdrum2midi source code](https://github.com/rbdrum2midi/rbdrum2midi)