Launchpad.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "Launchpad.h"
  2. #include "MidiMessage.h"
  3. Launchpad::Launchpad()
  4. : midiin(), midiout(), keyPressedCallback(0), keyReleasedCallback(0)
  5. {
  6. midiin.setCallback(midiMessageCallback, (void*) this);
  7. midiout.openPort(1);
  8. midiin.openPort(0);
  9. }
  10. void Launchpad::midiMessageCallback(double timeStamp, MidiMessage &message, void *userData)
  11. {
  12. Launchpad *launchpad = (Launchpad*) userData;
  13. // use runtime type information to check for the message type.
  14. // this requires the specified class to have a virtual member.
  15. NoteMessage *noteMessage = dynamic_cast<NoteMessage*>(&message);
  16. if(noteMessage)
  17. {
  18. unsigned char x = noteMessage->pitch % 16;
  19. unsigned char y = 7 - noteMessage->pitch / 16;
  20. if(dynamic_cast<NoteOnMessage*>(noteMessage))
  21. {
  22. launchpad->keyPressed(x, y);
  23. }
  24. else
  25. {
  26. launchpad->keyReleased(x, y);
  27. }
  28. }
  29. else
  30. {
  31. ControlChangeMessage *controlChangeMessage = dynamic_cast<ControlChangeMessage*>(&message);
  32. if(controlChangeMessage)
  33. {
  34. unsigned char x = controlChangeMessage->control - 104;
  35. unsigned char y = 8;
  36. if(controlChangeMessage->value == 127)
  37. {
  38. launchpad->keyPressed(x, y);
  39. }
  40. else
  41. {
  42. launchpad->keyReleased(x, y);
  43. }
  44. }
  45. }
  46. }
  47. void Launchpad::setColor(unsigned char x, unsigned char y, unsigned char red, unsigned char green)
  48. {
  49. unsigned char velocity = (green << 4) + red;
  50. if(y == 8)
  51. {
  52. midiout.sendMessage(ControlChangeMessage(
  53. 0,
  54. 104 + x,
  55. velocity
  56. ));
  57. }
  58. else
  59. {
  60. midiout.sendMessage(NoteOnMessage(
  61. 0,
  62. ((7 - y) << 4) + x,
  63. velocity
  64. ));
  65. }
  66. }
  67. void Launchpad::keyPressed(unsigned char x, unsigned char y)
  68. {
  69. if(keyPressedCallback)
  70. {
  71. keyPressedCallback(x, y);
  72. }
  73. }
  74. void Launchpad::keyReleased(unsigned char x, unsigned char y)
  75. {
  76. if(keyReleasedCallback)
  77. {
  78. keyReleasedCallback(x, y);
  79. }
  80. }