123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #include "Sequencer.h"
- #include "PlaybackScreen.h"
- #include "colors.h"
- #include <iostream>
- PlaybackScreen::PlaybackScreen(Sequencer& seq)
- : parent(seq), beatDisplayOffset(0)
- {
- }
- void PlaybackScreen::enable()
- {
- if(sequencer.beats.size() == 0) {
- beatDisplayOffset = 0;
- } else {
- beatDisplayOffset = std::min(
- beatDisplayOffset,
- (Player::BeatIndex)(sequencer.beats.size() - 1) / beatDisplayWidth * beatDisplayWidth
- );
- }
- refreshAll();
- parent::enable();
- }
- void PlaybackScreen::beforeBeat(Player::BeatIndex beat)
- {
- std::cout << "before beat #" << beat << std::endl;
- beatDisplayOffset = beat / beatDisplayWidth * beatDisplayWidth;
- refreshAll();
- }
- void PlaybackScreen::afterBeat(Player::BeatIndex beat)
- {
- }
- void PlaybackScreen::keyPressed(unsigned char x, unsigned char y)
- {
- std::cout << "clicked x=" << (int)x << ", y=" << (int)y << std::endl;
- if(x == 8) { // very right
- if(y < sequencer.messages.size()) {
- std::shared_ptr<midi::Message> msg_ptr = sequencer.messages[y];
- msg_ptr->print(std::cout);
- sequencer.midiOut.sendMessage(*msg_ptr);
- }
- } else if(y == 8) { // very top
- bool playing = sequencer.player.isPlaying();
- switch(x) {
- case 2: // left
- if(!playing && beatDisplayOffset > 0) {
- beatDisplayOffset = std::max((Player::BeatIndex)0, beatDisplayOffset - beatDisplayWidth);
- }
- break;
- case 3: // right
- if(!playing && beatDisplayOffset < (sequencer.beats.size() / beatDisplayWidth)) {
- beatDisplayOffset += beatDisplayWidth;
- }
- break;
- case 7: // start / stop
- if(playing) {
- sequencer.player.stop();
- } else {
- sequencer.player.loop();
- }
- break;
- }
- } else {
- Player::BeatIndex beatIndex = x + beatDisplayOffset;
- if(beatIndex < sequencer.beats.size() && y < sequencer.messages.size()) {
- midi::MessageList& beat = sequencer.beats[beatIndex];
- std::cout << "before ";
- beat.print(std::cout);
- std::shared_ptr<midi::Message> msg_ptr = sequencer.messages[y];
- msg_ptr->print(std::cout);
- midi::MessageList::const_iterator beat_msg_it = beat.find(*msg_ptr);
- if(beat_msg_it == beat.end()) {
- // insert message at beat
- beat.push_back(msg_ptr);
- } else {
- // remove message from beat
- beat.erase(beat_msg_it);
- }
- std::cout << "after ";
- beat.print(std::cout);
- }
- }
- refreshAll();
- }
- void PlaybackScreen::keyReleased(unsigned char x, unsigned char y)
- {
- refreshAll();
- }
- void PlaybackScreen::refresh(unsigned char x, unsigned char y)
- {
- if(x == 8) { // very right
- if(y < sequencer.messages.size()) {
- setColor(x, y, getKeyPressed(x, y) ? colors::activeOption : colors::inactiveOption);
- } else {
- setColor(x, y, colors::dark);
- }
- } else if(y == 8) { // very top
- bool playing = sequencer.player.isPlaying();
- switch(x) {
- case 2: // left
- if(!playing && beatDisplayOffset > 0) {
- setColor(x, y, colors::inactiveOption);
- } else {
- setColor(x, y, colors::dark);
- }
- break;
- case 3: // right
- if(!playing && beatDisplayOffset < (sequencer.beats.size() / beatDisplayWidth)) {
- setColor(x, y, colors::inactiveOption);
- } else {
- setColor(x, y, colors::dark);
- }
- break;
- case 7: // start / stop
- if(playing) {
- setColor(x, y, colors::activeOption);
- } else {
- setColor(x, y, colors::inactiveOption);
- }
- break;
- }
- } else {
- Player::BeatIndex beatIndex = x + beatDisplayOffset;
- if(beatIndex < sequencer.beats.size() && y < sequencer.messages.size()) {
- midi::MessageList& beat = sequencer.beats[beatIndex];
- std::shared_ptr<midi::Message> msg_ptr = sequencer.messages[y];
- if(beat.contains(*msg_ptr)) {
- if(sequencer.player.getNextBeat() == beatIndex) {
- setColor(x, y, colors::activeMessage);
- } else {
- setColor(x, y, colors::inactiveMessage);
- }
- } else {
- setColor(x, y, colors::dark);
- }
- } else {
- setColor(x, y, colors::dark);
- }
- }
- }
|