From 0d942b6677b76ed627d05f05696d85242efd0497 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sat, 19 Oct 2024 04:08:46 +0200 Subject: [PATCH] midi channel selection yeah :) - midi send message no :( --- src/main.cpp | 44 +++++++++++++----------------- src/midi.h | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/moveable.h | 4 ++- src/node.h | 9 +++++++ 4 files changed, 102 insertions(+), 27 deletions(-) create mode 100644 src/midi.h diff --git a/src/main.cpp b/src/main.cpp index 62a8cbb..38e37c8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,30 +25,22 @@ #include "raygui/raygui.h" #include "raygui/dark/style_dark.h" -#include "libremidi/libremidi.hpp" -#include "libremidi/message.hpp" -#include "libremidi/observer_configuration.hpp" - #include #include #include +#include "midi.h" #include "node.h" #include "signal.h" #include "connection-manager.h" -libremidi::observer obs; -std::vector midi_outs; -libremidi::midi_out midi_out; - -std::vector midi_in_ports; -std::vector midi_out_ports; - std::vector nodes; std::vector signals; ConnectionManager cm; +Midi midi; + Vec2D mouse_pos; Vec2D drag_start; @@ -79,7 +71,7 @@ int main(){ app.width = GetMonitorWidth(monitor); app.height = GetMonitorHeight(monitor); - Camera2D camera = { 0 }; + Camera2D camera = { {0} }; camera.target = (Vector2){ app.width/2.0f, app.height/2.0f }; camera.offset = (Vector2){ app.width/2.0f, app.height/2.0f }; camera.rotation = 0.0f; @@ -89,17 +81,9 @@ int main(){ ToggleFullscreen(); - for(const libremidi::input_port& port : obs.get_input_ports()){ - midi_in_ports.push_back(port); - } - - for(const libremidi::output_port& port : obs.get_output_ports()){ - midi_out_ports.push_back(port); - } for(int i = 0; i < 10; i++){ nodes.emplace(nodes.end(), Node((float)(rand() % app.width*0.5 + app.width*0.25), (float)(rand() % app.height*0.5 + app.height*0.25), 15.0f)); - std::cout << nodes.back().position.x << " " << nodes.back().position.y << std::endl; } @@ -109,8 +93,6 @@ int main(){ signals[i].last = &nodes.front(); } - midi_out.open_port(midi_out_ports[2]); - Vec2D drag_offset; Node* connecting_from = nullptr; @@ -208,11 +190,13 @@ int main(){ s.direction = (s.next->position - s.position).norm(); if(s.position.dist(&s.next->position) < s.speed * 1.5) { Node* n = cm.next(s.next, s.last); + if(n != s.next && n != nullptr) { + midi.note(s.next->midi_out, 1, 50, 50, 500); s.last = s.next; s.next = n; - std::cout << s.last << " " << s.next << std::endl; - midi_out.send_message(libremidi::channel_events::control_change(2, 10, 50)); + //std::cout << s.last << " " << s.next << std::endl; + //midi_out.send_message(libremidi::channel_events::control_change(2, 10, 50)); } } s.draw(&mouse_pos); @@ -229,10 +213,18 @@ int main(){ for(auto& n : nodes){ if(n.config){ - n.config = !GuiWindowBox((Rectangle){n.position.x + 10, n.position.y + 10,200,300}, "config"); + n.config = !GuiWindowBox((Rectangle){n.position.x + 10, n.position.y + 10,240,300}, "config"); int option = n.mode; - GuiComboBox((Rectangle){ n.position.x + 20, n.position.y + 40, 200, 20 }, "Round Robin;Random", &option); + GuiComboBox((Rectangle){ n.position.x + 20, n.position.y + 40, 220, 20 }, "Round Robin;Random", &option); n.mode = (Distribution)option; + std::string toggle_out_ports = ""; + for(auto& mo : midi.midi_out_ports){ + toggle_out_ports += mo.port_name + "\n"; + } + toggle_out_ports = toggle_out_ports.substr(0, toggle_out_ports.size()-2); + GuiLabel((Rectangle){n.position.x + 20, n.position.y + 60, 220, 20}, "MIDI OUT"); + GuiToggleGroup((Rectangle){n.position.x + 20, n.position.y + 80, 220, 20}, toggle_out_ports.c_str(), &n.midi_out); + if(GuiButton((Rectangle){n.position.x + 20, n.position.y + 100 + midi.midi_out_ports.size()*20, 220, 20}, "OPEN PORT")) midi.open_midi_out(n.midi_out); } } diff --git a/src/midi.h b/src/midi.h new file mode 100644 index 0000000..d8466f3 --- /dev/null +++ b/src/midi.h @@ -0,0 +1,72 @@ +#pragma once + +#include "libremidi/libremidi.hpp" +#include "libremidi/message.hpp" +#include "libremidi/observer_configuration.hpp" +#include "raylib.h" + +#include +#include +#include + + +struct NoteTimer{ + int midi_out; + int channel; + int note; + int velocity; + int start; + int length; +}; + + +class Midi { + + public: + Midi() { + + for(const libremidi::input_port& port : obs.get_input_ports()){ + midi_in_ports.push_back(port); + } + + for(const libremidi::output_port& port : obs.get_output_ports()){ + midi_out_ports.push_back(port); + } + std::cout << midi_out_ports.size() << std::endl; + } + + libremidi::observer obs; + + std::vector> midi_outs; + std::vector midi_in_ports; + std::vector midi_out_ports; + + std::vector notes; + + float timer; + + void open_midi_out(int midi_n){ + std::cout << midi_n << std::endl; + + auto out = std::make_shared(); + out->open_port(midi_out_ports[midi_n]); + midi_outs.push_back(out); + } + + void note(int midi_out, int channel, int note, int velocity, int length){ + midi_outs[midi_out]->send_message(libremidi::channel_events::note_on(channel, note, velocity)); + notes.emplace_back(midi_out, channel, note, velocity, GetTime(), length); + } + + void update(){ + float time = GetTime(); + for( auto it = notes.begin(); it != notes.end(); ++it){ + if(time - it->start > ((float)it->length / 1000.0f)){ + midi_outs[it->midi_out]->send_message(libremidi::channel_events::note_off(it->channel, it->note, it->velocity)); + notes.erase(it); + } + } + } +}; + + diff --git a/src/moveable.h b/src/moveable.h index bc2b149..54b53a3 100644 --- a/src/moveable.h +++ b/src/moveable.h @@ -5,7 +5,9 @@ class Movable{ public: - Movable(){} + Movable() {} + virtual ~Movable() {} + Movable(Vec2D p, Vec2D d, float s) : speed(s), position(p), direction(d) {} Movable(Vec2D p, float s) : speed(s), position(p) {} diff --git a/src/node.h b/src/node.h index 729b3d0..9fd7b2a 100644 --- a/src/node.h +++ b/src/node.h @@ -25,9 +25,18 @@ class Node : public Movable{ int midi_note = 0; int midi_cc = 0; + int midi_gate = 0; Distribution mode = Distribution::ROUNDROBIN; + void note() { + + } + + void cc() { + + } + void draw(Vec2D *mouse) { if(!hover_move) DrawCircle(position.x, position.y, radius, (Color){180, 210, 115, 255}); if(hover_move) DrawCircle(position.x, position.y, radius, (Color){108, 153, 187, 255});