control input to route keyboard to different ports
This commit is contained in:
parent
6172e8a7ec
commit
239e851cb7
15
main.cpp
15
main.cpp
|
@ -44,6 +44,7 @@ public:
|
|||
|
||||
RingBuffer<ThreadMessage> thread_messages;
|
||||
|
||||
Jack::MIDIPort *midi_inp;
|
||||
Jack::MIDIPort *midi_omni_out;
|
||||
typedef std::vector<Jack::MIDIPort *> MIDIPortArray;
|
||||
|
||||
|
@ -60,6 +61,8 @@ public:
|
|||
enable_sync = false;
|
||||
waiting_for_sync = false;
|
||||
defunct = false;
|
||||
midi_inp = new Jack::MIDIPort(
|
||||
*this, "control", Jack::MIDIPort::IsInput);
|
||||
midi_omni_out = new Jack::MIDIPort(
|
||||
*this, "omni", Jack::MIDIPort::IsOutput);
|
||||
for (int i = 0; i < MaxPorts; ++i) {
|
||||
|
@ -76,6 +79,7 @@ public:
|
|||
}
|
||||
midi_ports.clear();
|
||||
delete midi_omni_out;
|
||||
delete midi_inp;
|
||||
}
|
||||
|
||||
void play() {
|
||||
|
@ -223,12 +227,21 @@ public:
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
midi_omni_out->clear_buffer();
|
||||
for (MIDIPortArray::iterator iter = midi_ports.begin();
|
||||
iter != midi_ports.end(); ++iter) {
|
||||
(*iter)->clear_buffer();
|
||||
}
|
||||
|
||||
for (Jack::NFrames i = 0; i < midi_inp->get_event_count(); ++i) {
|
||||
MIDI::Message ctrl_msg;
|
||||
if (midi_inp->get_event(ctrl_msg, NULL, i)) {
|
||||
midi_omni_out->write_event(0, ctrl_msg);
|
||||
midi_ports[model->midi_control_port]->write_event(0, ctrl_msg);
|
||||
}
|
||||
}
|
||||
|
||||
process_messages((int)size);
|
||||
}
|
||||
|
||||
|
|
|
@ -426,6 +426,7 @@ Model::Model() {
|
|||
|
||||
void Model::reset() {
|
||||
end_cue = 0;
|
||||
midi_control_port = 0;
|
||||
beats_per_minute = 120;
|
||||
frames_per_beat = 4;
|
||||
beats_per_bar = 4;
|
||||
|
|
|
@ -271,6 +271,9 @@ public:
|
|||
int beats_per_bar;
|
||||
// how many beats are in one minute
|
||||
int beats_per_minute;
|
||||
|
||||
// what port to use for the midi control
|
||||
int midi_control_port;
|
||||
|
||||
void reset();
|
||||
|
||||
|
|
|
@ -18,8 +18,15 @@ TrackBar::TrackBar(int index, TrackView &view) {
|
|||
set_size_request(-1, TrackHeight);
|
||||
|
||||
name.set_alignment(0,0.5);
|
||||
pack_start(name, true, true);
|
||||
view.group_names->add_widget(name);
|
||||
|
||||
name_eventbox.add(name);
|
||||
name_eventbox.set_visible_window(false);
|
||||
name_eventbox.set_events(Gdk::BUTTON_PRESS_MASK);
|
||||
name_eventbox.signal_button_press_event().connect(
|
||||
sigc::mem_fun(*this, &TrackBar::on_name_button_press_event));
|
||||
|
||||
pack_start(name_eventbox, true, true);
|
||||
|
||||
for (int i = 0; i < 16; ++i) {
|
||||
char buffer[64];
|
||||
|
@ -83,6 +90,16 @@ void TrackBar::on_port(int port) {
|
|||
update();
|
||||
}
|
||||
|
||||
bool TrackBar::on_name_button_press_event(GdkEventButton *event) {
|
||||
if ((event->type == GDK_BUTTON_PRESS) &&
|
||||
(event->button == 1)) {
|
||||
Track &track = model->tracks[index];
|
||||
model->midi_control_port = track.midi_port;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TrackBar::on_channel_button_press_event(GdkEventButton *event) {
|
||||
if ((event->type == GDK_BUTTON_PRESS) &&
|
||||
(event->button == 1)) {
|
||||
|
|
|
@ -20,6 +20,7 @@ public:
|
|||
~TrackBar();
|
||||
|
||||
Gtk::Label name;
|
||||
Gtk::EventBox name_eventbox;
|
||||
|
||||
Gtk::EventBox channel_eventbox;
|
||||
Gtk::Menu channel_menu;
|
||||
|
@ -38,6 +39,7 @@ public:
|
|||
void update();
|
||||
bool on_channel_button_press_event(GdkEventButton *event);
|
||||
bool on_port_button_press_event(GdkEventButton *event);
|
||||
bool on_name_button_press_event(GdkEventButton *event);
|
||||
|
||||
void on_channel(int channel);
|
||||
void on_port(int port);
|
||||
|
|
Loading…
Reference in New Issue