2 * Copyright (C) 2006-2016 David Robillard <d@drobilla.net>
3 * Copyright (C) 2007-2012 Carl Hetherington <carl@carlh.net>
4 * Copyright (C) 2007-2019 Paul Davis <paul@linuxaudiosystems.com>
5 * Copyright (C) 2008-2012 Hans Baier <hansfbaier@googlemail.com>
6 * Copyright (C) 2013-2016 Tim Mayberry <mojofunk@gmail.com>
7 * Copyright (C) 2013-2019 Robin Gareus <robin@gareus.org>
8 * Copyright (C) 2013 John Emmas <john@creativepost.co.uk>
9 * Copyright (C) 2015-2018 Ben Loftis <ben@harrisonconsoles.com>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
30 // 'std::isinf()' and 'std::isnan()' are not available in MSVC.
31 #define isinf_local(val) !((bool)_finite((double)val))
32 #define isnan_local(val) (bool)_isnan((double)val)
34 #define isinf_local std::isinf
35 #define isnan_local std::isnan
38 #include "pbd/enumwriter.h"
39 #include "pbd/types_convert.h"
40 #include "evoral/midi_util.h"
42 #include "ardour/amp.h"
43 #include "ardour/beats_samples_converter.h"
44 #include "ardour/buffer_set.h"
45 #include "ardour/debug.h"
46 #include "ardour/delivery.h"
47 #include "ardour/disk_reader.h"
48 #include "ardour/disk_writer.h"
49 #include "ardour/event_type_map.h"
50 #include "ardour/meter.h"
51 #include "ardour/midi_playlist.h"
52 #include "ardour/midi_port.h"
53 #include "ardour/midi_region.h"
54 #include "ardour/midi_track.h"
55 #include "ardour/monitor_control.h"
56 #include "ardour/parameter_types.h"
57 #include "ardour/port.h"
58 #include "ardour/processor.h"
59 #include "ardour/profile.h"
60 #include "ardour/route_group_specialized.h"
61 #include "ardour/session.h"
62 #include "ardour/session_playlists.h"
63 #include "ardour/types_convert.h"
64 #include "ardour/utils.h"
69 class InterThreadInfo;
76 using namespace ARDOUR;
79 MidiTrack::MidiTrack (Session& sess, string name, TrackMode mode)
80 : Track (sess, name, PresentationInfo::MidiTrack, mode, DataType::MIDI)
81 , _immediate_events(6096) // FIXME: size?
82 , _immediate_event_buffer(6096)
83 , _step_edit_ring_buffer(64) // FIXME: size?
84 , _note_mode (Sustained)
85 , _step_editing (false)
86 , _input_active (true)
88 _session.SessionLoaded.connect_same_thread (*this, boost::bind (&MidiTrack::restore_controls, this));
91 MidiTrack::~MidiTrack ()
102 _input->changed.connect_same_thread (*this, boost::bind (&MidiTrack::track_input_active, this, _1, _2));
104 _disk_writer->set_note_mode (_note_mode);
105 _disk_reader->reset_tracker ();
107 _disk_writer->DataRecorded.connect_same_thread (*this, boost::bind (&MidiTrack::data_recorded, this, _1));
113 MidiTrack::data_recorded (boost::weak_ptr<MidiSource> src)
115 DataRecorded (src); /* EMIT SIGNAL */
119 MidiTrack::can_be_record_safe ()
125 return Track::can_be_record_safe ();
129 MidiTrack::can_be_record_enabled ()
135 return Track::can_be_record_enabled ();
139 MidiTrack::set_state (const XMLNode& node, int version)
141 /* This must happen before Track::set_state(), as there will be a buffer
142 fill during that call, and we must fill buffers using the correct
145 if (!node.get_property (X_("note-mode"), _note_mode)) {
146 _note_mode = Sustained;
149 if (Track::set_state (node, version)) {
153 // No destructive MIDI tracks (yet?)
157 if (node.get_property ("input-active", yn)) {
158 set_input_active (yn);
161 ChannelMode playback_channel_mode = AllChannels;
162 ChannelMode capture_channel_mode = AllChannels;
164 node.get_property ("playback-channel-mode", playback_channel_mode);
165 node.get_property ("capture-channel-mode", capture_channel_mode);
167 if (node.get_property ("channel-mode", playback_channel_mode)) {
168 /* 3.0 behaviour where capture and playback modes were not separated */
169 capture_channel_mode = playback_channel_mode;
172 XMLProperty const * prop;
174 unsigned int playback_channel_mask = 0xffff;
175 unsigned int capture_channel_mask = 0xffff;
177 if ((prop = node.property ("playback-channel-mask")) != 0) {
178 sscanf (prop->value().c_str(), "0x%x", &playback_channel_mask);
180 if ((prop = node.property ("capture-channel-mask")) != 0) {
181 sscanf (prop->value().c_str(), "0x%x", &capture_channel_mask);
183 if ((prop = node.property ("channel-mask")) != 0) {
184 sscanf (prop->value().c_str(), "0x%x", &playback_channel_mask);
185 capture_channel_mask = playback_channel_mask;
188 set_playback_channel_mode (playback_channel_mode, playback_channel_mask);
189 set_capture_channel_mode (capture_channel_mode, capture_channel_mask);
191 pending_state = const_cast<XMLNode*> (&node);
193 if (_session.loading ()) {
194 _session.StateReady.connect_same_thread (
195 *this, boost::bind (&MidiTrack::set_state_part_two, this));
197 set_state_part_two ();
204 MidiTrack::state(bool save_template)
206 XMLNode& root (Track::state (save_template));
207 XMLNode* freeze_node;
210 if (_freeze_record.playlist) {
213 freeze_node = new XMLNode (X_("freeze-info"));
214 freeze_node->set_property ("playlist", _freeze_record.playlist->name());
215 freeze_node->set_property ("state", _freeze_record.state);
217 for (vector<FreezeRecordProcessorInfo*>::iterator i = _freeze_record.processor_info.begin(); i != _freeze_record.processor_info.end(); ++i) {
218 inode = new XMLNode (X_("processor"));
219 inode->set_property (X_("id"), id());
220 inode->add_child_copy ((*i)->state);
222 freeze_node->add_child_nocopy (*inode);
225 root.add_child_nocopy (*freeze_node);
228 root.set_property("playback-channel-mode", get_playback_channel_mode());
229 root.set_property("capture-channel-mode", get_capture_channel_mode());
230 snprintf (buf, sizeof(buf), "0x%x", get_playback_channel_mask());
231 root.set_property("playback-channel-mask", std::string(buf));
232 snprintf (buf, sizeof(buf), "0x%x", get_capture_channel_mask());
233 root.set_property("capture-channel-mask", std::string(buf));
235 root.set_property ("note-mode", _note_mode);
236 root.set_property ("step-editing", _step_editing);
237 root.set_property ("input-active", _input_active);
239 for (Controls::const_iterator c = _controls.begin(); c != _controls.end(); ++c) {
240 if (boost::dynamic_pointer_cast<MidiTrack::MidiControl>(c->second)) {
241 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c->second);
243 root.add_child_nocopy (ac->get_state ());
251 MidiTrack::set_state_part_two ()
255 /* This is called after all session state has been restored but before
256 have been made ports and connections are established.
259 if (pending_state == 0) {
263 if ((fnode = find_named_node (*pending_state, X_("freeze-info"))) != 0) {
265 _freeze_record.state = Frozen;
267 for (vector<FreezeRecordProcessorInfo*>::iterator i = _freeze_record.processor_info.begin(); i != _freeze_record.processor_info.end(); ++i) {
270 _freeze_record.processor_info.clear ();
273 if (fnode->get_property (X_("playlist"), str)) {
274 boost::shared_ptr<Playlist> pl = _session.playlists()->by_name (str);
276 _freeze_record.playlist = boost::dynamic_pointer_cast<MidiPlaylist> (pl);
278 _freeze_record.playlist.reset();
279 _freeze_record.state = NoFreeze;
284 fnode->get_property (X_("state"), _freeze_record.state);
286 XMLNodeConstIterator citer;
287 XMLNodeList clist = fnode->children();
289 for (citer = clist.begin(); citer != clist.end(); ++citer) {
290 if ((*citer)->name() != X_("processor")) {
294 if (!(*citer)->get_property (X_("id"), str)) {
298 FreezeRecordProcessorInfo* frii = new FreezeRecordProcessorInfo (*((*citer)->children().front()),
299 boost::shared_ptr<Processor>());
301 _freeze_record.processor_info.push_back (frii);
309 MidiTrack::restore_controls ()
311 // TODO order events (CC before PGM to set banks)
312 for (Controls::const_iterator c = _controls.begin(); c != _controls.end(); ++c) {
313 boost::shared_ptr<MidiTrack::MidiControl> mctrl = boost::dynamic_pointer_cast<MidiTrack::MidiControl>(c->second);
315 mctrl->restore_value();
321 MidiTrack::update_controls (BufferSet const& bufs)
323 const MidiBuffer& buf = bufs.get_midi(0);
324 for (MidiBuffer::const_iterator e = buf.begin(); e != buf.end(); ++e) {
325 const Evoral::Event<samplepos_t>& ev = *e;
326 const Evoral::Parameter param = midi_parameter(ev.buffer(), ev.size());
327 const boost::shared_ptr<AutomationControl> control = automation_control (param);
329 double old = control->get_double (false, 0);
330 control->set_double (ev.value(), 0, false);
331 if (old != ev.value()) {
332 control->Changed (false, Controllable::NoGroup);
339 MidiTrack::no_roll_unlocked (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool state_changing)
341 int ret = Track::no_roll_unlocked (nframes, start_sample, end_sample, state_changing);
343 if (ret == 0 && _step_editing) {
344 push_midi_input_to_step_edit_ringbuffer (nframes);
351 MidiTrack::realtime_locate ()
353 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
359 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
360 (*i)->realtime_locate ();
363 _disk_reader->resolve_tracker (_immediate_events, Port::port_offset());
367 MidiTrack::non_realtime_locate (samplepos_t pos)
369 Track::non_realtime_locate(pos);
371 boost::shared_ptr<MidiPlaylist> playlist = _disk_writer->midi_playlist();
376 /* Get the top unmuted region at this position. */
377 boost::shared_ptr<MidiRegion> region = boost::dynamic_pointer_cast<MidiRegion>(playlist->top_unmuted_region_at(pos));
383 /* the source may be missing, but the control still referenced in the GUI */
384 if (!region->midi_source() || !region->model()) {
388 Glib::Threads::Mutex::Lock lm (_control_lock, Glib::Threads::TRY_LOCK);
393 /* Update track controllers based on its "automation". */
394 const samplepos_t origin = region->position() - region->start();
395 BeatsSamplesConverter bfc(_session.tempo_map(), origin);
397 for (Controls::const_iterator c = _controls.begin(); c != _controls.end(); ++c) {
399 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c->second);
401 if (!ac->automation_playback()) {
405 boost::shared_ptr<MidiTrack::MidiControl> tcontrol;
406 boost::shared_ptr<Evoral::Control> rcontrol;
408 if ((tcontrol = boost::dynamic_pointer_cast<MidiTrack::MidiControl>(c->second)) &&
410 (rcontrol = region->control(tcontrol->parameter()))) {
411 const Temporal::Beats pos_beats = bfc.from(pos - origin);
412 if (rcontrol->list()->size() > 0) {
413 tcontrol->set_value(rcontrol->list()->eval(pos_beats.to_double()), Controllable::NoGroup);
420 MidiTrack::push_midi_input_to_step_edit_ringbuffer (samplecnt_t nframes)
422 PortSet& ports (_input->ports());
424 for (PortSet::iterator p = ports.begin(DataType::MIDI); p != ports.end(DataType::MIDI); ++p) {
426 Buffer& b (p->get_buffer (nframes));
427 const MidiBuffer* const mb = dynamic_cast<MidiBuffer*>(&b);
430 for (MidiBuffer::const_iterator e = mb->begin(); e != mb->end(); ++e) {
432 const Evoral::Event<samplepos_t> ev(*e, false);
434 /* note on, since for step edit, note length is determined
438 if (ev.is_note_on()) {
439 /* we don't care about the time for this purpose */
440 _step_edit_ring_buffer.write (0, ev.event_type(), ev.size(), ev.buffer());
447 MidiTrack::snapshot_out_of_band_data (samplecnt_t nframes)
449 _immediate_event_buffer.clear ();
450 if (0 == _immediate_events.read_space()) {
454 assert (nframes > 0);
456 DEBUG_TRACE (DEBUG::MidiIO, string_compose ("%1 has %2 of immediate events to deliver\n",
457 name(), _immediate_events.read_space()));
459 /* write as many of the immediate events as we can, but give "true" as
460 * the last argument ("stop on overflow in destination") so that we'll
461 * ship the rest out next time.
463 * the Port::port_offset() + (nframes-1) argument puts all these events at the last
464 * possible position of the output buffer, so that we do not
465 * violate monotonicity when writing. Port::port_offset() will
466 * be non-zero if we're in a split process cycle.
468 _immediate_events.read (_immediate_event_buffer, 0, 1, Port::port_offset() + nframes - 1, true);
472 MidiTrack::write_out_of_band_data (BufferSet& bufs, samplecnt_t nframes) const
474 MidiBuffer& buf (bufs.get_midi (0));
475 buf.merge_from (_immediate_event_buffer, nframes);
479 MidiTrack::export_stuff (BufferSet& buffers,
482 boost::shared_ptr<Processor> endpoint,
483 bool include_endpoint,
487 if (buffers.count().n_midi() == 0) {
491 Glib::Threads::RWLock::ReaderLock rlock (_processor_lock);
493 boost::shared_ptr<MidiPlaylist> mpl = _disk_writer->midi_playlist();
497 mpl->reset_note_trackers (); // TODO once at start and end ?
499 buffers.get_midi(0).clear();
500 if (mpl->read(buffers.get_midi(0), start, nframes, 0) != nframes) {
504 if (endpoint && !for_export) {
505 MidiBuffer& buf = buffers.get_midi(0);
506 for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
507 MidiBuffer::TimeType *t = i.timeptr ();
510 bounce_process (buffers, start, nframes, endpoint, include_endpoint, for_export, for_freeze);
512 mpl->reset_note_trackers ();
517 boost::shared_ptr<Region>
518 MidiTrack::bounce (InterThreadInfo& itt)
520 return bounce_range (_session.current_start_sample(), _session.current_end_sample(), itt, main_outs(), false);
523 boost::shared_ptr<Region>
524 MidiTrack::bounce_range (samplepos_t start,
526 InterThreadInfo& itt,
527 boost::shared_ptr<Processor> endpoint,
528 bool include_endpoint)
530 vector<boost::shared_ptr<Source> > srcs;
531 return _session.write_one_track (*this, start, end, false, srcs, itt, endpoint, include_endpoint, false, false);
535 MidiTrack::freeze_me (InterThreadInfo& /*itt*/)
537 std::cerr << "MIDI freeze currently unsupported" << std::endl;
541 MidiTrack::unfreeze ()
543 _freeze_record.state = UnFrozen;
544 FreezeChange (); /* EMIT SIGNAL */
548 MidiTrack::set_note_mode (NoteMode m)
551 _disk_writer->set_note_mode(m);
555 MidiTrack::describe_parameter (Evoral::Parameter param)
557 const std::string str(instrument_info().get_controller_name(param));
558 return str.empty() ? Automatable::describe_parameter(param) : str;
562 MidiTrack::midi_panic()
564 DEBUG_TRACE (DEBUG::MidiIO, string_compose ("%1 delivers panic data\n", name()));
565 for (uint8_t channel = 0; channel <= 0xF; channel++) {
566 uint8_t ev[3] = { ((uint8_t) (MIDI_CMD_CONTROL | channel)), ((uint8_t) MIDI_CTL_SUSTAIN), 0 };
567 write_immediate_event(3, ev);
568 ev[1] = MIDI_CTL_ALL_NOTES_OFF;
569 write_immediate_event(3, ev);
570 ev[1] = MIDI_CTL_RESET_CONTROLLERS;
571 write_immediate_event(3, ev);
575 /** \return true on success, false on failure (no buffer space left)
578 MidiTrack::write_immediate_event(size_t size, const uint8_t* buf)
580 if (!Evoral::midi_event_is_valid(buf, size)) {
581 cerr << "WARNING: Ignoring illegal immediate MIDI event" << endl;
584 return (_immediate_events.write (0, Evoral::MIDI_EVENT, size, buf) == size);
588 MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState state)
590 switch (param.type()) {
591 case MidiCCAutomation:
592 case MidiPgmChangeAutomation:
593 case MidiPitchBenderAutomation:
594 case MidiChannelPressureAutomation:
595 case MidiNotePressureAutomation:
596 case MidiSystemExclusiveAutomation:
597 /* The track control for MIDI parameters is for immediate events to act
598 as a control surface, write/touch for them is not currently
602 Automatable::set_parameter_automation_state(param, state);
607 MidiTrack::MidiControl::restore_value ()
609 actually_set_value (get_value(), Controllable::NoGroup);
613 MidiTrack::MidiControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
615 const Evoral::Parameter ¶meter = _list ? _list->parameter() : Control::parameter();
616 const Evoral::ParameterDescriptor &desc = EventTypeMap::instance().descriptor(parameter);
619 if (isinf_local(val)) {
620 cerr << "MIDIControl value is infinity" << endl;
621 } else if (isnan_local(val)) {
622 cerr << "MIDIControl value is NaN" << endl;
623 } else if (val < desc.lower) {
624 cerr << "MIDIControl value is < " << desc.lower << endl;
625 } else if (val > desc.upper) {
626 cerr << "MIDIControl value is > " << desc.upper << endl;
635 assert(val <= desc.upper);
636 if ( ! _list || ! automation_playback()) {
638 uint8_t ev[3] = { parameter.channel(), uint8_t (val), 0 };
639 switch(parameter.type()) {
640 case MidiCCAutomation:
641 ev[0] |= MIDI_CMD_CONTROL;
642 ev[1] = parameter.id();
646 case MidiPgmChangeAutomation:
648 ev[0] |= MIDI_CMD_PGM_CHANGE;
652 case MidiChannelPressureAutomation:
654 ev[0] |= MIDI_CMD_CHANNEL_PRESSURE;
658 case MidiNotePressureAutomation:
659 ev[0] |= MIDI_CMD_NOTE_PRESSURE;
660 ev[1] = parameter.id();
664 case MidiPitchBenderAutomation:
665 ev[0] |= MIDI_CMD_BENDER;
666 ev[1] = 0x7F & int(val);
667 ev[2] = 0x7F & (int(val) >> 7);
674 _route->write_immediate_event(size, ev);
677 AutomationControl::actually_set_value(val, group_override);
681 MidiTrack::set_step_editing (bool yn)
683 if (_session.record_status() != Session::Disabled) {
687 if (yn != _step_editing) {
689 StepEditStatusChange (yn);
693 boost::shared_ptr<SMFSource>
694 MidiTrack::write_source (uint32_t)
696 return _disk_writer->midi_write_source ();
700 MidiTrack::set_playback_channel_mode(ChannelMode mode, uint16_t mask)
702 if (_playback_filter.set_channel_mode(mode, mask)) {
703 _session.set_dirty();
708 MidiTrack::set_capture_channel_mode(ChannelMode mode, uint16_t mask)
710 if (_capture_filter.set_channel_mode(mode, mask)) {
711 _session.set_dirty();
716 MidiTrack::set_playback_channel_mask (uint16_t mask)
718 if (_playback_filter.set_channel_mask(mask)) {
719 _session.set_dirty();
724 MidiTrack::set_capture_channel_mask (uint16_t mask)
726 if (_capture_filter.set_channel_mask(mask)) {
727 _session.set_dirty();
731 boost::shared_ptr<MidiPlaylist>
732 MidiTrack::midi_playlist ()
734 return boost::dynamic_pointer_cast<MidiPlaylist> (_playlists[DataType::MIDI]);
738 MidiTrack::input_active () const
740 return _input_active;
744 MidiTrack::set_input_active (bool yn)
746 if (yn != _input_active) {
748 map_input_active (yn);
749 InputActiveChanged (); /* EMIT SIGNAL */
754 MidiTrack::map_input_active (bool yn)
760 PortSet& ports (_input->ports());
762 for (PortSet::iterator p = ports.begin(DataType::MIDI); p != ports.end(DataType::MIDI); ++p) {
763 boost::shared_ptr<MidiPort> mp = boost::dynamic_pointer_cast<MidiPort> (*p);
764 if (yn != mp->input_active()) {
765 mp->set_input_active (yn);
771 MidiTrack::track_input_active (IOChange change, void* /* src */)
773 if (change.type & IOChange::ConfigurationChanged) {
774 map_input_active (_input_active);
778 boost::shared_ptr<MidiBuffer>
779 MidiTrack::get_gui_feed_buffer () const
781 return _disk_writer->get_gui_feed_buffer ();
785 MidiTrack::act_on_mute ()
787 /* this is called right after our mute status has changed.
788 if we are now muted, send suitable output to shutdown
791 XXX we should should also stop all relevant note trackers.
794 /* If we haven't got a diskstream yet, there's nothing to worry about,
795 and we can't call get_channel_mask() anyway.
801 if (muted() || _mute_master->muted_by_others_soloing_at (MuteMaster::AllPoints)) {
802 /* only send messages for channels we are using */
804 uint16_t mask = _playback_filter.get_channel_mask();
806 for (uint8_t channel = 0; channel <= 0xF; channel++) {
808 if ((1<<channel) & mask) {
810 DEBUG_TRACE (DEBUG::MidiIO, string_compose ("%1 delivers mute message to channel %2\n", name(), channel+1));
811 uint8_t ev[3] = { ((uint8_t) (MIDI_CMD_CONTROL | channel)), MIDI_CTL_SUSTAIN, 0 };
812 write_immediate_event (3, ev);
814 /* Note we do not send MIDI_CTL_ALL_NOTES_OFF here, since this may
815 silence notes that came from another non-muted track. */
819 /* Resolve active notes. */
820 _disk_reader->resolve_tracker(_immediate_events, Port::port_offset());
825 MidiTrack::monitoring_changed (bool self, Controllable::GroupControlDisposition gcd)
827 Track::monitoring_changed (self, gcd);
829 /* monitoring state changed, so flush out any on notes at the
833 PortSet& ports (_output->ports());
835 for (PortSet::iterator p = ports.begin(); p != ports.end(); ++p) {
836 boost::shared_ptr<MidiPort> mp = boost::dynamic_pointer_cast<MidiPort> (*p);
838 mp->require_resolve ();
842 _disk_reader->reset_tracker ();
846 MidiTrack::monitoring_state () const
848 MonitorState ms = Track::monitoring_state();
849 if (ms == MonitoringSilence) {
850 return MonitoringInput;
856 MidiTrack::get_auto_monitoring_state () const
858 //if we are a midi track, we ignore auto_input, tape_mode, etc etc. "Auto" will monitor Disk+In
859 return MonitoringCue;
863 MidiTrack::filter_input (BufferSet& bufs)
865 _capture_filter.filter (bufs);
869 MidiTrack::realtime_handle_transport_stopped ()
871 Route::realtime_handle_transport_stopped ();
872 _disk_reader->resolve_tracker (_immediate_events, Port::port_offset());
876 MidiTrack::playlist_contents_changed ()