Launchpad.cpp 1.9 KB

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