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

View file

@ -731,6 +731,19 @@ style "midi_track_base" = "default"
bg[SELECTED] = @@COLPREFIX@_bg 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" style "audio_track_metrics" = "audio_track_base"
{ {
font_name = "@FONT_TINY@" font_name = "@FONT_TINY@"
@ -815,7 +828,9 @@ style "plugin_slider"
bg[ACTIVE] = shade (0.6, @@COLPREFIX@_lightest) bg[ACTIVE] = shade (0.6, @@COLPREFIX@_lightest)
bg[INSENSITIVE] = shade (0.6, @@COLPREFIX@_lightest) bg[INSENSITIVE] = shade (0.6, @@COLPREFIX@_lightest)
bg[SELECTED] = 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 # the numeric display
@ -826,6 +841,16 @@ style "plugin_slider"
text[PRELIGHT] = @@COLPREFIX@_text 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" style "track_list_display" = "small_bold_text"
{ {
text[NORMAL] = @@COLPREFIX@_text text[NORMAL] = @@COLPREFIX@_text

View file

@ -187,12 +187,12 @@
<Option name="processor postfader: led active" value="78cb4eff"/> <Option name="processor postfader: led active" value="78cb4eff"/>
<Option name="processor postfader: text" value="aaaaa3ff"/> <Option name="processor postfader: text" value="aaaaa3ff"/>
<Option name="processor postfader: text active" value="eeeeecff"/> <Option name="processor postfader: text active" value="eeeeecff"/>
<Option name="processor control button: fill start" value="000000ff"/> <Option name="processor control button: fill start" value="222222ff"/>
<Option name="processor control button: fill end" value="000000ff"/> <Option name="processor control button: fill end" value="333333ff"/>
<Option name="processor control button: fill start active" value="000000ff"/> <Option name="processor control button: fill start active" value="444444ff"/>
<Option name="processor control button: fill end active" value="000000ff"/> <Option name="processor control button: fill end active" value="333333ff"/>
<Option name="processor control button: led" value="000000ff"/> <Option name="processor control button: led" value="224400ff"/>
<Option name="processor control button: led active" value="ff0000ff"/> <Option name="processor control button: led active" value="99cc00ff"/>
<Option name="processor control button: text" value="ffffffff"/> <Option name="processor control button: text" value="ffffffff"/>
<Option name="processor control button: text active" value="ffffffff"/> <Option name="processor control button: text active" value="ffffffff"/>
<Option name="monitor button: fill start" value="5f5a58ff"/> <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 "*TimeAxisViewControlsBaseUnselected" style:highest "audio_track_base"
widget "*AudioTrackControlsBaseUnselected" style:highest "audio_track_base" widget "*AudioTrackControlsBaseUnselected" style:highest "audio_track_base"
widget "*MidiTrackControlsBaseUnselected" style:highest "midi_track_base" widget "*MidiTrackControlsBaseUnselected" style:highest "midi_track_base"
widget "*AudioTrackFader" style:highest "gain_fader"
widget "*MidiTrackFader" style:highest "gain_fader" widget "*SendUIFader" style:highest "plugin_slider"
widget "*AudioBusFader" style:highest "gain_fader" 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 "*BusControlsBaseUnselected" style:highest "audio_bus_base"
widget "*TrackSeparator" style:highest "track_separator" widget "*TrackSeparator" style:highest "track_separator"
@ -234,6 +238,8 @@ widget "*MotionControllerValue*" style:highest "small_entry"
widget "*ParameterValueDisplay" style:highest "medium_bold_entry" widget "*ParameterValueDisplay" style:highest "medium_bold_entry"
widget "*PluginUIClickBox" style:highest "medium_bold_entry" widget "*PluginUIClickBox" 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 "*PluginSlider" style:highest "plugin_slider"
widget "*GainFader" style:highest "plugin_slider" widget "*GainFader" style:highest "plugin_slider"
widget "*MixerTrackCommentArea" style:highest "option_entry" widget "*MixerTrackCommentArea" style:highest "option_entry"

View file

@ -302,6 +302,9 @@ ArdourButton::render (cairo_t* cr)
} }
if ( ((_elements & Text)==Text) && !_text.empty()) { 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_new_path (cr);
cairo_set_source_rgba (cr, text_r, text_g, text_b, text_a); 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 */ /* 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_move_to (cr, (get_width() - _text_width)/2.0, get_height()/2.0 - _text_height/2.0);
} }
cairo_restore (cr);
} }
if (((_elements & Indicator)==Indicator)) { if (((_elements & Indicator)==Indicator)) {
@ -472,6 +475,7 @@ ArdourButton::on_size_request (Gtk::Requisition* req)
req->height = _text_height + ypad; req->height = _text_height + ypad;
} }
} }
req->width += _corner_radius;
} }
void void

View file

@ -133,17 +133,19 @@ Editor::show_editor_mixer (bool yn)
if (current_mixer_strip == 0) { if (current_mixer_strip == 0) {
create_editor_mixer (); 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.pack_start (*current_mixer_strip, Gtk::PACK_SHRINK );
global_hpacker.reorder_child (*current_mixer_strip, 0); global_hpacker.reorder_child (*current_mixer_strip, 0);
current_mixer_strip->show (); 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 { } else {
if (current_mixer_strip) { if (current_mixer_strip) {

View file

@ -38,6 +38,7 @@
#include <gtkmm2ext/choice.h> #include <gtkmm2ext/choice.h>
#include <gtkmm2ext/utils.h> #include <gtkmm2ext/utils.h>
#include <gtkmm2ext/doi.h> #include <gtkmm2ext/doi.h>
#include <gtkmm2ext/rgb_macros.h>
#include "ardour/amp.h" #include "ardour/amp.h"
#include "ardour/audio_track.h" #include "ardour/audio_track.h"
@ -91,6 +92,9 @@ RefPtr<Action> ProcessorBox::rename_action;
RefPtr<Action> ProcessorBox::edit_action; RefPtr<Action> ProcessorBox::edit_action;
RefPtr<Action> ProcessorBox::edit_generic_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) ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processor> p, Width w)
: _button (ArdourButton::led_default_elements) : _button (ArdourButton::led_default_elements)
, _position (PreFader) , _position (PreFader)
@ -98,6 +102,8 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
, _processor (p) , _processor (p)
, _width (w) , _width (w)
, _visual_state (Gtk::STATE_NORMAL) , _visual_state (Gtk::STATE_NORMAL)
, _input_icon(true)
, _output_icon(false)
{ {
_vbox.show (); _vbox.show ();
@ -109,18 +115,37 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
if (_processor) { if (_processor) {
_vbox.pack_start (_routing_icon);
_vbox.pack_start (_input_icon);
_vbox.pack_start (_button, true, true); _vbox.pack_start (_button, true, true);
_vbox.pack_end (_output_icon);
_button.set_active (_processor->active()); _button.set_active (_processor->active());
_routing_icon.set_no_show_all(true);
_input_icon.set_no_show_all(true);
_button.show (); _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->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->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 (); set<Evoral::Parameter> p = _processor->what_can_be_automated ();
for (set<Evoral::Parameter>::iterator i = p.begin(); i != p.end(); ++i) { 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); _controls.push_back (c);
@ -128,12 +153,13 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptr<Processo
/* Add non-Amp controls to the processor box */ /* Add non-Amp controls to the processor box */
_vbox.pack_start (c->box); _vbox.pack_start (c->box);
} }
}
if (boost::dynamic_pointer_cast<Send> (_processor)) { _input_icon.set_ports(_processor->input_streams());
/* Don't label send faders */ _output_icon.set_ports(_processor->output_streams());
c->hide_label ();
} _routing_icon.set_sources(_processor->input_streams());
} _routing_icon.set_sinks(_processor->output_streams());
setup_tooltip (); setup_tooltip ();
setup_visuals (); setup_visuals ();
@ -168,9 +194,17 @@ ProcessorEntry::drag_text () const
} }
void void
ProcessorEntry::set_position (Position p) ProcessorEntry::set_position (Position p, uint32_t num)
{ {
_position = p; _position = p;
_position_num = num;
if (_position_num == 0 || _routing_icon.get_visible()) {
_input_icon.show();
} else {
_input_icon.hide();
}
setup_visuals (); 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 void
ProcessorEntry::setup_tooltip () 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) , _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 (&_adjustment, 0, 13, false)
, _slider_persistant_tooltip (&_slider) , _slider_persistant_tooltip (&_slider)
, _button (ArdourButton::Element (ArdourButton::Text | ArdourButton::Indicator)) , _button (ArdourButton::led_default_elements)
, _ignore_ui_adjustment (false) , _ignore_ui_adjustment (false)
, _visible (false) , _visible (false)
, _name (n) , _name (n)
{ {
_slider.set_controllable (c); _slider.set_controllable (c);
box.set_padding(0, 0, 4, 4);
if (c->toggled()) { if (c->toggled()) {
_button.set_text (_name); _button.set_text (_name);
_button.set_led_left (true); _button.set_led_left (true);
_button.set_name ("processor control button"); _button.set_name ("processor control button");
box.pack_start (_button); box.add (_button);
_button.show (); _button.show ();
_button.signal_clicked.connect (sigc::mem_fun (*this, &Control::button_clicked)); _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 { } else {
_slider.set_name ("PluginSlider"); _slider.set_name ("ProcessorControlSlider");
_slider.set_text (_name); _slider.set_text (_name);
box.pack_start (_slider); box.add (_slider);
_slider.show (); _slider.show ();
double const lo = c->internal_to_interface (c->lower ()); 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()); string sm = Glib::Markup::escape_text (s.str());
ARDOUR_UI::instance()->set_tip (_label, sm);
_slider_persistant_tooltip.set_tip (sm); _slider_persistant_tooltip.set_tip (sm);
ARDOUR_UI::instance()->set_tip (_button, sm); ARDOUR_UI::instance()->set_tip (_button, sm);
} }
@ -505,6 +551,7 @@ ProcessorEntry::Control::button_clicked ()
c->set_value (n ? 0 : 1); c->set_value (n ? 0 : 1);
_button.set_active (!n); _button.set_active (!n);
set_tooltip ();
} }
void void
@ -578,12 +625,6 @@ ProcessorEntry::Control::hide_things ()
} }
} }
void
ProcessorEntry::Control::hide_label ()
{
_label.hide ();
}
string string
ProcessorEntry::Control::state_id () const ProcessorEntry::Control::state_id () const
{ {
@ -593,11 +634,6 @@ ProcessorEntry::Control::state_id () const
return string_compose (X_("control %1"), c->id().to_s ()); 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) PluginInsertProcessorEntry::PluginInsertProcessorEntry (ProcessorBox* b, boost::shared_ptr<ARDOUR::PluginInsert> p, Width w)
: ProcessorEntry (b, p, w) : ProcessorEntry (b, p, w)
, _plugin_insert (p) , _plugin_insert (p)
@ -606,33 +642,54 @@ PluginInsertProcessorEntry::PluginInsertProcessorEntry (ProcessorBox* b, boost::
_splitting_connection, invalidator (*this), boost::bind (&PluginInsertProcessorEntry::plugin_insert_splitting_changed, this), gui_context() _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 (); plugin_insert_splitting_changed ();
} }
void void
PluginInsertProcessorEntry::plugin_insert_splitting_changed () PluginInsertProcessorEntry::plugin_insert_splitting_changed ()
{ {
_splitting_icon.set_inputs(_plugin_insert->input_streams()); _output_icon.set_ports(_plugin_insert->output_streams());
_splitting_icon.set_outputs(_plugin_insert->output_streams()); _routing_icon.set_splitting(_plugin_insert->splitting ());
if (_plugin_insert->splitting () || ( ChanCount sources = _plugin_insert->input_streams();
_plugin_insert->input_streams().n_midi() == 0 ChanCount sinks = _plugin_insert->natural_input_streams();
&& _plugin_insert->input_streams().n_audio() < _plugin_insert->output_streams().n_audio()
) /* 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 (); _routing_icon.set_size_request (-1, 7);
_splitting_icon.queue_draw(); _routing_icon.set_visible(true);
_input_icon.show();
} else { } 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 void
PluginInsertProcessorEntry::hide_things () PluginInsertProcessorEntry::hide_things ()
{ {
@ -640,35 +697,78 @@ PluginInsertProcessorEntry::hide_things ()
plugin_insert_splitting_changed (); 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 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_t* cr = gdk_cairo_create (get_window()->gobj());
cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height); cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
cairo_clip (cr); 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); cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
Gtk::Allocation a = get_allocation(); 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); 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 ()); 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 sources = _sources.n_total();
const uint32_t outputs = _outputs.n_audio(); 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) { cairo_set_source_rgb (cr,
const float si_l = rintf(width * 0.2) + .5f; UINT_RGBA_R_FLT(midi_port_color),
const float si_c = rintf(width * 0.5) + .5f; UINT_RGBA_G_FLT(midi_port_color),
const float si_r = rintf(width * 0.8) + .5f; UINT_RGBA_B_FLT(midi_port_color));
if (midi_sources > 0 && midi_sinks > 0 && sinks > 1 && sources > 1) {
cairo_move_to (cr, si_l, height); for (uint32_t i = 0 ; i < midi_sources; ++i) {
cairo_line_to (cr, si_l, si_m); const float si_x = rintf(width * (.2f + .6f * i / (sinks - 1.f))) + .5f;
cairo_line_to (cr, si_r, si_m); const float si_x0 = rintf(width * (.2f + .6f * i / (sources - 1.f))) + .5f;
cairo_line_to (cr, si_r, height); cairo_move_to (cr, si_x, height);
cairo_stroke (cr); cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
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_stroke (cr); cairo_stroke (cr);
} }
} else if (midi_sources == 1 && midi_sinks == 1 && sinks == 1 && sources == 1) {
cairo_move_to (cr, si_c, si_m); const float si_x = rintf(width * .5f) + .5f;
cairo_line_to (cr, si_c, 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_move_to (cr, si_x, height);
cairo_line_to (cr, si_x, 0); cairo_line_to (cr, si_x, 0);
cairo_stroke (cr); 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; return true;
} }
@ -761,7 +871,7 @@ ProcessorBox::ProcessorBox (ARDOUR::Session* sess, boost::function<PluginSelecto
processor_display.set_name ("ProcessorList"); processor_display.set_name ("ProcessorList");
processor_display.set_data ("processorbox", this); processor_display.set_data ("processorbox", this);
processor_display.set_size_request (48, -1); 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_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); 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 */ `dropped on' processor */
list<ProcessorEntry*> c = processor_display.children (); list<ProcessorEntry*> c = processor_display.children ();
list<ProcessorEntry*>::iterator i = c.begin (); list<ProcessorEntry*>::iterator i = c.begin ();
while (dynamic_cast<BlankProcessorEntry*> (*i)) {
assert (i != c.end ());
++i;
}
assert (i != c.end ()); assert (i != c.end ());
p = (*i)->processor (); 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), _route->foreach_processor (sigc::bind (sigc::mem_fun (*this, &ProcessorBox::help_count_visible_prefader_processors),
&_visible_prefader_processors, &fader_seen)); &_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)); _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) { 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 (); list<ProcessorEntry*> children = processor_display.children ();
bool pre_fader = true; bool pre_fader = true;
uint32_t num = 0;
for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) { for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) {
if (boost::dynamic_pointer_cast<Amp>((*i)->processor())) { if (boost::dynamic_pointer_cast<Amp>((*i)->processor())) {
pre_fader = false; pre_fader = false;
(*i)->set_position (ProcessorEntry::Fader); (*i)->set_position (ProcessorEntry::Fader, num++);
} else { } else {
if (pre_fader) { if (pre_fader) {
(*i)->set_position (ProcessorEntry::PreFader); (*i)->set_position (ProcessorEntry::PreFader, num++);
} else { } else {
(*i)->set_position (ProcessorEntry::PostFader); (*i)->set_position (ProcessorEntry::PostFader, num++);
} }
} }
} }

View file

@ -125,7 +125,7 @@ public:
PostFader PostFader
}; };
void set_position (Position); void set_position (Position, uint32_t);
boost::shared_ptr<ARDOUR::Processor> processor () const; boost::shared_ptr<ARDOUR::Processor> processor () const;
void set_enum_width (Width); void set_enum_width (Width);
@ -143,6 +143,7 @@ protected:
ArdourButton _button; ArdourButton _button;
Gtk::VBox _vbox; Gtk::VBox _vbox;
Position _position; Position _position;
uint32_t _position_num;
virtual void setup_visuals (); virtual void setup_visuals ();
@ -150,6 +151,7 @@ private:
void led_clicked(); void led_clicked();
void processor_active_changed (); void processor_active_changed ();
void processor_property_changed (const PBD::PropertyChange&); void processor_property_changed (const PBD::PropertyChange&);
void processor_configuration_changed (const ARDOUR::ChanCount in, const ARDOUR::ChanCount out);
std::string name (Width) const; std::string name (Width) const;
void setup_tooltip (); void setup_tooltip ();
@ -159,6 +161,7 @@ private:
Gtk::StateType _visual_state; Gtk::StateType _visual_state;
PBD::ScopedConnection active_connection; PBD::ScopedConnection active_connection;
PBD::ScopedConnection name_connection; PBD::ScopedConnection name_connection;
PBD::ScopedConnection config_connection;
class Control : public sigc::trackable { class Control : public sigc::trackable {
public: public:
@ -168,7 +171,6 @@ private:
void add_state (XMLNode *) const; void add_state (XMLNode *) const;
void set_state (XMLNode const *); void set_state (XMLNode const *);
void hide_things (); void hide_things ();
void hide_label ();
bool visible () const { bool visible () const {
return _visible; return _visible;
@ -178,7 +180,7 @@ private:
return _name; return _name;
} }
Gtk::VBox box; Gtk::Alignment box;
private: private:
void slider_adjusted (); void slider_adjusted ();
@ -191,7 +193,6 @@ private:
/* things for a slider */ /* things for a slider */
Gtk::Adjustment _adjustment; Gtk::Adjustment _adjustment;
Gtkmm2ext::HSliderController _slider; Gtkmm2ext::HSliderController _slider;
Gtk::Label _label;
Gtkmm2ext::PersistentTooltip _slider_persistant_tooltip; Gtkmm2ext::PersistentTooltip _slider_persistant_tooltip;
/* things for a button */ /* things for a button */
ArdourButton _button; ArdourButton _button;
@ -204,12 +205,43 @@ private:
std::list<Control*> _controls; std::list<Control*> _controls;
void toggle_control_visibility (Control *); void toggle_control_visibility (Control *);
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 BlankProcessorEntry : public ProcessorEntry class RoutingIcon : public Gtk::DrawingArea {
{
public: public:
BlankProcessorEntry (ProcessorBox *, Width w); 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 class PluginInsertProcessorEntry : public ProcessorEntry
@ -220,25 +252,9 @@ public:
void hide_things (); void hide_things ();
private: private:
void setup_visuals ();
void plugin_insert_splitting_changed (); 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; boost::shared_ptr<ARDOUR::PluginInsert> _plugin_insert;
SplittingIcon _splitting_icon;
PBD::ScopedConnection _splitting_connection; 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>); void mixer_strip_delivery_changed (boost::weak_ptr<ARDOUR::Delivery>);
XMLNode* entry_gui_object_state (ProcessorEntry *); XMLNode* entry_gui_object_state (ProcessorEntry *);
PBD::ScopedConnection amp_config_connection;
}; };
#endif /* __ardour_gtk_processor_box__ */ #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()); _gpm.set_controls (boost::shared_ptr<Route>(), r->meter(), r->amp());
_hbox.pack_start (_gpm, true, true); _hbox.pack_start (_gpm, true, true);
set_name ("ReturnUIFrame"); set_name (X_("ReturnUIFrame"));
_vbox.set_spacing (5); _vbox.set_spacing (5);
_vbox.set_border_width (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()); _return->input()->changed.connect (input_change_connection, invalidator (*this), boost::bind (&ReturnUI::ins_changed, this, _1, _2), gui_context());
_gpm.setup_meters (); _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)); // 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)); 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()); _gpm.set_controls (boost::shared_ptr<Route>(), s->meter(), s->amp());
_hbox.pack_start (_gpm, true, true); _hbox.pack_start (_gpm, true, true);
set_name ("SendUIFrame"); set_name (X_("SendUIFrame"));
_vbox.set_spacing (5); _vbox.set_spacing (5);
_vbox.set_border_width (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 (); _panners.setup_pan ();
_gpm.setup_meters (); _gpm.setup_meters ();
_gpm.set_fader_name ("SendUIFrame"); _gpm.set_fader_name (X_("SendUIFader"));
// screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect ( // screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect (
// sigc::mem_fun (*this, &SendUI::update)); // sigc::mem_fun (*this, &SendUI::update));

View file

@ -707,7 +707,7 @@ SoundFileBrowser::add_gain_meter ()
boost::shared_ptr<Route> r = _session->the_auditioner (); boost::shared_ptr<Route> r = _session->the_auditioner ();
gm->set_controls (r, r->shared_peak_meter(), r->amp()); 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.set_border_width (12);
meter_packer.pack_start (*gm, false, true); meter_packer.pack_start (*gm, false, true);

View file

@ -1093,7 +1093,12 @@ LV2Plugin::do_save_preset(string name)
lilv_state_free(state); 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 void

View file

@ -1212,10 +1212,23 @@ double
PluginInsert::PluginControl::internal_to_interface (double val) const PluginInsert::PluginControl::internal_to_interface (double val) const
{ {
if (_logarithmic) { 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) { if (val > 0) {
val = log (val); val = log (val);
} else { } else {
val = 0; val = -8; // ~ -70dB = 20 * log10(exp(-8))
} }
} }
@ -1226,8 +1239,13 @@ double
PluginInsert::PluginControl::interface_to_internal (double val) const PluginInsert::PluginControl::interface_to_internal (double val) const
{ {
if (_logarithmic) { if (_logarithmic) {
if (val <= -8) {
/* see note in PluginInsert::PluginControl::internal_to_interface() */
val= 0;
} else {
val = exp (val); val = exp (val);
} }
}
return 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) { for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
string port; 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]; 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 */ /* master bus is audio only */
if (_master_out && _master_out->n_inputs().get(*t) > 0) { if (_master_out && _master_out->n_inputs().get(*t) > 0) {
port = _master_out->input()->ports().port(*t, port = _master_out->input()->ports().port(*t,

View file

@ -421,7 +421,9 @@ Session::process_with_events (pframes_t nframes)
check_declick_out (); check_declick_out ();
} }
if (nframes > 0) {
_engine.split_cycle (this_nframes); _engine.split_cycle (this_nframes);
}
/* now handle this event and all others scheduled for the same time */ /* 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') 'LIBARDOUR_API', 'ardour/libardour_visibility.h')
autowaf.configure(conf) autowaf.configure(conf)
autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO', 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, 'libxml-2.0', uselib_store='XML')
autowaf.check_pkg(conf, 'lrdf', uselib_store='LRDF', autowaf.check_pkg(conf, 'lrdf', uselib_store='LRDF',
atleast_version='0.4.0') atleast_version='0.4.0')

View file

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

View file

@ -746,7 +746,7 @@ clearlooks_glossy_draw_tab (cairo_t *cr,
if (params->active) 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, pattern = cairo_pattern_create_linear (tab->gap_side == CL_GAP_LEFT ? width-1 : 0,
tab->gap_side == CL_GAP_TOP ? height-2 : 1, tab->gap_side == CL_GAP_TOP ? height-2 : 1,

View file

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

View file

@ -298,7 +298,7 @@ private:
/* make up an icon for the drag */ /* make up an icon for the drag */
_drag_icon = new Gtk::Window (Gtk::WINDOW_POPUP); _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->set_size_request (a.get_width(), a.get_height());
_drag_icon->signal_expose_event().connect (sigc::mem_fun (*this, &DnDVBox::icon_expose)); _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 ()); 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); gdk_cairo_set_source_pixmap (cr, p->gobj(), 0, 0);
cairo_rectangle (cr, 0, 0, w, h); cairo_rectangle (cr, 0, 0, w, h);
cairo_fill (cr); cairo_fill (cr);

View file

@ -33,7 +33,9 @@ using namespace Gtk;
using namespace std; using namespace std;
#define CORNER_RADIUS 4 #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; 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_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
adjustment.signal_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 () PixFader::~PixFader ()
@ -105,11 +113,8 @@ PixFader::create_patterns ()
cairo_surface_t* surface; cairo_surface_t* surface;
cairo_t* tc = 0; cairo_t* tc = 0;
float radius = CORNER_RADIUS;
double w = get_width(); if (get_width() <= 1 || get_height() <= 1) {
if (w <= 1 || get_height() <= 1) {
return; return;
} }
@ -136,13 +141,12 @@ PixFader::create_patterns ()
/* paint lower shade */ /* paint lower shade */
w -= 2.0; shade_pattern = cairo_pattern_create_linear (0.0, 0.0, get_width() - 2 - CORNER_OFFSET , 0);
shade_pattern = cairo_pattern_create_linear (0.0, 0.0, w, 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, 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_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); 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_fill (tc);
cairo_pattern_destroy (shade_pattern); 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, 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_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); 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_fill (tc);
cairo_pattern_destroy (shade_pattern); cairo_pattern_destroy (shade_pattern);
@ -212,7 +217,6 @@ PixFader::on_expose_event (GdkEventExpose* ev)
cairo_set_source_rgb (cr, br, bg, bb); cairo_set_source_rgb (cr, br, bg, bb);
cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height); cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
cairo_fill (cr); cairo_fill (cr);
return true; return true;
} }
@ -223,18 +227,27 @@ PixFader::on_expose_event (GdkEventExpose* ev)
float w = get_width(); float w = get_width();
float h = get_height(); 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; 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 (_orien == VERT) {
if (ds > h - FADER_RESERVE) { if (ds > h - FADER_RESERVE - CORNER_OFFSET) {
ds = h - FADER_RESERVE; ds = h - FADER_RESERVE - CORNER_OFFSET;
} }
cairo_set_source (cr, pattern); cairo_set_source (cr, pattern);
cairo_matrix_init_translate (&matrix, 0, (h - ds)); cairo_matrix_init_translate (&matrix, 0, (h - ds));
cairo_pattern_set_matrix (pattern, &matrix); cairo_pattern_set_matrix (pattern, &matrix);
Gtkmm2ext::rounded_rectangle (cr, 0, 0, w, h, CORNER_RADIUS-1.5);
cairo_fill (cr); cairo_fill (cr);
} else { } else {
@ -258,7 +271,6 @@ PixFader::on_expose_event (GdkEventExpose* ev)
cairo_set_source (cr, pattern); cairo_set_source (cr, pattern);
cairo_matrix_init_translate (&matrix, w - ds, 0); cairo_matrix_init_translate (&matrix, w - ds, 0);
cairo_pattern_set_matrix (pattern, &matrix); cairo_pattern_set_matrix (pattern, &matrix);
Gtkmm2ext::rounded_rectangle (cr, 0, 0, w, h, CORNER_RADIUS-1.5);
cairo_fill (cr); 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); 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 ( _orien == VERT) {
if (unity_loc < h ) { if (unity_loc < h ) {
context->move_to (1.5, unity_loc + .5); context->move_to (1.5, unity_loc + CORNER_OFFSET + .5);
context->line_to (girth - 1.5, unity_loc + .5); context->line_to (girth - 1.5, unity_loc + CORNER_OFFSET + .5);
context->stroke (); context->stroke ();
} }
} else { } else {
if ( unity_loc < w ){ if ( unity_loc < w ){
context->move_to (unity_loc + .5, 1.5); context->move_to (unity_loc - CORNER_OFFSET + .5, 1.5);
context->line_to (unity_loc + .5, girth - 1.5); context->line_to (unity_loc - CORNER_OFFSET + .5, girth - 1.5);
context->stroke (); context->stroke ();
} }
} }
@ -293,11 +305,11 @@ PixFader::on_expose_event (GdkEventExpose* ev)
} }
if (!get_sensitive()) { 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_set_source_rgba (cr, 0.505, 0.517, 0.525, 0.4);
cairo_fill (cr); cairo_fill (cr);
} else if (_hovering) { } 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_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.1);
cairo_fill (cr); cairo_fill (cr);
} }
@ -546,9 +558,9 @@ void
PixFader::update_unity_position () PixFader::update_unity_position ()
{ {
if (_orien == VERT) { 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 { } 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 (); queue_draw ();
@ -614,6 +626,7 @@ PixFader::on_state_changed (Gtk::StateType old_state)
{ {
Widget::on_state_changed (old_state); Widget::on_state_changed (old_state);
create_patterns (); create_patterns ();
queue_draw ();
} }
void void
@ -630,4 +643,5 @@ PixFader::on_style_changed (const Glib::RefPtr<Gtk::Style>&)
*/ */
pattern = 0; pattern = 0;
queue_draw ();
} }

View file

@ -26,7 +26,8 @@ def configure(conf):
conf.load('compiler_cxx') conf.load('compiler_cxx')
autowaf.configure(conf) autowaf.configure(conf)
autowaf.check_pkg(conf, 'fftw3f', uselib_store='FFTW3F', mandatory=True) 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) conf.write_config_header('libvampplugins-config.h', remove=False)
def build(bld): 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="99" Name="Patch 99" ProgramChange="98"/>
<Patch Number="100" Name="Patch 100" ProgramChange="99"/> <Patch Number="100" Name="Patch 100" ProgramChange="99"/>
</PatchNameList> </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"> <ControlNameList Name="Controls">
<!-- Modulation --> <!-- Modulation -->
<Control Type="7bit" Number="3" Name="LFO Rate (Coarse)"/> <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="45" Name="LFO VCO Amount (Fine)"/>
<Control Type="7bit" Number="12" Name="LFO VCF Amount (Coarse)"/> <Control Type="7bit" Number="12" Name="LFO VCF Amount (Coarse)"/>
<Control Type="7bit" Number="44" Name="LFO VCF Amount (Fine)"/> <Control Type="7bit" Number="44" Name="LFO VCF Amount (Fine)"/>
<Control Type="7bit" Number="87" Name="LFO MIDI Sync"/> <Control Type="7bit" Number="87" Name="LFO MIDI Sync">
<Control Type="7bit" Number="86" Name="LFO Sync Clock Div"/> <Values Min="0" Max="127">
<Control Type="7bit" Number="82" Name="LFO Key Trigger"/> <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 --> <!-- Oscillators -->
<Control Type="7bit" Number="70" Name="VCO 1 Wave"/> <Control Type="7bit" Number="70" Name="VCO 1 Wave">
<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="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="17" Name="VCO 2 Freq (Coarse)"/>
<Control Type="7bit" Number="49" Name="VCO 2 Freq (Fine)"/> <Control Type="7bit" Number="49" Name="VCO 2 Freq (Fine)"/>
<Control Type="7bit" Number="18" Name="VCO 2 Beat (Coarse)"/> <Control Type="7bit" Number="18" Name="VCO 2 Beat (Coarse)"/>
<!-- Duplicate <Control Type="7bit" Number="50" Name="VCO 2 Beat (Fine)"/> --> <!-- 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="5" Name="Glide Rate"/>
<Control Type="7bit" Number="65" Name="Glide Switch"/> <Control Type="7bit" Number="65" Name="Glide Switch">
<Control Type="7bit" Number="92" Name="Glide Type"/> <Values Min="0" Max="127">
<Control Type="7bit" Number="83" Name="Legato Glide"/> <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 --> <!-- Mixer -->
<Control Type="7bit" Number="15" Name="VCO 1 (Coarse)"/> <Control Type="7bit" Number="15" Name="VCO 1 (Coarse)"/>
<Control Type="7bit" Number="47" Name="VCO 1 (Fine)"/> <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="61" Name="VCA Decay/Release (Fine)"/>
<Control Type="7bit" Number="30" Name="VCA Sustain (Coarse)"/> <Control Type="7bit" Number="30" Name="VCA Sustain (Coarse)"/>
<Control Type="7bit" Number="62" Name="VCA Sustain (Fine)"/> <Control Type="7bit" Number="62" Name="VCA Sustain (Fine)"/>
<Control Type="7bit" Number="72" Name="Release Switch"/> <Control Type="7bit" Number="72" Name="Release Switch">
<Control Type="7bit" Number="73" Name="Trigger Mode"/> <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 --> <!-- Volume -->
<Control Type="7bit" Number="7" Name="Volume (Coarse)"/> <Control Type="7bit" Number="7" Name="Volume (Coarse)"/>
<Control Type="7bit" Number="39" Name="Volume (Fine)"/> <Control Type="7bit" Number="39" Name="Volume (Fine)"/>
<Control Type="7bit" Number="90" Name="Volume Velocity Sensitivity"/> <Control Type="7bit" Number="90" Name="Volume Velocity Sensitivity"/>
<!-- Keyboard Response --> <!-- 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 --> <!-- Mod Wheel Response -->
<Control Type="7bit" Number="1" Name="Mod Wheel (Coarse)"/> <Control Type="7bit" Number="1" Name="Mod Wheel (Coarse)"/>
<Control Type="7bit" Number="33" Name="Mod Wheel (Fine)"/> <Control Type="7bit" Number="33" Name="Mod Wheel (Fine)"/>
<!-- Pitch Wheel Response --> <!-- Pitch Wheel Response -->
<Control Type="7bit" Number="107" Name="Bend Up Amount"/> <Control Type="7bit" Number="107" Name="Bend Up Amount">
<Control Type="7bit" Number="108" Name="Bend Down 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 -->
<Control Type="7bit" Number="122" Name="Local Control Off"/> <Control Type="7bit" Number="122" Name="Local Control Off"/>
<Control Type="7bit" Number="120" Name="All Sounds 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 # Prevents visibility issues in standard headers
conf.define("_DARWIN_C_SOURCE", 1) 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": if is_clang and platform == "darwin":
# Silence warnings about the non-existing osx clang compiler flags # Silence warnings about the non-existing osx clang compiler flags
# -compatibility_version and -current_version. These are Waf # -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') help='Do not ask questions that require confirmation during the build')
opt.add_option('--cxx11', action='store_true', default=False, dest='cxx11', opt.add_option('--cxx11', action='store_true', default=False, dest='cxx11',
help='Turn on c++11 compiler flags (-std=c++11)') 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: for i in children:
opt.recurse(i) opt.recurse(i)