Kaynağa Gözat

PlaybackScreen::refresh

Fabian Peter Hammerle 10 yıl önce
ebeveyn
işleme
52f9cf13ed
4 değiştirilmiş dosya ile 65 ekleme ve 12 silme
  1. 53 10
      PlaybackScreen.cpp
  2. 9 0
      PlaybackScreen.h
  3. 2 1
      Sequencer.cpp
  4. 1 1
      midi

+ 53 - 10
PlaybackScreen.cpp

@@ -7,19 +7,29 @@
 PlaybackScreen::PlaybackScreen(Sequencer& seq)
     : sequencer(seq)
 {
-    setColorAll(midi::LaunchpadColor(0, 0));
+}
+
+void PlaybackScreen::enable()
+{
+    refreshAll();
+    parent::enable();
 }
 
 void PlaybackScreen::beforeBeat(Player::BeatIndex beat)
 {
     std::cout << "before beat #" << beat << std::endl;
-    setColor(beat, 0, colors::activeMessage);
-    setColor((beat - 1) % 8, 0, colors::dark);
+    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)
 {
     std::cout << "after beat #" << beat << std::endl;
+    for(unsigned char y = 0; y < midi::Launchpad::height; y++) {
+        //refreshColor(beat, y);
+    }
 }
 
 void PlaybackScreen::keyPressed(unsigned char x, unsigned char y)
@@ -27,30 +37,63 @@ 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
-        setColor(x, y, colors::activeMessage);
-        std::shared_ptr<midi::Message> msg_ptr = sequencer.messages[y];
-        msg_ptr->print(std::cout);
-        sequencer.midiOut.sendMessage(*msg_ptr);
+        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
         if(x == 0) {
             if(sequencer.player.isPlaying()) {
                 sequencer.player.stop();
-                setColor(x, y, colors::inactiveOption);
             } else {
                 sequencer.player.loop();
-                setColor(x, y, colors::activeOption);
             }
         }
     } else {
     }
+
+    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
-        setColor(x, y, colors::inactiveMessage);
+        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 {
+        if(sequencer.player.getNextBeat() == x) {
+            setColor(x, y, colors::activeMessage);
+        } else {
+            setColor(x, y, colors::inactiveMessage);
+        }
     }
 }
 
+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);
+            }
+        }
+    }
+}

+ 9 - 0
PlaybackScreen.h

@@ -7,16 +7,25 @@ class Sequencer;
 
 class PlaybackScreen : public midi::LaunchpadScreen
 {
+    typedef midi::LaunchpadScreen parent;
+
 public:
+
     Sequencer& sequencer;
 
     PlaybackScreen(Sequencer& seq);
+    
+    void enable();
 
     void beforeBeat(Player::BeatIndex beat);
     void afterBeat(Player::BeatIndex beat);
 
 protected:
+
 	virtual void keyPressed(unsigned char x, unsigned char y);
 	virtual void keyReleased(unsigned char x, unsigned char y);
+
+    void refresh(unsigned char x, unsigned char y);
+    void refreshAll();
 };
 	

+ 2 - 1
Sequencer.cpp

@@ -2,7 +2,7 @@
 #include <iostream>
 
 Sequencer::Sequencer()
-    : launchpad(), playbackScreen(*this), messages(midi::Launchpad::height - 1),
+    : launchpad(), playbackScreen(*this), messages(),
       defaultOutputChannel(9), player(&midiOut, &beats, *this)
 {
     playbackScreen.setLaunchpad(launchpad);
@@ -15,6 +15,7 @@ void Sequencer::run()
 
     midiOut.openVirtualPort("launchpad sequencer");
 
+    messages.resize(5);
     for(int i=0; i<messages.size(); i++) {
         messages[i] = std::make_shared<midi::NoteOnMessage>(defaultOutputChannel, 20 + i * 12, 100 + i);
     }

+ 1 - 1
midi

@@ -1 +1 @@
-Subproject commit 8d32b041f56d23e428756482c46f07fb13997aa1
+Subproject commit 79ecc896dae3292ed596f18681c43bcd34c73041