mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-08 15:54:57 +01:00
* some refactoring of patch name stuff in preparation for altering program changes events
git-svn-id: svn://localhost/ardour2/branches/3.0@4323 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
18d6284438
commit
bf7e792e3e
7 changed files with 130 additions and 44 deletions
|
|
@ -36,10 +36,10 @@ CanvasProgramChange::on_event(GdkEvent* ev)
|
||||||
switch (ev->type) {
|
switch (ev->type) {
|
||||||
case GDK_SCROLL:
|
case GDK_SCROLL:
|
||||||
if (ev->scroll.direction == GDK_SCROLL_UP) {
|
if (ev->scroll.direction == GDK_SCROLL_UP) {
|
||||||
cerr << "increasing program" << endl;
|
previous_patch();
|
||||||
return true;
|
return true;
|
||||||
} else if (ev->scroll.direction == GDK_SCROLL_DOWN) {
|
} else if (ev->scroll.direction == GDK_SCROLL_DOWN) {
|
||||||
cerr << "decreasing program" << endl;
|
next_patch();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
@ -48,3 +48,15 @@ CanvasProgramChange::on_event(GdkEvent* ev)
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CanvasProgramChange::previous_patch()
|
||||||
|
{
|
||||||
|
cerr << "decreasing program" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CanvasProgramChange::next_patch()
|
||||||
|
{
|
||||||
|
cerr << "increasing program" << endl;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,23 @@ public:
|
||||||
|
|
||||||
virtual bool on_event(GdkEvent* ev);
|
virtual bool on_event(GdkEvent* ev);
|
||||||
|
|
||||||
|
nframes_t event_time() const { return _event_time; }
|
||||||
|
void set_event_time(nframes_t new_time) { _event_time = new_time; };
|
||||||
|
|
||||||
|
uint8_t program() const { return _program; }
|
||||||
|
void set_program(uint8_t new_time) { _program = new_time; };
|
||||||
|
|
||||||
|
uint8_t channel() const { return _channel; }
|
||||||
|
void set_channel(uint8_t new_time) { _channel = new_time; };
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void previous_patch();
|
||||||
|
void next_patch();
|
||||||
|
|
||||||
|
nframes_t _event_time;
|
||||||
|
uint8_t _program;
|
||||||
|
uint8_t _channel;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Canvas
|
} // namespace Canvas
|
||||||
|
|
|
||||||
|
|
@ -635,47 +635,42 @@ MidiRegionView::find_and_insert_program_change_flags()
|
||||||
|
|
||||||
//cerr << " got program change on channel " << int(channel) << " time: " << event_time << " number: " << program_number << endl;
|
//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
|
// 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_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<Evoral::Control> msb_control = _model->control(bank_select_msb);
|
||||||
|
uint8_t msb = 0;
|
||||||
boost::shared_ptr<MIDI::Name::MasterDeviceNames> master_device
|
if (msb_control != 0) {
|
||||||
= MIDI::Name::MidiPatchManager::instance().master_device_by_model(_model_name);
|
msb = uint8_t(msb_control->get_float(true, event_time));
|
||||||
|
}
|
||||||
|
|
||||||
|
Evoral::Parameter bank_select_lsb(MidiCCAutomation, channel, MIDI_CTL_LSB_BANK);
|
||||||
|
boost::shared_ptr<Evoral::Control> lsb_control = _model->control(bank_select_lsb);
|
||||||
|
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) << " thread_id: " << pthread_self() << endl;
|
||||||
|
|
||||||
|
MIDI::Name::PatchPrimaryKey patch_key(msb, lsb, program_number);
|
||||||
|
|
||||||
boost::shared_ptr<MIDI::Name::Patch> patch;
|
boost::shared_ptr<MIDI::Name::Patch> patch =
|
||||||
|
MIDI::Name::MidiPatchManager::instance().find_patch(
|
||||||
if (master_device != 0 && _custom_device_mode != "") {
|
_model_name,
|
||||||
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) << " thread_id: " << pthread_self() << endl;
|
|
||||||
|
|
||||||
patch = master_device->find_patch(
|
|
||||||
_custom_device_mode,
|
_custom_device_mode,
|
||||||
channel,
|
channel,
|
||||||
msb,
|
patch_key
|
||||||
lsb,
|
|
||||||
uint8_t(program_number)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
ControlEvent program_change(nframes_t(event_time), uint8_t(program_number), channel);
|
||||||
|
|
||||||
if (patch != 0) {
|
if (patch != 0) {
|
||||||
cerr << " got patch with name " << patch->name() << " number " << patch->number() << endl;
|
cerr << " got patch with name " << patch->name() << " number " << patch->number() << endl;
|
||||||
add_pgm_change(event_time, patch->name());
|
add_pgm_change(program_change, patch->name());
|
||||||
} else {
|
} else {
|
||||||
char buf[4];
|
char buf[4];
|
||||||
snprintf(buf, 4, "%d", int(program_number));
|
snprintf(buf, 4, "%d", int(program_number));
|
||||||
add_pgm_change(event_time, buf);
|
add_pgm_change(program_change, buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -996,21 +991,44 @@ MidiRegionView::add_note(const boost::shared_ptr<Evoral::Note> note)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MidiRegionView::add_pgm_change(nframes_t time, string displaytext)
|
MidiRegionView::add_pgm_change(ControlEvent& program, string displaytext)
|
||||||
{
|
{
|
||||||
assert(time >= 0);
|
assert(program.time >= 0);
|
||||||
|
|
||||||
// dont display program changes beyond the region bounds
|
// dont display program changes beyond the region bounds
|
||||||
if (time - _region->start() >= _region->length() || time < _region->start())
|
if (program.time - _region->start() >= _region->length() || program.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)time - _region->start());
|
const double x = trackview.editor.frame_to_pixel((nframes64_t)program.time - _region->start());
|
||||||
|
|
||||||
double height = midi_stream_view()->contents_height();
|
double height = midi_stream_view()->contents_height();
|
||||||
_pgm_changes.push_back(
|
|
||||||
boost::shared_ptr<CanvasProgramChange>(
|
boost::shared_ptr<CanvasProgramChange> pgm_change = boost::shared_ptr<CanvasProgramChange>(
|
||||||
new CanvasProgramChange(*this, *group, displaytext, height, x, 1.0)));
|
new CanvasProgramChange(*this, *group, displaytext, height, x, 1.0));
|
||||||
|
pgm_change->set_event_time(program.time);
|
||||||
|
pgm_change->set_program(program.value);
|
||||||
|
pgm_change->set_channel(program.channel);
|
||||||
|
|
||||||
|
_pgm_changes.push_back(pgm_change);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MidiRegionView::alter_program_change(ControlEvent& old_program, ControlEvent& new_program)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MidiRegionView::previous_program(boost::shared_ptr<CanvasProgramChange> program)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MidiRegionView::next_program(boost::shared_ptr<CanvasProgramChange> program)
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,20 @@ 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(nframes_t time, string displaytext);
|
struct ControlEvent
|
||||||
|
{
|
||||||
|
nframes_t time;
|
||||||
|
uint8_t value;
|
||||||
|
uint8_t channel;
|
||||||
|
|
||||||
|
ControlEvent(nframes_t a_time, uint8_t a_value, uint8_t a_channel)
|
||||||
|
: time(a_time), value(a_value), channel(a_channel) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
void add_pgm_change(ControlEvent& program, string displaytext);
|
||||||
|
void alter_program_change(ControlEvent& old_program, ControlEvent& new_program);
|
||||||
|
void previous_program(boost::shared_ptr<ArdourCanvas::CanvasProgramChange> program);
|
||||||
|
void next_program(boost::shared_ptr<ArdourCanvas::CanvasProgramChange> program);
|
||||||
void find_and_insert_program_change_flags();
|
void find_and_insert_program_change_flags();
|
||||||
|
|
||||||
void begin_write();
|
void begin_write();
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,23 @@ public:
|
||||||
boost::shared_ptr<MasterDeviceNames> master_device_by_model(std::string model_name)
|
boost::shared_ptr<MasterDeviceNames> master_device_by_model(std::string model_name)
|
||||||
{ return _master_devices_by_model[model_name]; }
|
{ return _master_devices_by_model[model_name]; }
|
||||||
|
|
||||||
|
boost::shared_ptr<Patch> find_patch(
|
||||||
|
string model,
|
||||||
|
string custom_device_mode,
|
||||||
|
uint8_t channel,
|
||||||
|
PatchPrimaryKey patch_key) {
|
||||||
|
|
||||||
|
boost::shared_ptr<MIDI::Name::MasterDeviceNames> master_device = master_device_by_model(model);
|
||||||
|
|
||||||
|
if (master_device != 0 && custom_device_mode != "") {
|
||||||
|
return master_device->
|
||||||
|
channel_name_set_by_device_mode_and_channel(custom_device_mode, channel)->
|
||||||
|
find_patch(patch_key);
|
||||||
|
} else {
|
||||||
|
return boost::shared_ptr<Patch>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::list<string> custom_device_mode_names_by_model(std::string model_name) {
|
std::list<string> custom_device_mode_names_by_model(std::string model_name) {
|
||||||
if (model_name != "") {
|
if (model_name != "") {
|
||||||
return master_device_by_model(model_name)->custom_device_mode_names();
|
return master_device_by_model(model_name)->custom_device_mode_names();
|
||||||
|
|
|
||||||
|
|
@ -151,11 +151,20 @@ public:
|
||||||
return _available_for_channels.find(channel) != _available_for_channels.end();
|
return _available_for_channels.find(channel) != _available_for_channels.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<Patch> find_patch(uint8_t msb, uint8_t lsb, uint8_t program_number) {
|
boost::shared_ptr<Patch> find_patch(PatchPrimaryKey& key) {
|
||||||
PatchPrimaryKey key(msb, lsb, program_number);
|
|
||||||
assert(key.is_sane());
|
assert(key.is_sane());
|
||||||
return _patch_map[key];
|
return _patch_map[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::shared_ptr<Patch> previous_patch(PatchPrimaryKey& key) {
|
||||||
|
assert(key.is_sane());
|
||||||
|
return (*(--_patch_map.find(key))).second;
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::shared_ptr<Patch> next_patch(PatchPrimaryKey& key) {
|
||||||
|
assert(key.is_sane());
|
||||||
|
return (*(++_patch_map.find(key))).second;
|
||||||
|
}
|
||||||
|
|
||||||
XMLNode& get_state (void);
|
XMLNode& get_state (void);
|
||||||
int set_state (const XMLNode& a_node);
|
int set_state (const XMLNode& a_node);
|
||||||
|
|
@ -266,8 +275,8 @@ public:
|
||||||
return _channel_name_sets[custom_device_mode_by_name(mode)->channel_name_set_name_by_channel(channel)];
|
return _channel_name_sets[custom_device_mode_by_name(mode)->channel_name_set_name_by_channel(channel)];
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<Patch> find_patch(string mode, uint8_t channel, uint8_t msb, uint8_t lsb, uint8_t program_number) {
|
boost::shared_ptr<Patch> find_patch(string mode, uint8_t channel, PatchPrimaryKey& key) {
|
||||||
return channel_name_set_by_device_mode_and_channel(mode, channel)->find_patch(msb, lsb, program_number);
|
return channel_name_set_by_device_mode_and_channel(mode, channel)->find_patch(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
XMLNode& get_state (void);
|
XMLNode& get_state (void);
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,7 @@ Patch::set_state (const XMLNode& node)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//cerr << "deserialized Patch: name: " << _name << _id.msb << " lsb: " << _id.lsb << " program " << _id.program_number << endl;
|
||||||
assert(_id.is_sane());
|
assert(_id.is_sane());
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue