1
Fork 0

control input to route keyboard to different ports

This commit is contained in:
Leonard Ritter 2010-08-18 13:23:07 +02:00
parent 6172e8a7ec
commit 239e851cb7
5 changed files with 38 additions and 2 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -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();

View File

@ -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)) {

View File

@ -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);