#ifndef __gtk_ardour_canvas_midi_event_h__
#define __gtk_ardour_canvas_midi_event_h__
-#include "simplerect.h"
-#include "midi_channel_selector.h"
+#include <boost/shared_ptr.hpp>
#include <libgnomecanvasmm/text.h>
#include <libgnomecanvasmm/widget.h>
-#include <ardour/midi_model.h>
+
+#include "ardour/midi_model.h"
+
+#include "rgb_macros.h"
+#include "ardour_ui.h"
+#include "ui_config.h"
+#include "interactive-item.h"
class Editor;
class MidiRegionView;
+namespace Evoral { template<typename T> class Note; }
+
namespace Gnome {
namespace Canvas {
*
* A newer, better canvas should remove the need for all the ugly here.
*/
-class CanvasNoteEvent : public sigc::trackable {
+class CanvasNoteEvent : virtual public sigc::trackable, public InteractiveItem {
public:
+ typedef Evoral::Note<ARDOUR::MidiModel::TimeType> NoteType;
+
CanvasNoteEvent(
- MidiRegionView& region,
- Item* item,
- const boost::shared_ptr<Evoral::Note> note = boost::shared_ptr<Evoral::Note>());
+ MidiRegionView& region,
+ Item* item,
+ const boost::shared_ptr<NoteType> note = boost::shared_ptr<NoteType>());
virtual ~CanvasNoteEvent();
- bool on_event(GdkEvent* ev);
+ virtual void show() = 0;
+ virtual void hide() = 0;
+ virtual bool on_event(GdkEvent* ev);
bool selected() const { return _selected; }
void selected(bool yn);
void move_event(double dx, double dy);
+ uint32_t base_color();
+
void show_velocity();
void hide_velocity();
- /**
- * This slot is called, when a new channel is selected for the single event
- * */
+ /** Channel changed for this specific event */
void on_channel_change(uint8_t channel);
+
+ /** Channel selection changed */
void on_channel_selection_change(uint16_t selection);
void show_channel_selector();
-
void hide_channel_selector();
virtual void set_outline_color(uint32_t c) = 0;
virtual double x2() = 0;
virtual double y2() = 0;
- const boost::shared_ptr<Evoral::Note> note() const { return _note; }
+ const boost::shared_ptr<NoteType> note() const { return _note; }
+
+ inline static uint32_t meter_style_fill_color(uint8_t vel) {
+ if (vel < 64) {
+ return UINT_INTERPOLATE(
+ ARDOUR_UI::config()->canvasvar_MidiNoteMeterColorBase.get(),
+ ARDOUR_UI::config()->canvasvar_MidiNoteMeterColorMid.get(),
+ (vel / (double)63.0));
+ } else {
+ return UINT_INTERPOLATE(
+ ARDOUR_UI::config()->canvasvar_MidiNoteMeterColorMid.get(),
+ ARDOUR_UI::config()->canvasvar_MidiNoteMeterColorTop.get(),
+ ((vel-64) / (double)63.0));
+ }
+ }
+
+ /// calculate outline colors from fill colors of notes
+ inline static uint32_t calculate_outline(uint32_t color) {
+ return UINT_INTERPOLATE(color, 0x000000ff, 0.5);
+ }
+
+ /// hue circle divided into 16 equal-looking parts, courtesy Thorsten Wilms
+ static const uint32_t midi_channel_colors[16];
protected:
enum State { None, Pressed, Dragging };
- MidiRegionView& _region;
- Item* const _item;
- Text* _text;
- Widget* _channel_selector_widget;
- State _state;
- const boost::shared_ptr<Evoral::Note> _note;
- bool _own_note;
- bool _selected;
+ MidiRegionView& _region;
+ Item* const _item;
+ InteractiveText* _text;
+ Widget* _channel_selector_widget;
+ State _state;
+ const boost::shared_ptr<NoteType> _note;
+ bool _own_note;
+ bool _selected;
};
} // namespace Gnome