parent
07685051d9
commit
fb077ba140
38
MockBand.ino
38
MockBand.ino
|
@ -2,12 +2,17 @@
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <PluggableUSB.h>
|
#include <PluggableUSB.h>
|
||||||
|
|
||||||
|
#define DEBUG
|
||||||
|
|
||||||
#include "hid.hh" // Modified HID library: doesn't prefix each packet with ID
|
#include "hid.hh" // Modified HID library: doesn't prefix each packet with ID
|
||||||
#include "instrument.hh"
|
#include "instrument.hh"
|
||||||
|
|
||||||
//#include "blue.hh" // Ginnie's blue guitar
|
//#include "blue.hh" // Ginnie's blue guitar
|
||||||
#include "standard.hh" // Standard pins
|
#include "standard.hh" // Standard pins
|
||||||
|
|
||||||
|
// If defined, we will check the wammy bar input
|
||||||
|
#define WAMMY
|
||||||
|
|
||||||
// Maximum time between wammy bar updates.
|
// Maximum time between wammy bar updates.
|
||||||
#define UPDATE_INTERVAL_MS 20
|
#define UPDATE_INTERVAL_MS 20
|
||||||
|
|
||||||
|
@ -118,22 +123,37 @@ void loop() {
|
||||||
}
|
}
|
||||||
next = now + UPDATE_INTERVAL_MS;
|
next = now + UPDATE_INTERVAL_MS;
|
||||||
|
|
||||||
buttonState.buttons = (buttons & 0b1100111111); // All directly-mappable bits
|
buttonState.buttons = (buttons & 0b1100111111); // +-..!OYRGB
|
||||||
buttonState.buttons |= ((buttons >> 10) & 0b11111); // Solo keys
|
#ifdef GUITAR
|
||||||
bitWrite(buttonState.buttons, 6, (buttons >> 10) & 0b11111); // Solo bit
|
buttonState.buttons |= (buttons >> 10) & 0b11111; // Solo keys
|
||||||
|
#else // DRUMS
|
||||||
|
buttonState.buttons |= (buttons >> 10) & 0b01011; // Cymbals
|
||||||
|
#endif
|
||||||
|
bitWrite(buttonState.buttons, 6, buttons & (0b11111 << 10)); // Solo modifier
|
||||||
|
bitWrite(buttonState.buttons, 10, buttons & (0b01111 << 0)); // Drum pad modifier
|
||||||
|
bitWrite(buttonState.buttons, 11, buttons & (0b01011 << 10)); // Cymbals modifier
|
||||||
|
|
||||||
// I don't understand why any rational engineer would have done this.
|
// D-pad would go here if I ever implemented that:
|
||||||
|
// nothing seems to actualy need it.
|
||||||
|
//
|
||||||
|
// I don't understand why any rational engineer would have specified this algorithm.
|
||||||
buttonState.hatAndConstant = (0x08
|
buttonState.hatAndConstant = (0x08
|
||||||
^ (bitRead(buttons, 6) << 4) // up
|
^ (bitRead(buttons, 6) << 4) // strum up
|
||||||
// right << 3
|
// right << 3
|
||||||
^ (bitRead(buttons, 7) << 2) // down
|
^ (bitRead(buttons, 7) << 2) // strum down
|
||||||
// left << 1
|
// left << 1
|
||||||
);
|
);
|
||||||
|
|
||||||
buttonState.axis[2] = analogRead(ANALOG_WAMMY) / 4;
|
#ifdef WAMMY
|
||||||
|
buttonState.axis[2] = analogRead(ANALOG_WAMMY) / 4; // Wammy bar
|
||||||
|
#endif
|
||||||
|
buttonState.axis[3] = bitRead(buttons, 12)?255:0; // High hat
|
||||||
|
|
||||||
// The second Y axis doesn't appear to be used, so I'm logging sample rate with it
|
|
||||||
buttonState.axis[3] = samples & 0xff; // most things map this to [-1,1]
|
#ifdef DEBUG
|
||||||
|
// Log sample rate to the first X axis
|
||||||
|
buttonState.axis[0] = samples & 0xff;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Send an update
|
// Send an update
|
||||||
HID().SendReport(0, (uint8_t *)&buttonState, 27);
|
HID().SendReport(0, (uint8_t *)&buttonState, 27);
|
||||||
|
|
26
README.md
26
README.md
|
@ -39,28 +39,18 @@ On the drum kit,
|
||||||
|
|
||||||
* Orange: kick pedal
|
* Orange: kick pedal
|
||||||
* Solo Buttons: cymbals
|
* Solo Buttons: cymbals
|
||||||
|
* Red Solo: high hat
|
||||||
|
* Tilt: 2x kick
|
||||||
|
|
||||||
I think. I haven't been able to test this yet,
|
I think. I haven't been able to test this yet,
|
||||||
but the Clone Hero wiki leads me to believe this is how it works.
|
but the Clone Hero wiki leads me to believe this is how it works.
|
||||||
|
|
||||||
|
You can hook up a wammy bar for the drum kit,
|
||||||
|
and it will be sent the same way as the guitar.
|
||||||
|
I don't know why anyone would want this
|
||||||
|
but I'm not going to tell you how to live your life.
|
||||||
|
|
||||||
# Still To Do
|
# Still To Do
|
||||||
|
|
||||||
|
I'm tracking things I need to do in the
|
||||||
* 2x kick: needs its own input pin. Maps to button 5.
|
[forgejo issues](https://git.woozle.org/neale/mockband/issues).
|
||||||
* Drum pad modifier: looks like button 10 needs to be pressed when a drum pad is hit.
|
|
||||||
* Drum cymbal modifier: I don't see a problem with using the solo pins for this, but I may need to also send button 11.
|
|
||||||
* Hi Hat pedal: needs to be its own input pin. Looks like it maps to the second Y axis: the one I'm currently using to send frame rate.
|
|
||||||
|
|
||||||
If I set this up correctly, it will use every input pin on the pro micro.
|
|
||||||
|
|
||||||
Perhaps a smarter thing to do would be use the value of USB_PID
|
|
||||||
to re-use the orange solo pin as the hi hat pedal,
|
|
||||||
and the red solo pin as the 2x kick.
|
|
||||||
|
|
||||||
The
|
|
||||||
[Clone Hero Drum Mapping Guide](https://wiki.clonehero.net/books/guitars-drums-controllers/page/drum-mapping-guide)
|
|
||||||
is super helpful.
|
|
||||||
I'll need to hunt down a copy of Wii Rock Band 3
|
|
||||||
(or maybe The Beatles?)
|
|
||||||
in order to test this on an actual Wii.
|
|
||||||
|
|
Loading…
Reference in New Issue