diff options
Diffstat (limited to 'muse_qt4_evolution/muse/songfile.cpp')
| -rw-r--r-- | muse_qt4_evolution/muse/songfile.cpp | 489 | 
1 files changed, 489 insertions, 0 deletions
| diff --git a/muse_qt4_evolution/muse/songfile.cpp b/muse_qt4_evolution/muse/songfile.cpp new file mode 100644 index 00000000..ff89e41e --- /dev/null +++ b/muse_qt4_evolution/muse/songfile.cpp @@ -0,0 +1,489 @@ +//============================================================================= +//  MusE +//  Linux Music Editor +//  $Id:$ +// +//  Copyright (C) 2002-2006 by Werner Schweer and others +// +//  This program is free software; you can redistribute it and/or modify +//  it under the terms of the GNU General Public License version 2. +// +//  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 "muse.h" +#include "song.h" +#include "arranger.h" +#include "al/al.h" +#include "al/xml.h" +#include "midiedit/drummap.h" +#include "al/marker.h" +#include "midictrl.h" +#include "conf.h" +#include "al/tempo.h" +#include "al/sig.h" +#include "synth.h" +#include "waveedit/waveedit.h" +#include "master/masteredit.h" +#include "midiedit/drumedit.h" +#include "midiedit/pianoroll.h" +#include "part.h" +#include "marker/markerview.h" +#include "liste/listedit.h" + +using namespace AL; + +//--------------------------------------------------------- +//   readPart +//--------------------------------------------------------- + +Part* MusE::readPart(QDomNode node) +      { +      QDomElement e = node.toElement(); +      Part* part = 0; +      QString s = e.text(); +      int trackIdx; +      int partIdx; +      sscanf(s.toLatin1().data(), "%d:%d", &trackIdx, &partIdx); +      TrackList* tl = song->tracks(); +      Track* track = song->tracks()->value(trackIdx); +      if (track) { +            part = track->parts()->find(partIdx); +            if (part == 0) { +                  printf("MusE::readPart(): part %d(%d)  not found in track <%s>\n", +                     partIdx, track->parts()->size(), track->name().toLatin1().data()); +                  } +            } +      else { +            printf("MusE::readPart(): trackIdx >= tl->size %d > %d\n", +               trackIdx , tl->size()); +            } +      return part; +      } + +//--------------------------------------------------------- +//   readToplevels +//--------------------------------------------------------- + +void MusE::readToplevels(QDomNode node) +      { +      PartList* pl = new PartList; + +      for (;!node.isNull(); node = node.nextSibling()) { +            QDomElement e = node.toElement(); +            QString tag(e.tagName()); +            if (tag == "part") { +                  Part* part = readPart(node); +                  if (part) +                        pl->add(part); +                  else +                        printf("part not found\n"); +                  } +            else if (tag == "PianoRoll") { +                  PianoRoll* pianoroll = new PianoRoll(pl, true); +//                  connect(muse, SIGNAL(configChanged()), pianoroll, SLOT(configChanged())); +                  pianoroll->read(node); +                  pianoroll->show(); +                  pl = new PartList; +                  } +            else if (tag == "DrumEdit") { +                  DrumEdit* drumEditor = new DrumEdit(pl, true); +//                  connect(muse, SIGNAL(configChanged()), drumEditor, SLOT(configChanged())); +                  drumEditor->read(node); +                  drumEditor->show(); +                  pl = new PartList; +                  } +            else if (tag == "ListEdit") { +                  listEditor = new ListEdit(0); +                  listEditor->show(); +                  listEditor->read(node); +                  } +            else if (tag == "MasterEdit") { +                  MasterEdit* masterEditor = new MasterEdit(); +                  masterEditor->show(); +                  masterEditor->read(node); +                  } +            else if (tag == "MarkerView") { +                  showMarker(true); +                  markerView->read(node); +                  } +            else if (tag == "WaveEdit") { +                  WaveEdit* waveEditor = new WaveEdit(pl, true); +                  waveEditor->read(node); +                  waveEditor->show(); +                  connect(muse, SIGNAL(configChanged()), waveEditor, SLOT(configChanged())); +                  pl = new PartList; +                  } +            else +                  printf("MusE:readToplevels: unknown tag <%s>\n", e.tagName().toLatin1().data()); +            } +      delete pl; +      } + +//--------------------------------------------------------- +//   readMarker +//--------------------------------------------------------- + +void Song::readMarker(QDomNode node) +      { +      AL::Marker m; +      m.read(node); +      _markerList->add(m); +      } + +//--------------------------------------------------------- +//   read +//--------------------------------------------------------- + +void Song::read(QDomNode node) +      { +      cloneList.clear(); +      for (; !node.isNull(); node = node.nextSibling()) { +            QDomElement e = node.toElement(); +            QString tag(e.tagName()); +            int i = e.text().toInt(); +            if (tag == "configuration") +                  ; // readConfiguration(node.firstChild()); +            else if (tag == "master") +                  setMasterFlag(i); +            else if (tag == "loop") +                  setLoop(i); +            else if (tag == "punchin") +                  setPunchin(i); +            else if (tag == "punchout") +                  setPunchout(i); +            else if (tag == "record") +                  ;	// setRecord(i); +            else if (tag == "solo") +                  soloFlag = i; +            else if (tag == "recmode") +                  _recMode = i; +            else if (tag == "cycle") +                  _cycleMode = i; +            else if (tag == "click") +                  setClick(i); +            else if (tag == "quantize") +                  _quantize = i; +            else if (tag == "len") +                  _len = i; +            else if (tag == "tempolist") +                  AL::tempomap.read(node); +            else if (tag == "siglist") +                  AL::sigmap.read(node.firstChild()); +            else if (tag == "miditrack") { +                  MidiTrack* track = new MidiTrack(); +                  track->read(node.firstChild()); +                  insertTrack0(track, -1); +                  } +            else if (tag == "drumtrack") { +                  MidiTrack* track = new MidiTrack(); +                  //TODO track->setUseDrumMap(true); +                  track->read(node.firstChild()); +                  insertTrack0(track, -1); +                  } +            else if (tag == "wavetrack") { +                  WaveTrack* track = new WaveTrack(); +                  track->read(node.firstChild()); +                  insertTrack0(track, -1); +                  } +            else if (tag == "AudioInput") { +                  AudioInput* track = new AudioInput(); +                  track->read(node.firstChild()); +                  insertTrack0(track,-1); +                  } +            else if (tag == "AudioOutput") { +                  AudioOutput* track = new AudioOutput(); +                  track->read(node.firstChild()); +                  insertTrack0(track,-1); +                  } +            else if (tag == "AudioGroup") { +                  AudioGroup* track = new AudioGroup(); +                  track->read(node.firstChild()); +                  insertTrack0(track,-1); +                  } +            else if (tag == "SynthI") { +                  SynthI* track = new SynthI(); +                  track->read(node.firstChild()); +                  // insertTrack(track, -1); +                  } +            else if (tag == "MidiOutPort") { +                  MidiOutPort* track = new MidiOutPort(); +                  track->read(node.firstChild()); +                  insertTrack0(track, -1); +                  } +            else if (tag == "MidiInPort") { +                  MidiInPort* track = new MidiInPort(); +                  track->read(node.firstChild()); +                  insertTrack0(track, -1); +                  } +            else if (tag == "MidiSynti") { +                  MidiSynti* track = new MidiSynti(); +                  track->read(node.firstChild()); +                  // insertTrack0(track, -1); +                  } +            else if (tag == "arranger") +                  muse->arranger->readStatus(node.firstChild()); +            else if (tag == "Route") +                  readRoute(node); +            else if (tag == "marker") +                  readMarker(node); +            else if (tag == "globalPitchShift") +                  _globalPitchShift = i; +            else if (tag == "cpos") { +                  int pos = i; +                  Pos p(pos, AL::TICKS); +                  setPos(Song::CPOS, p, false, false, false); +                  } +            else if (tag == "lpos") { +                  int pos = i; +                  Pos p(pos, AL::TICKS); +                  setPos(Song::LPOS, p, false, false, false); +                  } +            else if (tag == "rpos") { +                  int pos = i; +                  Pos p(pos, AL::TICKS); +                  setPos(Song::RPOS, p, false, false, false); +                  } +            else if (tag == "Pianoroll") +                  PianoRoll::readConfiguration(node); +            else if (tag == "DrumEdit") +                  DrumEdit::readConfiguration(node); +            else if (tag == "comment") +                  _comment = e.text(); +            else if (tag == "createDate") +                  _createDate = QDateTime::fromString(e.text(), Qt::ISODate); +            else if (tag == "LenInSec") +                  ; +            else +                  printf("MusE:Song: unknown tag %s\n", tag.toLatin1().data()); +            } +      dirty = false; +      } + +//--------------------------------------------------------- +//   write +//--------------------------------------------------------- + +void Song::write(Xml& xml) const +      { +      xml.stag("song"); +      xml.tag("comment", _comment); +      xml.tag("createDate", _createDate.toString(Qt::ISODate)); +      int n = AL::tempomap.tick2frame(_len); +      xml.tag("LenInSec", n / AL::sampleRate); + +      xml.tag("cpos", cpos()); +      xml.tag("rpos", rpos()); +      xml.tag("lpos", lpos()); +      xml.tag("master", _masterFlag); +      if (loopFlag) +            xml.tag("loop", loopFlag); +      if (punchinFlag) +            xml.tag("punchin", punchinFlag); +      if (punchoutFlag) +            xml.tag("punchout", punchoutFlag); +      if (soloFlag) +            xml.tag("solo", soloFlag); +      if (_recMode != REC_OVERDUP) +            xml.tag("recmode", _recMode); +      if (_cycleMode != CYCLE_NORMAL) +            xml.tag("cycle", _cycleMode); +      if (_click) +            xml.tag("click", _click); +      if (_quantize) +            xml.tag("quantize", _quantize); +      xml.tag("len", _len); + +      if (_globalPitchShift) +            xml.tag("globalPitchShift", _globalPitchShift); + +      cloneList.clear(); + +      // write tracks +      for (ciTrack i = _tracks.begin(); i != _tracks.end(); ++i) +            (*i)->write(xml); + +      // write routing +      for (ciTrack i = _tracks.begin(); i != _tracks.end(); ++i) +            (*i)->writeRouting(xml); +      muse->arranger->writeStatus(xml); + +      AL::tempomap.write(xml); +      AL::sigmap.write(xml); +      _markerList->write(xml); + +      xml.etag("song"); +      } + +//--------------------------------------------------------- +//   write +//    write song +//--------------------------------------------------------- + +void MusE::write(Xml& xml) const +      { +      xml.header(); + +      xml.stag("muse version=\"3.0\""); +      writeConfiguration(xml); + +      song->write(xml); + +      xml.stag("toplevels"); +      foreach(QWidget* w, QApplication::topLevelWidgets()) { +            if (!w->isVisible()) +                  continue; +            if (strcmp("DrumEdit", w->metaObject()->className()) == 0) +                  ((TopWin*)w)->write(xml); +            else if (strcmp("PianoRoll", w->metaObject()->className()) == 0) +                  ((TopWin*)w)->write(xml); +            else if (strcmp("MasterEdit", w->metaObject()->className()) == 0) +                  ((TopWin*)w)->write(xml); +            else if (strcmp("WaveEdit", w->metaObject()->className()) == 0) +                  ((TopWin*)w)->write(xml); +            else if (strcmp("ListEdit", w->metaObject()->className()) == 0) +                  ((TopWin*)w)->write(xml); +            else if (strcmp("MarkerView", w->metaObject()->className()) == 0) +                  ((TopWin*)w)->write(xml); +            else if (strcmp("Mixer", w->metaObject()->className()) == 0) +                  ; +            else if (strcmp("Transport", w->metaObject()->className()) == 0) +                  ; +            else if (strcmp("MusE", w->metaObject()->className()) == 0) +                  ; +            else if (strcmp("QDesktopWidget", w->metaObject()->className()) == 0) +                  ; +            else +                  printf("TopLevel <%s>\n", w->metaObject()->className()); +            } +      xml.etag("toplevels"); +      xml.etag("muse"); +      } + +//--------------------------------------------------------- +//   read20 +//    read old file versions (muse < 1.0) +//--------------------------------------------------------- + +void Song::read20(QDomNode node) +      { +      printf("Warning: importing old muse file version\n"); + +      for (QDomNode n = node.firstChild(); !n.isNull(); n = n.nextSibling()) { +            QDomElement e = n.toElement(); +            if (e.isNull()) +                  continue; +            QString t(e.tagName()); +            if (t == "configuration") +                  readConfiguration(node.firstChild()); +            else if (t == "song") { +                  for (QDomNode n1 = n.firstChild(); !n1.isNull(); n1 = n1.nextSibling()) { +                        QDomElement e = n1.toElement(); +                        if (e.isNull()) +                              continue; +                        QString t(e.tagName()); +                        int i = e.text().toInt(); +                        if (t == "automation") +                              ; +                        else if (t == "cpos") { +                              int pos = i; +                              Pos p(pos, AL::TICKS); +                              setPos(Song::CPOS, p, false, false, false); +                              } +                        else if (t == "rpos") { +                              int pos = i; +                              Pos p(pos, AL::TICKS); +                              setPos(Song::RPOS, p, false, false, false); +                              } +                        else if (t == "lpos") { +                              int pos = i; +                              Pos p(pos, AL::TICKS); +                              setPos(Song::LPOS, p, false, false, false); +                              } +                        else if (t == "master") +                              setMasterFlag(i); +                        else if (t == "loop") +                              setLoop(i); +                        else if (t == "punchin") +                              setPunchin(i); +                        else if (t == "punchout") +                              setPunchout(i); +                        else if (t == "record") +                              ; +                        else if (t == "solo") +                              soloFlag = i; +                        else if (t == "type") +                              ; +                        else if (t == "recmode") +                              _recMode = i; +                        else if (t == "cycle") +                              _cycleMode = i; +                        else if (t == "click") +                              setClick(i); +                        else if (t == "quantize") +                              _quantize = i; +                        else if (t == "len") +                              _len = i; +                        else if (t == "follow") +                              ; +                        else if (t == "drummap") +                              ; +                        else if (t == "siglist") +                              AL::sigmap.read(node.firstChild()); +                        else if (t == "tempolist") +                              AL::tempomap.read(node); +                        else if (t == "Route") +                              ; +                        else if (t == "AudioAux") { +                              AudioGroup* track = new AudioGroup(); +                              track->read(n1.firstChild()); +                              insertTrack0(track,-1); +                              } +                        else if (t == "AudioInput") { +                              AudioInput* track = new AudioInput(); +                              track->read(n1.firstChild()); +                              insertTrack0(track,-1); +                              } +                        else if (t == "AudioGroup") { +                              AudioGroup* track = new AudioGroup(); +                              track->read(n1.firstChild()); +                              insertTrack0(track,-1); +                              } +                        else if (t == "AudioOutput") { +                              AudioOutput* track = new AudioOutput(); +                              track->read(n1.firstChild()); +                              insertTrack0(track,-1); +                              } +                        else if (t == "wavetrack") { +                              MidiTrack* track = new MidiTrack(); +                              track->read(n1.firstChild()); +                              insertTrack0(track, -1); +                              } +                        else if (t == "drumtrack") { +                              MidiTrack* track = new MidiTrack(); +                              track->read(n1.firstChild()); +                              insertTrack0(track, -1); +                              } +                        else if (t == "miditrack") { +                              MidiTrack* track = new MidiTrack(); +                              track->read(n1.firstChild()); +                              insertTrack0(track, -1); +                              } +                        else +                              domError(n1); +                        } +                  } +            else if (t == "toplevels") { +                  } +            else +                  domError(n); +            } +      } + | 
