Files
viseq/src/signal-manager.h
T

110 lines
2.5 KiB
C++
Raw Normal View History

#pragma once
#include "connection-manager.h"
#include "datatypes.h"
#include "node-manager.h"
#include "signal.h"
#include "node.h"
#include "midi.h"
#include <chrono>
#include <thread>
class SignalManager{
public:
2024-10-25 16:41:37 +02:00
SignalManager() {}
SignalManager(NodeManager *nm, ConnectionManager *cm, std::mutex *mutex) : mutex(mutex), cm(cm), nm(nm) {}
2024-10-25 16:41:37 +02:00
Midi midi;
std::mutex *mutex;
ConnectionManager *cm;
NodeManager *nm;
std::vector<Signal> signals;
bool loop = true;
bool play = false;
void pause(){
play = false;
}
void stop(){
play = false;
reset();
}
void start(){
play = true;
}
void reset(){
for(auto &s : signals){
s.position = nm->nodes[s.start].position + Vec2D<float>{0.1, 0.1};
s.next = s.start;
s.last = s.start;
}
cm->reset();
}
void startSignalThread(){
std::thread t1(&SignalManager::updateSignals, this);
t1.detach();
}
void stopSignalThread(){
loop = false;
}
2024-10-25 16:41:37 +02:00
void addSignalAtNode(int node_id){
Color c = {(unsigned char)(232 - (rand() % 120)), 50, (unsigned char)(20 + (int)(rand() % 120)), 255};
signals.emplace(signals.end(), Signal(nm->nodes[node_id].position.x+1, nm->nodes[node_id].position.y+1, 5.0f, 0, c)); // position + 1 or else it does not render. why? no idea!
signals.back().next = node_id;
signals.back().last = node_id;
signals.back().start = node_id;
}
void removeSignal(int n){
signals.erase(signals.begin() + n);
}
void updateSignals(){
auto last = std::chrono::steady_clock::now();
while(loop){
std::chrono::duration<double, std::micro> diff = std::chrono::steady_clock::now() - last;
if(diff.count() > 500){
2024-10-25 16:46:28 +02:00
mutex->lock();
if(play){
for(auto& s : signals){
s.direction = (nm->nodes[s.next].position - s.position).norm();
s.update(diff.count());
if(s.position.dist(&nm->nodes[s.next].position) < 1.0f) {
int n = cm->next(s.next, s.last);
if(n != s.next && n != -1) {
for(auto &m : nm->nodes[s.next].midi_outs){
if(m.second.enabled) midi.note(m.second.i, nm->nodes[s.next].midi_channel, nm->nodes[s.next].midi_note, nm->nodes[s.next].midi_velocity, nm->nodes[s.next].midi_gate);
}
s.last = s.next;
s.next = n;
}
}
}
}
2024-10-25 16:46:28 +02:00
midi.update();
mutex->unlock();
last = std::chrono::steady_clock::now();
}
}
}
void drawSignals(Vec2D<float> *mouse_pos, Camera2D *camera){
for(auto& s : signals){
s.draw(mouse_pos, camera);
}
}
};