From 084dda86a7c4391aba4e9f37f752af4846ded15d Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 15 Sep 2010 18:54:04 +0000 Subject: when there is a chord at the beginning of a note selection, play the whole chord during drags, not just the first note. seems to be able to send a bank swap message - probably an existingbug git-svn-id: svn://localhost/ardour2/branches/3.0@7784 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/note_player.cc | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 gtk2_ardour/note_player.cc (limited to 'gtk2_ardour/note_player.cc') diff --git a/gtk2_ardour/note_player.cc b/gtk2_ardour/note_player.cc new file mode 100644 index 0000000000..3c577633b1 --- /dev/null +++ b/gtk2_ardour/note_player.cc @@ -0,0 +1,60 @@ +#include +#include + +#include "ardour/midi_track.h" +#include "ardour/session.h" + +#include "note_player.h" + +using namespace ARDOUR; +using namespace std; + +NotePlayer::NotePlayer (boost::shared_ptr mt) + : track (mt) +{ +} + +void +NotePlayer::add (boost::shared_ptr note) +{ + notes.push_back (note); +} + +void +NotePlayer::play () +{ + Evoral::MusicalTime longest_duration_beats = 0; + + /* note: if there is more than 1 note, we will silence them all at the same time + */ + + for (NoteList::iterator n = notes.begin(); n != notes.end(); ++n) { + track->write_immediate_event ((*n)->on_event().size(), (*n)->on_event().buffer()); + if ((*n)->length() > longest_duration_beats) { + longest_duration_beats = (*n)->length(); + } + } + + uint32_t note_length_ms = 350; + /* beats_to_frames (longest_duration_beats) + * (1000 / (double)track->session().nominal_frame_rate()); */ + + Glib::signal_timeout().connect(sigc::bind (sigc::ptr_fun (&NotePlayer::_off), this), + note_length_ms, G_PRIORITY_DEFAULT); +} + +bool +NotePlayer::_off (NotePlayer* np) +{ + np->off (); + delete np; + return false; +} + +void +NotePlayer::off () +{ + for (NoteList::iterator n = notes.begin(); n != notes.end(); ++n) { + track->write_immediate_event((*n)->off_event().size(), (*n)->off_event().buffer()); + } +} -- cgit v1.2.3