midi channel selection yeah :) - midi send message no :(
This commit is contained in:
+18
-26
@@ -25,30 +25,22 @@
|
|||||||
#include "raygui/raygui.h"
|
#include "raygui/raygui.h"
|
||||||
#include "raygui/dark/style_dark.h"
|
#include "raygui/dark/style_dark.h"
|
||||||
|
|
||||||
#include "libremidi/libremidi.hpp"
|
|
||||||
#include "libremidi/message.hpp"
|
|
||||||
#include "libremidi/observer_configuration.hpp"
|
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
|
#include "midi.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "signal.h"
|
#include "signal.h"
|
||||||
|
|
||||||
#include "connection-manager.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<Node> nodes;
|
||||||
std::vector<Signal> signals;
|
std::vector<Signal> signals;
|
||||||
ConnectionManager cm;
|
ConnectionManager cm;
|
||||||
|
|
||||||
|
Midi midi;
|
||||||
|
|
||||||
Vec2D<float> mouse_pos;
|
Vec2D<float> mouse_pos;
|
||||||
Vec2D<float> drag_start;
|
Vec2D<float> drag_start;
|
||||||
|
|
||||||
@@ -79,7 +71,7 @@ int main(){
|
|||||||
app.width = GetMonitorWidth(monitor);
|
app.width = GetMonitorWidth(monitor);
|
||||||
app.height = GetMonitorHeight(monitor);
|
app.height = GetMonitorHeight(monitor);
|
||||||
|
|
||||||
Camera2D camera = { 0 };
|
Camera2D camera = { {0} };
|
||||||
camera.target = (Vector2){ app.width/2.0f, app.height/2.0f };
|
camera.target = (Vector2){ app.width/2.0f, app.height/2.0f };
|
||||||
camera.offset = (Vector2){ app.width/2.0f, app.height/2.0f };
|
camera.offset = (Vector2){ app.width/2.0f, app.height/2.0f };
|
||||||
camera.rotation = 0.0f;
|
camera.rotation = 0.0f;
|
||||||
@@ -89,17 +81,9 @@ int main(){
|
|||||||
|
|
||||||
ToggleFullscreen();
|
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++){
|
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));
|
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;
|
std::cout << nodes.back().position.x << " " << nodes.back().position.y << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,8 +93,6 @@ int main(){
|
|||||||
signals[i].last = &nodes.front();
|
signals[i].last = &nodes.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
midi_out.open_port(midi_out_ports[2]);
|
|
||||||
|
|
||||||
Vec2D<float> drag_offset;
|
Vec2D<float> drag_offset;
|
||||||
|
|
||||||
Node* connecting_from = nullptr;
|
Node* connecting_from = nullptr;
|
||||||
@@ -208,11 +190,13 @@ int main(){
|
|||||||
s.direction = (s.next->position - s.position).norm();
|
s.direction = (s.next->position - s.position).norm();
|
||||||
if(s.position.dist(&s.next->position) < s.speed * 1.5) {
|
if(s.position.dist(&s.next->position) < s.speed * 1.5) {
|
||||||
Node* n = cm.next(s.next, s.last);
|
Node* n = cm.next(s.next, s.last);
|
||||||
|
|
||||||
if(n != s.next && n != nullptr) {
|
if(n != s.next && n != nullptr) {
|
||||||
|
midi.note(s.next->midi_out, 1, 50, 50, 500);
|
||||||
s.last = s.next;
|
s.last = s.next;
|
||||||
s.next = n;
|
s.next = n;
|
||||||
std::cout << s.last << " " << s.next << std::endl;
|
//std::cout << s.last << " " << s.next << std::endl;
|
||||||
midi_out.send_message(libremidi::channel_events::control_change(2, 10, 50));
|
//midi_out.send_message(libremidi::channel_events::control_change(2, 10, 50));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s.draw(&mouse_pos);
|
s.draw(&mouse_pos);
|
||||||
@@ -229,10 +213,18 @@ int main(){
|
|||||||
|
|
||||||
for(auto& n : nodes){
|
for(auto& n : nodes){
|
||||||
if(n.config){
|
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;
|
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;
|
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
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -6,6 +6,8 @@ class Movable{
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
Movable() {}
|
Movable() {}
|
||||||
|
virtual ~Movable() {}
|
||||||
|
|
||||||
Movable(Vec2D<float> p, Vec2D<float> d, float s) : speed(s), position(p), direction(d) {}
|
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) {}
|
Movable(Vec2D<float> p, float s) : speed(s), position(p) {}
|
||||||
|
|
||||||
|
|||||||
@@ -25,9 +25,18 @@ class Node : public Movable{
|
|||||||
|
|
||||||
int midi_note = 0;
|
int midi_note = 0;
|
||||||
int midi_cc = 0;
|
int midi_cc = 0;
|
||||||
|
int midi_gate = 0;
|
||||||
|
|
||||||
Distribution mode = Distribution::ROUNDROBIN;
|
Distribution mode = Distribution::ROUNDROBIN;
|
||||||
|
|
||||||
|
void note() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void cc() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void draw(Vec2D<float> *mouse) {
|
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){180, 210, 115, 255});
|
||||||
if(hover_move) DrawCircle(position.x, position.y, radius, (Color){108, 153, 187, 255});
|
if(hover_move) DrawCircle(position.x, position.y, radius, (Color){108, 153, 187, 255});
|
||||||
|
|||||||
Reference in New Issue
Block a user