]> git.0d.be Git - jack_mixer.git/commitdiff
Do pick up mode properly for volume
authorDaniel Sheeler <dsheeler@pobox.com>
Mon, 29 Jun 2020 05:33:23 +0000 (00:33 -0500)
committerDaniel Sheeler <dsheeler@pobox.com>
Mon, 29 Jun 2020 05:33:23 +0000 (00:33 -0500)
channel.py
jack_mixer.c
jack_mixer.h
jack_mixer.py
jack_mixer_c.c
slider.py

index b163edf05c1480c130ef5944c15934a0386bbcd8..de9bda00fe4c1bc1bcb0ca2d9d484f81f261f286 100644 (file)
@@ -249,19 +249,25 @@ class Channel(Gtk.VBox, SerializedObject):
             self.slider_adjustment.step_up()
         return True
 
-    def update_volume(self, update_engine):
+    def update_volume(self, update_engine, from_midi = False):
         db = self.slider_adjustment.get_value_db()
 
         db_text = "%.2f" % db
         self.volume_digits.set_text(db_text)
 
         if update_engine:
-            self.channel.volume = db
+            if not from_midi:
+                self.channel.volume = db
+            else:
+                self.channel.set_volume_from_midi(db)
             self.app.update_monitor(self)
 
     def on_volume_changed(self, adjustment):
         self.update_volume(True)
 
+    def on_volume_changed_from_midi(self, adjustment):
+        self.update_volume(True, from_midi = True)
+
     def on_balance_changed(self, adjustment):
         balance = self.balance_adjustment.get_value()
         #print "%s balance: %f" % (self.channel_name, balance)
@@ -321,7 +327,7 @@ class Channel(Gtk.VBox, SerializedObject):
         return False
 
     def on_midi_event_received(self, *args):
-        self.slider_adjustment.set_value_db(self.channel.volume)
+        self.slider_adjustment.set_value_db(self.channel.volume, from_midi = True)
         self.balance_adjustment.set_value(self.channel.balance)
 
     def on_monitor_button_toggled(self, button):
index 95a586b44ae7131fbc766fe253956f3cb23529b7..5c25a80c96246bb97d7b25e1994634bd8e712254 100644 (file)
@@ -45,8 +45,6 @@
 
 #define VOLUME_TRANSITION_SECONDS 0.01
 
-#define MIDI_PICK_UP_DIFF 20
-
 #define PEAK_FRAMES_CHUNK 4800
 
 // we don't know how much to allocate, but we don't want to wait with 
@@ -98,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 */
+  
   jack_default_audio_sample_t * left_buffer_ptr;
   jack_default_audio_sample_t * right_buffer_ptr;
 
@@ -340,6 +339,12 @@ 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)
+{
+  LOG_DEBUG("Setting channel %s picked up to %d", channel_ptr->name, status);
+  channel_ptr->midi_cc_picked_up = status;
+}
+
 unsigned int
 channel_set_solo_midi_cc(
   jack_mixer_channel_t channel,
@@ -1103,8 +1108,18 @@ process(
       }
       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 && abs(in_event.buffer[2] -current_midi) <= MIDI_PICK_UP_DIFF) || mixer_ptr->midi_behavior == Jump_To_Value) {
+        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 ) {
+          if (in_event.buffer[2] == current_midi) {
+            channel_ptr->midi_cc_picked_up = true;
+          }
+        }
+        if ((mixer_ptr->midi_behavior == Pick_Up &&
+         channel_ptr->midi_cc_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->volume_new - channel_ptr->volume) /
@@ -1442,6 +1457,7 @@ 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_change_callback = NULL;
   channel_ptr->midi_change_callback_data = NULL;
@@ -1569,6 +1585,7 @@ 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_change_callback = NULL;
   channel_ptr->midi_change_callback_data = NULL;
index 2efa186e53d2b31676105b7648a5835242d27830..064f60357385fb8b68bfbf0171df515f617cad18 100644 (file)
@@ -170,6 +170,9 @@ 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,
+  bool status);
+
 void
 channel_autoset_volume_midi_cc(
   jack_mixer_channel_t channel);
index 4b60f6bec4f8357b36e2a998a85c7d3e507983b4..d0b8e6f0823dd0c2a5baa5f495cc7f0ca8ccd432 100755 (executable)
@@ -255,7 +255,6 @@ class JackMixer(SerializedObject):
         Gtk.main_quit()
 
     def on_midi_behavior_mode_changed(self, gui_factory, value):
-        print('on_midi_behavior_mode_changed', value)
         self.mixer.midi_behavior_mode = value
 
     def on_delete_event(self, widget, event):
index 0ff0ef7cbb8ad3204bbc49580a9b332f6ed63275..394d365a62998355ecc08d01983a29c3df6193eb 100644 (file)
@@ -215,6 +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);
        return 0;
 }
 
@@ -592,6 +593,20 @@ Channel_autoset_solo_midi_cc(ChannelObject *self, PyObject *args)
        return Py_None;
 }
 
+static int
+Channel_set_volume_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_volume_write(self->channel, value);
+       return 0;
+}
+
 static PyMethodDef channel_methods[] = {
        {"remove", (PyCFunction)Channel_remove, METH_VARARGS, "Remove"},
        {"autoset_volume_midi_cc",
@@ -602,6 +617,8 @@ static PyMethodDef channel_methods[] = {
                (PyCFunction)Channel_autoset_mute_midi_cc, METH_VARARGS, "Autoset Mute MIDI CC"},
        {"autoset_solo_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"},
        {NULL}
 };
 
index be98e396f31330a52a631ff2764a60f77a918b37..d8ee650bf8a1b9b6628c9dbc1956722bd3430511 100644 (file)
--- a/slider.py
+++ b/slider.py
@@ -42,12 +42,15 @@ class AdjustmentdBFS(Gtk.Adjustment):
     def get_value_db(self):
         return self.db
 
-    def set_value_db(self, db):
+    def set_value_db(self, db, from_midi = False):
         self.db = db
         self.disable_value_notify = True
         self.set_value(self.scale.db_to_scale(db))
         self.disable_value_notify = False
-        self.emit("volume-changed")
+        if not from_midi:
+            self.emit("volume-changed")
+        else:
+            self.emit("volume-changed-from-midi")
 
     def on_value_changed(self, adjustment):
         if not self.disable_value_notify:
@@ -63,6 +66,9 @@ class AdjustmentdBFS(Gtk.Adjustment):
 GObject.signal_new("volume-changed", AdjustmentdBFS,
                    GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION, None, [])
 
+GObject.signal_new("volume-changed-from-midi", AdjustmentdBFS,
+                   GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION, None, [])
+
 
 class GtkSlider(Gtk.VScale):
     def __init__(self, adjustment):