PlaybackScreen.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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 < (sequencer.beats.size() / beatDisplayWidth)) {
  50. beatDisplayOffset += beatDisplayWidth;
  51. }
  52. break;
  53. case 7: // start / stop
  54. if(playing) {
  55. sequencer.player.stop();
  56. } else {
  57. sequencer.player.loop();
  58. }
  59. break;
  60. }
  61. } else {
  62. Player::BeatIndex beatIndex = x + beatDisplayOffset;
  63. if(beatIndex < sequencer.beats.size() && y < sequencer.messages.size()) {
  64. midi::MessageList& beat = sequencer.beats[beatIndex];
  65. std::cout << "before ";
  66. beat.print(std::cout);
  67. std::shared_ptr<midi::Message> msg_ptr = sequencer.messages[y];
  68. msg_ptr->print(std::cout);
  69. midi::MessageList::const_iterator beat_msg_it = beat.find(*msg_ptr);
  70. if(beat_msg_it == beat.end()) {
  71. // insert message at beat
  72. beat.push_back(msg_ptr);
  73. } else {
  74. // remove message from beat
  75. beat.erase(beat_msg_it);
  76. }
  77. std::cout << "after ";
  78. beat.print(std::cout);
  79. }
  80. }
  81. refreshAll();
  82. }
  83. void PlaybackScreen::keyReleased(unsigned char x, unsigned char y)
  84. {
  85. refreshAll();
  86. }
  87. void PlaybackScreen::refresh(unsigned char x, unsigned char y)
  88. {
  89. if(x == 8) { // very right
  90. if(y < sequencer.messages.size()) {
  91. setColor(x, y, getKeyPressed(x, y) ? colors::activeOption : colors::inactiveOption);
  92. } else {
  93. setColor(x, y, colors::dark);
  94. }
  95. } else if(y == 8) { // very top
  96. bool playing = sequencer.player.isPlaying();
  97. switch(x) {
  98. case 2: // left
  99. if(!playing && beatDisplayOffset > 0) {
  100. setColor(x, y, colors::inactiveOption);
  101. } else {
  102. setColor(x, y, colors::dark);
  103. }
  104. break;
  105. case 3: // right
  106. if(!playing && beatDisplayOffset < (sequencer.beats.size() / beatDisplayWidth)) {
  107. setColor(x, y, colors::inactiveOption);
  108. } else {
  109. setColor(x, y, colors::dark);
  110. }
  111. break;
  112. case 7: // start / stop
  113. if(playing) {
  114. setColor(x, y, colors::activeOption);
  115. } else {
  116. setColor(x, y, colors::inactiveOption);
  117. }
  118. break;
  119. }
  120. } else {
  121. Player::BeatIndex beatIndex = x + beatDisplayOffset;
  122. if(beatIndex < sequencer.beats.size() && y < sequencer.messages.size()) {
  123. midi::MessageList& beat = sequencer.beats[beatIndex];
  124. std::shared_ptr<midi::Message> msg_ptr = sequencer.messages[y];
  125. if(beat.contains(*msg_ptr)) {
  126. if(sequencer.player.getNextBeat() == beatIndex) {
  127. setColor(x, y, colors::activeMessage);
  128. } else {
  129. setColor(x, y, colors::inactiveMessage);
  130. }
  131. } else {
  132. setColor(x, y, colors::dark);
  133. }
  134. } else {
  135. setColor(x, y, colors::dark);
  136. }
  137. }
  138. }