X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=inline;f=gtk2_ardour%2Fnote_player.cc;h=cd5c058209b76181fe063af8fff5e2ec158f02cc;hb=2a95d79014c6c7dcef73c8cae083c2e34c7bb811;hp=3c577633b183aeefb063aad60b7231eec1adf1ff;hpb=084dda86a7c4391aba4e9f37f752af4846ded15d;p=ardour.git diff --git a/gtk2_ardour/note_player.cc b/gtk2_ardour/note_player.cc index 3c577633b1..cd5c058209 100644 --- a/gtk2_ardour/note_player.cc +++ b/gtk2_ardour/note_player.cc @@ -1,8 +1,25 @@ +/* + Copyright (C) 2011 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + #include #include #include "ardour/midi_track.h" -#include "ardour/session.h" #include "note_player.h" @@ -10,51 +27,62 @@ using namespace ARDOUR; using namespace std; NotePlayer::NotePlayer (boost::shared_ptr mt) - : track (mt) + : track (mt) { } +NotePlayer::~NotePlayer () +{ + clear (); +} + void NotePlayer::add (boost::shared_ptr note) { - notes.push_back (note); + notes.push_back (note); } void -NotePlayer::play () +NotePlayer::clear () { - Evoral::MusicalTime longest_duration_beats = 0; + off (); + notes.clear (); +} + +void +NotePlayer::on () +{ + for (Notes::iterator n = notes.begin(); n != notes.end(); ++n) { + track->write_immediate_event ((*n)->on_event().size(), (*n)->on_event().buffer()); + } +} - /* note: if there is more than 1 note, we will silence them all at the same time - */ +void +NotePlayer::play () +{ + on (); - 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(); - } - } + /* note: if there is more than 1 note, we will silence them all at the same time + */ - uint32_t note_length_ms = 350; - /* beats_to_frames (longest_duration_beats) - * (1000 / (double)track->session().nominal_frame_rate()); */ + const uint32_t note_length_ms = 100; - Glib::signal_timeout().connect(sigc::bind (sigc::ptr_fun (&NotePlayer::_off), this), - note_length_ms, G_PRIORITY_DEFAULT); + 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; + 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()); - } + for (Notes::iterator n = notes.begin(); n != notes.end(); ++n) { + track->write_immediate_event ((*n)->off_event().size(), (*n)->off_event().buffer()); + } }