X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fnote_base.cc;h=915866ef61237e3ed751ac4851aa1f085783a869;hb=abf1f286d49482ade939da7e49863a3d63048b42;hp=3bdb73489e078e53eaf7f7d3c3abe821092e5967;hpb=680c64246e4ee9f3eb53da079dea6a7ecf996e92;p=ardour.git diff --git a/gtk2_ardour/note_base.cc b/gtk2_ardour/note_base.cc index 3bdb73489e..915866ef61 100644 --- a/gtk2_ardour/note_base.cc +++ b/gtk2_ardour/note_base.cc @@ -21,21 +21,21 @@ #include "gtkmm2ext/keyboard.h" +#include "evoral/Note.hpp" + #include "canvas/text.h" #include "note_base.h" -#include "midi_region_view.h" #include "public_editor.h" #include "editing_syms.h" #include "keyboard.h" +#include "midi_region_view.h" using namespace std; using namespace Gtkmm2ext; using ARDOUR::MidiModel; using namespace ArdourCanvas; -PBD::Signal1 NoteBase::NoteBaseDeleted; - /// dividing the hue circle in 16 parts, hand adjusted for equal look, courtesy Thorsten Wilms const uint32_t NoteBase::midi_channel_colors[16] = { 0xd32d2dff, 0xd36b2dff, 0xd3972dff, 0xd3d12dff, @@ -44,6 +44,21 @@ const uint32_t NoteBase::midi_channel_colors[16] = { 0x832dd3ff, 0xa92dd3ff, 0xd32dbfff, 0xd32d67ff }; +bool NoteBase::_color_init = false; +Gtkmm2ext::Color NoteBase::_selected_col = 0; +Gtkmm2ext::SVAModifier NoteBase::color_modifier; +Gtkmm2ext::Color NoteBase::velocity_color_table[128]; + +void +NoteBase::set_colors () +{ + for (uint8_t i = 0; i < 128; ++i) { + velocity_color_table[i] = 0; /* out of bounds because zero alpha makes no sense */ + } + _selected_col = UIConfiguration::instance().color ("midi note selected outline"); + color_modifier = UIConfiguration::instance().modifier ("midi note"); +} + NoteBase::NoteBase(MidiRegionView& region, bool with_events, const boost::shared_ptr note) : _region(region) , _item (0) @@ -56,11 +71,15 @@ NoteBase::NoteBase(MidiRegionView& region, bool with_events, const boost::shared , _mouse_x_fraction (-1.0) , _mouse_y_fraction (-1.0) { + if (!_color_init) { + NoteBase::set_colors(); + _color_init = true; + } } NoteBase::~NoteBase() { - NoteBaseDeleted (this); + _region.note_deleted (this); delete _text; } @@ -94,7 +113,7 @@ NoteBase::show_velocity() if (!_text) { _text = new Text (_item->parent ()); _text->set_ignore_events (true); - _text->set_color (ARDOUR_UI::config()->get_canvasvar_MidiNoteVelocityText()); + _text->set_color (UIConfiguration::instance().color_mod ("midi note velocity text", "midi note velocity text")); _text->set_alignment (Pango::ALIGN_CENTER); } @@ -119,8 +138,9 @@ NoteBase::on_channel_selection_change(uint16_t selection) { // make note change its color if its channel is not marked active if ( (selection & (1 << _note->channel())) == 0 ) { - set_fill_color(ARDOUR_UI::config()->get_canvasvar_MidiNoteInactiveChannel()); - set_outline_color(calculate_outline(ARDOUR_UI::config()->get_canvasvar_MidiNoteInactiveChannel())); + const Gtkmm2ext::Color inactive_ch = UIConfiguration::instance().color ("midi note inactive channel"); + set_fill_color(inactive_ch); + set_outline_color(calculate_outline(inactive_ch, _selected)); } else { // set the color according to the notes selection state set_selected(_selected); @@ -145,14 +165,11 @@ NoteBase::set_selected(bool selected) } _selected = selected; - set_fill_color (base_color()); - - if (_selected) { - set_outline_color(calculate_outline(ARDOUR_UI::config()->get_canvasvar_MidiNoteSelected())); - } else { - set_outline_color(calculate_outline(base_color())); - } + const uint32_t base_col = base_color(); + set_fill_color (base_col); + + set_outline_color(calculate_outline(base_col, _selected)); } #define SCALE_USHORT_TO_UINT8_T(x) ((x) / 257) @@ -170,22 +187,23 @@ NoteBase::base_color() switch (mode) { case TrackColor: { - Gdk::Color color = _region.midi_stream_view()->get_region_color(); - return UINT_INTERPOLATE (RGBA_TO_UINT( - SCALE_USHORT_TO_UINT8_T(color.get_red()), - SCALE_USHORT_TO_UINT8_T(color.get_green()), - SCALE_USHORT_TO_UINT8_T(color.get_blue()), - opacity), - ARDOUR_UI::config()->get_canvasvar_MidiNoteSelected(), 0.5); + const uint32_t region_color = _region.midi_stream_view()->get_region_color(); + return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (region_color, opacity), _selected_col, + 0.5); } case ChannelColors: - return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (NoteBase::midi_channel_colors[_note->channel()], - opacity), - ARDOUR_UI::config()->get_canvasvar_MidiNoteSelected(), 0.5); + return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (NoteBase::midi_channel_colors[_note->channel()], opacity), + _selected_col, 0.5); default: - return meter_style_fill_color(_note->velocity(), selected()); + if (UIConfiguration::instance().get_use_note_color_for_velocity()) { + return meter_style_fill_color(_note->velocity(), selected()); + } else { + const uint32_t region_color = _region.midi_stream_view()->get_region_color(); + return UINT_INTERPOLATE (UINT_RGBA_CHANGE_A (region_color, opacity), _selected_col, + 0.5); + } }; return 0; @@ -246,28 +264,29 @@ NoteBase::set_mouse_fractions (GdkEvent* ev) _mouse_y_fraction = yf; if (notify) { - if (big_enough_to_trim()) { - _region.note_mouse_position (_mouse_x_fraction, _mouse_y_fraction, set_cursor); - } else { - /* pretend the mouse is in the middle, because this is not big enough - to trim right now. - */ - _region.note_mouse_position (0.5, 0.5, set_cursor); - } + if (big_enough_to_trim()) { + _region.note_mouse_position (_mouse_x_fraction, _mouse_y_fraction, set_cursor); + } else { + /* pretend the mouse is in the middle, because this is not big enough + to trim right now. + */ + _region.note_mouse_position (0.5, 0.5, set_cursor); + } } } bool NoteBase::event_handler (GdkEvent* ev) { - if (!_region.get_time_axis_view().editor().internal_editing()) { + PublicEditor& editor = _region.get_time_axis_view().editor(); + if (!editor.internal_editing()) { return false; } switch (ev->type) { case GDK_ENTER_NOTIFY: - set_mouse_fractions (ev); _region.note_entered (this); + set_mouse_fractions (ev); break; case GDK_LEAVE_NOTIFY: @@ -281,24 +300,17 @@ NoteBase::event_handler (GdkEvent* ev) case GDK_BUTTON_PRESS: set_mouse_fractions (ev); - if (ev->button.button == 3 && Keyboard::no_modifiers_active (ev->button.state) && _selected) { - _region.get_time_axis_view().editor().edit_notes (_region); - return true; - } break; case GDK_BUTTON_RELEASE: set_mouse_fractions (ev); - if (ev->button.button == 3 && Keyboard::no_modifiers_active (ev->button.state)) { - return true; - } break; default: break; } - return _region.get_time_axis_view().editor().canvas_note_event (ev, _item); + return editor.canvas_note_event (ev, _item); } bool @@ -311,6 +323,42 @@ NoteBase::mouse_near_ends () const bool NoteBase::big_enough_to_trim () const { - return (x1() - x0()) > 10; + return (x1() - x0()) > 10; +} + + +Gtkmm2ext::Color +NoteBase::meter_style_fill_color(uint8_t vel, bool /* selected */) +{ + /* note that because vel is uint8_t, we don't need bounds checking for + the color lookup table. + */ + + if (velocity_color_table[vel] == 0) { + + Gtkmm2ext::Color col; + + if (vel < 32) { + col = UINT_INTERPOLATE(UIConfiguration::instance().color ("midi meter color0"), UIConfiguration::instance().color ("midi meter color1"), (vel / 32.0)); + col = Gtkmm2ext::change_alpha (col, color_modifier.a()); + } else if (vel < 64) { + col = UINT_INTERPOLATE(UIConfiguration::instance().color ("midi meter color2"), UIConfiguration::instance().color ("midi meter color3"), ((vel-32) / 32.0)); + col = Gtkmm2ext::change_alpha (col, color_modifier.a()); + } else if (vel < 100) { + col = UINT_INTERPOLATE(UIConfiguration::instance().color ("midi meter color4"), UIConfiguration::instance().color ("midi meter color5"), ((vel-64) / 36.0)); + col = Gtkmm2ext::change_alpha (col, color_modifier.a()); + } else if (vel < 112) { + col = UINT_INTERPOLATE(UIConfiguration::instance().color ("midi meter color6"), UIConfiguration::instance().color ("midi meter color7"), ((vel-100) / 12.0)); + col = Gtkmm2ext::change_alpha (col, color_modifier.a()); + } else { + col = UINT_INTERPOLATE(UIConfiguration::instance().color ("midi meter color8"), UIConfiguration::instance().color ("midi meter color9"), ((vel-112) / 17.0)); + col = Gtkmm2ext::change_alpha (col, color_modifier.a()); + } + + velocity_color_table[vel] = col; + return col; + } + + return velocity_color_table[vel]; }