]> git.0d.be Git - jack_mixer.git/commitdiff
Balance uses pick up mode
authorDaniel Sheeler <dsheeler@pobox.com>
Mon, 29 Jun 2020 22:43:21 +0000 (17:43 -0500)
committerDaniel Sheeler <dsheeler@pobox.com>
Mon, 29 Jun 2020 22:43:21 +0000 (17:43 -0500)
channel.py
jack_mixer.c
jack_mixer.h
jack_mixer_c.c
preferences.py
slider.py

index 02e381decb4ee37520e67d9092318fb923a9949e..93499292bea2b12fe180bc17f10221a63e2d133b 100644 (file)
@@ -78,7 +78,7 @@ class Channel(Gtk.VBox, SerializedObject):
         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
@@ -108,7 +108,7 @@ class Channel(Gtk.VBox, SerializedObject):
             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()
@@ -181,7 +181,7 @@ class Channel(Gtk.VBox, SerializedObject):
             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
 
@@ -198,7 +198,7 @@ class Channel(Gtk.VBox, SerializedObject):
                 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):
@@ -323,10 +323,16 @@ class Channel(Gtk.VBox, SerializedObject):
 
     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"
@@ -381,7 +387,7 @@ class Channel(Gtk.VBox, SerializedObject):
 
     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():
index 5c25a80c96246bb97d7b25e1994634bd8e712254..50a63a0640ee86be0cdba416326b99e7240c9819 100644 (file)
@@ -96,7 +96,8 @@ struct channel
   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;
@@ -339,10 +340,16 @@ channel_get_solo_midi_cc(
   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
@@ -1096,29 +1103,40 @@ process(
           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 *
@@ -1457,7 +1475,8 @@ add_channel(
   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;
@@ -1585,7 +1604,8 @@ create_output_channel(
   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;
index 064f60357385fb8b68bfbf0171df515f617cad18..f993d36ae515ff6ee935319df5dd5955d252515d 100644 (file)
@@ -170,7 +170,10 @@ channel_set_solo_midi_cc(
   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
index 394d365a62998355ecc08d01983a29c3df6193eb..43ed8441ce86b11319600f5bd9c08b9e9ff77f15 100644 (file)
@@ -215,7 +215,7 @@ Channel_set_volume(ChannelObject *self, PyObject *value, void *closure)
                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;
 }
 
@@ -229,6 +229,7 @@ static int
 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;
 }
 
@@ -237,7 +238,7 @@ Channel_get_out_mute(ChannelObject *self, void *closure)
 {
        PyObject *result;
 
-    if (channel_is_out_muted(self->channel)) {
+       if (channel_is_out_muted(self->channel)) {
                result = Py_True;
        } else {
                result = Py_False;
@@ -607,6 +608,20 @@ Channel_set_volume_from_midi(ChannelObject *self, PyObject *args)
        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",
@@ -619,6 +634,8 @@ static PyMethodDef channel_methods[] = {
                (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}
 };
 
index 1805543a42e03ae08aa3b3d18537692c7d8f6e79..53a165ed29cfcc6787f8c88a35831e1eb10d8ba8 100644 (file)
@@ -93,11 +93,11 @@ class PreferencesDialog(Gtk.Dialog):
         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)
index e155f3a1968f7d65e06ea17c6cfb81a0c26c8d3e..7e73aa615a693e84d053843dfb5d2cd049b82977 100644 (file)
--- a/slider.py
+++ b/slider.py
@@ -69,6 +69,31 @@ GObject.signal_new("volume-changed", AdjustmentdBFS,
 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):