mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 15:25:01 +01:00
* added myself to about.cc
* created ArdourCanvas::CanvasFlag as a base class for flags * removed obsolete cruft from midi_model * made MidiTimeAxisView and MidiRegionView work together to display program changes as names by means of MidiPatchManager git-svn-id: svn://localhost/ardour2/branches/3.0@4307 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
dfed4965b7
commit
e009016b03
12 changed files with 272 additions and 96 deletions
|
|
@ -131,6 +131,7 @@ axis_view.cc
|
||||||
bundle_manager.cc
|
bundle_manager.cc
|
||||||
canvas-note-event.cc
|
canvas-note-event.cc
|
||||||
canvas-note.cc
|
canvas-note.cc
|
||||||
|
canvas-flag.cc
|
||||||
canvas-program-change.cc
|
canvas-program-change.cc
|
||||||
canvas-simpleline.c
|
canvas-simpleline.c
|
||||||
canvas-simplerect.c
|
canvas-simplerect.c
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,7 @@ static const char* authors[] = {
|
||||||
N_("Christopher George"),
|
N_("Christopher George"),
|
||||||
N_("Robert Jordens"),
|
N_("Robert Jordens"),
|
||||||
N_("Dave Robillard"),
|
N_("Dave Robillard"),
|
||||||
|
N_("Hans Baier"),
|
||||||
N_("Hans Fugal"),
|
N_("Hans Fugal"),
|
||||||
N_("Brian Ahr"),
|
N_("Brian Ahr"),
|
||||||
N_("Nimal Ratnayake"),
|
N_("Nimal Ratnayake"),
|
||||||
|
|
|
||||||
41
gtk2_ardour/canvas-flag.cc
Normal file
41
gtk2_ardour/canvas-flag.cc
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
#include "canvas-flag.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "ardour_ui.h"
|
||||||
|
|
||||||
|
using namespace Gnome::Canvas;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
CanvasFlag::set_text(string a_text)
|
||||||
|
{
|
||||||
|
if (_text) {
|
||||||
|
delete _text;
|
||||||
|
}
|
||||||
|
|
||||||
|
_text = new Text(*this, 0.0, 0.0, a_text);
|
||||||
|
_text->property_justification() = Gtk::JUSTIFY_CENTER;
|
||||||
|
_text->property_fill_color_rgba() = _outline_color_rgba;
|
||||||
|
double flagwidth = _text->property_text_width() + 10.0;
|
||||||
|
double flagheight = _text->property_text_height() + 3.0;
|
||||||
|
_text->property_x() = flagwidth / 2.0;
|
||||||
|
_text->property_y() = flagheight / 2.0;
|
||||||
|
_text->show();
|
||||||
|
_line = new SimpleLine(*this, 0.0, 0.0, 0.0, _height);
|
||||||
|
_line->property_color_rgba() = _outline_color_rgba;
|
||||||
|
_rect = new SimpleRect(*this, 0.0, 0.0, flagwidth, flagheight);
|
||||||
|
_rect->property_outline_color_rgba() = _outline_color_rgba;
|
||||||
|
_rect->property_fill_color_rgba() = _fill_color_rgba;
|
||||||
|
_text->lower_to_bottom();
|
||||||
|
_text->raise(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
CanvasFlag::~CanvasFlag()
|
||||||
|
{
|
||||||
|
delete _line;
|
||||||
|
delete _rect;
|
||||||
|
if(_text) {
|
||||||
|
delete _text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
58
gtk2_ardour/canvas-flag.h
Normal file
58
gtk2_ardour/canvas-flag.h
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
#ifndef CANVASFLAG_H_
|
||||||
|
#define CANVASFLAG_H_
|
||||||
|
|
||||||
|
#include <libgnomecanvasmm/group.h>
|
||||||
|
#include <libgnomecanvasmm/text.h>
|
||||||
|
#include <libgnomecanvasmm/widget.h>
|
||||||
|
|
||||||
|
#include <ardour/midi_model.h>
|
||||||
|
|
||||||
|
#include "simplerect.h"
|
||||||
|
#include "simpleline.h"
|
||||||
|
|
||||||
|
class MidiRegionView;
|
||||||
|
|
||||||
|
namespace Gnome {
|
||||||
|
namespace Canvas {
|
||||||
|
|
||||||
|
class CanvasFlag : public Group
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CanvasFlag(
|
||||||
|
MidiRegionView& region,
|
||||||
|
Group& parent,
|
||||||
|
double height,
|
||||||
|
guint outline_color_rgba = 0xc0c0c0ff,
|
||||||
|
guint fill_color_rgba = 0x07070707,
|
||||||
|
double x = 0.0,
|
||||||
|
double y = 0.0
|
||||||
|
) : Group(parent, x, y)
|
||||||
|
, _text(0)
|
||||||
|
, _height(height)
|
||||||
|
, _outline_color_rgba(outline_color_rgba)
|
||||||
|
, _fill_color_rgba(fill_color_rgba)
|
||||||
|
, _region(region)
|
||||||
|
, _line(0)
|
||||||
|
, _rect(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual ~CanvasFlag();
|
||||||
|
|
||||||
|
void set_text(string a_text);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Text* _text;
|
||||||
|
double _height;
|
||||||
|
guint _outline_color_rgba;
|
||||||
|
guint _fill_color_rgba;
|
||||||
|
|
||||||
|
private:
|
||||||
|
MidiRegionView& _region;
|
||||||
|
SimpleLine* _line;
|
||||||
|
SimpleRect* _rect;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Canvas
|
||||||
|
} // namespace Gnome
|
||||||
|
|
||||||
|
#endif /*CANVASFLAG_H_*/
|
||||||
|
|
@ -8,40 +8,24 @@ using namespace std;
|
||||||
CanvasProgramChange::CanvasProgramChange(
|
CanvasProgramChange::CanvasProgramChange(
|
||||||
MidiRegionView& region,
|
MidiRegionView& region,
|
||||||
Group& parent,
|
Group& parent,
|
||||||
boost::shared_ptr<Evoral::Event> event,
|
string text,
|
||||||
double height,
|
double height,
|
||||||
double x,
|
double x,
|
||||||
double y)
|
double y)
|
||||||
: Group(parent, x, y)
|
: CanvasFlag(
|
||||||
, _region(region)
|
region,
|
||||||
, _event(event)
|
parent,
|
||||||
, _text(0)
|
height,
|
||||||
, _line(0)
|
ARDOUR_UI::config()->canvasvar_MidiProgramChangeOutline.get(),
|
||||||
, _rect(0)
|
ARDOUR_UI::config()->canvasvar_MidiProgramChangeFill.get(),
|
||||||
|
x,
|
||||||
|
y
|
||||||
|
)
|
||||||
{
|
{
|
||||||
char pgm_str[4];
|
set_text(text);
|
||||||
snprintf(pgm_str, 4, "%d", (int)(((Evoral::MIDIEvent*)event.get())->pgm_number()));
|
|
||||||
_text = new Text(*this, 0.0, 0.0, pgm_str);
|
|
||||||
_text->property_justification() = Gtk::JUSTIFY_CENTER;
|
|
||||||
_text->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiProgramChangeOutline.get();
|
|
||||||
double flagwidth = _text->property_text_width() + 10.0;
|
|
||||||
double flagheight = _text->property_text_height() + 3.0;
|
|
||||||
_text->property_x() = flagwidth / 2.0;
|
|
||||||
_text->property_y() = flagheight / 2.0;
|
|
||||||
_text->show();
|
|
||||||
_line = new SimpleLine(*this, 0.0, 0.0, 0.0, height);
|
|
||||||
_line->property_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiProgramChangeOutline.get();
|
|
||||||
_rect = new SimpleRect(*this, 0.0, 0.0, flagwidth, flagheight);
|
|
||||||
_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiProgramChangeOutline.get();
|
|
||||||
_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiProgramChangeFill.get();
|
|
||||||
_text->lower_to_bottom();
|
|
||||||
_text->raise(2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CanvasProgramChange::~CanvasProgramChange()
|
CanvasProgramChange::~CanvasProgramChange()
|
||||||
{
|
{
|
||||||
delete _line;
|
|
||||||
delete _rect;
|
|
||||||
delete _text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,20 @@
|
||||||
#ifndef CANVASPROGRAMCHANGE_H_
|
#ifndef CANVASPROGRAMCHANGE_H_
|
||||||
#define CANVASPROGRAMCHANGE_H_
|
#define CANVASPROGRAMCHANGE_H_
|
||||||
|
|
||||||
#include <libgnomecanvasmm/group.h>
|
#include "canvas-flag.h"
|
||||||
#include "simplerect.h"
|
|
||||||
#include "simpleline.h"
|
|
||||||
#include <libgnomecanvasmm/text.h>
|
|
||||||
#include <libgnomecanvasmm/widget.h>
|
|
||||||
#include <ardour/midi_model.h>
|
|
||||||
|
|
||||||
class MidiRegionView;
|
class MidiRegionView;
|
||||||
|
|
||||||
namespace Gnome {
|
namespace Gnome {
|
||||||
namespace Canvas {
|
namespace Canvas {
|
||||||
|
|
||||||
class CanvasProgramChange : public Group
|
class CanvasProgramChange : public CanvasFlag
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CanvasProgramChange(
|
CanvasProgramChange(
|
||||||
MidiRegionView& region,
|
MidiRegionView& region,
|
||||||
Group& parent,
|
Group& parent,
|
||||||
boost::shared_ptr<Evoral::Event> event,
|
string text,
|
||||||
double height,
|
double height,
|
||||||
double x = 0.0,
|
double x = 0.0,
|
||||||
double y = 0.0
|
double y = 0.0
|
||||||
|
|
@ -28,11 +23,6 @@ public:
|
||||||
virtual ~CanvasProgramChange();
|
virtual ~CanvasProgramChange();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MidiRegionView& _region;
|
|
||||||
boost::shared_ptr<Evoral::Event> _event;
|
|
||||||
Text* _text;
|
|
||||||
SimpleLine* _line;
|
|
||||||
SimpleRect* _rect;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Canvas
|
} // namespace Canvas
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,10 @@
|
||||||
#include <ardour/midi_source.h>
|
#include <ardour/midi_source.h>
|
||||||
#include <ardour/midi_diskstream.h>
|
#include <ardour/midi_diskstream.h>
|
||||||
#include <ardour/midi_model.h>
|
#include <ardour/midi_model.h>
|
||||||
|
#include <ardour/midi_patch_manager.h>
|
||||||
|
|
||||||
|
#include <evoral/Parameter.hpp>
|
||||||
|
#include <evoral/Control.hpp>
|
||||||
|
|
||||||
#include "streamview.h"
|
#include "streamview.h"
|
||||||
#include "midi_region_view.h"
|
#include "midi_region_view.h"
|
||||||
|
|
@ -67,6 +71,8 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &
|
||||||
, _default_note_length(0.0)
|
, _default_note_length(0.0)
|
||||||
, _current_range_min(0)
|
, _current_range_min(0)
|
||||||
, _current_range_max(0)
|
, _current_range_max(0)
|
||||||
|
, _model_name(string())
|
||||||
|
, _custom_device_mode(string())
|
||||||
, _active_notes(0)
|
, _active_notes(0)
|
||||||
, _note_group(new ArdourCanvas::Group(*parent))
|
, _note_group(new ArdourCanvas::Group(*parent))
|
||||||
, _delta_command(NULL)
|
, _delta_command(NULL)
|
||||||
|
|
@ -81,6 +87,8 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &
|
||||||
, _force_channel(-1)
|
, _force_channel(-1)
|
||||||
, _last_channel_selection(0xFFFF)
|
, _last_channel_selection(0xFFFF)
|
||||||
, _default_note_length(0.0)
|
, _default_note_length(0.0)
|
||||||
|
, _model_name(string())
|
||||||
|
, _custom_device_mode(string())
|
||||||
, _active_notes(0)
|
, _active_notes(0)
|
||||||
, _note_group(new ArdourCanvas::Group(*parent))
|
, _note_group(new ArdourCanvas::Group(*parent))
|
||||||
, _delta_command(NULL)
|
, _delta_command(NULL)
|
||||||
|
|
@ -97,6 +105,8 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other)
|
||||||
, _force_channel(-1)
|
, _force_channel(-1)
|
||||||
, _last_channel_selection(0xFFFF)
|
, _last_channel_selection(0xFFFF)
|
||||||
, _default_note_length(0.0)
|
, _default_note_length(0.0)
|
||||||
|
, _model_name(string())
|
||||||
|
, _custom_device_mode(string())
|
||||||
, _active_notes(0)
|
, _active_notes(0)
|
||||||
, _note_group(new ArdourCanvas::Group(*get_canvas_group()))
|
, _note_group(new ArdourCanvas::Group(*get_canvas_group()))
|
||||||
, _delta_command(NULL)
|
, _delta_command(NULL)
|
||||||
|
|
@ -117,6 +127,8 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr<M
|
||||||
, _force_channel(-1)
|
, _force_channel(-1)
|
||||||
, _last_channel_selection(0xFFFF)
|
, _last_channel_selection(0xFFFF)
|
||||||
, _default_note_length(0.0)
|
, _default_note_length(0.0)
|
||||||
|
, _model_name(string())
|
||||||
|
, _custom_device_mode(string())
|
||||||
, _active_notes(0)
|
, _active_notes(0)
|
||||||
, _note_group(new ArdourCanvas::Group(*get_canvas_group()))
|
, _note_group(new ArdourCanvas::Group(*get_canvas_group()))
|
||||||
, _delta_command(NULL)
|
, _delta_command(NULL)
|
||||||
|
|
@ -175,6 +187,9 @@ MidiRegionView::init (Gdk::Color& basic_color, bool wfd)
|
||||||
|
|
||||||
midi_view()->signal_channel_mode_changed().connect(
|
midi_view()->signal_channel_mode_changed().connect(
|
||||||
mem_fun(this, &MidiRegionView::midi_channel_mode_changed));
|
mem_fun(this, &MidiRegionView::midi_channel_mode_changed));
|
||||||
|
|
||||||
|
midi_view()->signal_midi_patch_settings_changed().connect(
|
||||||
|
mem_fun(this, &MidiRegionView::midi_patch_settings_changed));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
@ -546,7 +561,9 @@ MidiRegionView::redisplay_model()
|
||||||
clear_events();
|
clear_events();
|
||||||
_model->read_lock();
|
_model->read_lock();
|
||||||
|
|
||||||
/*MidiModel::Notes notes = _model->notes();
|
|
||||||
|
MidiModel::Notes notes = _model->notes();
|
||||||
|
/*
|
||||||
cerr << endl << _model->midi_source()->name() << " : redisplaying " << notes.size() << " notes:" << endl;
|
cerr << endl << _model->midi_source()->name() << " : redisplaying " << notes.size() << " notes:" << endl;
|
||||||
for (MidiModel::Notes::iterator i = notes.begin(); i != notes.end(); ++i) {
|
for (MidiModel::Notes::iterator i = notes.begin(); i != notes.end(); ++i) {
|
||||||
cerr << "NOTE time: " << (*i)->time()
|
cerr << "NOTE time: " << (*i)->time()
|
||||||
|
|
@ -555,27 +572,14 @@ MidiRegionView::redisplay_model()
|
||||||
<< " end-time: " << (*i)->end_time()
|
<< " end-time: " << (*i)->end_time()
|
||||||
<< " velocity: " << int((*i)->velocity())
|
<< " velocity: " << int((*i)->velocity())
|
||||||
<< endl;
|
<< endl;
|
||||||
}*/
|
|
||||||
|
|
||||||
for (size_t i = 0; i < _model->n_notes(); ++i)
|
|
||||||
add_note(_model->note_at(i));
|
|
||||||
|
|
||||||
// Draw program change 'flags'
|
|
||||||
for (Automatable::Controls::iterator control = _model->controls().begin();
|
|
||||||
control != _model->controls().end(); ++control) {
|
|
||||||
if (control->first.type() == MidiPgmChangeAutomation) {
|
|
||||||
Glib::Mutex::Lock list_lock (control->second->list()->lock());
|
|
||||||
|
|
||||||
for (AutomationList::const_iterator event = control->second->list()->begin();
|
|
||||||
event != control->second->list()->end(); ++event) {
|
|
||||||
Evoral::ControlIterator iter(control->second->list(), (*event)->when, (*event)->value);
|
|
||||||
boost::shared_ptr<Evoral::Event> event(new Evoral::Event());
|
|
||||||
_model->control_to_midi_event(event, iter);
|
|
||||||
add_pgm_change(event);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (size_t i = 0; i < _model->n_notes(); ++i) {
|
||||||
|
add_note(_model->note_at(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
find_and_insert_program_chage_flags();
|
||||||
|
|
||||||
// Is this necessary?
|
// Is this necessary?
|
||||||
/*for (Automatable::Controls::const_iterator i = _model->controls().begin();
|
/*for (Automatable::Controls::const_iterator i = _model->controls().begin();
|
||||||
|
|
@ -606,7 +610,6 @@ MidiRegionView::redisplay_model()
|
||||||
|
|
||||||
_automation_children.insert(std::make_pair(i->second->parameter(), arv));
|
_automation_children.insert(std::make_pair(i->second->parameter(), arv));
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
_model->read_unlock();
|
_model->read_unlock();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -614,6 +617,74 @@ MidiRegionView::redisplay_model()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MidiRegionView::find_and_insert_program_change_flags()
|
||||||
|
{
|
||||||
|
// Draw program change 'flags'
|
||||||
|
for (Automatable::Controls::iterator control = _model->controls().begin();
|
||||||
|
control != _model->controls().end(); ++control) {
|
||||||
|
if (control->first.type() == MidiPgmChangeAutomation) {
|
||||||
|
Glib::Mutex::Lock list_lock (control->second->list()->lock());
|
||||||
|
|
||||||
|
uint8_t channel = control->first.channel();
|
||||||
|
|
||||||
|
for (AutomationList::const_iterator event = control->second->list()->begin();
|
||||||
|
event != control->second->list()->end(); ++event) {
|
||||||
|
double event_time = (*event)->when;
|
||||||
|
double program_number = (*event)->value;
|
||||||
|
|
||||||
|
//cerr << " got program change on channel " << int(channel) << " time: " << event_time << " number: " << program_number << endl;
|
||||||
|
|
||||||
|
// find bank select msb and lsb for the program change
|
||||||
|
Evoral::Parameter bank_select_msb(MidiCCAutomation, channel, MIDI_CTL_MSB_BANK);
|
||||||
|
Evoral::Parameter bank_select_lsb(MidiCCAutomation, channel, MIDI_CTL_LSB_BANK);
|
||||||
|
|
||||||
|
boost::shared_ptr<Evoral::Control> lsb_control = _model->control(bank_select_lsb);
|
||||||
|
boost::shared_ptr<Evoral::Control> msb_control = _model->control(bank_select_msb);
|
||||||
|
|
||||||
|
boost::shared_ptr<MIDI::Name::MasterDeviceNames> master_device
|
||||||
|
= MIDI::Name::MidiPatchManager::instance().master_device_by_model(_model_name);
|
||||||
|
|
||||||
|
MIDI::Name::Patch patch;
|
||||||
|
|
||||||
|
if (master_device != 0 && _custom_device_mode != "") {
|
||||||
|
uint8_t msb = 0;
|
||||||
|
if (msb_control != 0) {
|
||||||
|
msb = uint8_t(msb_control->get_float(true, event_time));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t lsb = 0;
|
||||||
|
if (lsb_control != 0) {
|
||||||
|
lsb = uint8_t(lsb_control->get_float(true, event_time));
|
||||||
|
}
|
||||||
|
|
||||||
|
//cerr << " got msb " << int(msb) << " and lsb " << int(lsb) << endl;
|
||||||
|
|
||||||
|
patch = master_device->find_patch(
|
||||||
|
_custom_device_mode,
|
||||||
|
channel,
|
||||||
|
msb,
|
||||||
|
lsb,
|
||||||
|
uint8_t(program_number)
|
||||||
|
);
|
||||||
|
|
||||||
|
//cerr << " got patch with name " << patch.name() << " number " << patch.number() << endl;
|
||||||
|
}
|
||||||
|
if (patch.name() != "") {
|
||||||
|
add_pgm_change(event_time, patch.name());
|
||||||
|
} else {
|
||||||
|
char buf[4];
|
||||||
|
snprintf(buf, 4, "%d", int(program_number));
|
||||||
|
add_pgm_change(event_time, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else if (control->first.type() == MidiCCAutomation) {
|
||||||
|
//cerr << " found CC Automation of channel " << int(control->first.channel()) << " and id " << control->first.id() << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MidiRegionView::~MidiRegionView ()
|
MidiRegionView::~MidiRegionView ()
|
||||||
{
|
{
|
||||||
|
|
@ -925,21 +996,21 @@ MidiRegionView::add_note(const boost::shared_ptr<Evoral::Note> note)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MidiRegionView::add_pgm_change(boost::shared_ptr<Evoral::Event> event)
|
MidiRegionView::add_pgm_change(nframes_t time, string displaytext)
|
||||||
{
|
{
|
||||||
assert(event->time() >= 0);
|
assert(time >= 0);
|
||||||
|
|
||||||
// dont display notes beyond the region bounds
|
// dont display notes beyond the region bounds
|
||||||
if (event->time() - _region->start() >= _region->length() || event->time() < _region->start())
|
if (time - _region->start() >= _region->length() || time < _region->start())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ArdourCanvas::Group* const group = (ArdourCanvas::Group*)get_canvas_group();
|
ArdourCanvas::Group* const group = (ArdourCanvas::Group*)get_canvas_group();
|
||||||
const double x = trackview.editor.frame_to_pixel((nframes64_t)event->time() - _region->start());
|
const double x = trackview.editor.frame_to_pixel((nframes64_t)time - _region->start());
|
||||||
|
|
||||||
double height = midi_stream_view()->contents_height();
|
double height = midi_stream_view()->contents_height();
|
||||||
_pgm_changes.push_back(
|
_pgm_changes.push_back(
|
||||||
boost::shared_ptr<CanvasProgramChange>(
|
boost::shared_ptr<CanvasProgramChange>(
|
||||||
new CanvasProgramChange(*this, *group, event, height, x, 1.0)));
|
new CanvasProgramChange(*this, *group, displaytext, height, x, 1.0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -1438,3 +1509,11 @@ MidiRegionView::midi_channel_mode_changed(ChannelMode mode, uint16_t mask)
|
||||||
_last_channel_selection = mask;
|
_last_channel_selection = mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MidiRegionView::midi_patch_settings_changed(std::string model, std::string custom_device_mode)
|
||||||
|
{
|
||||||
|
_model_name = model;
|
||||||
|
_custom_device_mode = custom_device_mode;
|
||||||
|
redisplay_model();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,8 @@ class MidiRegionView : public RegionView
|
||||||
void add_note(const boost::shared_ptr<Evoral::Note> note);
|
void add_note(const boost::shared_ptr<Evoral::Note> note);
|
||||||
void resolve_note(uint8_t note_num, double end_time);
|
void resolve_note(uint8_t note_num, double end_time);
|
||||||
|
|
||||||
void add_pgm_change(boost::shared_ptr<Evoral::Event> event);
|
void add_pgm_change(nframes_t time, string displaytext);
|
||||||
|
void find_and_insert_program_change_flags();
|
||||||
|
|
||||||
void begin_write();
|
void begin_write();
|
||||||
void end_write();
|
void end_write();
|
||||||
|
|
@ -219,6 +220,7 @@ class MidiRegionView : public RegionView
|
||||||
bool note_canvas_event(GdkEvent* ev);
|
bool note_canvas_event(GdkEvent* ev);
|
||||||
|
|
||||||
void midi_channel_mode_changed(ARDOUR::ChannelMode mode, uint16_t mask);
|
void midi_channel_mode_changed(ARDOUR::ChannelMode mode, uint16_t mask);
|
||||||
|
void midi_patch_settings_changed(std::string model, std::string custom_device_mode);
|
||||||
|
|
||||||
void clear_selection_except(ArdourCanvas::CanvasNoteEvent* ev);
|
void clear_selection_except(ArdourCanvas::CanvasNoteEvent* ev);
|
||||||
void clear_selection() { clear_selection_except(NULL); }
|
void clear_selection() { clear_selection_except(NULL); }
|
||||||
|
|
@ -229,6 +231,9 @@ class MidiRegionView : public RegionView
|
||||||
double _default_note_length;
|
double _default_note_length;
|
||||||
uint8_t _current_range_min;
|
uint8_t _current_range_min;
|
||||||
uint8_t _current_range_max;
|
uint8_t _current_range_max;
|
||||||
|
|
||||||
|
string _model_name;
|
||||||
|
string _custom_device_mode;
|
||||||
|
|
||||||
typedef std::vector<ArdourCanvas::CanvasNoteEvent*> Events;
|
typedef std::vector<ArdourCanvas::CanvasNoteEvent*> Events;
|
||||||
typedef std::vector< boost::shared_ptr<ArdourCanvas::CanvasProgramChange> > PgmChanges;
|
typedef std::vector< boost::shared_ptr<ArdourCanvas::CanvasProgramChange> > PgmChanges;
|
||||||
|
|
|
||||||
|
|
@ -141,36 +141,28 @@ MidiTimeAxisView::MidiTimeAxisView (PublicEditor& ed, Session& sess, boost::shar
|
||||||
}
|
}
|
||||||
|
|
||||||
HBox* midi_controls_hbox = manage(new HBox());
|
HBox* midi_controls_hbox = manage(new HBox());
|
||||||
|
|
||||||
// Instrument patch selector
|
|
||||||
ComboBoxText* model_selector = manage(new ComboBoxText());
|
|
||||||
ComboBoxText* custom_device_mode_selector = manage(new ComboBoxText());
|
|
||||||
|
|
||||||
MIDI::Name::MidiPatchManager& patch_manager = MIDI::Name::MidiPatchManager::instance();
|
MIDI::Name::MidiPatchManager& patch_manager = MIDI::Name::MidiPatchManager::instance();
|
||||||
|
|
||||||
for (MIDI::Name::MasterDeviceNames::Models::const_iterator model = patch_manager.all_models().begin();
|
for (MIDI::Name::MasterDeviceNames::Models::const_iterator model = patch_manager.all_models().begin();
|
||||||
model != patch_manager.all_models().end();
|
model != patch_manager.all_models().end();
|
||||||
++model) {
|
++model) {
|
||||||
model_selector->append_text(model->c_str());
|
_model_selector.append_text(model->c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_model_selector.signal_changed().connect(mem_fun(*this, &MidiTimeAxisView::model_changed));
|
||||||
|
|
||||||
|
_custom_device_mode_selector.signal_changed().connect(
|
||||||
|
mem_fun(*this, &MidiTimeAxisView::custom_device_mode_changed));
|
||||||
|
|
||||||
// TODO: persist the choice
|
// TODO: persist the choice
|
||||||
model_selector->set_active(0);
|
// this initializes the comboboxes and sends out the signal
|
||||||
|
_model_selector.set_active(0);
|
||||||
std::list<std::string> device_modes = patch_manager.custom_device_mode_names_by_model(model_selector->get_active_text());
|
|
||||||
|
|
||||||
for (std::list<std::string>::const_iterator i = device_modes.begin(); i != device_modes.end(); ++i) {
|
|
||||||
cerr << "found custom device mode " << *i << endl;
|
|
||||||
custom_device_mode_selector->append_text(*i);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: persist the choice
|
|
||||||
custom_device_mode_selector->set_active(0);
|
|
||||||
|
|
||||||
midi_controls_hbox->pack_start(_channel_selector, true, false);
|
midi_controls_hbox->pack_start(_channel_selector, true, false);
|
||||||
if (!patch_manager.all_models().empty()) {
|
if (!patch_manager.all_models().empty()) {
|
||||||
_midi_controls_box.pack_start(*model_selector, true, false);
|
_midi_controls_box.pack_start(_model_selector, true, false);
|
||||||
_midi_controls_box.pack_start(*custom_device_mode_selector, true, false);
|
_midi_controls_box.pack_start(_custom_device_mode_selector, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
_midi_controls_box.pack_start(*midi_controls_hbox, true, true);
|
_midi_controls_box.pack_start(*midi_controls_hbox, true, true);
|
||||||
|
|
@ -195,6 +187,26 @@ MidiTimeAxisView::~MidiTimeAxisView ()
|
||||||
_range_scroomer = 0;
|
_range_scroomer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MidiTimeAxisView::model_changed()
|
||||||
|
{
|
||||||
|
std::list<std::string> device_modes = MIDI::Name::MidiPatchManager::instance()
|
||||||
|
.custom_device_mode_names_by_model(_model_selector.get_active_text());
|
||||||
|
|
||||||
|
_custom_device_mode_selector.clear_items();
|
||||||
|
|
||||||
|
for (std::list<std::string>::const_iterator i = device_modes.begin(); i != device_modes.end(); ++i) {
|
||||||
|
cerr << "found custom device mode " << *i << endl;
|
||||||
|
_custom_device_mode_selector.append_text(*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
_custom_device_mode_selector.set_active(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MidiTimeAxisView::custom_device_mode_changed()
|
||||||
|
{
|
||||||
|
_midi_patch_settings_changed.emit(_model_selector.get_active_text(), _custom_device_mode_selector.get_active_text());
|
||||||
|
}
|
||||||
|
|
||||||
MidiStreamView*
|
MidiStreamView*
|
||||||
MidiTimeAxisView::midi_view()
|
MidiTimeAxisView::midi_view()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -77,10 +77,19 @@ class MidiTimeAxisView : public RouteTimeAxisView
|
||||||
|
|
||||||
void update_range();
|
void update_range();
|
||||||
|
|
||||||
sigc::signal<void, ARDOUR::ChannelMode, uint16_t>& signal_channel_mode_changed()
|
sigc::signal<void, ARDOUR::ChannelMode, uint16_t>& signal_channel_mode_changed() {
|
||||||
{ return _channel_selector.mode_changed; }
|
return _channel_selector.mode_changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
sigc::signal<void, string, string>& signal_midi_patch_settings_changed() {
|
||||||
|
return _midi_patch_settings_changed;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
sigc::signal<void, string, string> _midi_patch_settings_changed;
|
||||||
|
|
||||||
|
void model_changed();
|
||||||
|
void custom_device_mode_changed();
|
||||||
|
|
||||||
void append_extra_display_menu_items ();
|
void append_extra_display_menu_items ();
|
||||||
void build_automation_action_menu ();
|
void build_automation_action_menu ();
|
||||||
|
|
@ -102,6 +111,8 @@ class MidiTimeAxisView : public RouteTimeAxisView
|
||||||
Gtk::RadioMenuItem* _percussion_mode_item;
|
Gtk::RadioMenuItem* _percussion_mode_item;
|
||||||
Gtk::VBox _midi_controls_box;
|
Gtk::VBox _midi_controls_box;
|
||||||
MidiMultipleChannelSelector _channel_selector;
|
MidiMultipleChannelSelector _channel_selector;
|
||||||
|
Gtk::ComboBoxText _model_selector;
|
||||||
|
Gtk::ComboBoxText _custom_device_mode_selector;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __ardour_midi_time_axis_h__ */
|
#endif /* __ardour_midi_time_axis_h__ */
|
||||||
|
|
|
||||||
|
|
@ -278,13 +278,6 @@ XMLNode& MidiModel::DeltaCommand::get_state()
|
||||||
return *delta_command;
|
return *delta_command;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct EventTimeComparator {
|
|
||||||
typedef const Evoral::Event* value_type;
|
|
||||||
inline bool operator()(const Evoral::Event& a, const Evoral::Event& b) const {
|
|
||||||
return a.time() >= b.time();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Write the model to a MidiSource (i.e. save the model).
|
/** Write the model to a MidiSource (i.e. save the model).
|
||||||
* This is different from manually using read to write to a source in that
|
* This is different from manually using read to write to a source in that
|
||||||
* note off events are written regardless of the track mode. This is so the
|
* note off events are written regardless of the track mode. This is so the
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,7 @@ public:
|
||||||
|
|
||||||
Patch& find_patch(uint8_t msb, uint8_t lsb, uint8_t program_number) {
|
Patch& find_patch(uint8_t msb, uint8_t lsb, uint8_t program_number) {
|
||||||
PatchPrimaryKey key(msb, lsb, program_number);
|
PatchPrimaryKey key(msb, lsb, program_number);
|
||||||
|
assert(key.is_sane());
|
||||||
return _patch_map[key];
|
return _patch_map[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue