self.meter_scale = self.gui_factory.get_default_meter_scale()
self.slider_scale = self.gui_factory.get_default_slider_scale()
self.slider_adjustment = slider.AdjustmentdBFS(self.slider_scale, 0.0, 0.02)
- self.balance_adjustment = Gtk.Adjustment(0.0, -1.0, 1.0, 0.02)
+ self.balance_adjustment = slider.BalanceAdjustment()
self.future_out_mute = None
self.future_volume_midi_cc = None
self.future_balance_midi_cc = None
self.channel.out_mute = self.future_out_mute
self.slider_adjustment.connect("volume-changed", self.on_volume_changed)
- self.balance_adjustment.connect("value-changed", self.on_balance_changed)
+ self.balance_adjustment.connect("balance-changed", self.on_balance_changed)
self.slider = None
self.create_slider_widget()
self.balance.button_down_value = self.balance.get_value()
return True
if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
- self.balance.set_value(0)
+ self.balance_adjustment.set_balance(0)
return True
return False
x = 1
elif x <= -1:
x = -1
- self.balance.set_value(x)
+ self.balance_adjustment.set_balance(x)
return True
def on_balance_scroll_event(self, widget, event):
def on_balance_changed(self, adjustment):
balance = self.balance_adjustment.get_value()
- #print "%s balance: %f" % (self.channel_name, balance)
+ #print("%s balance: %f" % (self.channel_name, balance))
self.channel.balance = balance
self.app.update_monitor(self)
+ def on_volume_changed_from_midi(self, adjustment):
+ balance = self.balance_adjustment.get_value()
+ #print("%s balance from midi: %f" % (self.channel_name, balance))
+ self.channel.set_balance_from_midi(balance)
+ self.app.update_monitor(self)
+
def on_key_pressed(self, widget, event):
if (event.keyval == Gdk.KEY_Up):
#print self.channel_name + " Up"
def on_midi_event_received(self, *args):
self.slider_adjustment.set_value_db(self.channel.volume, from_midi = True)
- self.balance_adjustment.set_value(self.channel.balance)
+ self.balance_adjustment.set_balance(self.channel.balance, from_midi = True)
def on_monitor_button_toggled(self, button):
if button.get_active():
int midi_cc_balance_index;
int midi_cc_mute_index;
int midi_cc_solo_index;
- bool midi_cc_picked_up; /* used only if in 'pick up' mode */
+ bool midi_cc_volume_picked_up;
+ bool midi_cc_balance_picked_up;
jack_default_audio_sample_t * left_buffer_ptr;
jack_default_audio_sample_t * right_buffer_ptr;
return channel_ptr->midi_cc_solo_index;
}
-void channel_set_midi_cc_picked_up(jack_mixer_channel_t channel, bool status)
+void channel_set_midi_cc_volume_picked_up(jack_mixer_channel_t channel, bool status)
{
- LOG_DEBUG("Setting channel %s picked up to %d", channel_ptr->name, status);
- channel_ptr->midi_cc_picked_up = status;
+ LOG_DEBUG("Setting channel %s volume picked up to %d", channel_ptr->name, status);
+ channel_ptr->midi_cc_volume_picked_up = status;
+}
+
+void channel_set_midi_cc_balance_picked_up(jack_mixer_channel_t channel, bool status)
+{
+ LOG_DEBUG("Setting channel %s balance picked up to %d", channel_ptr->name, status);
+ channel_ptr->midi_cc_balance_picked_up = status;
}
unsigned int
byte = 1;
}
byte -= 64;
-
- if (channel_ptr->balance != channel_ptr->balance_new) {
- channel_ptr->balance = channel_ptr->balance + channel_ptr->balance_idx *
- (channel_ptr->balance_new - channel_ptr->balance) /
- channel_ptr->num_volume_transition_steps;
+ int current_midi = (int)63 * channel_ptr->balance + 64;
+ current_midi = current_midi == 1 ? 0 : current_midi;
+ if (mixer_ptr->midi_behavior == Pick_Up &&
+ !channel_ptr->midi_cc_balance_picked_up) {
+ if (in_event.buffer[2] == current_midi) {
+ channel_set_midi_cc_balance_picked_up(channel_ptr, true);
+ }
+ }
+ if ((mixer_ptr->midi_behavior == Pick_Up &&
+ channel_ptr->midi_cc_balance_picked_up) ||
+ mixer_ptr->midi_behavior == Jump_To_Value) {
+ if (channel_ptr->balance != channel_ptr->balance_new) {
+ channel_ptr->balance = channel_ptr->balance + channel_ptr->balance_idx *
+ (channel_ptr->balance_new - channel_ptr->balance) /
+ channel_ptr->num_volume_transition_steps;
+ }
+ channel_ptr->balance_idx = 0;
+ channel_ptr->balance_new = (float)byte / 63;
+ LOG_DEBUG("\"%s\" balance -> %f", channel_ptr->name, channel_ptr->balance_new);
}
- channel_ptr->balance_idx = 0;
- channel_ptr->balance_new = (float)byte / 63;
- LOG_DEBUG("\"%s\" balance -> %f", channel_ptr->name, channel_ptr->balance_new);
}
else if (channel_ptr->midi_cc_volume_index == in_event.buffer[1])
{
- int current_midi = (int)(127 *
- scale_db_to_scale(channel_ptr->midi_scale,
- value_to_db(channel_ptr->volume)));
- if (mixer_ptr->midi_behavior == Pick_Up &&
- !channel_ptr->midi_cc_picked_up ) {
+ int current_midi = (int)(127 *
+ scale_db_to_scale(channel_ptr->midi_scale,
+ value_to_db(channel_ptr->volume)));
+ if (mixer_ptr->midi_behavior == Pick_Up &&
+ !channel_ptr->midi_cc_volume_picked_up ) {
if (in_event.buffer[2] == current_midi) {
- channel_ptr->midi_cc_picked_up = true;
+ channel_set_midi_cc_volume_picked_up(channel_ptr, true);
}
}
if ((mixer_ptr->midi_behavior == Pick_Up &&
- channel_ptr->midi_cc_picked_up) ||
+ channel_ptr->midi_cc_volume_picked_up) ||
mixer_ptr->midi_behavior == Jump_To_Value) {
if (channel_ptr->volume_new != channel_ptr->volume) {
channel_ptr->volume = channel_ptr->volume + channel_ptr->volume_idx *
channel_ptr->midi_cc_balance_index = -1;
channel_ptr->midi_cc_mute_index = -1;
channel_ptr->midi_cc_solo_index = -1;
- channel_ptr->midi_cc_picked_up = false;
+ channel_ptr->midi_cc_volume_picked_up = false;
+ channel_ptr->midi_cc_balance_picked_up = false;
channel_ptr->midi_change_callback = NULL;
channel_ptr->midi_change_callback_data = NULL;
channel_ptr->midi_cc_balance_index = -1;
channel_ptr->midi_cc_mute_index = -1;
channel_ptr->midi_cc_solo_index = -1;
- channel_ptr->midi_cc_picked_up = false;
+ channel_ptr->midi_cc_volume_picked_up = false;
+ channel_ptr->midi_cc_balance_picked_up = false;
channel_ptr->midi_change_callback = NULL;
channel_ptr->midi_change_callback_data = NULL;
jack_mixer_channel_t channel,
int new_cc);
-void channel_set_midi_cc_picked_up(jack_mixer_channel_t channel,
+void channel_set_midi_cc_volume_picked_up(jack_mixer_channel_t channel,
+ bool status);
+
+void channel_set_midi_cc_balance_picked_up(jack_mixer_channel_t channel,
bool status);
void
return -1;
}
channel_volume_write(self->channel, PyFloat_AsDouble(value));
- channel_set_midi_cc_picked_up(self->channel, false);
+ channel_set_midi_cc_volume_picked_up(self->channel, false);
return 0;
}
Channel_set_balance(ChannelObject *self, PyObject *value, void *closure)
{
channel_balance_write(self->channel, PyFloat_AsDouble(value));
+ channel_set_midi_cc_balance_picked_up(self->channel, false);
return 0;
}
{
PyObject *result;
- if (channel_is_out_muted(self->channel)) {
+ if (channel_is_out_muted(self->channel)) {
result = Py_True;
} else {
result = Py_False;
return 0;
}
+static int
+Channel_set_balance_from_midi(ChannelObject *self, PyObject *args)
+{
+ double value;
+
+ if (! PyArg_ParseTuple(args, "f", &value)) return NULL;
+ if (self->channel == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "unitialized channel");
+ return -1;
+ }
+ channel_balance_write(self->channel, value);
+ return 0;
+}
+
static PyMethodDef channel_methods[] = {
{"remove", (PyCFunction)Channel_remove, METH_VARARGS, "Remove"},
{"autoset_volume_midi_cc",
(PyCFunction)Channel_autoset_solo_midi_cc, METH_VARARGS, "Autoset Solo MIDI CC"},
{"set_volume_from_midi",
(PyCFunction)Channel_set_volume_from_midi, METH_VARARGS, "Set Volume From MIDI"},
+ {"set_balance_from_midi",
+ (PyCFunction)Channel_set_volume_from_midi, METH_VARARGS, "Set Balance From MIDI"},
{NULL}
};
table.set_row_spacings(5)
table.set_col_spacings(5)
- table.attach(Gtk.Label(label='Midi behavior'), 0, 1, 0, 1)
+ table.attach(Gtk.Label(label='Control Behavior'), 0, 1, 0, 1)
self.midi_behavior_combo = self.create_midi_behavior_combo()
table.attach(self.midi_behavior_combo, 1, 2, 0, 1)
- vbox.pack_start(self.create_frame('Midi Behavior', table), True, True, 0)
+ vbox.pack_start(self.create_frame('MIDI', table), True, True, 0)
self.vbox.show_all()
self.add_button(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)
GObject.signal_new("volume-changed-from-midi", AdjustmentdBFS,
GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION, None, [])
+class BalanceAdjustment(Gtk.Adjustment):
+ def __init__(self):
+ Gtk.Adjustment.__init__(self, 0.0, -1.0, 1.0, 0.02)
+ self.connect("value-changed", self.on_value_changed)
+ self.disable_value_notify = False
+
+ def set_balance(self, value, from_midi = False):
+ self.disable_value_notify = True
+ self.set_value(value)
+ self.disable_value_notify = False
+ if not from_midi:
+ self.emit("balance-changed")
+ else:
+ self.emit("balance-changed-from-midi")
+
+ def on_value_changed(self, adjustment):
+ if not self.disable_value_notify:
+ self.emit("balance-changed")
+
+GObject.signal_new("balance-changed", BalanceAdjustment,
+ GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION, None, [])
+
+GObject.signal_new("balance-changed-from-midi", BalanceAdjustment,
+ GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION, None, [])
+
class GtkSlider(Gtk.VScale):
def __init__(self, adjustment):