2 Copyright (C) 2006 Paul Davis
3 Author: David Robillard
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 // 'std::isinf()' and 'std::isnan()' are not available in MSVC.
25 #define isinf_local(val) !((bool)_finite((double)val))
26 #define isnan_local(val) (bool)_isnan((double)val)
28 #define isinf_local std::isinf
29 #define isnan_local std::isnan
32 #include "pbd/enumwriter.h"
33 #include "pbd/types_convert.h"
34 #include "evoral/midi_util.h"
36 #include "ardour/amp.h"
37 #include "ardour/beats_samples_converter.h"
38 #include "ardour/buffer_set.h"
39 #include "ardour/debug.h"
40 #include "ardour/delivery.h"
41 #include "ardour/disk_reader.h"
42 #include "ardour/disk_writer.h"
43 #include "ardour/event_type_map.h"
44 #include "ardour/meter.h"
45 #include "ardour/midi_playlist.h"
46 #include "ardour/midi_port.h"
47 #include "ardour/midi_region.h"
48 #include "ardour/midi_track.h"
49 #include "ardour/monitor_control.h"
50 #include "ardour/parameter_types.h"
51 #include "ardour/port.h"
52 #include "ardour/processor.h"
53 #include "ardour/profile.h"
54 #include "ardour/route_group_specialized.h"
55 #include "ardour/session.h"
56 #include "ardour/session_playlists.h"
57 #include "ardour/types_convert.h"
58 #include "ardour/utils.h"
63 class InterThreadInfo;
70 using namespace ARDOUR;
73 MidiTrack::MidiTrack (Session& sess, string name, TrackMode mode)
74 : Track (sess, name, PresentationInfo::MidiTrack, mode, DataType::MIDI)
75 , _immediate_events(6096) // FIXME: size?
76 , _immediate_event_buffer(6096)
77 , _step_edit_ring_buffer(64) // FIXME: size?
78 , _note_mode (Sustained)
79 , _step_editing (false)
80 , _input_active (true)
82 _session.SessionLoaded.connect_same_thread (*this, boost::bind (&MidiTrack::restore_controls, this));
85 MidiTrack::~MidiTrack ()
96 _input->changed.connect_same_thread (*this, boost::bind (&MidiTrack::track_input_active, this, _1, _2));
98 _disk_writer->set_note_mode (_note_mode);
99 _disk_reader->reset_tracker ();
105 MidiTrack::can_be_record_safe ()
111 return Track::can_be_record_safe ();
115 MidiTrack::can_be_record_enabled ()
121 return Track::can_be_record_enabled ();
125 MidiTrack::set_state (const XMLNode& node, int version)
127 /* This must happen before Track::set_state(), as there will be a buffer
128 fill during that call, and we must fill buffers using the correct
131 if (!node.get_property (X_("note-mode"), _note_mode)) {
132 _note_mode = Sustained;
135 if (Track::set_state (node, version)) {
139 // No destructive MIDI tracks (yet?)
143 if (node.get_property ("input-active", yn)) {
144 set_input_active (yn);
147 ChannelMode playback_channel_mode = AllChannels;
148 ChannelMode capture_channel_mode = AllChannels;
150 node.get_property ("playback-channel-mode", playback_channel_mode);
151 node.get_property ("capture-channel-mode", capture_channel_mode);
153 if (node.get_property ("channel-mode", playback_channel_mode)) {
154 /* 3.0 behaviour where capture and playback modes were not separated */
155 capture_channel_mode = playback_channel_mode;
158 XMLProperty const * prop;
160 unsigned int playback_channel_mask = 0xffff;
161 unsigned int capture_channel_mask = 0xffff;
163 if ((prop = node.property ("playback-channel-mask")) != 0) {
164 sscanf (prop->value().c_str(), "0x%x", &playback_channel_mask);
166 if ((prop = node.property ("capture-channel-mask")) != 0) {
167 sscanf (prop->value().c_str(), "0x%x", &capture_channel_mask);
169 if ((prop = node.property ("channel-mask")) != 0) {
170 sscanf (prop->value().c_str(), "0x%x", &playback_channel_mask);
171 capture_channel_mask = playback_channel_mask;
174 set_playback_channel_mode (playback_channel_mode, playback_channel_mask);
175 set_capture_channel_mode (capture_channel_mode, capture_channel_mask);
177 pending_state = const_cast<XMLNode*> (&node);
179 if (_session.state_of_the_state() & Session::Loading) {
180 _session.StateReady.connect_same_thread (
181 *this, boost::bind (&MidiTrack::set_state_part_two, this));
183 set_state_part_two ();
190 MidiTrack::state(bool full_state)
192 XMLNode& root (Track::state(full_state));
193 XMLNode* freeze_node;
196 if (_freeze_record.playlist) {
199 freeze_node = new XMLNode (X_("freeze-info"));
200 freeze_node->set_property ("playlist", _freeze_record.playlist->name());
201 freeze_node->set_property ("state", _freeze_record.state);
203 for (vector<FreezeRecordProcessorInfo*>::iterator i = _freeze_record.processor_info.begin(); i != _freeze_record.processor_info.end(); ++i) {
204 inode = new XMLNode (X_("processor"));
205 inode->set_property (X_("id"), id());
206 inode->add_child_copy ((*i)->state);
208 freeze_node->add_child_nocopy (*inode);
211 root.add_child_nocopy (*freeze_node);
214 root.set_property("playback-channel-mode", get_playback_channel_mode());
215 root.set_property("capture-channel-mode", get_capture_channel_mode());
216 snprintf (buf, sizeof(buf), "0x%x", get_playback_channel_mask());
217 root.set_property("playback-channel-mask", std::string(buf));
218 snprintf (buf, sizeof(buf), "0x%x", get_capture_channel_mask());
219 root.set_property("capture-channel-mask", std::string(buf));
221 root.set_property ("note-mode", _note_mode);
222 root.set_property ("step-editing", _step_editing);
223 root.set_property ("input-active", _input_active);
225 for (Controls::const_iterator c = _controls.begin(); c != _controls.end(); ++c) {
226 if (boost::dynamic_pointer_cast<MidiTrack::MidiControl>(c->second)) {
227 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c->second);
229 root.add_child_nocopy (ac->get_state ());
237 MidiTrack::set_state_part_two ()
241 /* This is called after all session state has been restored but before
242 have been made ports and connections are established.
245 if (pending_state == 0) {
249 if ((fnode = find_named_node (*pending_state, X_("freeze-info"))) != 0) {
251 _freeze_record.state = Frozen;
253 for (vector<FreezeRecordProcessorInfo*>::iterator i = _freeze_record.processor_info.begin(); i != _freeze_record.processor_info.end(); ++i) {
256 _freeze_record.processor_info.clear ();
259 if (fnode->get_property (X_("playlist"), str)) {
260 boost::shared_ptr<Playlist> pl = _session.playlists->by_name (str);
262 _freeze_record.playlist = boost::dynamic_pointer_cast<MidiPlaylist> (pl);
264 _freeze_record.playlist.reset();
265 _freeze_record.state = NoFreeze;
270 fnode->get_property (X_("state"), _freeze_record.state);
272 XMLNodeConstIterator citer;
273 XMLNodeList clist = fnode->children();
275 for (citer = clist.begin(); citer != clist.end(); ++citer) {
276 if ((*citer)->name() != X_("processor")) {
280 if (!(*citer)->get_property (X_("id"), str)) {
284 FreezeRecordProcessorInfo* frii = new FreezeRecordProcessorInfo (*((*citer)->children().front()),
285 boost::shared_ptr<Processor>());
287 _freeze_record.processor_info.push_back (frii);
295 MidiTrack::restore_controls ()
297 // TODO order events (CC before PGM to set banks)
298 for (Controls::const_iterator c = _controls.begin(); c != _controls.end(); ++c) {
299 boost::shared_ptr<MidiTrack::MidiControl> mctrl = boost::dynamic_pointer_cast<MidiTrack::MidiControl>(c->second);
301 mctrl->restore_value();
307 MidiTrack::update_controls (BufferSet const& bufs)
309 const MidiBuffer& buf = bufs.get_midi(0);
310 for (MidiBuffer::const_iterator e = buf.begin(); e != buf.end(); ++e) {
311 const Evoral::Event<samplepos_t>& ev = *e;
312 const Evoral::Parameter param = midi_parameter(ev.buffer(), ev.size());
313 const boost::shared_ptr<AutomationControl> control = automation_control (param);
315 double old = control->get_double (false, 0);
316 control->set_double (ev.value(), 0, false);
317 if (old != ev.value()) {
318 control->Changed (false, Controllable::NoGroup);
325 MidiTrack::no_roll_unlocked (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample, bool state_changing)
327 int ret = Track::no_roll_unlocked (nframes, start_sample, end_sample, state_changing);
329 if (ret == 0 && _step_editing) {
330 push_midi_input_to_step_edit_ringbuffer (nframes);
337 MidiTrack::realtime_locate ()
339 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
345 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
346 (*i)->realtime_locate ();
349 _disk_reader->reset_tracker ();
353 MidiTrack::non_realtime_locate (samplepos_t pos)
355 Track::non_realtime_locate(pos);
357 boost::shared_ptr<MidiPlaylist> playlist = _disk_writer->midi_playlist();
362 /* Get the top unmuted region at this position. */
363 boost::shared_ptr<MidiRegion> region = boost::dynamic_pointer_cast<MidiRegion>(
364 playlist->top_unmuted_region_at(pos));
369 /* the source may be missing, but the control still referenced in the GUI */
370 if (!region->midi_source() || !region->model()) {
374 Glib::Threads::Mutex::Lock lm (_control_lock, Glib::Threads::TRY_LOCK);
379 /* Update track controllers based on its "automation". */
380 const samplepos_t origin = region->position() - region->start();
381 BeatsSamplesConverter bfc(_session.tempo_map(), origin);
382 for (Controls::const_iterator c = _controls.begin(); c != _controls.end(); ++c) {
383 boost::shared_ptr<MidiTrack::MidiControl> tcontrol;
384 boost::shared_ptr<Evoral::Control> rcontrol;
385 if ((tcontrol = boost::dynamic_pointer_cast<MidiTrack::MidiControl>(c->second)) &&
386 (rcontrol = region->control(tcontrol->parameter()))) {
387 const Temporal::Beats pos_beats = bfc.from(pos - origin);
388 if (rcontrol->list()->size() > 0) {
389 tcontrol->set_value(rcontrol->list()->eval(pos_beats.to_double()), Controllable::NoGroup);
396 MidiTrack::push_midi_input_to_step_edit_ringbuffer (samplecnt_t nframes)
398 PortSet& ports (_input->ports());
400 for (PortSet::iterator p = ports.begin(DataType::MIDI); p != ports.end(DataType::MIDI); ++p) {
402 Buffer& b (p->get_buffer (nframes));
403 const MidiBuffer* const mb = dynamic_cast<MidiBuffer*>(&b);
406 for (MidiBuffer::const_iterator e = mb->begin(); e != mb->end(); ++e) {
408 const Evoral::Event<samplepos_t> ev(*e, false);
410 /* note on, since for step edit, note length is determined
414 if (ev.is_note_on()) {
415 /* we don't care about the time for this purpose */
416 _step_edit_ring_buffer.write (0, ev.event_type(), ev.size(), ev.buffer());
423 MidiTrack::snapshot_out_of_band_data (samplecnt_t nframes)
425 _immediate_event_buffer.clear ();
426 if (0 == _immediate_events.read_space()) {
430 assert (nframes > 0);
432 DEBUG_TRACE (DEBUG::MidiIO, string_compose ("%1 has %2 of immediate events to deliver\n",
433 name(), _immediate_events.read_space()));
435 /* write as many of the immediate events as we can, but give "true" as
436 * the last argument ("stop on overflow in destination") so that we'll
437 * ship the rest out next time.
439 * the Port::port_offset() + (nframes-1) argument puts all these events at the last
440 * possible position of the output buffer, so that we do not
441 * violate monotonicity when writing. Port::port_offset() will
442 * be non-zero if we're in a split process cycle.
444 _immediate_events.read (_immediate_event_buffer, 0, 1, Port::port_offset() + nframes - 1, true);
448 MidiTrack::write_out_of_band_data (BufferSet& bufs, samplecnt_t nframes) const
450 MidiBuffer& buf (bufs.get_midi (0));
451 buf.merge_from (_immediate_event_buffer, nframes);
455 MidiTrack::export_stuff (BufferSet& buffers,
458 boost::shared_ptr<Processor> endpoint,
459 bool include_endpoint,
463 if (buffers.count().n_midi() == 0) {
467 Glib::Threads::RWLock::ReaderLock rlock (_processor_lock);
469 boost::shared_ptr<MidiPlaylist> mpl = _disk_writer->midi_playlist();
474 buffers.get_midi(0).clear();
475 if (mpl->read(buffers.get_midi(0), start, nframes, 0) != nframes) {
479 //bounce_process (buffers, start, nframes, endpoint, include_endpoint, for_export, for_freeze);
484 boost::shared_ptr<Region>
485 MidiTrack::bounce (InterThreadInfo& itt)
487 return bounce_range (_session.current_start_sample(), _session.current_end_sample(), itt, main_outs(), false);
490 boost::shared_ptr<Region>
491 MidiTrack::bounce_range (samplepos_t start,
493 InterThreadInfo& itt,
494 boost::shared_ptr<Processor> endpoint,
495 bool include_endpoint)
497 vector<boost::shared_ptr<Source> > srcs;
498 return _session.write_one_track (*this, start, end, false, srcs, itt, endpoint, include_endpoint, false, false);
502 MidiTrack::freeze_me (InterThreadInfo& /*itt*/)
504 std::cerr << "MIDI freeze currently unsupported" << std::endl;
508 MidiTrack::unfreeze ()
510 _freeze_record.state = UnFrozen;
511 FreezeChange (); /* EMIT SIGNAL */
515 MidiTrack::set_note_mode (NoteMode m)
518 _disk_writer->set_note_mode(m);
522 MidiTrack::describe_parameter (Evoral::Parameter param)
524 const std::string str(instrument_info().get_controller_name(param));
525 return str.empty() ? Automatable::describe_parameter(param) : str;
529 MidiTrack::midi_panic()
531 DEBUG_TRACE (DEBUG::MidiIO, string_compose ("%1 delivers panic data\n", name()));
532 for (uint8_t channel = 0; channel <= 0xF; channel++) {
533 uint8_t ev[3] = { ((uint8_t) (MIDI_CMD_CONTROL | channel)), ((uint8_t) MIDI_CTL_SUSTAIN), 0 };
534 write_immediate_event(3, ev);
535 ev[1] = MIDI_CTL_ALL_NOTES_OFF;
536 write_immediate_event(3, ev);
537 ev[1] = MIDI_CTL_RESET_CONTROLLERS;
538 write_immediate_event(3, ev);
542 /** \return true on success, false on failure (no buffer space left)
545 MidiTrack::write_immediate_event(size_t size, const uint8_t* buf)
547 if (!Evoral::midi_event_is_valid(buf, size)) {
548 cerr << "WARNING: Ignoring illegal immediate MIDI event" << endl;
551 return (_immediate_events.write (0, Evoral::MIDI_EVENT, size, buf) == size);
555 MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState state)
557 switch (param.type()) {
558 case MidiCCAutomation:
559 case MidiPgmChangeAutomation:
560 case MidiPitchBenderAutomation:
561 case MidiChannelPressureAutomation:
562 case MidiNotePressureAutomation:
563 case MidiSystemExclusiveAutomation:
564 /* The track control for MIDI parameters is for immediate events to act
565 as a control surface, write/touch for them is not currently
569 Automatable::set_parameter_automation_state(param, state);
574 MidiTrack::MidiControl::restore_value ()
576 actually_set_value (get_value(), Controllable::NoGroup);
580 MidiTrack::MidiControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
582 const Evoral::Parameter ¶meter = _list ? _list->parameter() : Control::parameter();
583 const Evoral::ParameterDescriptor &desc = EventTypeMap::instance().descriptor(parameter);
586 if (isinf_local(val)) {
587 cerr << "MIDIControl value is infinity" << endl;
588 } else if (isnan_local(val)) {
589 cerr << "MIDIControl value is NaN" << endl;
590 } else if (val < desc.lower) {
591 cerr << "MIDIControl value is < " << desc.lower << endl;
592 } else if (val > desc.upper) {
593 cerr << "MIDIControl value is > " << desc.upper << endl;
602 assert(val <= desc.upper);
603 if ( ! _list || ! automation_playback()) {
605 uint8_t ev[3] = { parameter.channel(), uint8_t (val), 0 };
606 switch(parameter.type()) {
607 case MidiCCAutomation:
608 ev[0] += MIDI_CMD_CONTROL;
609 ev[1] = parameter.id();
613 case MidiPgmChangeAutomation:
615 ev[0] += MIDI_CMD_PGM_CHANGE;
619 case MidiChannelPressureAutomation:
621 ev[0] += MIDI_CMD_CHANNEL_PRESSURE;
625 case MidiNotePressureAutomation:
626 ev[0] += MIDI_CMD_NOTE_PRESSURE;
627 ev[1] = parameter.id();
631 case MidiPitchBenderAutomation:
632 ev[0] += MIDI_CMD_BENDER;
633 ev[1] = 0x7F & int(val);
634 ev[2] = 0x7F & (int(val) >> 7);
640 _route->write_immediate_event(size, ev);
643 AutomationControl::actually_set_value(val, group_override);
647 MidiTrack::set_step_editing (bool yn)
649 if (_session.record_status() != Session::Disabled) {
653 if (yn != _step_editing) {
655 StepEditStatusChange (yn);
659 boost::shared_ptr<SMFSource>
660 MidiTrack::write_source (uint32_t)
662 return _disk_writer->midi_write_source ();
666 MidiTrack::set_playback_channel_mode(ChannelMode mode, uint16_t mask)
668 if (_playback_filter.set_channel_mode(mode, mask)) {
669 _session.set_dirty();
674 MidiTrack::set_capture_channel_mode(ChannelMode mode, uint16_t mask)
676 if (_capture_filter.set_channel_mode(mode, mask)) {
677 _session.set_dirty();
682 MidiTrack::set_playback_channel_mask (uint16_t mask)
684 if (_playback_filter.set_channel_mask(mask)) {
685 _session.set_dirty();
690 MidiTrack::set_capture_channel_mask (uint16_t mask)
692 if (_capture_filter.set_channel_mask(mask)) {
693 _session.set_dirty();
697 boost::shared_ptr<MidiPlaylist>
698 MidiTrack::midi_playlist ()
700 return boost::dynamic_pointer_cast<MidiPlaylist> (_playlists[DataType::MIDI]);
704 MidiTrack::input_active () const
706 return _input_active;
710 MidiTrack::set_input_active (bool yn)
712 if (yn != _input_active) {
714 map_input_active (yn);
715 InputActiveChanged (); /* EMIT SIGNAL */
720 MidiTrack::map_input_active (bool yn)
726 PortSet& ports (_input->ports());
728 for (PortSet::iterator p = ports.begin(DataType::MIDI); p != ports.end(DataType::MIDI); ++p) {
729 boost::shared_ptr<MidiPort> mp = boost::dynamic_pointer_cast<MidiPort> (*p);
730 if (yn != mp->input_active()) {
731 mp->set_input_active (yn);
737 MidiTrack::track_input_active (IOChange change, void* /* src */)
739 if (change.type & IOChange::ConfigurationChanged) {
740 map_input_active (_input_active);
744 boost::shared_ptr<MidiBuffer>
745 MidiTrack::get_gui_feed_buffer () const
747 return _disk_reader->get_gui_feed_buffer ();
751 MidiTrack::act_on_mute ()
753 /* this is called right after our mute status has changed.
754 if we are now muted, send suitable output to shutdown
757 XXX we should should also stop all relevant note trackers.
760 /* If we haven't got a diskstream yet, there's nothing to worry about,
761 and we can't call get_channel_mask() anyway.
767 if (muted() || _mute_master->muted_by_others_soloing_at (MuteMaster::AllPoints)) {
768 /* only send messages for channels we are using */
770 uint16_t mask = _playback_filter.get_channel_mask();
772 for (uint8_t channel = 0; channel <= 0xF; channel++) {
774 if ((1<<channel) & mask) {
776 DEBUG_TRACE (DEBUG::MidiIO, string_compose ("%1 delivers mute message to channel %2\n", name(), channel+1));
777 uint8_t ev[3] = { ((uint8_t) (MIDI_CMD_CONTROL | channel)), MIDI_CTL_SUSTAIN, 0 };
778 write_immediate_event (3, ev);
780 /* Note we do not send MIDI_CTL_ALL_NOTES_OFF here, since this may
781 silence notes that came from another non-muted track. */
785 /* Resolve active notes. */
786 _disk_reader->resolve_tracker(_immediate_events, Port::port_offset());
791 MidiTrack::monitoring_changed (bool self, Controllable::GroupControlDisposition gcd)
793 Track::monitoring_changed (self, gcd);
795 /* monitoring state changed, so flush out any on notes at the
799 PortSet& ports (_output->ports());
801 for (PortSet::iterator p = ports.begin(); p != ports.end(); ++p) {
802 boost::shared_ptr<MidiPort> mp = boost::dynamic_pointer_cast<MidiPort> (*p);
804 mp->require_resolve ();
808 _disk_reader->reset_tracker ();
812 MidiTrack::monitoring_state () const
814 MonitorState ms = Track::monitoring_state();
815 if (ms == MonitoringSilence) {
816 return MonitoringInput;
822 MidiTrack::filter_input (BufferSet& bufs)
824 _capture_filter.filter (bufs);