mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-22 06:36:29 +01:00
* MidiModel::const_iterator::operator++: added AUTOMATION type
* automatable.cc/parameter.cc: Added friendly names for the new Midi parameter types * fixed a failed assertion problem (note on channel != note off channel), but have no idea how :) * changed lots of whitespace :| git-svn-id: svn://localhost/ardour2/branches/3.0@3309 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
fb1fbf71af
commit
b0d49651a7
9 changed files with 320 additions and 337 deletions
|
|
@ -238,7 +238,7 @@ class AutomationList : public PBD::StatefulDestructible
|
||||||
Glib::Mutex& lock() const { return _lock; }
|
Glib::Mutex& lock() const { return _lock; }
|
||||||
LookupCache& lookup_cache() const { return _lookup_cache; }
|
LookupCache& lookup_cache() const { return _lookup_cache; }
|
||||||
SearchCache& search_cache() const { return _search_cache; }
|
SearchCache& search_cache() const { return _search_cache; }
|
||||||
|
|
||||||
/** Called by locked entry point and various private
|
/** Called by locked entry point and various private
|
||||||
* locations where we already hold the lock.
|
* locations where we already hold the lock.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -226,6 +226,9 @@ private:
|
||||||
WriteNotes _write_notes[16];
|
WriteNotes _write_notes[16];
|
||||||
bool _writing;
|
bool _writing;
|
||||||
bool _edited;
|
bool _edited;
|
||||||
|
|
||||||
|
typedef std::vector< boost::shared_ptr<const ARDOUR::AutomationList> > AutomationLists;
|
||||||
|
AutomationLists _dirty_automations;
|
||||||
|
|
||||||
const const_iterator _end_iter;
|
const const_iterator _end_iter;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -198,14 +198,21 @@ Automatable::describe_parameter (Parameter param)
|
||||||
{
|
{
|
||||||
/* derived classes like PluginInsert should override this */
|
/* derived classes like PluginInsert should override this */
|
||||||
|
|
||||||
if (param == Parameter(GainAutomation))
|
if (param == Parameter(GainAutomation)) {
|
||||||
return _("Fader");
|
return _("Fader");
|
||||||
else if (param.type() == PanAutomation)
|
} else if (param.type() == PanAutomation) {
|
||||||
return (string_compose(_("Pan %1"), param.id()));
|
return (string_compose(_("Pan %1"), param.id()));
|
||||||
else if (param.type() == MidiCCAutomation)
|
} else if (param.type() == MidiCCAutomation) {
|
||||||
return string_compose("CC %1", param.id());
|
return string_compose("CC %1 [%2]", param.id(), int(param.channel()) + 1);
|
||||||
else
|
} else if (param.type() == MidiPgmChangeAutomation) {
|
||||||
|
return string_compose("Program [%1]", int(param.channel()) + 1);
|
||||||
|
} else if (param.type() == MidiPitchBenderAutomation) {
|
||||||
|
return string_compose("Bender [%1]", int(param.channel()) + 1);
|
||||||
|
} else if (param.type() == MidiChannelAftertouchAutomation) {
|
||||||
|
return string_compose("Aftertouch [%1]", int(param.channel()) + 1);
|
||||||
|
} else {
|
||||||
return param.to_string();
|
return param.to_string();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -455,7 +462,11 @@ Automatable::transport_stopped (nframes_t now)
|
||||||
boost::shared_ptr<AutomationControl>
|
boost::shared_ptr<AutomationControl>
|
||||||
Automatable::control_factory(boost::shared_ptr<AutomationList> list)
|
Automatable::control_factory(boost::shared_ptr<AutomationList> list)
|
||||||
{
|
{
|
||||||
if (list->parameter().type() == MidiCCAutomation) {
|
if (
|
||||||
|
list->parameter().type() == MidiCCAutomation ||
|
||||||
|
list->parameter().type() == MidiPgmChangeAutomation ||
|
||||||
|
list->parameter().type() == MidiChannelAftertouchAutomation
|
||||||
|
) {
|
||||||
// FIXME: this will die horribly if this is not a MidiTrack
|
// FIXME: this will die horribly if this is not a MidiTrack
|
||||||
return boost::shared_ptr<AutomationControl>(new MidiTrack::MidiControl((MidiTrack*)this, list));
|
return boost::shared_ptr<AutomationControl>(new MidiTrack::MidiControl((MidiTrack*)this, list));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1436,6 +1436,10 @@ AutomationList::get_state ()
|
||||||
XMLNode&
|
XMLNode&
|
||||||
AutomationList::state (bool full)
|
AutomationList::state (bool full)
|
||||||
{
|
{
|
||||||
|
cerr << "getting ";
|
||||||
|
if(full)
|
||||||
|
cerr << "full ";
|
||||||
|
cerr << "state for AutomationList " << _parameter.to_string() << " list size: " << size() << endl;
|
||||||
XMLNode* root = new XMLNode (X_("AutomationList"));
|
XMLNode* root = new XMLNode (X_("AutomationList"));
|
||||||
char buf[64];
|
char buf[64];
|
||||||
LocaleGuard lg (X_("POSIX"));
|
LocaleGuard lg (X_("POSIX"));
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -724,11 +724,35 @@ MidiTrack::write_immediate_event(size_t size, const Byte* buf)
|
||||||
void
|
void
|
||||||
MidiTrack::MidiControl::set_value(float val)
|
MidiTrack::MidiControl::set_value(float val)
|
||||||
{
|
{
|
||||||
assert(val >= 0);
|
assert(val >= _list->parameter().min());
|
||||||
assert(val <= 127.0);
|
assert(val <= _list->parameter().max());
|
||||||
|
|
||||||
if ( ! _list->automation_playback()) {
|
if ( ! _list->automation_playback()) {
|
||||||
Byte ev[3] = { MIDI_CMD_CONTROL, _list->parameter().id(), (int)val };
|
Byte ev[3] = { _list->parameter().channel(), int(val), 0.0 };
|
||||||
|
switch(AutomationType type = _list->parameter().type()) {
|
||||||
|
case MidiCCAutomation:
|
||||||
|
ev[0] += MIDI_CMD_CONTROL;
|
||||||
|
ev[1] = _list->parameter().id();
|
||||||
|
ev[2] = int(val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MidiPgmChangeAutomation:
|
||||||
|
ev[0] += MIDI_CMD_PGM_CHANGE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MidiChannelAftertouchAutomation:
|
||||||
|
ev[0] += MIDI_CMD_CHANNEL_PRESSURE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MidiPitchBenderAutomation:
|
||||||
|
ev[0] += MIDI_CMD_BENDER;
|
||||||
|
ev[1] = 0x7F & int(val);
|
||||||
|
ev[2] = 0x7F & (int(val) >> 7);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
_route->write_immediate_event(3, ev);
|
_route->write_immediate_event(3, ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@ Note::Note(uint8_t chan, double t, double d, uint8_t n, uint8_t v)
|
||||||
assert(duration() == d);
|
assert(duration() == d);
|
||||||
assert(note() == n);
|
assert(note() == n);
|
||||||
assert(velocity() == v);
|
assert(velocity() == v);
|
||||||
|
assert(_on_event.channel() == _off_event.channel());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -64,6 +65,8 @@ Note::Note(const Note& copy)
|
||||||
assert(note() == copy.note());
|
assert(note() == copy.note());
|
||||||
assert(velocity() == copy.velocity());
|
assert(velocity() == copy.velocity());
|
||||||
assert(duration() == copy.duration());
|
assert(duration() == copy.duration());
|
||||||
|
assert(_on_event.channel() == _off_event.channel());
|
||||||
|
assert(channel() == copy.channel());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -86,7 +89,9 @@ Note::operator=(const Note& copy)
|
||||||
assert(note() == copy.note());
|
assert(note() == copy.note());
|
||||||
assert(velocity() == copy.velocity());
|
assert(velocity() == copy.velocity());
|
||||||
assert(duration() == copy.duration());
|
assert(duration() == copy.duration());
|
||||||
|
assert(_on_event.channel() == _off_event.channel());
|
||||||
|
assert(channel() == copy.channel());
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,13 +87,13 @@ Parameter::to_string() const
|
||||||
} else if (_type == PluginAutomation) {
|
} else if (_type == PluginAutomation) {
|
||||||
return string_compose("parameter-%1", _id);
|
return string_compose("parameter-%1", _id);
|
||||||
} else if (_type == MidiCCAutomation) {
|
} else if (_type == MidiCCAutomation) {
|
||||||
return string_compose("midicc-%1-%2", _channel, _id);
|
return string_compose("midicc-%1-%2", int(_channel), _id);
|
||||||
} else if (_type == MidiPgmChangeAutomation) {
|
} else if (_type == MidiPgmChangeAutomation) {
|
||||||
return string_compose("midi_pgm_change-%1", _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", _channel);
|
return string_compose("midi-pitch-bender-%1", int(_channel));
|
||||||
} else if (_type == MidiChannelAftertouchAutomation) {
|
} else if (_type == MidiChannelAftertouchAutomation) {
|
||||||
return string_compose("midi_channel_aftertouch-%1", _channel);
|
return string_compose("midi-channel-aftertouch-%1", int(_channel));
|
||||||
} else {
|
} else {
|
||||||
PBD::warning << "Uninitialized Parameter to_string() called." << endmsg;
|
PBD::warning << "Uninitialized Parameter to_string() called." << endmsg;
|
||||||
return "";
|
return "";
|
||||||
|
|
|
||||||
|
|
@ -451,8 +451,7 @@ SMFSource::write_unlocked (MidiRingBuffer& src, nframes_t cnt)
|
||||||
void
|
void
|
||||||
SMFSource::append_event_unlocked(EventTimeUnit unit, const MIDI::Event& ev)
|
SMFSource::append_event_unlocked(EventTimeUnit unit, const MIDI::Event& ev)
|
||||||
{
|
{
|
||||||
printf("%s - append chan = %u, time = %lf, size = %u, data = ", _path.c_str(),
|
//printf("%s - append chan = %u, time = %lf, size = %u, data = ", _path.c_str(), (unsigned)ev.channel(), ev.time(), ev.size());
|
||||||
(unsigned)ev.channel(), ev.time(), ev.size());
|
|
||||||
for (size_t i=0; i < ev.size(); ++i) {
|
for (size_t i=0; i < ev.size(); ++i) {
|
||||||
printf("%X ", ev.buffer()[i]);
|
printf("%X ", ev.buffer()[i]);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue