/*
- Copyright (C) 2000 Paul Davis
+ Copyright (C) 2000 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
using namespace Gtk;
using namespace sigc;
using namespace Editing;
-
+
// Minimum height at which a control is displayed
static const uint32_t MIDI_CONTROLS_BOX_MIN_HEIGHT = 162;
static const uint32_t KEYBOARD_MIN_HEIGHT = 140;
boost::shared_ptr<Route> rt, Canvas& canvas)
: AxisView(sess) // virtually inherited
, RouteTimeAxisView(ed, sess, rt, canvas)
- , _ignore_signals(false)
+ , _ignore_signals(false)
, _range_scroomer(0)
, _piano_roll_header(0)
, _note_mode(Sustained)
solo_button->set_active (false);
step_edit_insert_position = 0;
-
+
if (is_midi_track()) {
controls_ebox.set_name ("MidiTimeAxisViewControlsBaseUnselected");
_note_mode = midi_track()->note_mode();
ensure_xml_node ();
- set_state (*xml_node);
-
+ set_state (*xml_node, Stateful::loading_state_version);
+
_route->processors_changed.connect (mem_fun(*this, &MidiTimeAxisView::processors_changed));
if (is_track()) {
_view->RegionViewAdded.connect (mem_fun(*this, &MidiTimeAxisView::region_view_added));
_view->attach ();
}
-
+
HBox* midi_controls_hbox = manage(new HBox());
-
+
MIDI::Name::MidiPatchManager& patch_manager = MIDI::Name::MidiPatchManager::instance();
MIDI::Name::MasterDeviceNames::Models::const_iterator m = patch_manager.all_models().begin();
for (; m != patch_manager.all_models().end(); ++m) {
_model_selector.append_text(m->c_str());
}
-
+
_model_selector.signal_changed().connect(mem_fun(*this, &MidiTimeAxisView::model_changed));
-
+
_custom_device_mode_selector.signal_changed().connect(
mem_fun(*this, &MidiTimeAxisView::custom_device_mode_changed));
-
+
// TODO: persist the choice
// this initializes the comboboxes and sends out the signal
_model_selector.set_active(0);
_midi_controls_box.pack_start(_model_selector, true, false);
_midi_controls_box.pack_start(_custom_device_mode_selector, true, false);
}
-
+
_midi_controls_box.pack_start(*midi_controls_hbox, true, true);
-
+
controls_vbox.pack_start(_midi_controls_box, false, false);
-
+
boost::shared_ptr<MidiDiskstream> diskstream = midi_track()->midi_diskstream();
// restore channel selector settings
_channel_selector.set_channel_colors(CanvasNoteEvent::midi_channel_colors);
}
}
+
+ if ((prop = xml_node->property ("note-mode")) != 0) {
+ _note_mode = NoteMode (string_2_enum(prop->value(), _note_mode));
+ if (mode_menu) {
+ _percussion_mode_item->set_active (_note_mode == Percussive);
+ }
+ }
}
MidiTimeAxisView::~MidiTimeAxisView ()
{
std::list<std::string> device_modes = MIDI::Name::MidiPatchManager::instance()
.custom_device_mode_names_by_model(_model_selector.get_active_text());
-
+
_custom_device_mode_selector.clear_items();
-
+
for (std::list<std::string>::const_iterator i = device_modes.begin();
i != device_modes.end(); ++i) {
cerr << "found custom device mode " << *i << " thread_id: " << pthread_self() << endl;
void MidiTimeAxisView::custom_device_mode_changed()
{
_midi_patch_settings_changed.emit(_model_selector.get_active_text(),
- _custom_device_mode_selector.get_active_text());
+ _custom_device_mode_selector.get_active_text());
}
MidiStreamView*
{
ensure_xml_node ();
xml_node->add_property ("shown-editor", "yes");
-
+
guint32 ret = TimeAxisView::show_at (y, nth, parent);
return ret;
}
} else {
_midi_controls_box.hide();
}
-
+
if (height >= KEYBOARD_MIN_HEIGHT) {
if (is_track() && _range_scroomer)
_range_scroomer->show();
Menu *range_menu = manage(new Menu);
MenuList& range_items = range_menu->items();
range_menu->set_name ("ArdourContextMenu");
-
+
range_items.push_back (MenuElem (_("Show Full Range"), bind (
mem_fun(*this, &MidiTimeAxisView::set_note_range),
MidiStreamView::FullRange)));
-
+
range_items.push_back (MenuElem (_("Fit Contents"), bind (
mem_fun(*this, &MidiTimeAxisView::set_note_range),
MidiStreamView::ContentsRange)));
MidiTimeAxisView::build_def_channel_menu ()
{
using namespace Menu_Helpers;
-
+
if (default_channel_menu == 0) {
default_channel_menu = manage (new Menu ());
- }
-
+ }
+
uint8_t defchn = midi_track()->default_channel();
MenuList& def_channel_items = default_channel_menu->items();
RadioMenuItem* item;
RadioMenuItem::Group dc_group;
-
+
for (int i = 0; i < 16; ++i) {
char buf[4];
snprintf (buf, sizeof (buf), "%d", i+1);
-
+
def_channel_items.push_back (RadioMenuElem (dc_group, buf,
bind (mem_fun (*this, &MidiTimeAxisView::set_default_channel), i)));
item = dynamic_cast<RadioMenuItem*>(&def_channel_items.back());
RouteTimeAxisView::build_automation_action_menu ();
MenuList& automation_items = automation_action_menu->items();
-
+
automation_items.push_back (SeparatorElem());
- automation_items.push_back (MenuElem (_("Controller..."),
+ automation_items.push_back (MenuElem (_("Controller..."),
mem_fun(*this, &MidiTimeAxisView::add_cc_track)));
- automation_items.push_back (MenuElem (_("Program Change"),
+ automation_items.push_back (MenuElem (_("Program Change"),
sigc::bind(mem_fun(*this, &MidiTimeAxisView::add_parameter_track),
- Evoral::Parameter(MidiPgmChangeAutomation))));
- automation_items.push_back (MenuElem (_("Bender"),
+ Evoral::Parameter(MidiPgmChangeAutomation))));
+ automation_items.push_back (MenuElem (_("Bender"),
sigc::bind(mem_fun(*this, &MidiTimeAxisView::add_parameter_track),
Evoral::Parameter(MidiPitchBenderAutomation))));
- automation_items.push_back (MenuElem (_("Pressure"),
+ automation_items.push_back (MenuElem (_("Pressure"),
sigc::bind(mem_fun(*this, &MidiTimeAxisView::add_parameter_track),
Evoral::Parameter(MidiChannelPressureAutomation))));
}
bind (mem_fun (*this, &MidiTimeAxisView::set_color_mode), ChannelColors)));
_channel_color_mode_item = dynamic_cast<RadioMenuItem*>(&items.back());
_channel_color_mode_item->set_active(_color_mode == ChannelColors);
-
+
items.push_back (RadioMenuElem (mode_group, _("Track Color"),
bind (mem_fun (*this, &MidiTimeAxisView::set_color_mode), TrackColor)));
_channel_color_mode_item = dynamic_cast<RadioMenuItem*>(&items.back());
_channel_color_mode_item->set_active(_color_mode == TrackColor);
-
+
return mode_menu;
}
-
+
void
MidiTimeAxisView::set_note_mode(NoteMode mode)
{
if (_note_mode != mode || midi_track()->note_mode() != mode) {
_note_mode = mode;
midi_track()->set_note_mode(mode);
+ xml_node->add_property ("note-mode", enum_2_string(_note_mode));
_view->redisplay_diskstream();
}
}
AddMidiCCTrackDialog dialog;
dialog.set_transient_for (_editor);
response = dialog.run();
-
+
if (response == Gtk::RESPONSE_ACCEPT)
param = dialog.parameter();
}
error << "MidiTimeAxisView: unknown automation child "
<< ARDOUR::EventTypeMap::instance().to_symbol(param) << endmsg;
return;
- }
+ }
// create the parameter lane for each selected channel
uint16_t selected_channels = _channel_selector.get_selected_channels();
-
+
for (uint8_t i = 0; i < 16; i++) {
if (selected_channels & (0x0001 << i)) {
Evoral::Parameter param_with_channel(param.type(), i, param.id());
return;
boost::shared_ptr<AutomationControl> c = _route->get_control (param);
-
+
assert(c);
boost::shared_ptr<AutomationTimeAxisView> track(new AutomationTimeAxisView (_session,
true,
parent_canvas,
_route->describe_parameter(param)));
-
+
add_automation_child(param, track, show);
}
} else {
throw; // wha?
-
+
if (_route->active()) {
controls_ebox.set_name ("BusControlsBaseUnselected");
controls_base_selected_name = "BusControlsBaseSelected";
uint32_t size;
incoming.read_prefix (&time, &type, &size);
-
+
if (size > bufsize) {
delete [] buf;
bufsize = size;
}
incoming.read_contents (size, buf);
-
+
if ((buf[0] & 0xf0) == MIDI_CMD_NOTE_ON) {
if (step_edit_region == 0) {
fatal << X_("programming error: no view found for new MIDI region") << endmsg;
/*NOTREACHED*/
}
- }
+ }
if (step_edit_region_view) {
bool success;
Evoral::MusicalTime beats = _editor.get_grid_type_as_beats (success, step_edit_insert_position);
-
+
if (!success) {
continue;
}
-
+
step_edit_region_view->add_note (buf[0] & 0xf, buf[1], buf[2], step_edit_beat_pos, beats);
step_edit_beat_pos += beats;
}
}
-
+
}
}
real_editor->begin_reversible_command (_("create region"));
XMLNode &before = playlist()->get_state();
-
+
nframes64_t start = pos;
real_editor->snap_to (start, -1);
const Meter& m = _session.tempo_map().meter_at(start);
const boost::shared_ptr<MidiDiskstream> diskstream =
boost::dynamic_pointer_cast<MidiDiskstream>(view()->trackview().track()->diskstream());
-
+
boost::shared_ptr<Source> src = _session.create_midi_source_for_session (*diskstream.get());
-
- boost::shared_ptr<Region> region = (RegionFactory::create (src, 0, (nframes_t) length,
+
+ boost::shared_ptr<Region> region = (RegionFactory::create (src, 0, (nframes_t) length,
PBD::basename_nosuffix(src->name())));
playlist()->add_region (region, start);
real_editor->commit_reversible_command();
return region;
-}
+}