Fabian Peter Hammerle пре 10 година
родитељ
комит
8f2c609828
3 измењених фајлова са 97 додато и 1 уклоњено
  1. 5 1
      CMakeLists.txt
  2. 83 0
      Loop.h
  3. 9 0
      main.cpp

+ 5 - 1
CMakeLists.txt

@@ -1,3 +1,7 @@
-cmake_minimum_required (VERSION 2.6)
+cmake_minimum_required (VERSION 2.8.0)
 project (launchpad-sequencer)
+include_directories("${CMAKE_SOURCE_DIR}")
+add_definitions(-pthread)
+add_definitions(-std=c++11)
+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
 add_executable(launchpad-sequencer main.cpp)

+ 83 - 0
Loop.h

@@ -0,0 +1,83 @@
+#include <iostream>
+#include <thread>
+#include <mutex>
+#include <chrono>
+
+class Loop
+{
+    std::thread loopThread;
+    std::chrono::milliseconds lastBeatTime; 
+    unsigned short bpm;
+    std::mutex bpmLock;
+    bool stopNext;
+
+public:
+    bool enabled;
+
+    Loop()
+        : bpm(60), stopNext(false), enabled(false), loopThread(&Loop::loop, this)
+    {
+    }
+
+    ~Loop()
+    {
+        stopNext = true;
+        loopThread.join();
+    }
+
+    void setBpm(unsigned short b)
+    {
+        bpmLock.lock();
+        bpm = b;
+        bpmLock.unlock();
+    }
+
+    unsigned short getBpm()
+    {
+        bpmLock.lock();
+        unsigned short r = bpm;
+        bpmLock.unlock();
+        return r;
+    }
+
+    std::chrono::milliseconds getBeatDuration()
+    {
+        return std::chrono::milliseconds(
+                (long long)((double)60 * 1000 / bpm)
+                );
+    }
+
+    void start()
+    {
+        enabled = true;
+    }
+
+    void stop()
+    {
+        enabled = false;
+    }
+
+private:
+    std::chrono::milliseconds getMillisecondsSinceEpoch()
+    {
+        std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
+        std::chrono::system_clock::duration duration = now.time_since_epoch();
+        return std::chrono::duration_cast<std::chrono::milliseconds>(duration);
+    }
+
+    void beat() 
+    {
+        std::cout << "\a" << lastBeatTime.count() << std::endl;
+    }
+
+    void loop()
+    {
+        while(!stopNext) {
+            if((getMillisecondsSinceEpoch() - lastBeatTime) >= getBeatDuration()) {
+                lastBeatTime = getMillisecondsSinceEpoch();
+                beat();
+            }
+        }
+    }
+};
+

+ 9 - 0
main.cpp

@@ -1,7 +1,16 @@
 #include <iostream>
+#include <Loop.h>
 
 int main() 
 {
+    Loop loop;
+    loop.start();
+
+    loop.setBpm(60);
+    std::this_thread::sleep_for(std::chrono::milliseconds(2000));
+    loop.setBpm(120);
+    std::this_thread::sleep_for(std::chrono::milliseconds(2000));
+
     return 0;
 }