diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2010-09-15 18:54:04 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2010-09-15 18:54:04 +0000 |
commit | 084dda86a7c4391aba4e9f37f752af4846ded15d (patch) | |
tree | 067abd6a4ad767958bc3a391c96f5486f8e3462f /gtk2_ardour/note_player.cc | |
parent | 7eea9fac9d23cdb2a6b39c2fbd4b680fafb40a5c (diff) |
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
Diffstat (limited to 'gtk2_ardour/note_player.cc')
-rw-r--r-- | gtk2_ardour/note_player.cc | 60 |
1 files changed, 60 insertions, 0 deletions
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 <sigc++/bind.h> +#include <glibmm/main.h> + +#include "ardour/midi_track.h" +#include "ardour/session.h" + +#include "note_player.h" + +using namespace ARDOUR; +using namespace std; + +NotePlayer::NotePlayer (boost::shared_ptr<MidiTrack> mt) + : track (mt) +{ +} + +void +NotePlayer::add (boost::shared_ptr<NoteType> 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()); + } +} |