midi channel selection yeah :) - midi send message no :(

This commit is contained in:
Sebastian
2024-10-19 04:08:46 +02:00
parent d1542870d5
commit 0d942b6677
4 changed files with 102 additions and 27 deletions
+18 -26
View File
@@ -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 <cstdlib>
#include <stdio.h>
#include <cmath>
#include "midi.h"
#include "node.h"
#include "signal.h"
#include "connection-manager.h"
libremidi::observer obs;
std::vector<libremidi::midi_out> midi_outs;
libremidi::midi_out midi_out;
std::vector<libremidi::input_port> midi_in_ports;
std::vector<libremidi::output_port> midi_out_ports;
std::vector<Node> nodes;
std::vector<Signal> signals;
ConnectionManager cm;
Midi midi;
Vec2D<float> mouse_pos;
Vec2D<float> 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<float> 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);
}
}
+72
View File
@@ -0,0 +1,72 @@
#pragma once
#include "libremidi/libremidi.hpp"
#include "libremidi/message.hpp"
#include "libremidi/observer_configuration.hpp"
#include "raylib.h"
#include <iostream>
#include <memory>
#include <ostream>
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<std::shared_ptr<libremidi::midi_out>> midi_outs;
std::vector<libremidi::input_port> midi_in_ports;
std::vector<libremidi::output_port> midi_out_ports;
std::vector<NoteTimer> notes;
float timer;
void open_midi_out(int midi_n){
std::cout << midi_n << std::endl;
auto out = std::make_shared<libremidi::midi_out>();
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);
}
}
}
};
+2
View File
@@ -6,6 +6,8 @@ class Movable{
public:
Movable() {}
virtual ~Movable() {}
Movable(Vec2D<float> p, Vec2D<float> d, float s) : speed(s), position(p), direction(d) {}
Movable(Vec2D<float> p, float s) : speed(s), position(p) {}
+9
View File
@@ -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<float> *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});