* first prototype implementation of playing back MIDI notes when selected
git-svn-id: svn://localhost/ardour2/branches/3.0@4348 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
c3636a8c61
commit
be75d43bd0
@ -3248,11 +3248,6 @@ Editor::midi_panic_button_pressed ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::midi_sound_notes_toggled ()
|
|
||||||
{
|
|
||||||
cerr << "toggle sound notes" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::setup_midi_toolbar ()
|
Editor::setup_midi_toolbar ()
|
||||||
{
|
{
|
||||||
@ -3317,8 +3312,6 @@ Editor::setup_midi_toolbar ()
|
|||||||
midi_sound_notes.set_relief(Gtk::RELIEF_NONE);
|
midi_sound_notes.set_relief(Gtk::RELIEF_NONE);
|
||||||
ARDOUR_UI::instance()->tooltips().set_tip (midi_sound_notes, _("Sound Notes"));
|
ARDOUR_UI::instance()->tooltips().set_tip (midi_sound_notes, _("Sound Notes"));
|
||||||
midi_sound_notes.unset_flags (CAN_FOCUS);
|
midi_sound_notes.unset_flags (CAN_FOCUS);
|
||||||
midi_sound_notes.signal_toggled().connect (mem_fun(*this,
|
|
||||||
&Editor::midi_sound_notes_toggled));
|
|
||||||
|
|
||||||
/* Panic */
|
/* Panic */
|
||||||
|
|
||||||
|
@ -1754,7 +1754,7 @@ public:
|
|||||||
GroupedButtons *midi_tool_button_set;
|
GroupedButtons *midi_tool_button_set;
|
||||||
void midi_edit_mode_toggled (Editing::MidiEditMode m);
|
void midi_edit_mode_toggled (Editing::MidiEditMode m);
|
||||||
void midi_panic_button_pressed ();
|
void midi_panic_button_pressed ();
|
||||||
void midi_sound_notes_toggled();
|
bool is_midi_sound_notes_active () const { return midi_sound_notes.get_active(); }
|
||||||
|
|
||||||
bool ignore_midi_edit_mode_toggle;
|
bool ignore_midi_edit_mode_toggle;
|
||||||
|
|
||||||
|
@ -887,6 +887,36 @@ MidiRegionView::extend_active_notes()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MidiRegionView::play_midi_note(boost::shared_ptr<Evoral::Note> note)
|
||||||
|
{
|
||||||
|
if (!trackview.editor.is_midi_sound_notes_active()) {
|
||||||
|
cerr << "not_active " << endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RouteUI* route_ui = dynamic_cast<RouteUI*> (&trackview);
|
||||||
|
assert(route_ui);
|
||||||
|
|
||||||
|
route_ui->midi_track()->write_immediate_event(note->on_event().size(), note->on_event().buffer());
|
||||||
|
|
||||||
|
Glib::Thread::create(bind(mem_fun(this, &MidiRegionView::play_midi_note_off), note), false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MidiRegionView::play_midi_note_off(boost::shared_ptr<Evoral::Note> note)
|
||||||
|
{
|
||||||
|
RouteUI* route_ui = dynamic_cast<RouteUI*> (&trackview);
|
||||||
|
assert(route_ui);
|
||||||
|
|
||||||
|
Glib::usleep(
|
||||||
|
(note->off_event().time() - note->on_event().time()) *
|
||||||
|
(1000000 / route_ui->session().nominal_frame_rate())
|
||||||
|
);
|
||||||
|
route_ui->midi_track()->write_immediate_event(note->off_event().size(), note->off_event().buffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Add a MIDI note to the view (with length).
|
/** Add a MIDI note to the view (with length).
|
||||||
*
|
*
|
||||||
@ -1181,6 +1211,7 @@ MidiRegionView::note_selected(ArdourCanvas::CanvasNoteEvent* ev, bool add)
|
|||||||
}
|
}
|
||||||
|
|
||||||
_selection.insert(ev);
|
_selection.insert(ev);
|
||||||
|
play_midi_note(ev->note());
|
||||||
|
|
||||||
if ( ! ev->selected()) {
|
if ( ! ev->selected()) {
|
||||||
ev->selected(true);
|
ev->selected(true);
|
||||||
|
@ -261,7 +261,15 @@ class MidiRegionView : public RegionView
|
|||||||
void reset_width_dependent_items (double pixel_width);
|
void reset_width_dependent_items (double pixel_width);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/** play back the given MIDI note immediately
|
||||||
|
*/
|
||||||
|
void play_midi_note(boost::shared_ptr<Evoral::Note> note);
|
||||||
|
|
||||||
|
/** play back the NoteOff-Event of the given note (used by
|
||||||
|
* @ref play_midi_note() ) after waiting the duration of the MIDI Note
|
||||||
|
*/
|
||||||
|
void play_midi_note_off(boost::shared_ptr<Evoral::Note> note);
|
||||||
|
|
||||||
void clear_events();
|
void clear_events();
|
||||||
void switch_source(boost::shared_ptr<ARDOUR::Source> src);
|
void switch_source(boost::shared_ptr<ARDOUR::Source> src);
|
||||||
|
|
||||||
|
@ -160,6 +160,10 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway
|
|||||||
* (defined in editing_syms.h)
|
* (defined in editing_syms.h)
|
||||||
*/
|
*/
|
||||||
virtual Editing::MidiEditMode current_midi_edit_mode () const = 0;
|
virtual Editing::MidiEditMode current_midi_edit_mode () const = 0;
|
||||||
|
|
||||||
|
/** @return Sound edited notes in MIDI regions while editing
|
||||||
|
*/
|
||||||
|
virtual bool is_midi_sound_notes_active () const = 0;
|
||||||
|
|
||||||
/** Possibly start the audition of a region. If \ref r is 0, or not an AudioRegion
|
/** Possibly start the audition of a region. If \ref r is 0, or not an AudioRegion
|
||||||
* any current audition is cancelled. If we are currently auditioning \ref r,
|
* any current audition is cancelled. If we are currently auditioning \ref r,
|
||||||
|
@ -726,11 +726,11 @@ MidiTrack::midi_panic()
|
|||||||
bool
|
bool
|
||||||
MidiTrack::write_immediate_event(size_t size, const uint8_t* buf)
|
MidiTrack::write_immediate_event(size_t size, const uint8_t* buf)
|
||||||
{
|
{
|
||||||
/*printf("Write immediate event: ");
|
printf("Write immediate event: ");
|
||||||
for (size_t i=0; i < size; ++i) {
|
for (size_t i=0; i < size; ++i) {
|
||||||
printf("%X ", buf[i]);
|
printf("%X ", buf[i]);
|
||||||
}
|
}
|
||||||
printf("\n");*/
|
printf("\n");
|
||||||
const uint32_t type = EventTypeMap::instance().midi_event_type(buf[0]);
|
const uint32_t type = EventTypeMap::instance().midi_event_type(buf[0]);
|
||||||
return (_immediate_events.write(0, type, size, buf) == size);
|
return (_immediate_events.write(0, type, size, buf) == size);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user