#include "Sequencer.h" #include "PlaybackScreen.h" #include "colors.h" #include PlaybackScreen::PlaybackScreen(Sequencer& seq) : sequencer(seq) { } void PlaybackScreen::enable() { refreshAll(); parent::enable(); } void PlaybackScreen::beforeBeat(Player::BeatIndex beat) { std::cout << "before beat #" << beat << std::endl; for(unsigned char y = 0; y < midi::Launchpad::height - 1; y++) { refresh(beat, y); refresh((beat - 1) % (midi::Launchpad::width - 1), y); } } 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 msg_ptr = sequencer.messages[y]; msg_ptr->print(std::cout); sequencer.midiOut.sendMessage(*msg_ptr); } } else if(y == 8) { // very top if(x == 0) { if(sequencer.player.isPlaying()) { sequencer.player.stop(); } else { sequencer.player.loop(); } } } else { Player::BeatIndex beatIndex = x; 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 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); } } refresh(x, y); } void PlaybackScreen::keyReleased(unsigned char x, unsigned char y) { refresh(x, y); } 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 if(x == 0) { // start / stop if(sequencer.player.isPlaying()) { setColor(x, y, colors::activeOption); } else { setColor(x, y, colors::inactiveOption); } } } else { Player::BeatIndex beatIndex = x; if(beatIndex < sequencer.beats.size() && y < sequencer.messages.size()) { midi::MessageList& beat = sequencer.beats[beatIndex]; std::shared_ptr 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); } } } void PlaybackScreen::refreshAll() { for(unsigned char x = 0; x < midi::Launchpad::width; x++) { for(unsigned char y = 0; y < midi::Launchpad::height; y++) { if(x != 8 || y != 8) { refresh(x, y); } } } }