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)
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):
#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
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;
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,
}
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) /
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;
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;
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);
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):
return -1;
}
channel_volume_write(self->channel, PyFloat_AsDouble(value));
+ channel_set_midi_cc_picked_up(self->channel, false);
return 0;
}
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",
(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}
};
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:
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):