From 4180158dc9b12c1b38d7116f2c584244c506688d Mon Sep 17 00:00:00 2001 From: petern Date: Fri, 24 Jul 2009 07:19:13 +0000 Subject: [PATCH] -Fix: When quantising, remove all notes after the end of the loop. -Fix: Use notecache based on loop events to add note-offs, else some could possibly be missed. git-svn-id: http://svn.fuzzle.org/mloop/trunk@31 ba049829-c6ef-42ef-81ac-908dd8d2e907 --- src/jack.cpp | 2 +- src/loop.cpp | 20 ++++++++++++++++++++ src/loop.h | 2 ++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/jack.cpp b/src/jack.cpp index 11961d5..3b644d6 100644 --- a/src/jack.cpp +++ b/src/jack.cpp @@ -144,7 +144,7 @@ void Jack::ToggleRecording(int loop, int bpm, bool delay) m_loops[m_recording_loop].SetLength(m_recording_time); m_loops[m_recording_loop].SetState(LS_IDLE); - m_loops[m_recording_loop].EndFromNoteCache(m_notecache); + m_loops[m_recording_loop].Finalise(); } else { if (m_loops[loop].State() == LS_IDLE) { m_recording_loop = loop; diff --git a/src/loop.cpp b/src/loop.cpp index 327bd88..ebf8911 100644 --- a/src/loop.cpp +++ b/src/loop.cpp @@ -134,6 +134,26 @@ void Loop::EndFromNoteCache(NoteCache &cache) } } +void Loop::Finalise() +{ + NoteCache nc; + + /* Remove all events after the end of the loop. */ + EventList::iterator it; + for (it = m_events.begin(); it != m_events.end();) { + jack_midi_event_t &ev = *it; + if (ev.time < m_length) { + nc.HandleEvent(ev); + ++it; + } else { + it = m_events.erase(it); + } + } + + /* Now make sure no notes are left on. */ + EndFromNoteCache(nc); +} + void Loop::Empty() { if (m_state != LS_IDLE) return; diff --git a/src/loop.h b/src/loop.h index b2d0777..fe1392d 100644 --- a/src/loop.h +++ b/src/loop.h @@ -81,6 +81,8 @@ public: return m_loop; } + void Finalise(); + void Save(FILE *f) const; };