Merge branch 'master' into cairocanvas

This commit is contained in:
Paul Davis 2014-01-07 21:37:48 -05:00
commit 36c233fe6c
27 changed files with 929 additions and 208 deletions

View File

@ -56,6 +56,7 @@ AddRouteDialog::AddRouteDialog ()
, configuration_label (_("Configuration:"))
, mode_label (_("Track mode:"))
, instrument_label (_("Instrument:"))
, reasonable_synth_id(0)
{
set_name ("AddRouteDialog");
set_modal (true);
@ -82,7 +83,7 @@ AddRouteDialog::AddRouteDialog ()
build_instrument_list ();
instrument_combo.set_model (instrument_list);
instrument_combo.pack_start (instrument_list_columns.name);
instrument_combo.set_active (0);
instrument_combo.set_active (reasonable_synth_id);
instrument_combo.set_button_sensitivity (Gtk::SENSITIVITY_AUTO);
VBox* vbox = manage (new VBox);
@ -587,6 +588,7 @@ AddRouteDialog::build_instrument_list ()
row[instrument_list_columns.info_ptr] = PluginInfoPtr ();
row[instrument_list_columns.name] = _("-none-");
uint32_t n = 1;
for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
if (manager.get_status (*i) == PluginManager::Hidden) continue;
@ -595,6 +597,10 @@ AddRouteDialog::build_instrument_list ()
row = *(instrument_list->append());
row[instrument_list_columns.name] = (*i)->name;
row[instrument_list_columns.info_ptr] = *i;
if ((*i)->unique_id == "https://community.ardour.org/node/7596") {
reasonable_synth_id = n;
}
n++;
}
}
}

View File

@ -122,6 +122,7 @@ class AddRouteDialog : public ArdourDialog
InstrumentListColumns instrument_list_columns;
void build_instrument_list ();
uint32_t reasonable_synth_id;
};
#endif /* __gtk_ardour_add_route_dialog_h__ */

View File

@ -731,6 +731,19 @@ style "midi_track_base" = "default"
bg[SELECTED] = @@COLPREFIX@_bg
}
style "audio_track_fader" = "gain_fader"
{
bg[PRELIGHT] = @@COLPREFIX@_audio_track
}
style "audio_bus_fader" = "gain_fader"
{
bg[PRELIGHT] = @@COLPREFIX@_audio_bus
}
style "midi_track_fader" = "gain_fader"
{
bg[PRELIGHT] = @@COLPREFIX@_midi_track
}
style "audio_track_metrics" = "audio_track_base"
{
font_name = "@FONT_TINY@"
@ -815,7 +828,9 @@ style "plugin_slider"
bg[ACTIVE] = shade (0.6, @@COLPREFIX@_lightest)
bg[INSENSITIVE] = shade (0.6, @@COLPREFIX@_lightest)
bg[SELECTED] = shade (0.6, @@COLPREFIX@_lightest)
bg[PRELIGHT] = shade (0.6, @@COLPREFIX@_lightest)
# outer round-corner-background (pixslider does its own hover prelight)
bg[PRELIGHT] = @@COLPREFIX@_bg
# the numeric display
@ -826,6 +841,16 @@ style "plugin_slider"
text[PRELIGHT] = @@COLPREFIX@_text
}
style "processor_control_button" = "very_small_text"
{
}
style "processor_control_slider" = "plugin_slider"
{
bg[PRELIGHT] = @@COLPREFIX@_darkest
bg[NORMAL] = @@COLPREFIX@_bg
}
style "track_list_display" = "small_bold_text"
{
text[NORMAL] = @@COLPREFIX@_text

View File

@ -187,12 +187,12 @@
<Option name="processor postfader: led active" value="78cb4eff"/>
<Option name="processor postfader: text" value="aaaaa3ff"/>
<Option name="processor postfader: text active" value="eeeeecff"/>
<Option name="processor control button: fill start" value="000000ff"/>
<Option name="processor control button: fill end" value="000000ff"/>
<Option name="processor control button: fill start active" value="000000ff"/>
<Option name="processor control button: fill end active" value="000000ff"/>
<Option name="processor control button: led" value="000000ff"/>
<Option name="processor control button: led active" value="ff0000ff"/>
<Option name="processor control button: fill start" value="222222ff"/>
<Option name="processor control button: fill end" value="333333ff"/>
<Option name="processor control button: fill start active" value="444444ff"/>
<Option name="processor control button: fill end active" value="333333ff"/>
<Option name="processor control button: led" value="224400ff"/>
<Option name="processor control button: led active" value="99cc00ff"/>
<Option name="processor control button: text" value="ffffffff"/>
<Option name="processor control button: text active" value="ffffffff"/>
<Option name="monitor button: fill start" value="5f5a58ff"/>

View File

@ -186,9 +186,13 @@ widget "*AudioMidiTrackMetricsInactive" style:highest "midi_track_metrics_inacti
widget "*TimeAxisViewControlsBaseUnselected" style:highest "audio_track_base"
widget "*AudioTrackControlsBaseUnselected" style:highest "audio_track_base"
widget "*MidiTrackControlsBaseUnselected" style:highest "midi_track_base"
widget "*AudioTrackFader" style:highest "gain_fader"
widget "*MidiTrackFader" style:highest "gain_fader"
widget "*AudioBusFader" style:highest "gain_fader"
widget "*SendUIFader" style:highest "plugin_slider"
widget "*ReturnUIFader" style:highest "plugin_slider"
widget "*AudioTrackFader" style:highest "audio_track_fader"
widget "*MidiTrackFader" style:highest "midi_track_fader"
widget "*AudioBusFader" style:highest "audio_bus_fader"
widget "*BusControlsBaseUnselected" style:highest "audio_bus_base"
widget "*TrackSeparator" style:highest "track_separator"
@ -234,6 +238,8 @@ widget "*MotionControllerValue*" style:highest "small_entry"
widget "*ParameterValueDisplay" style:highest "medium_bold_entry"
widget "*PluginUIClickBox" style:highest "medium_bold_entry"
widget "*PluginUIClickBox*" style:highest "medium_bold_entry"
widget "*ProcessorControlSlider" style:highest "processor_control_slider"
widget "*processor control button" style:highest "processor_control_button"
widget "*PluginSlider" style:highest "plugin_slider"
widget "*GainFader" style:highest "plugin_slider"
widget "*MixerTrackCommentArea" style:highest "option_entry"

View File

@ -302,6 +302,9 @@ ArdourButton::render (cairo_t* cr)
}
if ( ((_elements & Text)==Text) && !_text.empty()) {
cairo_save (cr);
cairo_rectangle (cr, 2, 1, get_width()-4, get_height()-2);
cairo_clip(cr);
cairo_new_path (cr);
cairo_set_source_rgba (cr, text_r, text_g, text_b, text_a);
@ -342,7 +345,7 @@ ArdourButton::render (cairo_t* cr)
/* use old center'ed layout for follow up items - until rotation/aligment code is completed */
cairo_move_to (cr, (get_width() - _text_width)/2.0, get_height()/2.0 - _text_height/2.0);
}
cairo_restore (cr);
}
if (((_elements & Indicator)==Indicator)) {
@ -472,6 +475,7 @@ ArdourButton::on_size_request (Gtk::Requisition* req)
req->height = _text_height + ypad;
}
}
req->width += _corner_radius;
}
void

View File

