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/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
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+3
-1
@@ -5,7 +5,9 @@
|
||||
class Movable{
|
||||
|
||||
public:
|
||||
Movable(){}
|
||||
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) {}
|
||||
|
||||
|
||||
@@ -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});
|
||||
|
||||
Reference in New Issue
Block a user