+ if (!valid) {
+ return;
+ }
+
+ assert(val <= _list->parameter().max());
+ if ( ! automation_playback()) {
+ size_t size = 3;
+ uint8_t ev[3] = { _list->parameter().channel(), int(val), 0 };
+ switch(_list->parameter().type()) {
+ case MidiCCAutomation:
+ ev[0] += MIDI_CMD_CONTROL;
+ ev[1] = _list->parameter().id();
+ ev[2] = int(val);
+ break;
+
+ case MidiPgmChangeAutomation:
+ size = 2;
+ ev[0] += MIDI_CMD_PGM_CHANGE;
+ ev[1] = int(val);
+ break;
+
+ case MidiChannelPressureAutomation:
+ size = 2;
+ ev[0] += MIDI_CMD_CHANNEL_PRESSURE;
+ ev[1] = int(val);
+ 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(size, ev);
+ }
+
+ AutomationControl::set_value(val);
+}
+
+void
+MidiTrack::set_step_editing (bool yn)
+{
+ _step_editing = yn;
+}
+
+void
+MidiTrack::set_default_channel (uint8_t chn)
+{
+ _default_channel = std::min ((unsigned int) chn, 15U);
+}
+
+void
+MidiTrack::set_midi_thru (bool yn)
+{
+ _midi_thru = yn;
+}
+
+boost::shared_ptr<SMFSource>
+MidiTrack::write_source (uint32_t n)
+{
+ return midi_diskstream()->write_source ();
+}
+
+void
+MidiTrack::set_channel_mode (ChannelMode mode, uint16_t mask)
+{
+ midi_diskstream()->set_channel_mode (mode, mask);
+}
+
+ChannelMode
+MidiTrack::get_channel_mode ()
+{
+ return midi_diskstream()->get_channel_mode ();
+}
+
+uint16_t
+MidiTrack::get_channel_mask ()
+{
+ return midi_diskstream()->get_channel_mask ();
+}
+
+boost::shared_ptr<MidiPlaylist>
+MidiTrack::midi_playlist ()
+{
+ return midi_diskstream()->midi_playlist ();