summaryrefslogtreecommitdiff
path: root/attic/muse2-oom/muse2/muse/pos.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'attic/muse2-oom/muse2/muse/pos.cpp')
-rw-r--r--attic/muse2-oom/muse2/muse/pos.cpp568
1 files changed, 568 insertions, 0 deletions
diff --git a/attic/muse2-oom/muse2/muse/pos.cpp b/attic/muse2-oom/muse2/muse/pos.cpp
new file mode 100644
index 00000000..5a86673d
--- /dev/null
+++ b/attic/muse2-oom/muse2/muse/pos.cpp
@@ -0,0 +1,568 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: pos.cpp,v 1.11.2.1 2006/09/19 19:07:08 spamatica Exp $
+//
+// (C) Copyright 2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include <cmath>
+
+#include "pos.h"
+#include "xml.h"
+#include "tempo.h"
+#include "globals.h"
+///#include "sig.h"
+#include "al/sig.h"
+
+extern int mtcType;
+
+//---------------------------------------------------------
+// Pos
+//---------------------------------------------------------
+
+Pos::Pos()
+ {
+ _type = TICKS;
+ _tick = 0;
+ _frame = 0;
+ sn = -1;
+ }
+
+Pos::Pos(const Pos& p)
+ {
+ _type = p._type;
+ sn = p.sn;
+ _tick = p._tick;
+ _frame = p._frame;
+ }
+
+Pos::Pos(unsigned t, bool ticks)
+ {
+ if (ticks) {
+ _type = TICKS;
+ _tick = t;
+ }
+ else {
+ _type = FRAMES;
+ _frame = t;
+ }
+ sn = -1;
+ }
+
+Pos::Pos(const QString& s)
+ {
+ int m, b, t;
+ sscanf(s.toLatin1(), "%04d.%02d.%03d", &m, &b, &t);
+ _tick = AL::sigmap.bar2tick(m, b, t);
+ _type = TICKS;
+ sn = -1;
+ }
+
+Pos::Pos(int measure, int beat, int tick)
+ {
+ _tick = AL::sigmap.bar2tick(measure, beat, tick);
+ _type = TICKS;
+ sn = -1;
+ }
+
+Pos::Pos(int min, int sec, int frame, int subframe)
+ {
+ double time = min * 60.0 + sec;
+
+ double f = frame + subframe/100.0;
+ switch(mtcType) {
+ case 0: // 24 frames sec
+ time += f * 1.0/24.0;
+ break;
+ case 1: // 25
+ time += f * 1.0/25.0;
+ break;
+ case 2: // 30 drop frame
+ time += f * 1.0/30.0;
+ break;
+ case 3: // 30 non drop frame
+ time += f * 1.0/30.0;
+ break;
+ }
+ _type = FRAMES;
+ _frame = lrint(time * sampleRate);
+ sn = -1;
+ }
+
+//---------------------------------------------------------
+// setType
+//---------------------------------------------------------
+
+void Pos::setType(TType t)
+ {
+ if (t == _type)
+ return;
+
+ if (_type == TICKS) {
+ // convert from ticks to frames
+ _frame = tempomap.tick2frame(_tick, _frame, &sn);
+ }
+ else {
+ // convert from frames to ticks
+ _tick = tempomap.frame2tick(_frame, _tick, &sn);
+ }
+ _type = t;
+ }
+
+//---------------------------------------------------------
+// operator+=
+//---------------------------------------------------------
+
+Pos& Pos::operator+=(Pos a)
+ {
+ switch(_type) {
+ case FRAMES:
+ _frame += a.frame();
+ break;
+ case TICKS:
+ _tick += a.tick();
+ break;
+ }
+ sn = -1; // invalidate cached values
+ return *this;
+ }
+
+//---------------------------------------------------------
+// operator+=
+//---------------------------------------------------------
+
+Pos& Pos::operator+=(int a)
+ {
+ switch(_type) {
+ case FRAMES:
+ _frame += a;
+ break;
+ case TICKS:
+ _tick += a;
+ break;
+ }
+ sn = -1; // invalidate cached values
+ return *this;
+ }
+
+Pos operator+(Pos a, int b)
+ {
+ Pos c;
+ c.setType(a.type());
+ return c += b;
+ }
+
+Pos operator+(Pos a, Pos b)
+ {
+ Pos c = a;
+ return c += b;
+ }
+
+bool Pos::operator>=(const Pos& s) const
+ {
+ if (_type == FRAMES)
+ return _frame >= s.frame();
+ else
+ return _tick >= s.tick();
+ }
+
+bool Pos::operator>(const Pos& s) const
+ {
+ if (_type == FRAMES)
+ return _frame > s.frame();
+ else
+ return _tick > s.tick();
+ }
+
+bool Pos::operator<(const Pos& s) const
+ {
+ if (_type == FRAMES)
+ return _frame < s.frame();
+ else
+ return _tick < s.tick();
+ }
+
+bool Pos::operator<=(const Pos& s) const
+ {
+ if (_type == FRAMES)
+ return _frame <= s.frame();
+ else
+ return _tick <= s.tick();
+ }
+
+bool Pos::operator==(const Pos& s) const
+ {
+ if (_type == FRAMES)
+ return _frame == s.frame();
+ else
+ return _tick == s.tick();
+ }
+
+//---------------------------------------------------------
+// tick
+//---------------------------------------------------------
+
+unsigned Pos::tick() const
+ {
+ if (_type == FRAMES)
+ _tick = tempomap.frame2tick(_frame, _tick, &sn);
+ return _tick;
+ }
+
+//---------------------------------------------------------
+// frame
+//---------------------------------------------------------
+
+unsigned Pos::frame() const
+ {
+ if (_type == TICKS)
+ _frame = tempomap.tick2frame(_tick, _frame, &sn);
+ return _frame;
+ }
+
+//---------------------------------------------------------
+// setTick
+//---------------------------------------------------------
+
+void Pos::setTick(unsigned pos)
+ {
+ _tick = pos;
+ sn = -1;
+ if (_type == FRAMES)
+ _frame = tempomap.tick2frame(pos, &sn);
+ }
+
+//---------------------------------------------------------
+// setFrame
+//---------------------------------------------------------
+
+void Pos::setFrame(unsigned pos)
+ {
+ _frame = pos;
+ sn = -1;
+ if (_type == TICKS)
+ _tick = tempomap.frame2tick(pos, &sn);
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void Pos::write(int level, Xml& xml, const char* name) const
+ {
+ xml.nput(level++, "<%s ", name);
+
+ switch(_type) {
+ case TICKS:
+ xml.nput("tick=\"%d\"", _tick);
+ break;
+ case FRAMES:
+ xml.nput("frame=\"%d\"", _frame);
+ break;
+ }
+ xml.put(" />", name);
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void Pos::read(Xml& xml, const char* name)
+ {
+ sn = -1;
+ for (;;) {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+
+ case Xml::TagStart:
+ xml.unknown(name);
+ break;
+
+ case Xml::Attribut:
+ if (tag == "tick") {
+ _tick = xml.s2().toInt();
+ _type = TICKS;
+ }
+ else if (tag == "frame") {
+ _frame = xml.s2().toInt();
+ _type = FRAMES;
+ }
+ else if (tag == "sample") { // obsolete
+ _frame = xml.s2().toInt();
+ _type = FRAMES;
+ }
+ else
+ xml.unknown(name);
+ break;
+
+ case Xml::TagEnd:
+ if (tag == name)
+ return;
+ default:
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// PosLen
+//---------------------------------------------------------
+
+PosLen::PosLen()
+ {
+ _lenTick = 0;
+ _lenFrame = 0;
+ sn = -1;
+ }
+
+PosLen::PosLen(const PosLen& p)
+ : Pos(p)
+ {
+ _lenTick = p._lenTick;
+ _lenFrame = p._lenFrame;
+ sn = -1;
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void PosLen::dump(int n) const
+ {
+ Pos::dump(n);
+ printf(" Len(");
+ switch(type()) {
+ case FRAMES:
+ printf("samples=%d)\n", _lenFrame);
+ break;
+ case TICKS:
+ printf("ticks=%d)\n", _lenTick);
+ break;
+ }
+ }
+
+void Pos::dump(int /*n*/) const
+ {
+ printf("Pos(%s, sn=%d, ", type() == FRAMES ? "Frames" : "Ticks", sn);
+ switch(type()) {
+ case FRAMES:
+ printf("samples=%d)", _frame);
+ break;
+ case TICKS:
+ printf("ticks=%d)", _tick);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void PosLen::write(int level, Xml& xml, const char* name) const
+ {
+ xml.nput(level++, "<%s ", name);
+
+ switch(type()) {
+ case TICKS:
+ xml.nput("tick=\"%d\" len=\"%d\"", tick(), _lenTick);
+ break;
+ case FRAMES:
+ xml.nput("sample=\"%d\" len=\"%d\"", frame(), _lenFrame);
+ break;
+ }
+ xml.put(" />", name);
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void PosLen::read(Xml& xml, const char* name)
+ {
+ sn = -1;
+ for (;;) {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+ switch (token) {
+ case Xml::Error:
+ case Xml::End:
+ return;
+
+ case Xml::TagStart:
+ xml.unknown(name);
+ break;
+
+ case Xml::Attribut:
+ if (tag == "tick") {
+ setType(TICKS);
+ setTick(xml.s2().toInt());
+ }
+ else if (tag == "sample") {
+ setType(FRAMES);
+ setFrame(xml.s2().toInt());
+ }
+ else if (tag == "len") {
+ int n = xml.s2().toInt();
+ switch(type()) {
+ case TICKS:
+ setLenTick(n);
+ break;
+ case FRAMES:
+ setLenFrame(n);
+ break;
+ }
+ }
+ else
+ xml.unknown(name);
+ break;
+
+ case Xml::TagEnd:
+ if (tag == name)
+ return;
+ default:
+ break;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// setLenTick
+//---------------------------------------------------------
+
+void PosLen::setLenTick(unsigned len)
+ {
+ _lenTick = len;
+ sn = -1;
+// if (type() == FRAMES)
+ _lenFrame = tempomap.deltaTick2frame(tick(), tick() + len, &sn);
+ }
+
+//---------------------------------------------------------
+// setLenFrame
+//---------------------------------------------------------
+
+void PosLen::setLenFrame(unsigned len)
+ {
+ _lenFrame = len;
+ sn = -1;
+// if (type() == TICKS)
+ _lenTick = tempomap.deltaFrame2tick(frame(), frame() + len, &sn);
+ }
+
+//---------------------------------------------------------
+// lenTick
+//---------------------------------------------------------
+
+unsigned PosLen::lenTick() const
+ {
+ if (type() == FRAMES)
+ _lenTick = tempomap.deltaFrame2tick(frame(), frame() + _lenFrame, &sn);
+ return _lenTick;
+ }
+
+//---------------------------------------------------------
+// lenFrame
+//---------------------------------------------------------
+
+unsigned PosLen::lenFrame() const
+ {
+ if (type() == TICKS)
+ _lenFrame = tempomap.deltaTick2frame(tick(), tick() + _lenTick, &sn);
+ return _lenFrame;
+ }
+
+//---------------------------------------------------------
+// end
+//---------------------------------------------------------
+
+Pos PosLen::end() const
+ {
+ Pos pos(*this);
+ pos.invalidSn();
+ switch(type()) {
+ case FRAMES:
+ pos.setFrame(pos.frame() + _lenFrame);
+ break;
+ case TICKS:
+ pos.setTick(pos.tick() + _lenTick);
+ break;
+ }
+ return pos;
+ }
+
+//---------------------------------------------------------
+// setPos
+//---------------------------------------------------------
+
+void PosLen::setPos(const Pos& pos)
+ {
+ switch(pos.type()) {
+ case FRAMES:
+ setFrame(pos.frame());
+ break;
+ case TICKS:
+ setTick(pos.tick());
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// mbt
+//---------------------------------------------------------
+
+void Pos::mbt(int* bar, int* beat, int* tk) const
+ {
+ AL::sigmap.tickValues(tick(), bar, beat, (unsigned*)tk);
+ }
+
+//---------------------------------------------------------
+// msf
+//---------------------------------------------------------
+
+void Pos::msf(int* min, int* sec, int* fr, int* subFrame) const
+ {
+ double time = double(frame()) / double(sampleRate);
+ *min = int(time) / 60;
+ *sec = int(time) % 60;
+ double rest = time - (*min * 60 + *sec);
+ switch(mtcType) {
+ case 0: // 24 frames sec
+ rest *= 24;
+ break;
+ case 1: // 25
+ rest *= 25;
+ break;
+ case 2: // 30 drop frame
+ rest *= 30;
+ break;
+ case 3: // 30 non drop frame
+ rest *= 30;
+ break;
+ }
+ *fr = int(rest);
+ *subFrame = int((rest- *fr)*100);
+ }
+
+//---------------------------------------------------------
+// isValid
+//---------------------------------------------------------
+
+bool Pos::isValid(int,int,int)
+ {
+ return true;
+ }
+
+//---------------------------------------------------------
+// isValid
+//---------------------------------------------------------
+
+bool Pos::isValid(int,int,int,int)
+ {
+ return true;
+ }
+