diff options
| author | Werner Schweer <ws.seh.de> | 2006-12-13 22:04:25 +0000 | 
|---|---|---|
| committer | Werner Schweer <ws.seh.de> | 2006-12-13 22:04:25 +0000 | 
| commit | 88dc42fb35ffcf2401990651cd32ce10253dfe7c (patch) | |
| tree | aa6efb84f2358cf728a09fb5fe17190c3c50c72b | |
| parent | 657784c1a9bf557d2d8ac8f00ff9e2ee11cd2e0d (diff) | |
updates
29 files changed, 206 insertions, 260 deletions
diff --git a/muse/ChangeLog b/muse/ChangeLog index eb68b20b..b07142db 100644 --- a/muse/ChangeLog +++ b/muse/ChangeLog @@ -1,4 +1,7 @@ -13.12 (ns) DeicsOnze 0.5.5 +13.12 (ws) +      - changed (again) midi/audio time synchronisation +      - fix: record midi controller only in controller list +      (ns) DeicsOnze 0.5.5        - added filter for low quality  12.12 (ws)        - added possibility to define a new midicontroller diff --git a/muse/al/tempo.h b/muse/al/tempo.h index 68dcbb14..e2342003 100644 --- a/muse/al/tempo.h +++ b/muse/al/tempo.h @@ -98,3 +98,4 @@ extern TempoList tempomap;  }  #endif + diff --git a/muse/muse/arranger/canvas.cpp b/muse/muse/arranger/canvas.cpp index 5ea2efed..c9764822 100644 --- a/muse/muse/arranger/canvas.cpp +++ b/muse/muse/arranger/canvas.cpp @@ -62,7 +62,7 @@ PartCanvas::PartCanvas()  void PartCanvas::markerChanged(int val)        {        if (val == Song::MARKER_CUR) -            updateRuler();       +            updateRuler();        }  //--------------------------------------------------------- @@ -102,7 +102,7 @@ void PartCanvas::drawWavePart(QPainter& p, Part* wp, int y0, int th, int from, i              int samples = event.lenFrame();              int xScale  = (samples + w/2)/w; -            int frame   = pos.frame() - wp->frame()  +            int frame   = pos.frame() - wp->frame()                             - event.pos().frame() + event.spos();              if (h < 20) { @@ -539,7 +539,7 @@ void PartCanvas::mousePress(QMouseEvent* me)        if (hit == HIT_SUBTRACK) {              TLSWidget* w = (TLSWidget*)(at->tw);              int y = wpos.y() + pos.y() - w->y(); -            w->mousePress(QPoint(pos.x(), y), button, me->modifiers()); +            w->mousePress(QPoint(pos.x(), y), me);              // propagate drag events to subtrack if left button pressed:              if (me->button() == Qt::LeftButton)                    state = S_SUBTRACK; @@ -547,7 +547,7 @@ void PartCanvas::mousePress(QMouseEvent* me)              }        if (button & Qt::RightButton) { -            contextMenu(pos); +            contextMenu(me->pos());              return;              } @@ -880,17 +880,17 @@ void PartCanvas::renamePart(Part* part)        {        bool ok; -      QString s = QInputDialog::getText(this,  +      QString s = QInputDialog::getText(this,           tr("MusE: Change Part Name"),           tr("PartName:"),           QLineEdit::Normal, -         part->name(),  +         part->name(),           &ok           );        if (ok && s != part->name()) {              song->startUndo();              Part* newPart = new Part(*part); -            newPart->setName(s);             +            newPart->setName(s);              song->cmdChangePart(part, newPart);              widget()->update();              } @@ -1105,7 +1105,7 @@ void PartCanvas::drop(QDropEvent* event)        dstPart->setTrack(track);        // -      // cw == 0 means that we are dropping to  +      // cw == 0 means that we are dropping to        // another application        unsigned tick; @@ -1113,7 +1113,7 @@ void PartCanvas::drop(QDropEvent* event)              tick = AL::sigmap.raster(mapxDev(pos.x() - cw->dragOffset()), raster());        else              tick = AL::sigmap.raster(mapxDev(pos.x()), raster()); -             +        dstPart->setTick(tick);        Qt::DropAction da = event->proposedAction(); @@ -1128,7 +1128,7 @@ void PartCanvas::drop(QDropEvent* event)              }        else if (da == Qt::MoveAction)              event->setDropAction(Qt::MoveAction); -      else  +      else              event->setDropAction(Qt::CopyAction);        event->accept();        if (cw || needEndUndo) diff --git a/muse/muse/audio.cpp b/muse/muse/audio.cpp index f706edcf..b2d54019 100644 --- a/muse/muse/audio.cpp +++ b/muse/muse/audio.cpp @@ -99,22 +99,7 @@ Audio::Audio()        _bounce       = 0;        loopPassed    = false; -      _pos.setType(AL::FRAMES); -      _pos.setFrame(~0);      // make sure first seek is not optimized away - -      _curTickPos   = 0; -      _nextTickPos  = 0; - -      midiClick     = 0; -      clickno       = 0; -      clicksMeasure = 0; -      ticksBeat     = 0; - -      state         = STOP; -      lmark         = 0;      // left loop position -      rmark         = 0;      // right loop position -      msg           = 0; - +      _seqTime.pos.setType(AL::FRAMES);        startRecordPos.setType(AL::TICKS);        endRecordPos.setType(AL::TICKS); @@ -152,16 +137,11 @@ bool Audio::start()        {        TrackList* tl = song->tracks(); -      _curTickPos   = 0; -      _nextTickPos  = 0; - -      midiClick     = 0; -      clickno       = 0; -      clicksMeasure = 0; -      ticksBeat     = 0; +      _seqTime.curTickPos   = 0; +      _seqTime.nextTickPos  = 0; +      _seqTime.pos.setFrame(~0);      // make sure seek is not optimized away        msg           = 0; -      _pos.setFrame(~0);      // make sure seek is not optimized away        //        // init marker for synchronous loop processing @@ -193,7 +173,6 @@ bool Audio::start()                  //                  InputList* itl = song->inputs();                  for (iAudioInput i = itl->begin(); i != itl->end(); ++i) { -//                      printf("reconnecting input %s\n", (*i)->name().toLatin1().data());                        for (int x=0; x < (*i)->channels();x++) {                            (*i)->setJackPort(Port(), x); // zero out the old connection                            } @@ -202,7 +181,6 @@ bool Audio::start()                  OutputList* otl = song->outputs();                  for (iAudioOutput i = otl->begin(); i != otl->end(); ++i) { -//                      printf("reconnecting output %s\n", (*i)->name().toLatin1().data());                        for (int x=0; x < (*i)->channels();x++)                            (*i)->setJackPort(Port(), x);  // zero out the old connection                        (*i)->activate1(); @@ -258,7 +236,6 @@ bool Audio::sync(int jackState, unsigned frame)              if (state != START_PLAY) {              	Pos p(frame, AL::FRAMES); -//                  printf("  sync seek\n");  	            seek(p);        	      if (!_freewheel)              	      done = audioPrefetch->seekDone(); @@ -266,14 +243,13 @@ bool Audio::sync(int jackState, unsigned frame)                		state = START_PLAY;                	}              else { -            	if (frame != _pos.frame()) { +            	if (frame != _seqTime.pos.frame()) {                    	// seek during seek  		            seek(Pos(frame, AL::FRAMES));                    	}              	done = audioPrefetch->seekDone();                    }              } -//      printf("  sync %s\n", done ? "done" : "busy");        return done;        } @@ -300,12 +276,14 @@ printf("JACK: shutdown callback\n");  //---------------------------------------------------------  //   process -//    process one audio buffer at position "_pos " +//    process one audio buffer at position "_seqTime._pos "  //    of size "frames"  //---------------------------------------------------------  void Audio::process(unsigned frames, int jackState)        { +      _seqTime.lastFrameTime = audioDriver->lastFrameTime(); +        extern int watchAudio;        ++watchAudio;           // make a simple watchdog happy @@ -355,7 +333,6 @@ void Audio::process(unsigned frames, int jackState)              return;              } -      unsigned framePos = _pos.frame();        if (state == PLAY) {              //              // clear prefetch FIFO if left/right locators @@ -369,21 +346,21 @@ void Audio::process(unsigned frames, int jackState)                    // invalidate audio prefetch buffer                    //                    audioPrefetch->getFifo()->clear(); -                  audioPrefetch->msgSeek(framePos); +                  audioPrefetch->msgSeek(_seqTime.startFrame());                    lmark = llmark;                    rmark = rrmark;                    }              }        if (isPlaying()) { -            if (_bounce == 1 && _pos >= song->rPos()) { +            if (_bounce == 1 && _seqTime.pos >= song->rPos()) {                    _bounce = 2;                    sendMsgToGui(MSG_STOP_BOUNCE);                    }              //              //  check for end of song              // -            if ((_curTickPos >= song->len()) +            if ((_seqTime.curTickPos >= song->len())                 && !(song->record() || _bounce || song->loop())) {                    audioDriver->stopTransport();                    return; @@ -393,7 +370,7 @@ void Audio::process(unsigned frames, int jackState)              //  check for loop end              //              if (state == PLAY && song->loop() && !_bounce && !extSyncFlag) { -                  unsigned n = rmark - framePos - (3 * frames); +                  unsigned n = rmark - _seqTime.startFrame() - (3 * frames);                    if (n < frames) {                          // loop end in current cycle                          // adjust loop start so we get exact loop len @@ -405,9 +382,9 @@ void Audio::process(unsigned frames, int jackState)                          }                    } -            Pos ppp(_pos); +            Pos ppp(_seqTime.pos);              ppp += frames; -            _nextTickPos = ppp.tick(); +            _seqTime.nextTickPos = ppp.tick();              }        // @@ -426,7 +403,7 @@ void Audio::process(unsigned frames, int jackState)                    CtrlList* cl = track->controller();                    for (iCtrl i = cl->begin(); i != cl->end(); ++i) {                          Ctrl* c = i->second; -                        float val = c->value(framePos).f; +                        float val = c->value(_seqTime.startFrame()).f;                          if (val != c->curVal().f) {                                c->setCurVal(val);                                c->setChanged(true); @@ -439,8 +416,6 @@ void Audio::process(unsigned frames, int jackState)        //  process midi        //----------------------------------------- -      unsigned startFrame = _pos.frame(); -      unsigned endFrame   = startFrame + segmentSize;        SynthIList* sl      = song->syntis();        {        MidiOutPortList* ol = song->midiOutPorts(); @@ -453,11 +428,11 @@ void Audio::process(unsigned frames, int jackState)        for (iMidiInPort i = mil->begin(); i != mil->end(); ++i)              (*i)->beforeProcess();        for (iMidiTrack i = mtl->begin(); i != mtl->end(); ++i) -            (*i)->processMidi(_curTickPos, _nextTickPos, startFrame, endFrame); +            (*i)->processMidi(&_seqTime);        for (iMidiOutPort i = ol->begin(); i != ol->end(); ++i) -            (*i)->processMidi(_curTickPos, _nextTickPos, startFrame, endFrame); +            (*i)->processMidi(&_seqTime);        for (iSynthI i = sl->begin(); i != sl->end(); ++i) -            (*i)->processMidi(_curTickPos, _nextTickPos, startFrame, endFrame); +            (*i)->processMidi(&_seqTime);        for (iMidiInPort i = mil->begin(); i != mil->end(); ++i)              (*i)->afterProcess(); @@ -480,26 +455,26 @@ void Audio::process(unsigned frames, int jackState)        if (isPlaying() && !wl->empty()) {     	      Fifo1* fifo = audioPrefetch->getFifo();        	if (fifo->count() == 0) { -            	printf("MusE::Audio: fifo underflow at 0x%x\n", _curTickPos); +            	printf("MusE::Audio: fifo underflow at 0x%x\n", _seqTime.curTickPos);                    audioPrefetch->msgTick();                    }              else {                    bool msg = true;                    do {  	                  unsigned fifoPos = fifo->readPos(); -                  	if (fifoPos == framePos) { +                  	if (fifoPos == _seqTime.startFrame()) {                    		_curReadIndex = fifo->readIndex();                                break;                                }                          else {                                if (msg) {  	                              printf("Muse::Audio: wrong prefetch data 0x%x, expected 0x%x\n", -      	                     	   fifoPos, framePos); +      	                     	   fifoPos, _seqTime.startFrame());                                	msg = false;                                      } -                              if (fifoPos > framePos) { +                              if (fifoPos > _seqTime.startFrame()) {                                      // discard whole prefetch buffer -                                    seek(_pos + frames); +                                    seek(_seqTime.pos + frames);                                      break;                                      }                                fifo->pop();      // discard buffer @@ -513,7 +488,7 @@ void Audio::process(unsigned frames, int jackState)              }        for (iAudioGroup i = gl->begin(); i != gl->end(); ++i)              (*i)->process(); -       +        OutputList* aol = song->outputs();        for (iAudioOutput i = aol->begin(); i != aol->end(); ++i)              (*i)->process(); @@ -533,8 +508,8 @@ void Audio::process(unsigned frames, int jackState)                    }              if (recording && (_bounce == 0 || _bounce == 1))                    audioWriteback->trigger(); -            _pos       += frames; -            _curTickPos = _nextTickPos; +            _seqTime.pos       += frames; +            _seqTime.curTickPos = _seqTime.nextTickPos;              }        midiDriver->updateConnections();        } @@ -585,7 +560,7 @@ void Audio::processMsg()              case SEQM_SET_TEMPO:                    song->processMsg(msg);                    if (isPlaying()) -                        _pos.setTick(_curTickPos); +                        _seqTime.pos.setTick(_seqTime.curTickPos);                    break;              case SEQM_IDLE: @@ -613,21 +588,21 @@ void Audio::processMsg()  void Audio::seek(const Pos& p)        { -      _pos.setFrame(p.frame()); -      _curTickPos      = _pos.tick(); -      _nextTickPos     = _curTickPos; +      _seqTime.pos.setFrame(p.frame()); +      _seqTime.curTickPos      = _seqTime.pos.tick(); +      _seqTime.nextTickPos     = _seqTime.curTickPos;        updateController = true;        loopPassed = true;      // for record loop mode        if (state != LOOP2 && !freewheel()) -            audioPrefetch->msgSeek(_pos.frame()); +            audioPrefetch->msgSeek(_seqTime.pos.frame());        MidiOutPortList* ol = song->midiOutPorts();        for (iMidiOutPort i = ol->begin(); i != ol->end(); ++i) -            (*i)->seek(_curTickPos, _pos.frame()); +            (*i)->seek(_seqTime.curTickPos, _seqTime.pos.frame());        SynthIList* sl      = song->syntis();        for (iSynthI i = sl->begin(); i != sl->end(); ++i) -            (*i)->seek(_curTickPos, _pos.frame()); +            (*i)->seek(_seqTime.curTickPos, _seqTime.pos.frame());        sendMsgToGui(MSG_SEEK);        } @@ -637,9 +612,9 @@ void Audio::seek(const Pos& p)  void Audio::startRolling()        { -      startRecordPos = _pos; +      startRecordPos = _seqTime.pos;        if (song->record()) { -            startRecordPos = _pos; +            startRecordPos = _seqTime.pos;              recording      = true;              TrackList* tracks = song->tracks();              for (iTrack i = tracks->begin(); i != tracks->end(); ++i) { @@ -657,36 +632,6 @@ void Audio::startRolling()        SynthIList* sl      = song->syntis();        for (iSynthI i = sl->begin(); i != sl->end(); ++i)              (*i)->start(); -       -      if (precountEnableFlag -         && song->click() -         && !extSyncFlag -         && song->record()) { -#if 0 -            state = PRECOUNT; -            int z, n; -            if (precountFromMastertrackFlag) -                  AL::sigmap.timesig(playTickPos, z, n); -            else { -                  z = precountSigZ; -                  n = precountSigN; -                  } -            clickno       = z * preMeasures; -            clicksMeasure = z; -            ticksBeat     = (division * 4)/n; -#endif -            } -      else { -            // -            // compute next midi metronome click position -            // -            int bar, beat; -            unsigned tick; -            AL::sigmap.tickValues(_curTickPos, &bar, &beat, &tick); -            if (tick) -                  beat += 1; -            midiClick = AL::sigmap.bar2tick(bar, beat, 0); -            }        }  //--------------------------------------------------------- @@ -705,10 +650,10 @@ void Audio::stopRolling()              (*i)->stop();  	recording    = false; -      endRecordPos = _pos; +      endRecordPos = _seqTime.pos;        _bounce = 0;        sendMsgToGui(MSG_STOP); -      seek(_pos); +      seek(_seqTime.pos);        }  //--------------------------------------------------------- @@ -720,14 +665,3 @@ void Audio::sendMsgToGui(char c)        write(sigFd, &c, 1);        } -//--------------------------------------------------------- -//   timestamp -//    on stop we return a free running frame counter -//--------------------------------------------------------- - -unsigned Audio::timestamp() const -      { -      return audio->isPlaying() ? audioDriver->framePos()  -         : audioDriver->frameTime(); -      } - diff --git a/muse/muse/audio.h b/muse/muse/audio.h index 56c85f05..1d248f03 100644 --- a/muse/muse/audio.h +++ b/muse/muse/audio.h @@ -24,6 +24,7 @@  #include "thread.h"  #include "midievent.h"  #include "route.h" +#include "al/tempo.h"  #include "al/pos.h"  #include "event.h"  #include "ctrl.h" @@ -138,6 +139,39 @@ struct AudioMsg : public ThreadMsg {   // this should be an union  class AudioOutput; + +//--------------------------------------------------------- +//   SeqTime +//    timing information for sequencer cycle +//--------------------------------------------------------- + +extern unsigned int segmentSize; + +struct SeqTime { +      unsigned lastFrameTime; // free running counter + +      // transport values for current cycle: +      Pos pos;                // current play position +      unsigned curTickPos;    // pos at start of frame during play/record +      unsigned nextTickPos;   // pos at start of next frame during play/record + +      unsigned startFrame() const { return pos.frame(); } +      unsigned endFrame() const   { return startFrame() + segmentSize; } + +      //--------------------------------------------------------- +      //   tick2frame +      //    translate from tick to frameTime, this event has to +      //    be scheduled +      //--------------------------------------------------------- + +      unsigned tick2frame(unsigned tick) { +            return AL::tempomap.tick2frame(tick) - pos.frame() + lastFrameTime + segmentSize; +            } +      unsigned frame2tick(unsigned frame) { +            return AL::tempomap.frame2tick(frame - lastFrameTime + pos.frame()); +            } +      }; +  //---------------------------------------------------------  //   Audio  //--------------------------------------------------------- @@ -156,18 +190,12 @@ class Audio {        unsigned lmark;         // left loop position        unsigned rmark;         // right loop position -      Pos _pos;               // current play position +      SeqTime _seqTime; +      Pos startRecordPos; +      Pos endRecordPos; -      unsigned _curTickPos;   // pos at start of frame during play/record -      unsigned _nextTickPos;  // pos at start of next frame during play/record        int _curReadIndex; -      //metronome values -      unsigned midiClick; -      int clickno;      // precount values -      int clicksMeasure; -      int ticksBeat; -        State state;        bool updateController; @@ -190,9 +218,6 @@ class Audio {        Audio();        virtual ~Audio() {} -      Pos startRecordPos; -      Pos endRecordPos; -        void process(unsigned frames, int jackState);        bool sync(int state, unsigned frame);        void shutdown(); @@ -253,13 +278,9 @@ class Audio {        void msgRemoveController(Track*, int id, unsigned time);        void msgSetRtc(); -      const Pos& pos() const      { return _pos; }        const Pos& getStartRecordPos() const { return startRecordPos; }        const Pos& getEndRecordPos() const { return endRecordPos; } -      int curTickPos() const        { return _curTickPos;  } -      int nextTickPos() const       { return _nextTickPos; } -        bool freewheel() const       { return _freewheel; }        void setFreewheel(bool val); @@ -267,8 +288,9 @@ class Audio {        bool bounce() const { return _bounce != 0; }        MidiEvent* getMidiEvent();        void popMidiEvent(); -      int curReadIndex() const { return _curReadIndex; } -      unsigned timestamp() const; +      int curReadIndex() const       { return _curReadIndex;  } + +      const SeqTime* seqTime() const { return &_seqTime;      }        };  extern int processAudio(unsigned long, void*); diff --git a/muse/muse/audiotrack.cpp b/muse/muse/audiotrack.cpp index 36efd4b3..2d01e42d 100644 --- a/muse/muse/audiotrack.cpp +++ b/muse/muse/audiotrack.cpp @@ -326,7 +326,7 @@ void AudioTrack::readRecfile(QDomNode node)  void AudioTrack::putFifo(int channels, unsigned long n, float** bp)        { -      if (fifo.put(channels, n, bp, audio->pos().frame())) { +      if (fifo.put(channels, n, bp, audio->seqTime()->pos.frame())) {              printf("AudioTrack(%s)::putFifo(): overrun\n", name().toAscii().data());              }        } diff --git a/muse/muse/conf.cpp b/muse/muse/conf.cpp index e53ea2c5..50c82950 100644 --- a/muse/muse/conf.cpp +++ b/muse/muse/conf.cpp @@ -260,6 +260,8 @@ void readConfiguration(QDomNode node)                    config.projectPath = s;              else if (tag == "templatePath")                    config.templatePath = s; +            else if (tag == "instrumentPath") +                  config.instrumentPath = s;              else if (tag == "importMidiPath") {                    config.importMidiPath = s;                    lastMidiPath = museUser + "/" + s; diff --git a/muse/muse/ctrl/ctrleditor.cpp b/muse/muse/ctrl/ctrleditor.cpp index 1db70375..89e0fd89 100644 --- a/muse/muse/ctrl/ctrleditor.cpp +++ b/muse/muse/ctrl/ctrleditor.cpp @@ -212,8 +212,10 @@ void CtrlEditor::paint(QPainter& p, const QRect& r)  //   mousePress  //--------------------------------------------------------- -void CtrlEditor::mousePress(const QPoint& pos, int button, Qt::KeyboardModifiers modifiers) +void CtrlEditor::mousePress(const QPoint& pos, QMouseEvent* me)        { +      int button = me->button(); +      Qt::KeyboardModifiers modifiers = me->modifiers();        Tool tool = tc()->tool();        if (button & Qt::RightButton) {              QMenu pop(tc()); @@ -232,10 +234,10 @@ void CtrlEditor::mousePress(const QPoint& pos, int button, Qt::KeyboardModifiers              a = pop.addAction("List Editor");              a->setData(1 << (TOOLS+1)); -            a = pop.exec(tc()->mapToGlobal(pos)); +            a = pop.exec(me->globalPos());              if (a) {                    int n = a->data().toInt(); -                  if (n == (1 << (TOOLS+1))) {  +                  if (n == (1 << (TOOLS+1))) {                          Pos t(tc()->pix2pos(pos.x()));                          muse->showListEditor(t, track(), ctrl());                          } diff --git a/muse/muse/ctrl/ctrleditor.h b/muse/muse/ctrl/ctrleditor.h index ecec5e1d..97f12861 100644 --- a/muse/muse/ctrl/ctrleditor.h +++ b/muse/muse/ctrl/ctrleditor.h @@ -62,7 +62,7 @@ class CtrlEditor {        virtual ~CtrlEditor() {}        void paint(QPainter& p, const QRect& r);        void setDrawCtrlName(bool val) { _drawCtrlName = val; } -      void mousePress(const QPoint&, int, Qt::KeyboardModifiers); +      void mousePress(const QPoint&, QMouseEvent*);        void mouseRelease();        void mouseMove(const QPoint& pos);        }; diff --git a/muse/muse/driver/audiodev.h b/muse/muse/driver/audiodev.h index e0bf554d..55830c14 100644 --- a/muse/muse/driver/audiodev.h +++ b/muse/muse/driver/audiodev.h @@ -36,9 +36,9 @@ class AudioDriver : public Driver {        virtual void start(int priority) = 0;        virtual bool restart() { return false; }           // return true on error        virtual void stop () = 0; -//      virtual unsigned getCurFrame() = 0; -      virtual unsigned framePos() const = 0; +      virtual unsigned curFrame() const = 0;        virtual unsigned frameTime() const = 0; +      virtual unsigned lastFrameTime() const = 0;        virtual float* getBuffer(Port, unsigned long nframes) = 0;        virtual void registerClient() = 0;        virtual Port registerOutPort(const QString& name, bool midi) = 0; diff --git a/muse/muse/driver/dummyaudio.cpp b/muse/muse/driver/dummyaudio.cpp index 85997824..143b7918 100644 --- a/muse/muse/driver/dummyaudio.cpp +++ b/muse/muse/driver/dummyaudio.cpp @@ -54,12 +54,13 @@ class DummyAudio : public AudioDriver {        virtual bool init()   { return true; }        virtual void start(int);        virtual void stop (); -      virtual unsigned framePos() const { -            return lrint((curTime()-startTime) * AL::sampleRate); -            }        virtual unsigned frameTime() const {              return lrint(curTime() * AL::sampleRate);              } +      virtual unsigned lastFrameTime() const { +            return lrint(startTime * AL::sampleRate); +            } +      virtual unsigned curFrame() const { return pos; }        virtual float* getBuffer(Port /*port*/, unsigned long nframes)              { @@ -131,7 +132,6 @@ class DummyAudio : public AudioDriver {              else                    return QString(iPorts[port.alsaPort() - 30]);              } -      virtual unsigned getCurFrame() { return pos; }        virtual int realtimePriority() const { return 40; }        virtual void startTransport() {              state = Audio::PLAY; @@ -215,7 +215,7 @@ static void* dummyLoop(void*)              if ((policy = sched_getscheduler (0)) < 0) {        	        printf("cannot get current client scheduler for audio dummy thread: %s!\n", strerror(errno));                  } -      	    else  +      	    else                  {              	if (policy != SCHED_FIFO)  	                  printf("audio dummy thread _NOT_ running SCHED_FIFO\n"); diff --git a/muse/muse/driver/jack.cpp b/muse/muse/driver/jack.cpp index c67a42d9..4a8a6548 100644 --- a/muse/muse/driver/jack.cpp +++ b/muse/muse/driver/jack.cpp @@ -117,14 +117,14 @@ int JackAudio::getTransportState()        int jackState;        transportState = jack_transport_query(_client, &pos);        switch (jackAudio->transportState) { -            case JackTransportStopped:   +            case JackTransportStopped:                    jackState = Audio::STOP;                    break;              case JackTransportLooping: -            case JackTransportRolling:   +            case JackTransportRolling:                    jackState = Audio::PLAY;                    break; -            case JackTransportStarting:  +            case JackTransportStarting:                    jackState = Audio::START_PLAY;                    break;              default: @@ -374,7 +374,7 @@ void JackAudio::graphChanged()        foreach(Route r, ra)              audio->msgAddRoute1(r);        rr.clear(); -      ra.clear();       +      ra.clear();        OutputList* ol = song->outputs();        for (iAudioOutput ii = ol->begin(); ii != ol->end(); ++ii) { @@ -473,7 +473,7 @@ void JackAudio::registerClient()  //---------------------------------------------------------  //   registerInPort  //--------------------------------------------------------- -                                     +  Port JackAudio::registerInPort(const QString& name, bool midi)        {        const char* type = midi ? JACK_DEFAULT_MIDI_TYPE : JACK_DEFAULT_AUDIO_TYPE; @@ -806,21 +806,14 @@ void JackAudio::putEvent(Port port, const MidiEvent& e)              e.dump();              }        void* pb = jack_port_get_buffer(port.jackPort(), segmentSize); -      unsigned ft; -      if (transportState == JackTransportRolling) { -            ft = e.time() - pos.frame; -            if (pos.frame > e.time()) { -printf("time < 0 -- %d\n", pos.frame - e.time()); +      int ft = e.time() - lastFrameTime(); +      if (ft < 0 || ft >= segmentSize) { +            printf("JackAudio::putEvent: time out of range %d\n", ft); +            if (ft < 0)                    ft = 0; -                  } -            else if (ft >= segmentSize) { +            if (ft > segmentSize)                    ft = segmentSize - 1; -printf("time >= segmentSize -- %d\n", segmentSize - ft); -                  }              } -      else -            ft = 0; -        switch(e.type()) {              case ME_NOTEON:              case ME_NOTEOFF: @@ -838,7 +831,7 @@ printf("time >= segmentSize -- %d\n", segmentSize - ft);                    p[2] = e.dataB();                    }                    break; -             +              case ME_PROGRAM:              case ME_AFTERTOUCH:                    { diff --git a/muse/muse/driver/jackaudio.h b/muse/muse/driver/jackaudio.h index c6835c0e..0322b3b8 100644 --- a/muse/muse/driver/jackaudio.h +++ b/muse/muse/driver/jackaudio.h @@ -78,10 +78,9 @@ class JackAudio : public AudioDriver {        virtual void putEvent(Port, const MidiEvent&);        virtual void startMidiCycle(Port); -      virtual unsigned framePos() const { -            return pos.frame + jack_frames_since_cycle_start(_client); -            } -      virtual unsigned frameTime() const      { return jack_frame_time(_client); } +      virtual unsigned lastFrameTime() const { return jack_last_frame_time(_client); } +      virtual unsigned frameTime() const     { return jack_frame_time(_client); } +      virtual unsigned curFrame() const      { return pos.frame; }        };  #endif diff --git a/muse/muse/globals.cpp b/muse/muse/globals.cpp index ca51a659..e919b933 100644 --- a/muse/muse/globals.cpp +++ b/muse/muse/globals.cpp @@ -129,17 +129,6 @@ QAction* punchoutAction;  QAction* recordAction;  QAction* panicAction; -int preMeasures = 2; -bool precountEnableFlag = false; -bool precountFromMastertrackFlag = false; -int precountSigZ = 4; -int precountSigN = 4; -bool precountPrerecord = false; -bool precountPreroll = false; -bool midiClickFlag   = true; -bool audioClickFlag  = true; -double audioClickVolume = 0.1f; -  bool rcEnable = false;  bool midiSeqRunning = false; diff --git a/muse/muse/globals.h b/muse/muse/globals.h index fefa7311..eaf121d8 100644 --- a/muse/muse/globals.h +++ b/muse/muse/globals.h @@ -81,17 +81,6 @@ extern QAction* punchoutAction;  extern QAction* recordAction;  extern QAction* panicAction; -extern int preMeasures; -extern bool precountEnableFlag; -extern bool precountFromMastertrackFlag; -extern int precountSigZ; -extern int precountSigN; -extern bool precountPrerecord; -extern bool precountPreroll; -extern bool midiClickFlag; -extern bool audioClickFlag; -extern double audioClickVolume; -  extern bool rcEnable;  #endif diff --git a/muse/muse/midiedit/ecanvas.cpp b/muse/muse/midiedit/ecanvas.cpp index ae99db11..965bbaa7 100644 --- a/muse/muse/midiedit/ecanvas.cpp +++ b/muse/muse/midiedit/ecanvas.cpp @@ -439,7 +439,7 @@ void EventCanvas::mousePressCanvasA(QMouseEvent* me)                          if (curItem) {                                drag = DRAG_RESIZE;                                setCursor(); -                        	 +        				Pos p1(curItem->bbox.x(), timeType());        				Pos p2(pix2pos(start.x()));                                int w = p2.time(timeType()) - p1.time(timeType()); @@ -1180,7 +1180,7 @@ void EventCanvas::mousePress(QMouseEvent* me)                    QRect r(rCanvasB.x(), rCanvasB.y() + c->y + splitWidth,                       rCanvasB.width(), c->cheight());                    if (r.contains(pos)) { -                        c->mousePress(pos - r.topLeft(), me->button(), me->modifiers()); +                        c->mousePress(pos - r.topLeft(), me);                          break;                          }                    } diff --git a/muse/muse/midiinport.cpp b/muse/muse/midiinport.cpp index 878a5797..19365be6 100644 --- a/muse/muse/midiinport.cpp +++ b/muse/muse/midiinport.cpp @@ -102,7 +102,16 @@ void MidiInPort::eventReceived(snd_seq_event_t* ev)        {        MidiEvent event;        event.setB(0); -      event.setTime(audio->timestamp()); +      // +      // move all events 2*segmentSize into the future to get +      // jitterfree playback +      // +      //  cycle   n-1         n          n+1 +      //          -+----------+----------+----------+- +      //               ^          ^          ^ +      //               catch      process    play +      // +      event.setTime(audioDriver->frameTime() + 2 * segmentSize);        switch(ev->type) {              case SND_SEQ_EVENT_NOTEON: @@ -171,7 +180,7 @@ void MidiInPort::eventReceived(snd_seq_event_t* ev)        MidiEventList il, ol;        il.insert(event); -      pipeline()->apply(audio->curTickPos(), audio->nextTickPos(), &il, &ol); +      pipeline()->apply(audio->seqTime()->curTickPos, audio->seqTime()->nextTickPos, &il, &ol);        //        // update midi activity @@ -223,7 +232,7 @@ void MidiInPort::beforeProcess()  //   getEvents  //    called from jack process context  //    This method can be called multiple times in a process -//    cycle so we have to empty the fifo at  +//    cycle so we have to empty the fifo at  //    "afterProcess()".  //--------------------------------------------------------- @@ -247,7 +256,7 @@ bool MidiInPort::checkActivity(int channel)        {        if (activity[channel])              --activity[channel]; -      return activity[channel] != 0;       +      return activity[channel] != 0;        }  //--------------------------------------------------------- diff --git a/muse/muse/midiout.cpp b/muse/muse/midiout.cpp index 0f0af9d7..db9789c3 100644 --- a/muse/muse/midiout.cpp +++ b/muse/muse/midiout.cpp @@ -245,8 +245,6 @@ void MidiOut::seek(unsigned tickPos, unsigned framePos)  void MidiOut::stop()        { -      int frame = AL::tempomap.tick2frame(audio->curTickPos()); -        //---------------------------------------------------        //    stop all notes        //--------------------------------------------------- @@ -254,7 +252,7 @@ void MidiOut::stop()        for (iMidiEvent i = _schedEvents.begin(); i != _schedEvents.end(); ++i) {              MidiEvent ev = *i;              if (ev.isNoteOff()) { -                  ev.setTime(frame); +                  ev.setTime(0);                    track->routeEvent(ev);                    }              } @@ -288,7 +286,8 @@ void MidiOut::stop()                          0x7f, 0x7f, 0x06, 0x44, 0x06, 0x01,                          0, 0, 0, 0, 0                          }; -                  MTC mtc(double(frame) / double(AL::sampleRate)); +                  double frame = double(audio->seqTime()->pos.frame()); +                  MTC mtc(frame / double(AL::sampleRate));                    mmcPos[6] = mtc.h() | (AL::mtcType << 5);                    mmcPos[7] = mtc.m();                    mmcPos[8] = mtc.s(); @@ -301,7 +300,7 @@ void MidiOut::stop()                    // send STOP and                    // "set song position pointer"                    sendStop(); -                  sendSongpos(audio->curTickPos() * 4 / config.division); +                  sendSongpos(audio->seqTime()->curTickPos * 4 / config.division);                    }              }        } @@ -319,7 +318,7 @@ void MidiOut::start()        if (genMMC)              sendSysex(mmcDeferredPlayMsg, sizeof(mmcDeferredPlayMsg));        if (genMCSync) { -            if (audio->curTickPos()) +            if (audio->seqTime()->curTickPos)                    sendContinue();              else                    sendStart(); @@ -353,23 +352,22 @@ void MidiOut::reset()  //    note off events. The note off events maybe played later after the  //    current process cycle.  //    From _schedEvents queue copy all events for the current cycle -//    to all output routes. Events routed to ALSA go into the  +//    to all output routes. Events routed to ALSA go into the  //    _playEvents queue which is processed by the MidiSeq thread.  //------------------------------------------------------------------- -void MidiOut::processMidi(MidiEventList& el, unsigned fromTick, unsigned toTick,  -   unsigned, unsigned) +void MidiOut::processMidi(MidiEventList& el, const SeqTime* time)        {        while (!eventFifo.isEmpty())              el.insert(eventFifo.get());        // collect port controller -      if (track->autoRead() && (fromTick != toTick)) {  // if rolling +      if (track->autoRead() && (time->curTickPos != time->nextTickPos)) {  // if rolling              CtrlList* cl = track->controller();              for (iCtrl ic = cl->begin(); ic != cl->end(); ++ic) {                    Ctrl* c = ic->second; -                  iCtrlVal is = c->lowerBound(fromTick); -                  iCtrlVal ie = c->lowerBound(toTick); +                  iCtrlVal is = c->lowerBound(time->curTickPos); +                  iCtrlVal ie = c->lowerBound(time->nextTickPos);                    for (iCtrlVal ic = is; ic != ie; ++ic) {                          unsigned frame = AL::tempomap.tick2frame(ic.key());                          MidiEvent ev(frame, -1, ME_CONTROLLER, c->id(), ic.value().i); @@ -384,7 +382,7 @@ void MidiOut::processMidi(MidiEventList& el, unsigned fromTick, unsigned toTick,              if (t->isMute())                    continue;              MidiEventList ell; -            t->getEvents(fromTick, toTick, r.src.channel, &ell); +            t->getEvents(time->curTickPos, time->nextTickPos, r.src.channel, &ell);              int velo = 0;              for (iMidiEvent i = ell.begin(); i != ell.end(); ++i) {                    MidiEvent ev(*i); diff --git a/muse/muse/midiout.h b/muse/muse/midiout.h index 75e9cbd6..8bf25261 100644 --- a/muse/muse/midiout.h +++ b/muse/muse/midiout.h @@ -25,6 +25,7 @@  class Track;  class MidiInstrument; +class SeqTime;  //---------------------------------------------------------  //    MidiOut @@ -43,8 +44,7 @@ class MidiOut        MidiFifo eventFifo;        MidiOut(); -      void processMidi(MidiEventList& el, unsigned fromTick, unsigned toTick,  -         unsigned fromFrame, unsigned toFrame); +      void processMidi(MidiEventList&, const SeqTime*);        void seek(unsigned, unsigned);        void stop(); diff --git a/muse/muse/midioutport.cpp b/muse/muse/midioutport.cpp index 96984d48..a9cf9438 100644 --- a/muse/muse/midioutport.cpp +++ b/muse/muse/midioutport.cpp @@ -376,28 +376,30 @@ void MidiSeq::processMidiClock()  //    note off events. The note off events maybe played after the  //    current process cycle.  //    From _schedEvents queue copy all events for the current cycle -//    to all output routes. Events routed to ALSA go into the  +//    to all output routes. Events routed to ALSA go into the  //    _playEvents queue which is processed by the MidiSeq thread.  //------------------------------------------------------------------- -void MidiOutPort::processMidi(unsigned fromTick, unsigned toTick, unsigned fromFrame, unsigned toFrame) +void MidiOutPort::processMidi(const SeqTime* t)        {        if (track->mute())              return;        MidiEventList el; -      MidiOut::processMidi(el, fromTick, toTick, fromFrame, toFrame); +      MidiOut::processMidi(el, t); -      pipeline()->apply(fromTick, toTick, &el, &_schedEvents); +      pipeline()->apply(t->curTickPos, t->nextTickPos, &el, &_schedEvents);        //        // route events to destination        // -      int portVelo = 0; -      iMidiEvent i = _schedEvents.begin(); +      int portVelo      = 0; +      unsigned endFrame = t->lastFrameTime + segmentSize; +      iMidiEvent i      = _schedEvents.begin(); +        for (; i != _schedEvents.end(); ++i) { -            if (i->time() >= toFrame) +            if (i->time() >= endFrame)                    break;              routeEvent(*i);              if (i->type() == ME_NOTEON) diff --git a/muse/muse/midioutport.h b/muse/muse/midioutport.h index e77af2e5..31529349 100644 --- a/muse/muse/midioutport.h +++ b/muse/muse/midioutport.h @@ -24,6 +24,8 @@  #include "miditrackbase.h"  #include "midiout.h" +struct SeqTime; +  //---------------------------------------------------------  //   MidiOutPort  //--------------------------------------------------------- @@ -57,7 +59,7 @@ class MidiOutPort : public MidiTrackBase, public MidiOut {        bool guiVisible() const;        bool hasGui() const; -      virtual void processMidi(unsigned fromTick, unsigned toTick, unsigned fromFrame, unsigned toFrame); +      virtual void processMidi(const SeqTime*);        };  typedef QList<MidiOutPort*> MidiOutPortList; diff --git a/muse/muse/midiseq.cpp b/muse/muse/midiseq.cpp index 205066ac..bfb03283 100644 --- a/muse/muse/midiseq.cpp +++ b/muse/muse/midiseq.cpp @@ -193,6 +193,8 @@ bool MidiSeq::start(int prio)  //---------------------------------------------------------  //   midiTick  //    schedule events in playEvents +//    "now" is the free running audioDriver->frameTime() +//    frame counter  //---------------------------------------------------------  void MidiSeq::midiTick(void* p, void*) @@ -207,10 +209,9 @@ void MidiSeq::midiTick(void* p, void*)              at->playEvents.insert(at->fifo.get());        // -      // schedule all events upto framePos-segmentSize -      // (previous segment) +      // schedule all events upto curFrame()        // -      unsigned curFrame = audioDriver->framePos() - segmentSize; +      unsigned curFrame = audioDriver->frameTime();        iMidiOutEvent i = at->playEvents.begin();        for (; i != at->playEvents.end(); ++i) {              if (i->event.time() > curFrame) diff --git a/muse/muse/miditrack.cpp b/muse/muse/miditrack.cpp index 29319acf..b86aa904 100644 --- a/muse/muse/miditrack.cpp +++ b/muse/muse/miditrack.cpp @@ -409,7 +409,7 @@ void MidiTrack::stopRecording()        if (recordPart->lenTick() < (cpos-ptick)) {              //              // TODO: check for events outside part boundaries -            //	 +            //              int endTick = song->roundUpBar(cpos);              recordPart->setLenTick(endTick - ptick);              } @@ -476,13 +476,13 @@ bool MidiTrack::isMute() const  //   processMidi  //--------------------------------------------------------- -void MidiTrack::processMidi(unsigned from, unsigned to, unsigned, unsigned) +void MidiTrack::processMidi(SeqTime* t)        {        schedEvents.clear();  	//        // collect events only when transport is rolling        // -      if (from < to) { +      if (t->curTickPos < t->nextTickPos) {              for (iPart p = parts()->begin(); p != parts()->end(); ++p) {                    Part* part = p->second;                    if (part->mute()) @@ -490,20 +490,20 @@ void MidiTrack::processMidi(unsigned from, unsigned to, unsigned, unsigned)                    DrumMap* dm     = drumMap();                    unsigned offset = _delay + part->tick(); -                  if (offset > to) +                  if (offset > t->nextTickPos)                          break;                    EventList* events = part->events(); -                  iEvent ie   = events->lower_bound((offset > from) ? 0 : from - offset); -                  iEvent iend = events->lower_bound(to - offset); +                  iEvent ie   = events->lower_bound((offset > t->curTickPos) ? 0 : t->curTickPos - offset); +                  iEvent iend = events->lower_bound(t->nextTickPos - offset);                    for (; ie != iend; ++ie) {                          Event ev = ie->second;                          if (ev.type() == Meta)        // ignore meta events                                continue;                          unsigned tick  = ev.tick() + offset; -                        unsigned frame = AL::tempomap.tick2frame(tick); +                        unsigned frame = t->tick2frame(tick);                          if (ev.type() == Note) {                           	if (dm) {                                      if (dm->entry(dm->outmap(ev.pitch()))->mute) @@ -530,7 +530,7 @@ void MidiTrack::processMidi(unsigned from, unsigned to, unsigned, unsigned)                                      elen = 1;                                int veloOff = ev.veloOff(); -                              unsigned eframe = AL::tempomap.tick2frame(tick+elen); +                              unsigned eframe = t->tick2frame(tick+elen);                                schedEvents.insert(MidiEvent(frame, 0, ME_NOTEON, pitch, velo));                                schedEvents.insert(MidiEvent(eframe, 0, veloOff ? ME_NOTEOFF : ME_NOTEON, pitch, veloOff));                                _meter[0] += velo/2; @@ -548,10 +548,10 @@ void MidiTrack::processMidi(unsigned from, unsigned to, unsigned, unsigned)              if (autoRead()) {                    for (iCtrl ic = controller()->begin(); ic != controller()->end(); ++ic) {                          Ctrl* c = ic->second; -                        iCtrlVal is = c->lowerBound(from); -                        iCtrlVal ie = c->lowerBound(to); +                        iCtrlVal is = c->lowerBound(t->curTickPos); +                        iCtrlVal ie = c->lowerBound(t->nextTickPos);                          for (iCtrlVal ic = is; ic != ie; ++ic) { -                              unsigned frame = AL::tempomap.tick2frame(ic.key()); +                              unsigned frame = t->tick2frame(ic.key());                                Event ev(Controller);                                ev.setA(c->id());                                ev.setB(ic.value().i); @@ -571,13 +571,13 @@ void MidiTrack::processMidi(unsigned from, unsigned to, unsigned, unsigned)              if (track->isMute())                    continue;              MidiEventList el; -            track->getEvents(from, to, r.src.channel, &el); +            track->getEvents(t->curTickPos, t->nextTickPos, r.src.channel, &el);              for (iMidiEvent ie = el.begin(); ie != el.end(); ++ie) {                    MidiEvent event(*ie); -                  int eventTime = event.time(); +                  unsigned eventTime = event.time();                    if (recordFlag() && audio->isRecording()) { -                        unsigned time = AL::tempomap.frame2tick(eventTime); +                        unsigned time = t->frame2tick(eventTime);                          event.setTime(time);  // set tick time                          recordFifo.put(event);                          } @@ -601,8 +601,6 @@ void MidiTrack::processMidi(unsigned from, unsigned to, unsigned, unsigned)                                      event.setB(velo);                                      }                                } -                        unsigned time = 0; // eventTime + segmentSize*(segmentCount-1); -                        event.setTime(time);                          schedEvents.insert(event);                          }                    } diff --git a/muse/muse/miditrack.h b/muse/muse/miditrack.h index 6aad602f..994c3c92 100644 --- a/muse/muse/miditrack.h +++ b/muse/muse/miditrack.h @@ -28,6 +28,7 @@  class Part;  class EventList;  class MidiOut; +class SeqTime;  //---------------------------------------------------------  //   MidiTrack @@ -102,7 +103,7 @@ class MidiTrack : public MidiTrackBase {        virtual bool canRecord() const      { return true; }        void playMidiEvent(MidiEvent*); -      virtual void processMidi(unsigned fromTick, unsigned toTick, unsigned fromFrame, unsigned toFrame); +      virtual void processMidi(SeqTime*);        virtual void getEvents(unsigned from, unsigned to, int channel, MidiEventList* dst);        bool useDrumMap() const             { return _useDrumMap;    } diff --git a/muse/muse/song.cpp b/muse/muse/song.cpp index 17d03fe3..01b09cb6 100644 --- a/muse/muse/song.cpp +++ b/muse/muse/song.cpp @@ -124,7 +124,9 @@ bool Song::addEvent(Event& event, Part* part)                          }                    }              } -      part->events()->add(event); +      else { +            part->events()->add(event); +            }        return true;        } @@ -697,7 +699,7 @@ void Song::beat()        {        updateFlags = 0;        if (audio->isPlaying()) { -            int tick = audio->curTickPos(); +            int tick = audio->seqTime()->curTickPos;              setPos(0, tick, true, false, true);              }        if (audio->isRecording()) { @@ -1106,7 +1108,7 @@ void Song::seqSignal(int fd)                          setRecord(true);                          break;                    case MSG_SEEK: -	                  setPos(0, audio->curTickPos(), true, false, !seekInProgress); +	                  setPos(0, audio->seqTime()->curTickPos, true, false, !seekInProgress);                    	seekInProgress = false;                          beat();           // update controller guis                          break; @@ -1166,7 +1168,7 @@ void Song::stopRolling()        	for (iWaveTrack it = wl->begin(); it != wl->end(); ++it) {              	WaveTrack* track = *it;  	            if (track->recordFlag() || bounceTrack == track) { -      	            track->stopRecording(audio->startRecordPos, audio->endRecordPos); +      	            track->stopRecording(audio->getStartRecordPos(), audio->getEndRecordPos());              	      }  	            }        	MidiTrackList* ml = midis(); @@ -1178,7 +1180,7 @@ void Song::stopRolling()  	      for (iAudioOutput io = ol->begin(); io != ol->end(); ++io) {        	      AudioOutput* ao = *io;              	if (ao->recordFlag()) -	                  ao->stopRecording(audio->startRecordPos, audio->endRecordPos); +	                  ao->stopRecording(audio->getStartRecordPos(), audio->getEndRecordPos());        	      }       	 	audio->msgIdle(false);              updateFlags |= SC_PART_MODIFIED; @@ -1503,7 +1505,7 @@ void Song::restartJack()                   " homepage which is available through the help menu)\n"                   "\n"                   "To proceed check the status of Jack and try to restart it and then .\n" -                 "click on the Restart button."),  +                 "click on the Restart button."),                 "restart", "cancel", "save project"                 );              if (btn == 0) { diff --git a/muse/muse/synth.cpp b/muse/muse/synth.cpp index 1701c6df..ed56e1a0 100644 --- a/muse/muse/synth.cpp +++ b/muse/muse/synth.cpp @@ -35,6 +35,7 @@  #include "midiseq.h"  #include "midictrl.h"  #include "instruments/minstrument.h" +#include "driver/audiodev.h"  std::vector<Synth*> synthis;  // array of available synthis @@ -402,7 +403,6 @@ void MessSynthIF::write(Xml& xml) const        if (len) {              xml.stag("midistate");              xml.stag(QString("event type=\"%1\" datalen=\"%2\"").arg(Sysex).arg(len)); -            int col = 0;              xml.dump(len, p);              xml.etag("event");              xml.etag("midistate"); @@ -537,7 +537,7 @@ void MessSynthIF::getData(MidiEventList* el, unsigned pos, int ports, unsigned n                    int frame = i->time();                    if (frame >= endPos)                          break; -                  if (frame > curPos) {  +                  if (frame > curPos) {                          // Several following notes during same segmentsize?                          _mess->process(buffer, curPos-pos, frame - curPos);                          curPos = frame; // don't process this piece again @@ -553,7 +553,7 @@ void MessSynthIF::getData(MidiEventList* el, unsigned pos, int ports, unsigned n              // this happens if the synth has stereo and we switch the              // channel to mono -            printf("MessSynthIF::getData - ports %d < channels %d\n",  +            printf("MessSynthIF::getData - ports %d < channels %d\n",                 ports, channels());              }        } @@ -584,9 +584,8 @@ bool MessSynthIF::putEvent(const MidiEvent& ev)  void SynthI::collectInputData()        {        bufferEmpty = false; -      unsigned pos = audio->isPlaying() ? audio->pos().frame() -         : audio->timestamp(); -      _sif->getData(&_schedEvents, pos, channels(), segmentSize, buffer); +      _sif->getData(&_schedEvents, audioDriver->frameTime(), channels(), +         segmentSize, buffer);        }  //------------------------------------------------------------------- @@ -597,10 +596,10 @@ void SynthI::collectInputData()  //    current process cycle.  //------------------------------------------------------------------- -void SynthI::processMidi(unsigned fromTick, unsigned toTick, unsigned fromFrame, unsigned toFrame) +void SynthI::processMidi(SeqTime* t)        {        if (mute())              return; -      MidiOut::processMidi(_schedEvents, fromTick, toTick, fromFrame, toFrame); +      MidiOut::processMidi(_schedEvents, t);        } diff --git a/muse/muse/synth.h b/muse/muse/synth.h index 6d555233..cae9c417 100644 --- a/muse/muse/synth.h +++ b/muse/muse/synth.h @@ -119,7 +119,7 @@ class SynthIF {  class SynthI : public AudioTrack, public MidiOut, public MidiInstrument        {        Q_OBJECT -       +        SynthIF* _sif;     protected: @@ -179,7 +179,7 @@ class SynthI : public AudioTrack, public MidiOut, public MidiInstrument        void deactivate3();        bool isActivated() const         { return synthesizer && _sif; }        virtual bool hasAuxSend() const  { return _sif->hasAuxSend(); } -      virtual void processMidi(unsigned fromTick, unsigned toTick, unsigned fromFrame, unsigned toFrame); +      virtual void processMidi(SeqTime*);        virtual MidiOut* midiOut() { return this; }        virtual MidiInstrument* instrument() { return this; } diff --git a/muse/muse/waveedit/waveview.cpp b/muse/muse/waveedit/waveview.cpp index 14550c3d..eb5a744d 100644 --- a/muse/muse/waveedit/waveview.cpp +++ b/muse/muse/waveedit/waveview.cpp @@ -93,7 +93,7 @@ void WaveView::drawWavePart(QPainter& p, Part* wp, int y0, int th, int from, int              int samples = event.lenFrame();              int xScale  = (samples + w/2)/w; -            int frame   = pos.frame() - wp->frame()  +            int frame   = pos.frame() - wp->frame()                             - event.pos().frame() + event.spos();              if (h < 20) { @@ -247,7 +247,7 @@ void WaveView::mousePress(QMouseEvent* me)                    QRect r(rCanvasB.x(), rCanvasB.y() + c->y + splitWidth,                       rCanvasB.width(), c->cheight());                    if (r.contains(pos)) { -                        c->mousePress(pos - r.topLeft(), me->button(), me->modifiers()); +                        c->mousePress(pos - r.topLeft(), me);                          break;                          }                    } @@ -908,7 +908,7 @@ void WaveView::layout()              c->setHeight(sch);              layoutPanelB(c);              y += sch; -            }       +            }        }  //--------------------------------------------------------- @@ -926,7 +926,7 @@ void WaveView::layout1()              c->y = y;              y += c->height();              } -      resizeController(y);       +      resizeController(y);        }  //--------------------------------------------------------- @@ -970,7 +970,7 @@ void WaveView::addController(int id, int h)        {        ctrlHeight += h;        int n = ctrlEditList.size(); -       +        CtrlEdit* ce = new CtrlEdit(widget(), this, curPart->track());        ce->setHeight(h);        ce->setCtrl(id); @@ -1026,7 +1026,7 @@ void WaveView::updatePartControllerList()              cc.ctrlId = (*i)->ctrlId;              cc.height = (*i)->height();              cl->push_back(cc); -            }       +            }        }  //--------------------------------------------------------- diff --git a/muse/muse/wavetrack.cpp b/muse/muse/wavetrack.cpp index 9b7787a5..f4551f5a 100644 --- a/muse/muse/wavetrack.cpp +++ b/muse/muse/wavetrack.cpp @@ -364,7 +364,7 @@ void WaveTrack::process()        // record collected data for track        //  	if (recordFlag() && audio->isRecording() && recFile()) { -		unsigned framePos = audio->pos().frame(); +		unsigned framePos = audio->seqTime()->pos.frame();        	if (audio->freewheel()) {                    // write data directly to file                    _recFile->write(channels(), buffer, framePos);  | 
