summaryrefslogtreecommitdiff
path: root/muse2/muse/eventlist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'muse2/muse/eventlist.cpp')
-rw-r--r--muse2/muse/eventlist.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/muse2/muse/eventlist.cpp b/muse2/muse/eventlist.cpp
new file mode 100644
index 00000000..23fffc8c
--- /dev/null
+++ b/muse2/muse/eventlist.cpp
@@ -0,0 +1,112 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: eventlist.cpp,v 1.7.2.3 2009/11/05 03:14:35 terminator356 Exp $
+//
+// (C) Copyright 2000-2003 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "tempo.h"
+#include "event.h"
+#include "xml.h"
+
+//---------------------------------------------------------
+// readEventList
+//---------------------------------------------------------
+
+void EventList::read(Xml& xml, const char* name, bool midi)
+ {
+ for (;;) {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+ case Xml::TagStart:
+ if (tag == "event") {
+ Event e(midi ? Note : Wave);
+ e.read(xml);
+ add(e);
+ }
+ else
+ xml.unknown("readEventList");
+ break;
+ case Xml::TagEnd:
+ if (tag == name)
+ return;
+ default:
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// add
+//---------------------------------------------------------
+
+iEvent EventList::add(Event& event)
+ {
+ // Added by T356. An event list containing wave events should be sorted by
+ // frames. WaveTrack::fetchData() relies on the sorting order, and
+ // there was a bug that waveparts were sometimes muted because of
+ // incorrect sorting order (by ticks).
+ // Also, when the tempo map is changed, every wave event would have to be
+ // re-added to the event list so that the proper sorting order (by ticks)
+ // could be achieved.
+ // Note that in a med file, the tempo list is loaded AFTER all the tracks.
+ // There was a bug that all the wave events' tick values were not correct,
+ // since they were computed BEFORE the tempo map was loaded.
+ if(event.type() == Wave)
+ return std::multimap<unsigned, Event, std::less<unsigned> >::insert(std::pair<const unsigned, Event> (event.frame(), event));
+ else
+
+ return std::multimap<unsigned, Event, std::less<unsigned> >::insert(std::pair<const unsigned, Event> (event.tick(), event));
+ }
+
+//---------------------------------------------------------
+// move
+//---------------------------------------------------------
+
+void EventList::move(Event& event, unsigned tick)
+ {
+ iEvent i = find(event);
+ erase(i);
+
+ // Added by T356.
+ if(event.type() == Wave)
+ std::multimap<unsigned, Event, std::less<unsigned> >::insert(std::pair<const unsigned, Event> (tempomap.tick2frame(tick), event));
+ else
+
+ std::multimap<unsigned, Event, std::less<unsigned> >::insert(std::pair<const unsigned, Event> (tick, event));
+ }
+
+//---------------------------------------------------------
+// find
+//---------------------------------------------------------
+
+iEvent EventList::find(const Event& event)
+ {
+ // Changed by T356.
+ // Changed by Tim. p3.3.8
+ //EventRange range = equal_range(event.tick());
+ EventRange range = equal_range(event.type() == Wave ? event.frame() : event.tick());
+
+
+ for (iEvent i = range.first; i != range.second; ++i) {
+ if (i->second == event)
+ return i;
+ }
+ return end();
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void EventList::dump() const
+ {
+ for (ciEvent i = begin(); i != end(); ++i)
+ i->second.dump();
+ }
+