Config nodes do what they should do now. UX is still off, modifier keys do different things on MidiNodes and ConfigNodes.

This commit is contained in:
Sebastian
2024-12-08 14:21:46 +01:00
parent 558829f619
commit 3b08037f92
8 changed files with 106 additions and 131 deletions
+2 -5
View File
@@ -70,14 +70,11 @@ namespace VISEQ::APP {
} }
int highest_id = 0; int highest_id = 0;
Node hid;
for(auto n : graph.at("gm").at("nodes")){ for(auto n : graph.at("gm").at("nodes")){
std::cout << n << std::endl; std::cout << n << std::endl;
if(n.is_object()){ if(n.is_object()){
Node mn = n.template get<Node>(); if(n.at("id").get<int>() > highest_id) {
if(mn.id > highest_id) { highest_id = n.at("id").get<int>();
highest_id = mn.id;
hid = mn;
} }
} }
} }
+7 -16
View File
@@ -12,7 +12,7 @@ namespace VISEQ::GRAPH::NODES {
class ConfigNode : public Node{ class ConfigNode : public Node{
public: public:
ConfigNode() : Node() {std::cout << "ConfigNode Constructor std" << std::endl;} ConfigNode() {std::cout << "ConfigNode Constructor std" << std::endl;}
ConfigNode(Vec2Df position) : Node(position) {} ConfigNode(Vec2Df position) : Node(position) {}
std::shared_ptr<ConfigNode> getPtr(){ std::shared_ptr<ConfigNode> getPtr(){
@@ -32,11 +32,13 @@ namespace VISEQ::GRAPH::NODES {
float radius = 20.0f; float radius = 20.0f;
virtual NodeType getNodeType() const override {return nodeType;} virtual NodeType getNodeType() const override {return nodeType;}
int GGate(){ virtual void trigger() override {}
return 0;
virtual void setMode(int _mode) override {
mode = _mode;
} }
MIDI::MidiNote getNotes(){ MIDI::MidiNote getNotes(){
return midiNote; return midiNote;
} }
@@ -66,19 +68,8 @@ namespace VISEQ::GRAPH::NODES {
mode = state->node_mode; mode = state->node_mode;
} }
/*std::vector<std::weak_ptr<MidiNode>> getConnectedMidiNodes(){*/
/* auto midi_conns = connections | RANGE_FILTER([](EDGES::SPTR_Edge c){ return c->start.lock()->getNodeType() == NodeType::MIDINODE || c->end.lock()->getNodeType() == NodeType::MIDINODE;}) | std::ranges::to<std::vector<std::shared_ptr<EDGES::Edge>>>();*/
/* std::vector<std::weak_ptr<MidiNode>> midi_nodes;*/
/* for(auto e : midi_conns){*/
/* if(e->start.lock()->getNodeType() == NodeType::MIDINODE) midi_nodes.push_back(std::dynamic_pointer_cast<MidiNode>(e->start.lock()));*/
/* if(e->end.lock()->getNodeType() == NodeType::MIDINODE) midi_nodes.push_back(std::dynamic_pointer_cast<MidiNode>(e->end.lock()));*/
/* }*/
/* return midi_nodes;*/
/*}*/
void interact(){ void interact(){
float wheel = GetMouseWheelMove(); float wheel = GetMouseWheelMove();
/*auto midi_nodes = getConnectedMidiNodes();*/
if(KEYS_DOWN.ctrl && !KEYS_DOWN.alt){ if(KEYS_DOWN.ctrl && !KEYS_DOWN.alt){
switch(state->node_mode){ switch(state->node_mode){
+69 -77
View File
@@ -1,6 +1,5 @@
#pragma once #pragma once
#include <filesystem>
#ifdef _WIN32 #ifdef _WIN32
#define _USE_MATH_DEFINES #define _USE_MATH_DEFINES
#endif #endif
@@ -42,10 +41,10 @@ namespace VISEQ::GRAPH{
namespace VISEQ::MIDI{ namespace VISEQ::MIDI{
struct MidiNote{ struct MidiNote{
int channel = 1; int channel = 0;
int note = 48; int note = 0;
int velocity = 60; int velocity = 0;
int gate = 10; // gate time in milliseconds int gate = 0; // gate time in milliseconds
}; };
struct MidiCC{ struct MidiCC{
@@ -87,6 +86,11 @@ namespace VISEQ::MIDI{
int number; int number;
}; };
inline std::ostream& operator<<(std::ostream& os, const MidiNote note){
os << "note: " << note.note << " channel: " << note.channel << " velocity: " << note.velocity << " gate: " << note.gate;
return os;
}
inline MidiNote operator+(const MidiNote left, const MidiNote right){ inline MidiNote operator+(const MidiNote left, const MidiNote right){
MidiNote added; MidiNote added;
added.note = left.note + right.note; added.note = left.note + right.note;
@@ -181,102 +185,90 @@ namespace VISEQ::MIDI{
return added; return added;
} }
// UNARY // COMPOUND
inline MidiNote operator+=(const MidiNote left, const MidiNote right){ inline MidiNote& operator+=(MidiNote& left, const MidiNote& right){
MidiNote added; left.note += right.note;
added.note = left.note + right.note; left.channel += right.channel;
added.channel = left.channel + right.channel; left.gate += right.gate;
added.gate = left.gate + right.gate; left.velocity += right.velocity;
added.velocity = left.velocity + right.velocity; return left;
return added;
} }
inline MidiCC operator+=(const MidiCC left, const MidiCC right){ inline MidiCC& operator+=(MidiCC& left, const MidiCC right){
MidiCC added; left.channel += right.channel;
added.channel = left.channel + right.channel; left.control += right.control;
added.control = left.control + right.control; left.value += right.value;
added.value = left.value+ right.value; return left;
return added;
} }
inline MidiPC operator+=(const MidiPC left, const MidiPC right){ inline MidiPC& operator+=(MidiPC& left, const MidiPC right){
MidiPC added; left.channel += right.channel;
added.channel = left.channel + right.channel; left.program += right.program;
added.program = left.program + right.program; left.value += right.value;
added.value = left.value+ right.value; return left;
return added;
} }
inline MidiPitchBend operator+=(const MidiPitchBend left, const MidiPitchBend right){ inline MidiPitchBend& operator+=(MidiPitchBend& left, const MidiPitchBend right){
MidiPitchBend added; left.channel += right.channel;
added.channel = left.channel + right.channel; left.value += right.value;
added.value = left.value+ right.value; return left;
return added;
} }
inline MidiAftertouch operator+=(const MidiAftertouch left, const MidiAftertouch right){ inline MidiAftertouch& operator+=(MidiAftertouch& left, const MidiAftertouch right){
MidiAftertouch added; left.channel += right.channel;
added.channel = left.channel + right.channel; left.value += right.value;
added.value = left.value+ right.value; return left;
return added;
} }
inline MidiPolyPressure operator+=(const MidiPolyPressure left, const MidiPolyPressure right){ inline MidiPolyPressure& operator+=(MidiPolyPressure& left, const MidiPolyPressure right){
MidiPolyPressure added; left.channel += right.channel;
added.channel = left.channel + right.channel; left.note += right.note;
added.note = left.note + right.note; left.value += right.value;
added.value = left.value+ right.value; return left;
return added;
} }
inline MidiNote operator-=(const MidiNote left, const MidiNote right){
MidiNote added; inline MidiNote& operator-=(MidiNote& left, const MidiNote& right){
added.note = left.note - right.note; left.note -= right.note;
added.channel = left.channel - right.channel; left.channel -= right.channel;
added.gate = left.gate - right.gate; left.gate -= right.gate;
added.velocity = left.velocity - right.velocity; left.velocity -= right.velocity;
return added; return left;
} }
inline MidiCC operator-=(const MidiCC left, const MidiCC right){ inline MidiCC& operator-=(MidiCC& left, const MidiCC right){
MidiCC added; left.channel -= right.channel;
added.channel = left.channel - right.channel; left.control -= right.control;
added.control = left.control - right.control; left.value -= right.value;
added.value = left.value- right.value; return left;
return added;
} }
inline MidiPC operator-=(const MidiPC left, const MidiPC right){ inline MidiPC& operator-=(MidiPC& left, const MidiPC right){
MidiPC added; left.channel -= right.channel;
added.channel = left.channel - right.channel; left.program -= right.program;
added.program = left.program - right.program; left.value -= right.value;
added.value = left.value- right.value; return left;
return added;
} }
inline MidiPitchBend operator-=(const MidiPitchBend left, const MidiPitchBend right){ inline MidiPitchBend& operator-=(MidiPitchBend& left, const MidiPitchBend right){
MidiPitchBend added; left.channel -= right.channel;
added.channel = left.channel - right.channel; left.value -= right.value;
added.value = left.value- right.value; return left;
return added;
} }
inline MidiAftertouch operator-=(const MidiAftertouch left, const MidiAftertouch right){ inline MidiAftertouch& operator-=(MidiAftertouch& left, const MidiAftertouch right){
MidiAftertouch added; left.channel -= right.channel;
added.channel = left.channel - right.channel; left.value -= right.value;
added.value = left.value- right.value; return left;
return added;
} }
inline MidiPolyPressure operator-=(const MidiPolyPressure left, const MidiPolyPressure right){ inline MidiPolyPressure& operator-=(MidiPolyPressure& left, const MidiPolyPressure right){
MidiPolyPressure added; left.channel -= right.channel;
added.channel = left.channel - right.channel; left.note -= right.note;
added.note = left.note - right.note; left.value -= right.value;
added.value = left.value- right.value; return left;
return added;
} }
/*Vec2D<T> operator*(const Vec2D<T> left, T scalar){*/ /*Vec2D<T> operator*(const Vec2D<T> left, T scalar){*/
/* return Vec2D<T>(left.x * scalar, left.y * scalar);*/ /* return Vec2D<T>(left.x * scalar, left.y * scalar);*/
/*};*/ /*};*/
+9 -4
View File
@@ -125,6 +125,8 @@ namespace VISEQ::GRAPH {
void copyNodes(VEC_SPTR_Node _nodes, Vec2Df position){ void copyNodes(VEC_SPTR_Node _nodes, Vec2Df position){
for(auto n: _nodes){ for(auto n: _nodes){
nodes.insert(nodes.end(), std::make_shared<Node>(*n)); nodes.insert(nodes.end(), std::make_shared<Node>(*n));
/*if(n->getNodeType() == NodeType::MIDINODE) nodes.insert(nodes.end(), std::make_shared<MidiNode>(*n));*/
/*if(n->getNodeType() == NodeType::CONFIGNODE) nodes.insert(nodes.end(), std::make_shared<ConfigNode>(*n));*/
nodes.back()->setPosition(position + nodes.back()->drag_offset); nodes.back()->setPosition(position + nodes.back()->drag_offset);
nodes.back()->selected = false; nodes.back()->selected = false;
} }
@@ -141,8 +143,9 @@ namespace VISEQ::GRAPH {
VEC_SPTR_Node getCopiesOfSelectedNodes(){ VEC_SPTR_Node getCopiesOfSelectedNodes(){
VEC_SPTR_Node copied_nodes; VEC_SPTR_Node copied_nodes;
for(auto n : selected_nodes){ for(auto n : selected_nodes){
// if(n->getNodeType() == NodeType::MIDINODE) copied_nodes.insert(copied_nodes.end(), std::make_shared<MidiNode>(*n));
copied_nodes.insert(copied_nodes.end(), std::make_shared<Node>(*n)); copied_nodes.insert(copied_nodes.end(), std::make_shared<Node>(*n));
/*if(n->getNodeType() == NodeType::MIDINODE) copied_nodes.insert(copied_nodes.end(), std::make_shared<MidiNode>(*n));*/
/*if(n->getNodeType() == NodeType::CONFIGNODE) copied_nodes.insert(copied_nodes.end(), std::make_shared<ConfigNode>(*n));*/
copied_nodes.back()->deselect(); copied_nodes.back()->deselect();
} }
return copied_nodes; return copied_nodes;
@@ -151,6 +154,8 @@ namespace VISEQ::GRAPH {
SPTR_Node copyNode(SPTR_Node n, Vec2Df position){ SPTR_Node copyNode(SPTR_Node n, Vec2Df position){
std::cout << "copy basenode" << std::endl; std::cout << "copy basenode" << std::endl;
nodes.insert(nodes.end(), std::make_shared<Node>(*n)); nodes.insert(nodes.end(), std::make_shared<Node>(*n));
/*if(n->getNodeType() == NodeType::MIDINODE) nodes.insert(nodes.end(), std::make_shared<MidiNode>(*n));*/
/*if(n->getNodeType() == NodeType::CONFIGNODE) nodes.insert(nodes.end(), std::make_shared<ConfigNode>(*n));*/
nodes.back()->setPosition(position); nodes.back()->setPosition(position);
return nodes.back(); return nodes.back();
} }
@@ -165,7 +170,7 @@ namespace VISEQ::GRAPH {
void setNodeMode(int mode){ void setNodeMode(int mode){
for(auto n: nodes){ for(auto n: nodes){
n->SMode(mode); n->setMode(mode);
} }
} }
@@ -378,10 +383,10 @@ namespace VISEQ::GRAPH {
float midi_gate_v2 = 0.0f; float midi_gate_v2 = 0.0f;
if(c->start.lock()->getNodeType() == NodeType::MIDINODE){ if(c->start.lock()->getNodeType() == NodeType::MIDINODE){
midi_gate_v1 = Clamp((4.f / 1000.f) * std::dynamic_pointer_cast<MidiNode>(c->start.lock())->GGate(), 1.f, 4.f); midi_gate_v1 = Clamp((4.f / 1000.f) * std::dynamic_pointer_cast<MidiNode>(c->start.lock())->getNotes().gate, 1.f, 4.f);
} }
if(c->end.lock()->getNodeType() == NodeType::MIDINODE){ if(c->end.lock()->getNodeType() == NodeType::MIDINODE){
midi_gate_v2 = Clamp((4.f / 1000.f) * std::dynamic_pointer_cast<MidiNode>(c->end.lock())->GGate(), 1.f, 4.f); midi_gate_v2 = Clamp((4.f / 1000.f) * std::dynamic_pointer_cast<MidiNode>(c->end.lock())->getNotes().gate, 1.f, 4.f);
} }
// Line with small connector circles // Line with small connector circles
if(c->end.lock()->getNodeType() == NodeType::MIDINODE && c->start.lock()->getNodeType() == NodeType::MIDINODE){ if(c->end.lock()->getNodeType() == NodeType::MIDINODE && c->start.lock()->getNodeType() == NodeType::MIDINODE){
+7 -23
View File
@@ -34,7 +34,7 @@ namespace VISEQ::GRAPH::NODES {
bool enabled; bool enabled;
}; };
MidiNode() : Node() {std::cout << "MidiNode Constructor std" << std::endl;} MidiNode() {std::cout << "MidiNode Constructor std" << std::endl;}
MidiNode(Vec2Df position) : Node(position) {} MidiNode(Vec2Df position) : Node(position) {}
NodeType nodeType = NodeType::MIDINODE; NodeType nodeType = NodeType::MIDINODE;
@@ -53,10 +53,6 @@ namespace VISEQ::GRAPH::NODES {
bool gui_midi_velocity_edit = false; bool gui_midi_velocity_edit = false;
bool gui_midi_gate_edit = false; bool gui_midi_gate_edit = false;
bool triggered = false;
int mode = 0;
float start = 0; float start = 0;
float fade = 0; float fade = 0;
float time = 0; float time = 0;
@@ -75,23 +71,18 @@ namespace VISEQ::GRAPH::NODES {
void trigger() override { void trigger() override {
triggered = true; triggered = true;
start = GetTime(); start = GetTime();
fade = midiNote.gate; fade = getNotes().gate;
} }
void SMode(int _mode) override{ void setMode(int _mode) override {
mode = _mode; mode = _mode;
} }
int GGate(){
return midiNote.gate;
}
MIDI::MidiNote getNotes() const { MIDI::MidiNote getNotes() const {
MIDI::MidiNote cNote; MIDI::MidiNote cNote;
for(auto cn : getConnectedConfigNodes()){ for(auto cn : getConnectedConfigNodes()){
cNote += cn.lock()->getNotes(); cNote += cn.lock()->getNotes();
} }
std::cout << cNote.note << std::endl;
return midiNote + cNote; return midiNote + cNote;
} }
@@ -142,6 +133,7 @@ namespace VISEQ::GRAPH::NODES {
if(e->start.lock()->getNodeType() == NodeType::CONFIGNODE) config_nodes.push_back(std::dynamic_pointer_cast<ConfigNode>(e->start.lock())); if(e->start.lock()->getNodeType() == NodeType::CONFIGNODE) config_nodes.push_back(std::dynamic_pointer_cast<ConfigNode>(e->start.lock()));
if(e->end.lock()->getNodeType() == NodeType::CONFIGNODE) config_nodes.push_back(std::dynamic_pointer_cast<ConfigNode>(e->end.lock())); if(e->end.lock()->getNodeType() == NodeType::CONFIGNODE) config_nodes.push_back(std::dynamic_pointer_cast<ConfigNode>(e->end.lock()));
} }
/*std::cout << "id: " << id << " n cn: " << config_nodes.size() << std::endl;*/
return config_nodes; return config_nodes;
} }
@@ -150,14 +142,6 @@ namespace VISEQ::GRAPH::NODES {
mode = state->node_mode; mode = state->node_mode;
} }
int getMidiNote(){
int mod_notes = 0;
for(auto cn : getConnectedConfigNodes()){
mod_notes += cn.lock()->midiNote.note;
}
return midiNote.note + mod_notes;
}
void modMidiNote(int incr){ void modMidiNote(int incr){
midiNote.note += incr; midiNote.note += incr;
if(midiNote.note < 0 ) midiNote.note = VISEQ::MIDI::Notes.size()-1; if(midiNote.note < 0 ) midiNote.note = VISEQ::MIDI::Notes.size()-1;
@@ -223,7 +207,7 @@ namespace VISEQ::GRAPH::NODES {
last = time; last = time;
time = GetTime(); time = GetTime();
if(time - start >= (float)midiNote.gate / 1000.0f){ if(time - start >= (float)getNotes().gate / 1000.0f){
triggered = false; triggered = false;
fade = 0; fade = 0;
} else { } else {
@@ -231,10 +215,10 @@ namespace VISEQ::GRAPH::NODES {
} }
DrawRing(position, radius, radius+4, 0, 360, 24, (Color){60, 60, 60, 255}); DrawRing(position, radius, radius+4, 0, 360, 24, (Color){60, 60, 60, 255});
DrawRing(position, radius, radius+4, 0.0f - 90.0f, (360.0f/127.0f) * midiNote.velocity - 90.0f, 24, (Color){158, 134, 200, 255}); DrawRing(position, radius, radius+4, 0.0f - 90.0f, (360.0f/127.0f) * getNotes().velocity - 90.0f, 24, (Color){158, 134, 200, 255});
DrawCircleLinesV(position, radius + 4, (Color){100, 100, 100, 255}); DrawCircleLinesV(position, radius + 4, (Color){100, 100, 100, 255});
float midi_gate_map = round((255.f / midiNote.gate) * fade); float midi_gate_map = round((255.f / getNotes().gate) * fade);
Color gate_color = VS_COLOR_GREEN; Color gate_color = VS_COLOR_GREEN;
+6 -4
View File
@@ -37,6 +37,12 @@ namespace VISEQ::GRAPH::NODES {
float radius = 15.0f; float radius = 15.0f;
bool config = false; bool config = false;
bool triggered = false;
int mode = 0;
virtual void trigger() {}
virtual void setMode(int _mode) {mode = _mode;}
std::shared_ptr<Node> getPtr(){ std::shared_ptr<Node> getPtr(){
return shared_from_this(); return shared_from_this();
} }
@@ -54,11 +60,7 @@ namespace VISEQ::GRAPH::NODES {
} }
virtual NodeType getNodeType() const {return nodeType;} virtual NodeType getNodeType() const {return nodeType;}
virtual void SMode(int mode) {};
virtual void trigger() {};
void deselect() override { void deselect() override {
selected = false; selected = false;
} }
-1
View File
@@ -1,7 +1,6 @@
#pragma once #pragma once
#include <raylib.h> #include <raylib.h>
#include <string>
#include "moveable.h" #include "moveable.h"
#include "node.h" #include "node.h"
+6 -1
View File
@@ -113,7 +113,12 @@ namespace VISEQ::GRAPH::NODES {
inline void from_json(const json& j, std::shared_ptr<Node>& N){ inline void from_json(const json& j, std::shared_ptr<Node>& N){
std::cout << "SPTR_Node" << std::endl; std::cout << "SPTR_Node" << std::endl;
N.reset(new Node(j.get<Node>())); if(N->getNodeType() == NodeType::MIDINODE){
N.reset(new MidiNode(j.get<MidiNode>()));
}
if(N->getNodeType() == NodeType::CONFIGNODE){
N.reset(new ConfigNode(j.get<ConfigNode>()));
}
} }
} }