Launchpad.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. bool LaunchpadColor::operator==(const LaunchpadColor& color) const
  12. {
  13. return red == color.red && green == color.green;
  14. }
  15. Launchpad::Launchpad()
  16. : midiin(), midiout(), keyPressedCallback(0), keyReleasedCallback(0)
  17. {
  18. midiin.setCallback(midiMessageCallback, (void*) this);
  19. midiout.openPort(1);
  20. midiin.openPort(0);
  21. }
  22. void Launchpad::midiMessageCallback(double timeStamp, MidiMessage &message, void *userData)
  23. {
  24. Launchpad *launchpad = (Launchpad*) userData;
  25. // use runtime type information to check for the message type.
  26. // this requires the specified class to have a virtual member.
  27. NoteMessage *noteMessage = dynamic_cast<NoteMessage*>(&message);
  28. if(noteMessage)
  29. {
  30. unsigned char x = noteMessage->pitch % 16;
  31. unsigned char y = 7 - noteMessage->pitch / 16;
  32. if(dynamic_cast<NoteOnMessage*>(noteMessage))
  33. {
  34. launchpad->keyPressed(x, y);
  35. }
  36. else
  37. {
  38. launchpad->keyReleased(x, y);
  39. }
  40. }
  41. else
  42. {
  43. ControlChangeMessage *controlChangeMessage = dynamic_cast<ControlChangeMessage*>(&message);
  44. if(controlChangeMessage)
  45. {
  46. unsigned char x = controlChangeMessage->control - 104;
  47. unsigned char y = 8;
  48. if(controlChangeMessage->value == 127)
  49. {
  50. launchpad->keyPressed(x, y);
  51. }
  52. else
  53. {
  54. launchpad->keyReleased(x, y);
  55. }
  56. }
  57. }
  58. }
  59. bool Launchpad::issetColor(unsigned char x, unsigned char y) const
  60. {
  61. return colorSet[x][y];
  62. }
  63. const LaunchpadColor& Launchpad::getColor(unsigned char x, unsigned char y) const
  64. {
  65. return colors[x][y];
  66. }
  67. void Launchpad::setColor(unsigned char x, unsigned char y, const LaunchpadColor& color)
  68. {
  69. unsigned char velocity = (color.green << 4) + color.red;
  70. if(y == 8)
  71. {
  72. midiout.sendMessage(ControlChangeMessage(
  73. 0,
  74. 104 + x,
  75. velocity
  76. ));
  77. }
  78. else
  79. {
  80. midiout.sendMessage(NoteOnMessage(
  81. 0,
  82. ((7 - y) << 4) + x,
  83. velocity
  84. ));
  85. }
  86. colors[x][y] = color;
  87. colorSet[x][y] = true;
  88. }
  89. void Launchpad::keyPressed(unsigned char x, unsigned char y)
  90. {
  91. if(keyPressedCallback)
  92. {
  93. keyPressedCallback(x, y);
  94. }
  95. }
  96. void Launchpad::keyReleased(unsigned char x, unsigned char y)
  97. {
  98. if(keyReleasedCallback)
  99. {
  100. keyReleasedCallback(x, y);
  101. }
  102. }