PlaybackScreen.cpp 5.0 KB

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