PlaybackScreen.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "Sequencer.h"
  2. #include "PlaybackScreen.h"
  3. #include "colors.h"
  4. #include <iostream>
  5. PlaybackScreen::PlaybackScreen(Sequencer& seq)
  6. : sequencer(seq)
  7. {
  8. }
  9. void PlaybackScreen::enable()
  10. {
  11. refreshAll();
  12. parent::enable();
  13. }
  14. void PlaybackScreen::beforeBeat(Player::BeatIndex beat)
  15. {
  16. std::cout << "before beat #" << beat << std::endl;
  17. for(unsigned char y = 0; y < midi::Launchpad::height - 1; y++) {
  18. refresh(beat, y);
  19. refresh((beat - 1) % (midi::Launchpad::width - 1), y);
  20. }
  21. }
  22. void PlaybackScreen::afterBeat(Player::BeatIndex beat)
  23. {
  24. }
  25. void PlaybackScreen::keyPressed(unsigned char x, unsigned char y)
  26. {
  27. std::cout << "clicked x=" << (int)x << ", y=" << (int)y << std::endl;
  28. if(x == 8) { // very right
  29. if(y < sequencer.messages.size()) {
  30. std::shared_ptr<midi::Message> msg_ptr = sequencer.messages[y];
  31. msg_ptr->print(std::cout);
  32. sequencer.midiOut.sendMessage(*msg_ptr);
  33. }
  34. } else if(y == 8) { // very top
  35. if(x == 0) {
  36. if(sequencer.player.isPlaying()) {
  37. sequencer.player.stop();
  38. } else {
  39. sequencer.player.loop();
  40. }
  41. }
  42. } else {
  43. Player::BeatIndex beatIndex = x;
  44. if(beatIndex < sequencer.beats.size() && y < sequencer.messages.size()) {
  45. midi::MessageList& beat = sequencer.beats[beatIndex];
  46. std::cout << "before ";
  47. beat.print(std::cout);
  48. std::shared_ptr<midi::Message> msg_ptr = sequencer.messages[y];
  49. msg_ptr->print(std::cout);
  50. midi::MessageList::const_iterator beat_msg_it = beat.find(*msg_ptr);
  51. if(beat_msg_it == beat.end()) {
  52. // insert message at beat
  53. beat.push_back(msg_ptr);
  54. } else {
  55. // remove message from beat
  56. beat.erase(beat_msg_it);
  57. }
  58. std::cout << "after ";
  59. beat.print(std::cout);
  60. }
  61. }
  62. refresh(x, y);
  63. }
  64. void PlaybackScreen::keyReleased(unsigned char x, unsigned char y)
  65. {
  66. refresh(x, y);
  67. }
  68. void PlaybackScreen::refresh(unsigned char x, unsigned char y)
  69. {
  70. if(x == 8) { // very right
  71. if(y < sequencer.messages.size()) {
  72. setColor(x, y, getKeyPressed(x, y) ? colors::activeOption : colors::inactiveOption);
  73. } else {
  74. setColor(x, y, colors::dark);
  75. }
  76. } else if(y == 8) { // very top
  77. if(x == 0) {
  78. // start / stop
  79. if(sequencer.player.isPlaying()) {
  80. setColor(x, y, colors::activeOption);
  81. } else {
  82. setColor(x, y, colors::inactiveOption);
  83. }
  84. }
  85. } else {
  86. Player::BeatIndex beatIndex = x;
  87. if(beatIndex < sequencer.beats.size() && y < sequencer.messages.size()) {
  88. midi::MessageList& beat = sequencer.beats[beatIndex];
  89. std::shared_ptr<midi::Message> msg_ptr = sequencer.messages[y];
  90. if(beat.contains(*msg_ptr)) {
  91. if(sequencer.player.getNextBeat() == beatIndex) {
  92. setColor(x, y, colors::activeMessage);
  93. } else {
  94. setColor(x, y, colors::inactiveMessage);
  95. }
  96. } else {
  97. setColor(x, y, colors::dark);
  98. }
  99. } else {
  100. setColor(x, y, colors::dark);
  101. }
  102. }
  103. }
  104. void PlaybackScreen::refreshAll()
  105. {
  106. for(unsigned char x = 0; x < midi::Launchpad::width; x++) {
  107. for(unsigned char y = 0; y < midi::Launchpad::height; y++) {
  108. if(x != 8 || y != 8) {
  109. refresh(x, y);
  110. }
  111. }
  112. }
  113. }