@ -133,17 +133,19 @@ Editor::show_editor_mixer (bool yn)
if (current_mixer_strip == 0) {
create_editor_mixer ();
}
current_mixer_strip->set_route (r);
current_mixer_strip->set_width_enum (editor_mixer_strip_width, (void*) this);
}
if (current_mixer_strip->get_parent() == 0) {
if (current_mixer_strip && current_mixer_strip->get_parent() == 0) {
global_hpacker.pack_start (*current_mixer_strip, Gtk::PACK_SHRINK );
global_hpacker.reorder_child (*current_mixer_strip, 0);
current_mixer_strip->show ();
}
if (r) {
current_mixer_strip->set_route (r);
current_mixer_strip->set_width_enum (editor_mixer_strip_width, (void*) this);
}
} else {
if (current_mixer_strip) {

View File

@ -38,6 +38,7 @@
#include <gtkmm2ext/choice.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/doi.h>
#include <gtkmm2ext/rgb_macros.h>
#include "ardour/amp.h"
#include "ardour/audio_track.h"
@ -91,6 +92,9 @@ RefPtr<Action> ProcessorBox::rename_action;
RefPtr<Action> ProcessorBox::edit_action;
RefPtr<Action> ProcessorBox::edit_generic_action;
static const uint32_t audio_port_color = 0x4A8A0EFF; // Green
static const uint32_t midi_port_color = 0x960909FF; //Red
ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processor> p, Width w)
: _button (ArdourButton::led_default_elements)
, _position (PreFader)
@ -98,6 +102,8 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
, _processor (p)
, _width (w)
, _visual_state (Gtk::STATE_NORMAL)
, _input_icon(true)
, _output_icon(false)
{
_vbox.show ();
@ -109,18 +115,37 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
if (_processor) {
_vbox.pack_start (_routing_icon);
_vbox.pack_start (_input_icon);
_vbox.pack_start (_button, true, true);
_vbox.pack_end (_output_icon);
_button.set_active (_processor->active());
_routing_icon.set_no_show_all(true);
_input_icon.set_no_show_all(true);
_button.show ();
_routing_icon.set_visible(false);
_input_icon.hide();
_output_icon.show();
_processor->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context());
_processor->PropertyChanged.connect (name_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_property_changed, this, _1), gui_context());
_processor->ConfigurationChanged.connect (config_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_configuration_changed, this, _1, _2), gui_context());
set<Evoral::Parameter> p = _processor->what_can_be_automated ();
for (set<Evoral::Parameter>::iterator i = p.begin(); i != p.end(); ++i) {
Control* c = new Control (_processor->automation_control (*i), _processor->describe_parameter (*i));
std::string label = _processor->describe_parameter (*i);
if (boost::dynamic_pointer_cast<Send> (_processor)) {
label = _("Send");
} else if (boost::dynamic_pointer_cast<Return> (_processor)) {
label = _("Return");
}
Control* c = new Control (_processor->automation_control (*i), label);
_controls.push_back (c);
@ -128,13 +153,14 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
/* Add non-Amp controls to the processor box */
_vbox.pack_start (c->box);
}
if (boost::dynamic_pointer_cast<Send> (_processor)) {
/* Don't label send faders */
c->hide_label ();
}
}
_input_icon.set_ports(_processor->input_streams());
_output_icon.set_ports(_processor->output_streams());
_routing_icon.set_sources(_processor->input_streams());
_routing_icon.set_sinks(_processor->output_streams());
setup_tooltip ();
setup_visuals ();
} else {
@ -168,9 +194,17 @@ ProcessorEntry::drag_text () const
}
void
ProcessorEntry::set_position (Position p)
ProcessorEntry::set_position (Position p, uint32_t num)
{
_position = p;
_position_num = num;
if (_position_num == 0 || _routing_icon.get_visible()) {
_input_icon.show();
} else {
_input_icon.hide();
}
setup_visuals ();
}
@ -245,6 +279,18 @@ ProcessorEntry::processor_property_changed (const PropertyChange& what_changed)
}
}
void
ProcessorEntry::processor_configuration_changed (const ChanCount in, const ChanCount out)
{
_input_icon.set_ports(in);
_output_icon.set_ports(out);
_routing_icon.set_sources(in);
_routing_icon.set_sinks(out);
_input_icon.queue_draw();
_output_icon.queue_draw();
_routing_icon.queue_draw();
}
void
ProcessorEntry::setup_tooltip ()
{
@ -402,18 +448,19 @@ ProcessorEntry::Control::Control (boost::shared_ptr<AutomationControl> c, string
, _adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), 0, 1, 0.01, 0.1)
, _slider (&_adjustment, 0, 13, false)
, _slider_persistant_tooltip (&_slider)
, _button (ArdourButton::Element (ArdourButton::Text | ArdourButton::Indicator))
, _button (ArdourButton::led_default_elements)
, _ignore_ui_adjustment (false)
, _visible (false)
, _name (n)
{
_slider.set_controllable (c);
box.set_padding(0, 0, 4, 4);
if (c->toggled()) {
_button.set_text (_name);
_button.set_led_left (true);
_button.set_name ("processor control button");
box.pack_start (_button);
box.add (_button);
_button.show ();
_button.signal_clicked.connect (sigc::mem_fun (*this, &Control::button_clicked));
@ -422,10 +469,10 @@ ProcessorEntry::Control::Control (boost::shared_ptr<AutomationControl> c, string
} else {
_slider.set_name ("PluginSlider");
_slider.set_name ("ProcessorControlSlider");
_slider.set_text (_name);
box.pack_start (_slider);
box.add (_slider);
_slider.show ();
double const lo = c->internal_to_interface (c->lower ());
@ -470,7 +517,6 @@ ProcessorEntry::Control::set_tooltip ()
string sm = Glib::Markup::escape_text (s.str());
ARDOUR_UI::instance()->set_tip (_label, sm);
_slider_persistant_tooltip.set_tip (sm);
ARDOUR_UI::instance()->set_tip (_button, sm);
}
@ -505,6 +551,7 @@ ProcessorEntry::Control::button_clicked ()
c->set_value (n ? 0 : 1);
_button.set_active (!n);
set_tooltip ();
}
void
@ -578,12 +625,6 @@ ProcessorEntry::Control::hide_things ()
}
}
void
ProcessorEntry::Control::hide_label ()
{
_label.hide ();
}
string
ProcessorEntry::Control::state_id () const
{
@ -593,11 +634,6 @@ ProcessorEntry::Control::state_id () const
return string_compose (X_("control %1"), c->id().to_s ());
}
BlankProcessorEntry::BlankProcessorEntry (ProcessorBox* b, Width w)
: ProcessorEntry (b, boost::shared_ptr<Processor>(), w)
{
}
PluginInsertProcessorEntry::PluginInsertProcessorEntry (ProcessorBox* b, boost::shared_ptr<ARDOUR::PluginInsert> p, Width w)
: ProcessorEntry (b, p, w)
, _plugin_insert (p)
@ -606,31 +642,52 @@ PluginInsertProcessorEntry::PluginInsertProcessorEntry (ProcessorBox* b, boost::
_splitting_connection, invalidator (*this), boost::bind (&PluginInsertProcessorEntry::plugin_insert_splitting_changed, this), gui_context()
);
_splitting_icon.set_size_request (-1, 12);
_vbox.pack_start (_splitting_icon);
_vbox.reorder_child (_splitting_icon, 0);
plugin_insert_splitting_changed ();
}
void
PluginInsertProcessorEntry::plugin_insert_splitting_changed ()
{
_splitting_icon.set_inputs(_plugin_insert->input_streams());
_splitting_icon.set_outputs(_plugin_insert->output_streams());
_output_icon.set_ports(_plugin_insert->output_streams());
_routing_icon.set_splitting(_plugin_insert->splitting ());
if (_plugin_insert->splitting () || (
_plugin_insert->input_streams().n_midi() == 0
&& _plugin_insert->input_streams().n_audio() < _plugin_insert->output_streams().n_audio()
)
ChanCount sources = _plugin_insert->input_streams();
ChanCount sinks = _plugin_insert->natural_input_streams();
/* replicated instances */
if (!_plugin_insert->splitting () && _plugin_insert->get_count() > 1) {
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
sinks.set(*t, sinks.get(*t) * _plugin_insert->get_count());
}
}
/* MIDI bypass */
if (_plugin_insert->natural_output_streams().n_midi() == 0 &&
_plugin_insert->output_streams().n_midi() == 1) {
sinks.set(DataType::MIDI, 1);
sources.set(DataType::MIDI, 1);
}
_input_icon.set_ports(sinks);
_routing_icon.set_sinks(sinks);
_routing_icon.set_sources(sources);
if (_plugin_insert->splitting () ||
_plugin_insert->input_streams().n_audio() < _plugin_insert->natural_input_streams().n_audio()
)
{
_splitting_icon.show ();
_splitting_icon.queue_draw();
_routing_icon.set_size_request (-1, 7);
_routing_icon.set_visible(true);
_input_icon.show();
} else {
_splitting_icon.hide ();
_routing_icon.set_visible(false);
if (_position_num != 0) {
_input_icon.hide();
}
}
_input_icon.queue_draw();
_output_icon.queue_draw();
_routing_icon.queue_draw();
}
void
@ -640,35 +697,78 @@ PluginInsertProcessorEntry::hide_things ()
plugin_insert_splitting_changed ();
}
void
PluginInsertProcessorEntry::setup_visuals ()
{
switch (_position) {
case PreFader:
_splitting_icon.set_name ("ProcessorPreFader");
break;
case Fader:
_splitting_icon.set_name ("ProcessorFader");
break;
case PostFader:
_splitting_icon.set_name ("ProcessorPostFader");
break;
}
ProcessorEntry::setup_visuals ();
}
bool
PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev)
ProcessorEntry::PortIcon::on_expose_event (GdkEventExpose* ev)
{
cairo_t* cr = gdk_cairo_create (get_window()->gobj());
cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
cairo_clip (cr);
cairo_set_line_width (cr, 1.5);
cairo_set_line_width (cr, 5.0);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
Gtk::Allocation a = get_allocation();
double const width = a.get_width();
double const height = a.get_height();
Gdk::Color const bg = get_style()->get_bg (STATE_NORMAL);
cairo_set_source_rgb (cr, bg.get_red_p (), bg.get_green_p (), bg.get_blue_p ());
cairo_rectangle (cr, 0, 0, width, height);
cairo_fill (cr);
const double y0 = _input ? height-.5 : .5;
if (_ports.n_total() > 1) {
for (uint32_t i = 0; i < _ports.n_total(); ++i) {
if (i < _ports.n_midi()) {
cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(midi_port_color),
UINT_RGBA_G_FLT(midi_port_color),
UINT_RGBA_B_FLT(midi_port_color));
} else {
cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(audio_port_color),
UINT_RGBA_G_FLT(audio_port_color),
UINT_RGBA_B_FLT(audio_port_color));
}
const float x = rintf(width * (.2f + .6f * i / (_ports.n_total() - 1.f))) + .5f;
cairo_move_to (cr, x, y0);
cairo_close_path(cr);
cairo_stroke(cr);
}
} else if (_ports.n_total() == 1) {
if (_ports.n_midi() == 1) {
cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(midi_port_color),
UINT_RGBA_G_FLT(midi_port_color),
UINT_RGBA_B_FLT(midi_port_color));
} else {
cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(audio_port_color),
UINT_RGBA_G_FLT(audio_port_color),
UINT_RGBA_B_FLT(audio_port_color));
}
cairo_move_to (cr, rintf(width * .5) + .5f, y0);
cairo_close_path(cr);
cairo_stroke(cr);
}
cairo_destroy(cr);
return true;
}
bool
ProcessorEntry::RoutingIcon::on_expose_event (GdkEventExpose* ev)
{
cairo_t* cr = gdk_cairo_create (get_window()->gobj());
cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
cairo_clip (cr);
cairo_set_line_width (cr, 1.0);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
Gtk::Allocation a = get_allocation();
@ -684,54 +784,64 @@ PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev)
Gdk::Color const fg = get_style()->get_fg (STATE_NORMAL);
cairo_set_source_rgb (cr, fg.get_red_p (), fg.get_green_p (), fg.get_blue_p ());
const uint32_t inputs = _inputs.n_audio();
const uint32_t outputs = _outputs.n_audio();
const uint32_t sources = _sources.n_total();
const uint32_t sinks = _sinks.n_total();
const float si_m = rintf(height * 0.5) + .5f;
/* MIDI */
const uint32_t midi_sources = _sources.n_midi();
const uint32_t midi_sinks = _sinks.n_midi();
if (inputs == 1) {
const float si_l = rintf(width * 0.2) + .5f;
const float si_c = rintf(width * 0.5) + .5f;
const float si_r = rintf(width * 0.8) + .5f;
cairo_move_to (cr, si_l, height);
cairo_line_to (cr, si_l, si_m);
cairo_line_to (cr, si_r, si_m);
cairo_line_to (cr, si_r, height);
cairo_stroke (cr);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
const uint32_t outputs = _outputs.n_audio();
for (uint32_t i = 2; i < outputs; ++i) {
const float si_b = rintf(width * (.2f + .6f * (i - 1.f) / (outputs - 1.f))) + .5f;
cairo_move_to (cr, si_b, height);
cairo_line_to (cr, si_b, si_m);
cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(midi_port_color),
UINT_RGBA_G_FLT(midi_port_color),
UINT_RGBA_B_FLT(midi_port_color));
if (midi_sources > 0 && midi_sinks > 0 && sinks > 1 && sources > 1) {
for (uint32_t i = 0 ; i < midi_sources; ++i) {
const float si_x = rintf(width * (.2f + .6f * i / (sinks - 1.f))) + .5f;
const float si_x0 = rintf(width * (.2f + .6f * i / (sources - 1.f))) + .5f;
cairo_move_to (cr, si_x, height);
cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
cairo_stroke (cr);
}
cairo_move_to (cr, si_c, si_m);
cairo_line_to (cr, si_c, 0);
} else if (midi_sources == 1 && midi_sinks == 1 && sinks == 1 && sources == 1) {
const float si_x = rintf(width * .5f) + .5f;
cairo_move_to (cr, si_x, height);
cairo_line_to (cr, si_x, 0);
cairo_stroke (cr);
} else {
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
for (uint32_t i = 0 ; i < outputs; ++i) {
const float si_x = rintf(width * (.2f + .6f * i / (outputs - 1.f))) + .5f;
if (i < inputs) {
cairo_move_to (cr, si_x, height);
cairo_line_to (cr, si_x, 0);
cairo_stroke (cr);
} else {
cairo_move_to (cr, si_x, si_m);
cairo_line_to (cr, si_x, height);
cairo_stroke (cr);
cairo_move_to (cr, si_x+4, si_m);
cairo_line_to (cr, si_x-4, si_m);
cairo_stroke (cr);
}
}
}
/* AUDIO */
const uint32_t audio_sources = _sources.n_audio();
const uint32_t audio_sinks = _sinks.n_audio();
cairo_set_source_rgb (cr,
UINT_RGBA_R_FLT(audio_port_color),
UINT_RGBA_G_FLT(audio_port_color),
UINT_RGBA_B_FLT(audio_port_color));
if (_splitting) {
assert(audio_sinks > 1);
const float si_x0 = rintf(width * .5f) + .5f;
for (uint32_t i = midi_sinks; i < sinks; ++i) {
const float si_x = rintf(width * (.2f + .6f * i / (sinks - 1.f))) + .5f;
cairo_move_to (cr, si_x, height);
cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
cairo_stroke (cr);
}
} else if (audio_sources > 1) {
for (uint32_t i = 0 ; i < audio_sources; ++i) {
const float si_x = rintf(width * (.2f + .6f * (i + midi_sinks) / (sinks - 1.f))) + .5f;
const float si_x0 = rintf(width * (.2f + .6f * (i + midi_sources) / (sources - 1.f))) + .5f;
cairo_move_to (cr, si_x, height);
cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
cairo_stroke (cr);
}
} else if (audio_sources == 1 && audio_sinks == 1) {
const float si_x = rintf(width * .5f) + .5f;
cairo_move_to (cr, si_x, height);
cairo_line_to (cr, si_x, 0);
cairo_stroke (cr);
}
cairo_destroy(cr);
return true;
}
@ -761,7 +871,7 @@ ProcessorBox::ProcessorBox (ARDOUR::Session* sess, boost::function<PluginSelecto
processor_display.set_name ("ProcessorList");
processor_display.set_data ("processorbox", this);
processor_display.set_size_request (48, -1);
processor_display.set_spacing (2);
processor_display.set_spacing (0);
processor_display.signal_enter_notify_event().connect (sigc::mem_fun(*this, &ProcessorBox::enter_notify), false);
processor_display.signal_leave_notify_event().connect (sigc::mem_fun(*this, &ProcessorBox::leave_notify), false);
@ -845,10 +955,6 @@ ProcessorBox::object_drop(DnDVBox<ProcessorEntry>* source, ProcessorEntry* posit
`dropped on' processor */
list<ProcessorEntry*> c = processor_display.children ();
list<ProcessorEntry*>::iterator i = c.begin ();
while (dynamic_cast<BlankProcessorEntry*> (*i)) {
assert (i != c.end ());
++i;
}
assert (i != c.end ());
p = (*i)->processor ();
@ -1427,11 +1533,6 @@ ProcessorBox::redisplay_processors ()
_route->foreach_processor (sigc::bind (sigc::mem_fun (*this, &ProcessorBox::help_count_visible_prefader_processors),
&_visible_prefader_processors, &fader_seen));
if (_visible_prefader_processors == 0) { // fader only
BlankProcessorEntry* bpe = new BlankProcessorEntry (this, _width);
processor_display.add_child (bpe);
}
_route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::add_processor_to_display));
for (ProcessorWindowProxies::iterator i = _processor_window_info.begin(); i != _processor_window_info.end(); ++i) {
@ -1612,15 +1713,16 @@ ProcessorBox::setup_entry_positions ()
list<ProcessorEntry*> children = processor_display.children ();
bool pre_fader = true;
uint32_t num = 0;
for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) {
if (boost::dynamic_pointer_cast<Amp>((*i)->processor())) {
pre_fader = false;
(*i)->set_position (ProcessorEntry::Fader);
(*i)->set_position (ProcessorEntry::Fader, num++);
} else {
if (pre_fader) {
(*i)->set_position (ProcessorEntry::PreFader);
(*i)->set_position (ProcessorEntry::PreFader, num++);
} else {
(*i)->set_position (ProcessorEntry::PostFader);
(*i)->set_position (ProcessorEntry::PostFader, num++);
}
}
}

View File

@ -125,7 +125,7 @@ public:
PostFader
};
void set_position (Position);
void set_position (Position, uint32_t);
boost::shared_ptr<ARDOUR::Processor> processor () const;
void set_enum_width (Width);
@ -143,6 +143,7 @@ protected:
ArdourButton _button;
Gtk::VBox _vbox;
Position _position;
uint32_t _position_num;
virtual void setup_visuals ();
@ -150,6 +151,7 @@ private:
void led_clicked();
void processor_active_changed ();
void processor_property_changed (const PBD::PropertyChange&);
void processor_configuration_changed (const ARDOUR::ChanCount in, const ARDOUR::ChanCount out);
std::string name (Width) const;
void setup_tooltip ();
@ -159,6 +161,7 @@ private:
Gtk::StateType _visual_state;
PBD::ScopedConnection active_connection;
PBD::ScopedConnection name_connection;
PBD::ScopedConnection config_connection;
class Control : public sigc::trackable {
public:
@ -168,7 +171,6 @@ private:
void add_state (XMLNode *) const;
void set_state (XMLNode const *);
void hide_things ();
void hide_label ();
bool visible () const {
return _visible;
@ -178,7 +180,7 @@ private:
return _name;
}
Gtk::VBox box;
Gtk::Alignment box;
private:
void slider_adjusted ();
@ -191,7 +193,6 @@ private:
/* things for a slider */
Gtk::Adjustment _adjustment;
Gtkmm2ext::HSliderController _slider;
Gtk::Label _label;
Gtkmm2ext::PersistentTooltip _slider_persistant_tooltip;
/* things for a button */
ArdourButton _button;
@ -204,12 +205,43 @@ private:
std::list<Control*> _controls;
void toggle_control_visibility (Control *);
};
class BlankProcessorEntry : public ProcessorEntry
{
public:
BlankProcessorEntry (ProcessorBox *, Width w);
class PortIcon : public Gtk::DrawingArea {
public:
PortIcon(bool input) {
_input = input;
_ports = ARDOUR::ChanCount(ARDOUR::DataType::AUDIO, 1);
set_size_request (-1, 3);
}
void set_ports(ARDOUR::ChanCount const ports) { _ports = ports; }
private:
bool on_expose_event (GdkEventExpose *);
bool _input;
ARDOUR::ChanCount _ports;
};
class RoutingIcon : public Gtk::DrawingArea {
public:
RoutingIcon() {
_sources = ARDOUR::ChanCount(ARDOUR::DataType::AUDIO, 1);
_sinks = ARDOUR::ChanCount(ARDOUR::DataType::AUDIO, 1);
_splitting = false;
set_size_request (-1, 4);
}
void set_sources(ARDOUR::ChanCount const sources) { _sources = sources; }
void set_sinks(ARDOUR::ChanCount const sinks) { _sinks = sinks; }
void set_splitting(const bool splitting) { _splitting = splitting; }
private:
bool on_expose_event (GdkEventExpose *);
ARDOUR::ChanCount _sources; // signals available to feed into the processor(s)
ARDOUR::ChanCount _sinks; // combined number of outputs of the processor
bool _splitting;
};
protected:
RoutingIcon _routing_icon;
PortIcon _input_icon;
PortIcon _output_icon;
};
class PluginInsertProcessorEntry : public ProcessorEntry
@ -220,25 +252,9 @@ public:
void hide_things ();
private:
void setup_visuals ();
void plugin_insert_splitting_changed ();
class SplittingIcon : public Gtk::DrawingArea {
public:
SplittingIcon() {
_inputs = ARDOUR::ChanCount(ARDOUR::DataType::AUDIO, 1);
_outputs = ARDOUR::ChanCount(ARDOUR::DataType::AUDIO, 2);
}
void set_inputs(ARDOUR::ChanCount const inputs) { _inputs = inputs; }
void set_outputs(ARDOUR::ChanCount const outputs) { _outputs = outputs; }
private:
bool on_expose_event (GdkEventExpose *);
ARDOUR::ChanCount _inputs;
ARDOUR::ChanCount _outputs;
};
boost::shared_ptr<ARDOUR::PluginInsert> _plugin_insert;
SplittingIcon _splitting_icon;
PBD::ScopedConnection _splitting_connection;
};
@ -434,6 +450,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
void mixer_strip_delivery_changed (boost::weak_ptr<ARDOUR::Delivery>);
XMLNode* entry_gui_object_state (ProcessorEntry *);
PBD::ScopedConnection amp_config_connection;
};
#endif /* __ardour_gtk_processor_box__ */

View File

@ -42,7 +42,7 @@ ReturnUI::ReturnUI (Gtk::Window* parent, boost::shared_ptr<Return> r, Session* s
_gpm.set_controls (boost::shared_ptr<Route>(), r->meter(), r->amp());
_hbox.pack_start (_gpm, true, true);
set_name ("ReturnUIFrame");
set_name (X_("ReturnUIFrame"));
_vbox.set_spacing (5);
_vbox.set_border_width (5);
@ -61,7 +61,7 @@ ReturnUI::ReturnUI (Gtk::Window* parent, boost::shared_ptr<Return> r, Session* s
_return->input()->changed.connect (input_change_connection, invalidator (*this), boost::bind (&ReturnUI::ins_changed, this, _1, _2), gui_context());
_gpm.setup_meters ();
_gpm.set_fader_name ("ReturnUIFrame");
_gpm.set_fader_name (X_("ReturnUIFader"));
// screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect (sigc::mem_fun (*this, &ReturnUI::update));
fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (sigc::mem_fun (*this, &ReturnUI::fast_update));

View File

@ -46,7 +46,7 @@ SendUI::SendUI (Gtk::Window* parent, boost::shared_ptr<Send> s, Session* session
_gpm.set_controls (boost::shared_ptr<Route>(), s->meter(), s->amp());
_hbox.pack_start (_gpm, true, true);
set_name ("SendUIFrame");
set_name (X_("SendUIFrame"));
_vbox.set_spacing (5);
_vbox.set_border_width (5);
@ -77,7 +77,7 @@ SendUI::SendUI (Gtk::Window* parent, boost::shared_ptr<Send> s, Session* session
_panners.setup_pan ();
_gpm.setup_meters ();
_gpm.set_fader_name ("SendUIFrame");
_gpm.set_fader_name (X_("SendUIFader"));
// screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect (
// sigc::mem_fun (*this, &SendUI::update));

View File

@ -707,7 +707,7 @@ SoundFileBrowser::add_gain_meter ()
boost::shared_ptr<Route> r = _session->the_auditioner ();
gm->set_controls (r, r->shared_peak_meter(), r->amp());
gm->set_fader_name (X_("AudioTrackFader"));
gm->set_fader_name (X_("GainFader"));
meter_packer.set_border_width (12);
meter_packer.pack_start (*gm, false, true);

View File

@ -1093,7 +1093,12 @@ LV2Plugin::do_save_preset(string name)
lilv_state_free(state);
return Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
std::string uri = Glib::filename_to_uri(Glib::build_filename(bundle, file_name));
LilvNode *node = lilv_new_uri(_world.world, uri.c_str());
lilv_world_load_bundle(_world.world, node);
lilv_world_load_resource(_world.world, node);
lilv_node_free(node);
return uri;
}
void

View File

@ -1212,10 +1212,23 @@ double
PluginInsert::PluginControl::internal_to_interface (double val) const
{
if (_logarithmic) {
/* some plugins have a log-scale range "0.."
* ideally we'd map the range down to infinity somehow :)
*
* one solution could be to use
* val = exp(lower + log(range) * value);
* (log(val) - lower) / range)
* This approach would require access to the actual range (ie
* Plugin::ParameterDescriptor) and also require handling
* of unbound ranges..
*
* currently an arbitrarly low number is assumed to represnt
* log(0) as hot-fix solution.
*/
if (val > 0) {
val = log (val);
} else {
val = 0;
val = -8; // ~ -70dB = 20 * log10(exp(-8))
}
}
@ -1226,7 +1239,12 @@ double
PluginInsert::PluginControl::interface_to_internal (double val) const
{
if (_logarithmic) {
val = exp (val);
if (val <= -8) {
/* see note in PluginInsert::PluginControl::internal_to_interface() */
val= 0;
} else {
val = exp (val);
}
}
return val;

View File

@ -1985,9 +1985,9 @@ Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing
for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
string port;
if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
} else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
} else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
/* master bus is audio only */
if (_master_out && _master_out->n_inputs().get(*t) > 0) {
port = _master_out->input()->ports().port(*t,

View File

@ -421,7 +421,9 @@ Session::process_with_events (pframes_t nframes)
check_declick_out ();
}
_engine.split_cycle (this_nframes);
if (nframes > 0) {
_engine.split_cycle (this_nframes);
}
/* now handle this event and all others scheduled for the same time */

View File

@ -245,7 +245,7 @@ def configure(conf):
'LIBARDOUR_API', 'ardour/libardour_visibility.h')
autowaf.configure(conf)
autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO',
atleast_version='0.3.2')
exact_version='0.3.2')
autowaf.check_pkg(conf, 'libxml-2.0', uselib_store='XML')
autowaf.check_pkg(conf, 'lrdf', uselib_store='LRDF',
atleast_version='0.4.0')

View File

@ -1094,6 +1094,8 @@ JACKAudioBackend::control_app_name () const
appname = "hdspconf";
} else if (_target_device == "M Audio Delta 1010") {
appname = "mudita24";
} else if (_target_device == "M2496") {
appname = "mudita24";
}
}
} else {

View File

@ -746,7 +746,7 @@ clearlooks_glossy_draw_tab (cairo_t *cr,
if (params->active)
{
CairoColor shadow, hilight, f1, f2;
CairoColor shadow, f1, f2;
pattern = cairo_pattern_create_linear (tab->gap_side == CL_GAP_LEFT ? width-1 : 0,
tab->gap_side == CL_GAP_TOP ? height-2 : 1,

View File

@ -306,7 +306,7 @@ clearlooks_gtk2_rc_parse_style (GtkSettings *settings,
static guint
clearlooks_gtk2_rc_parse_dummy (GtkSettings *settings,
GScanner *scanner,
gchar *name)
const gchar *name)
{
(void) settings;

View File

@ -298,7 +298,7 @@ private:
/* make up an icon for the drag */
_drag_icon = new Gtk::Window (Gtk::WINDOW_POPUP);
Gtk::Allocation a = child->widget().get_allocation ();
Gtk::Allocation a = child->action_widget().get_allocation ();
_drag_icon->set_size_request (a.get_width(), a.get_height());
_drag_icon->signal_expose_event().connect (sigc::mem_fun (*this, &DnDVBox::icon_expose));
@ -328,7 +328,7 @@ private:
cairo_t* cr = gdk_cairo_create (_drag_icon->get_window()->gobj ());
Glib::RefPtr<Gdk::Pixmap> p = _drag_child->widget().get_snapshot();
Glib::RefPtr<Gdk::Pixmap> p = _drag_child->action_widget().get_snapshot();
gdk_cairo_set_source_pixmap (cr, p->gobj(), 0, 0);
cairo_rectangle (cr, 0, 0, w, h);
cairo_fill (cr);

View File

@ -33,7 +33,9 @@ using namespace Gtk;
using namespace std;
#define CORNER_RADIUS 4
#define FADER_RESERVE (2*CORNER_RADIUS)
#define CORNER_SIZE 2
#define CORNER_OFFSET 1
#define FADER_RESERVE 5
std::list<PixFader::FaderImage*> PixFader::_patterns;
@ -54,6 +56,12 @@ PixFader::PixFader (Gtk::Adjustment& adj, int orientation, int fader_length, int
adjustment.signal_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
adjustment.signal_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
if (_orien == VERT) {
DrawingArea::set_size_request(girth, span);
} else {
DrawingArea::set_size_request(span, girth);
}
}
PixFader::~PixFader ()
@ -105,11 +113,8 @@ PixFader::create_patterns ()
cairo_surface_t* surface;
cairo_t* tc = 0;
float radius = CORNER_RADIUS;
double w = get_width();
if (w <= 1 || get_height() <= 1) {
if (get_width() <= 1 || get_height() <= 1) {
return;
}
@ -136,13 +141,12 @@ PixFader::create_patterns ()
/* paint lower shade */
w -= 2.0;
shade_pattern = cairo_pattern_create_linear (0.0, 0.0, w, 0);
shade_pattern = cairo_pattern_create_linear (0.0, 0.0, get_width() - 2 - CORNER_OFFSET , 0);
cairo_pattern_add_color_stop_rgba (shade_pattern, 0, fr*0.8,fg*0.8,fb*0.8, 1.0);
cairo_pattern_add_color_stop_rgba (shade_pattern, 1, fr*0.6,fg*0.6,fb*0.6, 1.0);
cairo_set_source (tc, shade_pattern);
Gtkmm2ext::rounded_top_half_rectangle (tc, 1.0, get_height(), w, get_height(), radius-1.5);
Gtkmm2ext::rounded_top_half_rectangle (tc, CORNER_OFFSET, get_height() + CORNER_OFFSET,
get_width() - CORNER_SIZE, get_height(), CORNER_RADIUS);
cairo_fill (tc);
cairo_pattern_destroy (shade_pattern);
@ -169,7 +173,8 @@ PixFader::create_patterns ()
cairo_pattern_add_color_stop_rgba (shade_pattern, 0, fr*0.8,fg*0.8,fb*0.8, 1.0);
cairo_pattern_add_color_stop_rgba (shade_pattern, 1, fr*0.6,fg*0.6,fb*0.6, 1.0);
cairo_set_source (tc, shade_pattern);
Gtkmm2ext::rounded_right_half_rectangle (tc, 0, 1, get_width(), get_height() - 2.0, radius-1.5);
Gtkmm2ext::rounded_right_half_rectangle (tc, CORNER_OFFSET, CORNER_OFFSET,
get_width() - CORNER_OFFSET, get_height() - CORNER_SIZE, CORNER_RADIUS);
cairo_fill (tc);
cairo_pattern_destroy (shade_pattern);
@ -212,7 +217,6 @@ PixFader::on_expose_event (GdkEventExpose* ev)
cairo_set_source_rgb (cr, br, bg, bb);
cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
cairo_fill (cr);
return true;
}
@ -223,18 +227,27 @@ PixFader::on_expose_event (GdkEventExpose* ev)
float w = get_width();
float h = get_height();
Gdk::Color c = get_style()->get_bg (Gtk::STATE_PRELIGHT);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
cairo_rectangle (cr, 0, 0, w, h);
cairo_fill(cr);
cairo_set_line_width (cr, 1);
cairo_set_source_rgba (cr, 0, 0, 0, 1.0);
cairo_matrix_t matrix;
Gtkmm2ext::rounded_rectangle (cr, CORNER_OFFSET, CORNER_OFFSET, w-CORNER_SIZE, h-CORNER_SIZE, CORNER_RADIUS);
cairo_stroke_preserve(cr);
if (_orien == VERT) {
if (ds > h - FADER_RESERVE) {
ds = h - FADER_RESERVE;
if (ds > h - FADER_RESERVE - CORNER_OFFSET) {
ds = h - FADER_RESERVE - CORNER_OFFSET;
}
cairo_set_source (cr, pattern);
cairo_matrix_init_translate (&matrix, 0, (h - ds));
cairo_pattern_set_matrix (pattern, &matrix);
Gtkmm2ext::rounded_rectangle (cr, 0, 0, w, h, CORNER_RADIUS-1.5);
cairo_fill (cr);
} else {
@ -258,7 +271,6 @@ PixFader::on_expose_event (GdkEventExpose* ev)
cairo_set_source (cr, pattern);
cairo_matrix_init_translate (&matrix, w - ds, 0);
cairo_pattern_set_matrix (pattern, &matrix);
Gtkmm2ext::rounded_rectangle (cr, 0, 0, w, h, CORNER_RADIUS-1.5);
cairo_fill (cr);
}
@ -270,14 +282,14 @@ PixFader::on_expose_event (GdkEventExpose* ev)
context->set_source_rgba (c.get_red_p()*1.5, c.get_green_p()*1.5, c.get_blue_p()*1.5, 0.85);
if ( _orien == VERT) {
if (unity_loc < h ) {
context->move_to (1.5, unity_loc + .5);
context->line_to (girth - 1.5, unity_loc + .5);
context->move_to (1.5, unity_loc + CORNER_OFFSET + .5);
context->line_to (girth - 1.5, unity_loc + CORNER_OFFSET + .5);
context->stroke ();
}
} else {
if ( unity_loc < w ){
context->move_to (unity_loc + .5, 1.5);
context->line_to (unity_loc + .5, girth - 1.5);
context->move_to (unity_loc - CORNER_OFFSET + .5, 1.5);
context->line_to (unity_loc - CORNER_OFFSET + .5, girth - 1.5);
context->stroke ();
}
}
@ -293,11 +305,11 @@ PixFader::on_expose_event (GdkEventExpose* ev)
}
if (!get_sensitive()) {
Gtkmm2ext::rounded_rectangle (cr, 0, 0, get_width(), get_height(), 3);
Gtkmm2ext::rounded_rectangle (cr, CORNER_OFFSET, CORNER_OFFSET, w-CORNER_SIZE, h-CORNER_SIZE, CORNER_RADIUS);
cairo_set_source_rgba (cr, 0.505, 0.517, 0.525, 0.4);
cairo_fill (cr);
} else if (_hovering) {
Gtkmm2ext::rounded_rectangle (cr, 0, 0, get_width(), get_height(), 3);
Gtkmm2ext::rounded_rectangle (cr, CORNER_OFFSET, CORNER_OFFSET, w-CORNER_SIZE, h-CORNER_SIZE, CORNER_RADIUS);
cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.1);
cairo_fill (cr);
}
@ -546,9 +558,9 @@ void
PixFader::update_unity_position ()
{
if (_orien == VERT) {
unity_loc = (int) rint (span * (1 - (default_value / (adjustment.get_upper() - adjustment.get_lower())))) - 1;
unity_loc = (int) rint (span * (1 - ((default_value - adjustment.get_lower()) / (adjustment.get_upper() - adjustment.get_lower())))) - 1;
} else {
unity_loc = (int) rint (default_value * span / (adjustment.get_upper() - adjustment.get_lower()));
unity_loc = (int) rint ((default_value - adjustment.get_lower()) * span / (adjustment.get_upper() - adjustment.get_lower()));
}
queue_draw ();
@ -614,6 +626,7 @@ PixFader::on_state_changed (Gtk::StateType old_state)
{
Widget::on_state_changed (old_state);
create_patterns ();
queue_draw ();
}
void
@ -630,4 +643,5 @@ PixFader::on_style_changed (const Glib::RefPtr<Gtk::Style>&)
*/
pattern = 0;
queue_draw ();
}

View File

@ -26,7 +26,8 @@ def configure(conf):
conf.load('compiler_cxx')
autowaf.configure(conf)
autowaf.check_pkg(conf, 'fftw3f', uselib_store='FFTW3F', mandatory=True)
autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO', mandatory=False)
autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO', mandatory=False,
exact_version='0.3.2')
conf.write_config_header('libvampplugins-config.h', remove=False)
def build(bld):

View File

@ -0,0 +1,213 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE MIDINameDocument PUBLIC "-//MIDI Manufacturers Association//DTD MIDINameDocument 1.0//EN" "http://www.midi.org/dtds/MIDINameDocument10.dtd">
<MIDINameDocument>
<Author>David Robillard</Author>
<MasterDeviceNames>
<Manufacturer>Moog</Manufacturer>
<Model>MF-104M Analog Delay</Model>
<CustomDeviceMode Name="Default">
<ChannelNameSetAssignments>
<ChannelNameSetAssign Channel="1" NameSet="Names"/>
</ChannelNameSetAssignments>
</CustomDeviceMode>
<ChannelNameSet Name="Names">
<AvailableForChannels>
<AvailableChannel Channel="1" Available="true"/>
</AvailableForChannels>
<UsesControlNameList Name="Controls"/>
<PatchBank Name="User Patches">
<PatchNameList Name="User Patches"/>
</PatchBank>
</ChannelNameSet>
<ValueNameList Name="Toggle">
<Value Number="0" Name="Disabled"/>
<Value Number="64" Name="Enabled"/>
</ValueNameList>
<ControlNameList Name="Controls">
<Control Type="7bit" Number="7" Name="Output Level (Coarse)"/>
<Control Type="7bit" Number="39" Name="Output Level (Fine)"/>
<Control Type="7bit" Number="12" Name="Time (Coarse)"/>
<Control Type="7bit" Number="44" Name="Time (Fine)"/>
<Control Type="7bit" Number="13" Name="Feedback (Coarse)"/>
<Control Type="7bit" Number="45" Name="Feedback (Fine)"/>
<Control Type="7bit" Number="14" Name="Mix (Coarse)"/>
<Control Type="7bit" Number="46" Name="Mix (Fine)"/>
<Control Type="7bit" Number="15" Name="LFO Rate (Coarse)"/>
<Control Type="7bit" Number="47" Name="LFO Rate (Fine)"/>
<Control Type="7bit" Number="16" Name="LFO Amount (Coarse)"/>
<Control Type="7bit" Number="48" Name="LFO Amount (Fine)"/>
<Control Type="7bit" Number="70" Name="LFO Waveform">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Sine"/>
<Value Number="16" Name="Triangle"/>
<Value Number="32" Name="Square"/>
<Value Number="48" Name="Saw"/>
<Value Number="64" Name="Ramp"/>
<Value Number="80" Name="Sample &amp; Hold"/>
<Value Number="96" Name="Smooth Sample &amp; Hold"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="74" Name="Range (Fast/Slow)">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Slow"/>
<Value Number="64" Name="Fast"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="91" Name="Bypass On/Off">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Bypassed"/>
<Value Number="64" Name="Active"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="5" Name="Time Slew Rate (Coarse)"/>
<Control Type="7bit" Number="37" Name="Time Slew Rate (Fine)"/>
<Control Type="7bit" Number="83" Name="Pitch Bend Amount">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Off"/>
<Value Number="16" Name="2 Semi"/>
<Value Number="32" Name="3 Semi"/>
<Value Number="48" Name="4 Semi"/>
<Value Number="64" Name="5 Semi"/>
<Value Number="80" Name="7 Semi"/>
<Value Number="96" Name="12 Semi"/>
<Value Number="112" Name="24 Semi"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="85" Name="Filter Bright/Dark">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Bright"/>
<Value Number="64" Name="Dark"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="87" Name="Delay Time Multiplier">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Norm"/>
<Value Number="32" Name="x2"/>
<Value Number="64" Name="x4"/>
<Value Number="96" Name="x8"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="89" Name="Delay Time MIDI Sync Enable">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="105" Name="LFO Phase Reset"/>
<Control Type="7bit" Number="107" Name="LFO Clock Divisions">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="4 Whole"/>
<Value Number="6" Name="3 Whole"/>
<Value Number="12" Name="2 Whole"/>
<Value Number="18" Name="WH + 1/2 Dot"/>
<Value Number="24" Name="WH + 1/2"/>
<Value Number="30" Name="WH + 1/4"/>
<Value Number="35" Name="WH"/>
<Value Number="41" Name="1/2 Dot"/>
<Value Number="47" Name="WH T"/>
<Value Number="53" Name="1/2"/>
<Value Number="59" Name="1/4 Dot"/>
<Value Number="64" Name="1/2 T"/>
<Value Number="70" Name="1/4"/>
<Value Number="76" Name="1/8 Dot"/>
<Value Number="82" Name="1/4 T"/>
<Value Number="88" Name="1/8"/>
<Value Number="94" Name="1/16 Dot"/>
<Value Number="99" Name="1/8 T"/>
<Value Number="105" Name="1/16"/>
<Value Number="111" Name="1/16 T"/>
<Value Number="117" Name="1/32"/>
<Value Number="123" Name="1/32 T"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="108" Name="Enable LFO MIDI Sync">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="109" Name="Enable LFO Note Reset">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="110" Name="Enable MIDI Note Spillover">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="113" Name="MIDI Note Mode">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Off"/>
<Value Number="42" Name="Absolute"/>
<Value Number="84" Name="Relative"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="114" Name="MIDI Tap Tempo (Latching)">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Tap"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="115" Name="MIDI Tap Tempo (Momentary)">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="64" Name="Tap"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="117" Name="Time/MIDI LED Select">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Time LED"/>
<Value Number="64" Name="MIDI LED"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="119" Name="Enable Mod Wheel to LFO Amount">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
</ControlNameList>
</MasterDeviceNames>
</MIDINameDocument>

View File

@ -0,0 +1,181 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE MIDINameDocument PUBLIC "-//MIDI Manufacturers Association//DTD MIDINameDocument 1.0//EN" "http://www.midi.org/dtds/MIDINameDocument10.dtd">
<MIDINameDocument>
<Author>David Robillard</Author>
<MasterDeviceNames>
<Manufacturer>Moog</Manufacturer>
<Model>MF-108M Cluster Flux</Model>
<CustomDeviceMode Name="Default">
<ChannelNameSetAssignments>
<ChannelNameSetAssign Channel="1" NameSet="Names"/>
</ChannelNameSetAssignments>
</CustomDeviceMode>
<ChannelNameSet Name="Names">
<AvailableForChannels>
<AvailableChannel Channel="1" Available="true"/>
</AvailableForChannels>
<UsesControlNameList Name="Controls"/>
<PatchBank Name="User Patches">
<PatchNameList Name="User Patches"/>
</PatchBank>
</ChannelNameSet>
<ControlNameList Name="Controls">
<Control Type="7bit" Number="5" Name="Delay Time Portamento (Coarse)"/>
<Control Type="7bit" Number="37" Name="Delay Time Portamento (Fine)"/>
<Control Type="7bit" Number="7" Name="Output Level Control (Coarse)"/>
<Control Type="7bit" Number="39" Name="Output Level Control (Fine)"/>
<Control Type="7bit" Number="12" Name="Delay Time (Coarse)"/>
<Control Type="7bit" Number="44" Name="Delay Time (Fine)"/>
<Control Type="7bit" Number="13" Name="Feedback (Coarse)"/>
<Control Type="7bit" Number="45" Name="Feedback (Fine)"/>
<Control Type="7bit" Number="14" Name="Mix (Coarse)"/>
<Control Type="7bit" Number="46" Name="Mix (Fine)"/>
<Control Type="7bit" Number="15" Name="LFO Rate (Coarse)"/>
<Control Type="7bit" Number="47" Name="LFO Rate (Fine)"/>
<Control Type="7bit" Number="16" Name="LFO Amount (Coarse)"/>
<Control Type="7bit" Number="48" Name="LFO Amount (Fine)"/>
<Control Type="7bit" Number="70" Name="LFO Waveform">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Sine"/>
<Value Number="16" Name="Triangle"/>
<Value Number="32" Name="Square"/>
<Value Number="48" Name="Saw"/>
<Value Number="64" Name="Ramp"/>
<Value Number="80" Name="Random Stepped"/>
<Value Number="96" Name="Smoothed Random"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="74" Name="Range (Flange/Chorus)">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Flange"/>
<Value Number="64" Name="Chorus"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="91" Name="Bypass On/Off">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Bypassed"/>
<Value Number="64" Name="Active"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="71" Name="LFO Clock Divisions">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="4 Whole"/>
<Value Number="6" Name="3 Whole"/>
<Value Number="12" Name="2 Whole"/>
<Value Number="18" Name="WH + 1/2 Dot"/>
<Value Number="24" Name="WH + 1/2"/>
<Value Number="30" Name="WH + 1/4"/>
<Value Number="35" Name="WH"/>
<Value Number="41" Name="1/2 Dot"/>
<Value Number="47" Name="WH T"/>
<Value Number="53" Name="1/2"/>
<Value Number="59" Name="1/4 Dot"/>
<Value Number="64" Name="1/2 T"/>
<Value Number="70" Name="1/4"/>
<Value Number="76" Name="1/8 Dot"/>
<Value Number="82" Name="1/4 T"/>
<Value Number="88" Name="1/8"/>
<Value Number="94" Name="1/16 Dot"/>
<Value Number="99" Name="1/8 T"/>
<Value Number="105" Name="1/16"/>
<Value Number="111" Name="1/16 T"/>
<Value Number="117" Name="1/32"/>
<Value Number="123" Name="1/32 T"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="72" Name="LFO Phase Reset"/>
<Control Type="7bit" Number="73" Name="Enable LFO Note Reset">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="75" Name="Delay Time Range Multiplier">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Off"/>
<Value Number="32" Name="x2"/>
<Value Number="64" Name="x4"/>
<Value Number="96" Name="x8"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="76" Name="MIDI Sync Enable">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="77" Name="Enable MIDI Note Mode">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="78" Name="Enable MIDI Note Spillover">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="79" Name="Enable Mod Wheel to LFO Amount">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="80" Name="Pitch Bend Amount">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Off"/>
<Value Number="16" Name="2 Semi"/>
<Value Number="32" Name="3 Semi"/>
<Value Number="48" Name="4 Semi"/>
<Value Number="64" Name="5 Semi"/>
<Value Number="80" Name="7 Semi"/>
<Value Number="96" Name="12 Semi"/>
<Value Number="112" Name="24 Semi"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="92" Name="MIDI Tap Tempo (Latching)">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Tap"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="93" Name="MIDI Tap Tempo (Momentary)">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="64" Name="Tap"/>
</ValueNameList>
</Values>
</Control>
</ControlNameList>
</MasterDeviceNames>
</MIDINameDocument>

View File

@ -121,6 +121,20 @@
<Patch Number="99" Name="Patch 99" ProgramChange="98"/>
<Patch Number="100" Name="Patch 100" ProgramChange="99"/>
</PatchNameList>
<ValueNameList Name="Toggle">
<Value Number="0" Name="Off"/>
<Value Number="64" Name="On"/>
</ValueNameList>
<ValueNameList Name="PitchRange">
<Value Number="0" Name="Off"/>
<Value Number="16" Name="2 Semi"/>
<Value Number="32" Name="3 Semi"/>
<Value Number="48" Name="4 Semi"/>
<Value Number="64" Name="5 Semi"/>
<Value Number="80" Name="7 Semi"/>
<Value Number="96" Name="12 Semi"/>
<Value Number="112" Name="24 Semi"/>
</ValueNameList>
<ControlNameList Name="Controls">
<!-- Modulation -->
<Control Type="7bit" Number="3" Name="LFO Rate (Coarse)"/>
@ -129,21 +143,94 @@
<Control Type="7bit" Number="45" Name="LFO VCO Amount (Fine)"/>
<Control Type="7bit" Number="12" Name="LFO VCF Amount (Coarse)"/>
<Control Type="7bit" Number="44" Name="LFO VCF Amount (Fine)"/>
<Control Type="7bit" Number="87" Name="LFO MIDI Sync"/>
<Control Type="7bit" Number="86" Name="LFO Sync Clock Div"/>
<Control Type="7bit" Number="82" Name="LFO Key Trigger"/>
<Control Type="7bit" Number="87" Name="LFO MIDI Sync">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Internal"/>
<Value Number="16" Name="MIDI Clock"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="86" Name="LFO Sync Clock Div">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="4 Whole"/>
<Value Number="7" Name="3 Whole"/>
<Value Number="13" Name="2 Whole"/>
<Value Number="19" Name="WH + 1/2"/>
<Value Number="25" Name="WH"/>
<Value Number="31" Name="1/2 Dot"/>
<Value Number="37" Name="WH T"/>
<Value Number="43" Name="1/2"/>
<Value Number="49" Name="1/4 Dot"/>
<Value Number="55" Name="1/2 T"/>
<Value Number="61" Name="1/4"/>
<Value Number="68" Name="1/8 Dot"/>
<Value Number="74" Name="1/4 T"/>
<Value Number="80" Name="1/8"/>
<Value Number="86" Name="1/16 Dot"/>
<Value Number="92" Name="1/8 T"/>
<Value Number="98" Name="1/16"/>
<Value Number="104" Name="1/16 T"/>
<Value Number="116" Name="1/32"/>
<Value Number="122" Name="1/64 T"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="82" Name="LFO Key Trigger">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<!-- Oscillators -->
<Control Type="7bit" Number="70" Name="VCO 1 Wave"/>
<Control Type="7bit" Number="71" Name="VCO 2 Wave"/>
<Control Type="7bit" Number="70" Name="VCO 1 Wave">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Saw"/>
<Value Number="64" Name="Square"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="71" Name="VCO 2 Wave">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Saw"/>
<Value Number="64" Name="Square"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="17" Name="VCO 2 Freq (Coarse)"/>
<Control Type="7bit" Number="49" Name="VCO 2 Freq (Fine)"/>
<Control Type="7bit" Number="18" Name="VCO 2 Beat (Coarse)"/>
<!-- Duplicate <Control Type="7bit" Number="50" Name="VCO 2 Beat (Fine)"/> -->
<Control Type="7bit" Number="81" Name="Note Sync"/>
<Control Type="7bit" Number="81" Name="Note Sync">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="5" Name="Glide Rate"/>
<Control Type="7bit" Number="65" Name="Glide Switch"/>
<Control Type="7bit" Number="92" Name="Glide Type"/>
<Control Type="7bit" Number="83" Name="Legato Glide"/>
<Control Type="7bit" Number="65" Name="Glide Switch">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="92" Name="Glide Type">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Linear Constant Rate"/>
<Value Number="43" Name="Linear Constant Time"/>
<Value Number="85" Name="Exponential"/>
</ValueNameList>
</Values>
</Control>
<Control Type="7bit" Number="83" Name="Legato Glide">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Always Glide"/>
<Value Number="43" Name="Glide Legato Notes Only"/>
</ValueNameList>
</Values>
</Control>
<!-- Mixer -->
<Control Type="7bit" Number="15" Name="VCO 1 (Coarse)"/>
<Control Type="7bit" Number="47" Name="VCO 1 (Fine)"/>
@ -174,20 +261,48 @@
<Control Type="7bit" Number="61" Name="VCA Decay/Release (Fine)"/>
<Control Type="7bit" Number="30" Name="VCA Sustain (Coarse)"/>
<Control Type="7bit" Number="62" Name="VCA Sustain (Fine)"/>
<Control Type="7bit" Number="72" Name="Release Switch"/>
<Control Type="7bit" Number="73" Name="Trigger Mode"/>
<Control Type="7bit" Number="72" Name="Release Switch">
<Values Min="0" Max="127">
<UsesValueNameList Name="Toggle"/>
</Values>
</Control>
<Control Type="7bit" Number="73" Name="Trigger Mode">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Legato On"/>
<Value Number="43" Name="Legato Off"/>
<Value Number="85" Name="EG Reset"/>
</ValueNameList>
</Values>
</Control>
<!-- Volume -->
<Control Type="7bit" Number="7" Name="Volume (Coarse)"/>
<Control Type="7bit" Number="39" Name="Volume (Fine)"/>
<Control Type="7bit" Number="90" Name="Volume Velocity Sensitivity"/>
<!-- Keyboard Response -->
<Control Type="7bit" Number="91" Name="Key Priority"/>
<Control Type="7bit" Number="91" Name="Key Priority">
<Values Min="0" Max="127">
<ValueNameList>
<Value Number="0" Name="Low"/>
<Value Number="43" Name="High"/>
<Value Number="85" Name="Last"/>
</ValueNameList>
</Values>
</Control>
<!-- Mod Wheel Response -->
<Control Type="7bit" Number="1" Name="Mod Wheel (Coarse)"/>
<Control Type="7bit" Number="33" Name="Mod Wheel (Fine)"/>
<!-- Pitch Wheel Response -->
<Control Type="7bit" Number="107" Name="Bend Up Amount"/>
<Control Type="7bit" Number="108" Name="Bend Down Amount"/>
<Control Type="7bit" Number="107" Name="Bend Up Amount">
<Values Min="0" Max="127">
<UsesValueNameList Name="PitchRange"/>
</Values>
</Control>
<Control Type="7bit" Number="108" Name="Bend Down Amount">
<Values Min="0" Max="127">
<UsesValueNameList Name="PitchRange"/>
</Values>
</Control>
<!-- Control -->
<Control Type="7bit" Number="122" Name="Local Control Off"/>
<Control Type="7bit" Number="120" Name="All Sounds Off"/>

View File

@ -163,6 +163,11 @@ def set_compiler_flags (conf,opt):
# Prevents visibility issues in standard headers
conf.define("_DARWIN_C_SOURCE", 1)
if conf.options.asan:
conf.check_cxx(cxxflags=["-fsanitize=address"], linkflags=["-fsanitize=address"])
cxx_flags.append('-fsanitize=address')
linker_flags.append('-fsanitize=address')
if is_clang and platform == "darwin":
# Silence warnings about the non-existing osx clang compiler flags
# -compatibility_version and -current_version. These are Waf
@ -505,6 +510,8 @@ def options(opt):
help='Do not ask questions that require confirmation during the build')
opt.add_option('--cxx11', action='store_true', default=False, dest='cxx11',
help='Turn on c++11 compiler flags (-std=c++11)')
opt.add_option('--address-sanitizer', action='store_true', default=False, dest='asan',
help='Turn on AddressSanitizer (requires GCC >= 4.8 or clang)')
for i in children:
opt.recurse(i)