mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-10 16:46:35 +01:00
- Call channel pressure channel pressure, not aftertouch (that's key specific).
- Add context menu items to add a bender or pressure automation track to a MIDI track. - Now just need to figure out creation of program change events and you can create everything MIDI ardour understands from the GUI... git-svn-id: svn://localhost/ardour2/branches/3.0@3782 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
ca12fe9733
commit
a43d53e3b9
11 changed files with 39 additions and 23 deletions
|
|
@ -319,7 +319,7 @@ AudioTimeAxisView::set_waveform_scale (WaveformScale scale)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AudioTimeAxisView::create_automation_child (Parameter param, bool show)
|
AudioTimeAxisView::create_automation_child (const Parameter& param, bool show)
|
||||||
{
|
{
|
||||||
if (param.type() == GainAutomation) {
|
if (param.type() == GainAutomation) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ class AudioTimeAxisView : public RouteTimeAxisView
|
||||||
guint32 show_at (double y, int& nth, Gtk::VBox *parent);
|
guint32 show_at (double y, int& nth, Gtk::VBox *parent);
|
||||||
void hide ();
|
void hide ();
|
||||||
|
|
||||||
void create_automation_child (ARDOUR::Parameter param, bool show);
|
void create_automation_child (const ARDOUR::Parameter& param, bool show);
|
||||||
|
|
||||||
void first_idle ();
|
void first_idle ();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -225,9 +225,15 @@ MidiTimeAxisView::build_automation_action_menu ()
|
||||||
MenuList& automation_items = automation_action_menu->items();
|
MenuList& automation_items = automation_action_menu->items();
|
||||||
|
|
||||||
automation_items.push_back (SeparatorElem());
|
automation_items.push_back (SeparatorElem());
|
||||||
|
|
||||||
automation_items.push_back (MenuElem (_("Controller..."),
|
automation_items.push_back (MenuElem (_("Controller..."),
|
||||||
mem_fun(*this, &MidiTimeAxisView::add_controller_track)));
|
mem_fun(*this, &MidiTimeAxisView::add_cc_track)));
|
||||||
|
automation_items.push_back (MenuElem (_("Bender"),
|
||||||
|
sigc::bind(mem_fun(*this, &MidiTimeAxisView::add_parameter_track),
|
||||||
|
Parameter(MidiPitchBenderAutomation))));
|
||||||
|
automation_items.push_back (MenuElem (_("Pressure"),
|
||||||
|
sigc::bind(mem_fun(*this, &MidiTimeAxisView::add_parameter_track),
|
||||||
|
Parameter(MidiChannelPressureAutomation))));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Gtk::Menu*
|
Gtk::Menu*
|
||||||
|
|
@ -319,7 +325,7 @@ MidiTimeAxisView::show_existing_automation ()
|
||||||
/** Prompt for a controller with a dialog and add an automation track for it
|
/** Prompt for a controller with a dialog and add an automation track for it
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
MidiTimeAxisView::add_controller_track()
|
MidiTimeAxisView::add_cc_track()
|
||||||
{
|
{
|
||||||
int response;
|
int response;
|
||||||
Parameter param;
|
Parameter param;
|
||||||
|
|
@ -337,13 +343,22 @@ MidiTimeAxisView::add_controller_track()
|
||||||
create_automation_child(param, true);
|
create_automation_child(param, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Add an automation track for the given parameter (pitch bend, channel pressure).
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
MidiTimeAxisView::create_automation_child (Parameter param, bool show)
|
MidiTimeAxisView::add_parameter_track(const Parameter& param)
|
||||||
|
{
|
||||||
|
create_automation_child(param, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MidiTimeAxisView::create_automation_child (const Parameter& param, bool show)
|
||||||
{
|
{
|
||||||
if ( param.type() == MidiCCAutomation ||
|
if ( param.type() == MidiCCAutomation ||
|
||||||
param.type() == MidiPgmChangeAutomation ||
|
param.type() == MidiPgmChangeAutomation ||
|
||||||
param.type() == MidiPitchBenderAutomation ||
|
param.type() == MidiPitchBenderAutomation ||
|
||||||
param.type() == MidiChannelAftertouchAutomation
|
param.type() == MidiChannelPressureAutomation
|
||||||
) {
|
) {
|
||||||
|
|
||||||
/* These controllers are region "automation", so we do not create
|
/* These controllers are region "automation", so we do not create
|
||||||
|
|
|
||||||
|
|
@ -68,8 +68,9 @@ class MidiTimeAxisView : public RouteTimeAxisView
|
||||||
|
|
||||||
void show_all_automation ();
|
void show_all_automation ();
|
||||||
void show_existing_automation ();
|
void show_existing_automation ();
|
||||||
void add_controller_track ();
|
void add_cc_track ();
|
||||||
void create_automation_child (ARDOUR::Parameter param, bool show);
|
void add_parameter_track (const ARDOUR::Parameter& param);
|
||||||
|
void create_automation_child (const ARDOUR::Parameter& param, bool show);
|
||||||
|
|
||||||
ARDOUR::NoteMode note_mode() const { return _note_mode; }
|
ARDOUR::NoteMode note_mode() const { return _note_mode; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ public:
|
||||||
: param (par), menu_item (mi), track (tr) {}
|
: param (par), menu_item (mi), track (tr) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual void create_automation_child (ARDOUR::Parameter param, bool show) = 0;
|
virtual void create_automation_child (const ARDOUR::Parameter& param, bool show) = 0;
|
||||||
|
|
||||||
/* make sure we get the right version of this */
|
/* make sure we get the right version of this */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ public:
|
||||||
break;
|
break;
|
||||||
case MidiCCAutomation:
|
case MidiCCAutomation:
|
||||||
case MidiPgmChangeAutomation:
|
case MidiPgmChangeAutomation:
|
||||||
case MidiChannelAftertouchAutomation:
|
case MidiChannelPressureAutomation:
|
||||||
Evoral::MIDI::controller_range(min, max, normal); break;
|
Evoral::MIDI::controller_range(min, max, normal); break;
|
||||||
case MidiPitchBenderAutomation:
|
case MidiPitchBenderAutomation:
|
||||||
Evoral::MIDI::bender_range(min, max, normal); break;
|
Evoral::MIDI::bender_range(min, max, normal); break;
|
||||||
|
|
@ -108,7 +108,7 @@ public:
|
||||||
std::string symbol() const;
|
std::string symbol() const;
|
||||||
|
|
||||||
inline bool is_integer() const {
|
inline bool is_integer() const {
|
||||||
return (_type >= MidiCCAutomation && _type <= MidiChannelAftertouchAutomation);
|
return (_type >= MidiCCAutomation && _type <= MidiChannelPressureAutomation);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline operator Parameter() { return (Parameter)*this; }
|
inline operator Parameter() { return (Parameter)*this; }
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ namespace ARDOUR {
|
||||||
MidiCCAutomation = 0x20,
|
MidiCCAutomation = 0x20,
|
||||||
MidiPgmChangeAutomation = 0x21,
|
MidiPgmChangeAutomation = 0x21,
|
||||||
MidiPitchBenderAutomation = 0x22,
|
MidiPitchBenderAutomation = 0x22,
|
||||||
MidiChannelAftertouchAutomation = 0x23,
|
MidiChannelPressureAutomation = 0x23,
|
||||||
FadeInAutomation = 0x40,
|
FadeInAutomation = 0x40,
|
||||||
FadeOutAutomation = 0x80,
|
FadeOutAutomation = 0x80,
|
||||||
EnvelopeAutomation = 0x100
|
EnvelopeAutomation = 0x100
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@ AudioEngine::AudioEngine (string client_name)
|
||||||
Parameter::init_metadata(MidiCCAutomation);
|
Parameter::init_metadata(MidiCCAutomation);
|
||||||
Parameter::init_metadata(MidiPgmChangeAutomation);
|
Parameter::init_metadata(MidiPgmChangeAutomation);
|
||||||
Parameter::init_metadata(MidiPitchBenderAutomation);
|
Parameter::init_metadata(MidiPitchBenderAutomation);
|
||||||
Parameter::init_metadata(MidiChannelAftertouchAutomation);
|
Parameter::init_metadata(MidiChannelPressureAutomation);
|
||||||
Parameter::init_metadata(FadeInAutomation);
|
Parameter::init_metadata(FadeInAutomation);
|
||||||
Parameter::init_metadata(FadeOutAutomation);
|
Parameter::init_metadata(FadeOutAutomation);
|
||||||
Parameter::init_metadata(EnvelopeAutomation);
|
Parameter::init_metadata(EnvelopeAutomation);
|
||||||
|
|
|
||||||
|
|
@ -161,8 +161,8 @@ Automatable::describe_parameter (Parameter param)
|
||||||
return string_compose("Program [%1]", int(param.channel()) + 1);
|
return string_compose("Program [%1]", int(param.channel()) + 1);
|
||||||
} else if (param.type() == MidiPitchBenderAutomation) {
|
} else if (param.type() == MidiPitchBenderAutomation) {
|
||||||
return string_compose("Bender [%1]", int(param.channel()) + 1);
|
return string_compose("Bender [%1]", int(param.channel()) + 1);
|
||||||
} else if (param.type() == MidiChannelAftertouchAutomation) {
|
} else if (param.type() == MidiChannelPressureAutomation) {
|
||||||
return string_compose("Aftertouch [%1]", int(param.channel()) + 1);
|
return string_compose("Pressure [%1]", int(param.channel()) + 1);
|
||||||
} else {
|
} else {
|
||||||
return param.symbol();
|
return param.symbol();
|
||||||
}
|
}
|
||||||
|
|
@ -392,7 +392,7 @@ Automatable::control_factory(const Evoral::Parameter& param)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<AutomationList> list(new AutomationList(param));
|
boost::shared_ptr<AutomationList> list(new AutomationList(param));
|
||||||
Evoral::Control* control = NULL;
|
Evoral::Control* control = NULL;
|
||||||
if (param.type() >= MidiCCAutomation && param.type() <= MidiChannelAftertouchAutomation) {
|
if (param.type() >= MidiCCAutomation && param.type() <= MidiChannelPressureAutomation) {
|
||||||
control = new MidiTrack::MidiControl((MidiTrack*)this, param);
|
control = new MidiTrack::MidiControl((MidiTrack*)this, param);
|
||||||
} else {
|
} else {
|
||||||
control = new AutomationControl(_a_session, param);
|
control = new AutomationControl(_a_session, param);
|
||||||
|
|
|
||||||
|
|
@ -764,7 +764,7 @@ MidiTrack::MidiControl::set_value(float val)
|
||||||
ev[1] = int(val);
|
ev[1] = int(val);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MidiChannelAftertouchAutomation:
|
case MidiChannelPressureAutomation:
|
||||||
size = 2;
|
size = 2;
|
||||||
ev[0] += MIDI_CMD_CHANNEL_PRESSURE;
|
ev[0] += MIDI_CMD_CHANNEL_PRESSURE;
|
||||||
ev[1] = int(val);
|
ev[1] = int(val);
|
||||||
|
|
|
||||||
|
|
@ -68,10 +68,10 @@ Parameter::Parameter(const std::string& str)
|
||||||
assert(channel < 16);
|
assert(channel < 16);
|
||||||
_id = 0;
|
_id = 0;
|
||||||
_channel = channel;
|
_channel = channel;
|
||||||
} else if (str.length() > 24 && str.substr(0, 24) == "midi-channel-aftertouch-") {
|
} else if (str.length() > 24 && str.substr(0, 24) == "midi-channel-pressure-") {
|
||||||
_type = MidiChannelAftertouchAutomation;
|
_type = MidiChannelPressureAutomation;
|
||||||
uint32_t channel = 0;
|
uint32_t channel = 0;
|
||||||
sscanf(str.c_str(), "midi-channel-aftertouch-%d", &channel);
|
sscanf(str.c_str(), "midi-channel-pressure-%d", &channel);
|
||||||
assert(channel < 16);
|
assert(channel < 16);
|
||||||
_id = 0;
|
_id = 0;
|
||||||
_channel = channel;
|
_channel = channel;
|
||||||
|
|
@ -111,8 +111,8 @@ Parameter::symbol() const
|
||||||
return string_compose("midi-pgm-change-%1", int(_channel));
|
return string_compose("midi-pgm-change-%1", int(_channel));
|
||||||
} else if (_type == MidiPitchBenderAutomation) {
|
} else if (_type == MidiPitchBenderAutomation) {
|
||||||
return string_compose("midi-pitch-bender-%1", int(_channel));
|
return string_compose("midi-pitch-bender-%1", int(_channel));
|
||||||
} else if (_type == MidiChannelAftertouchAutomation) {
|
} else if (_type == MidiChannelPressureAutomation) {
|
||||||
return string_compose("midi-channel-aftertouch-%1", int(_channel));
|
return string_compose("midi-channel-pressure-%1", int(_channel));
|
||||||
} else {
|
} else {
|
||||||
PBD::warning << "Uninitialized Parameter symbol() called." << endmsg;
|
PBD::warning << "Uninitialized Parameter symbol() called." << endmsg;
|
||||||
return "";
|
return "";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue