diff options
| -rw-r--r-- | muse/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | muse/ChangeLog | 2 | ||||
| -rw-r--r-- | muse/muse/midiedit/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | muse/muse/midiedit/miditracker.cpp | 15 | ||||
| -rw-r--r-- | muse/muse/midiedit/miditracker.h | 6 | ||||
| -rw-r--r-- | muse/muse/midiedit/trackpattern.cpp | 197 | ||||
| -rw-r--r-- | muse/muse/midiedit/trackpattern.h | 79 | 
7 files changed, 221 insertions, 83 deletions
| diff --git a/muse/CMakeLists.txt b/muse/CMakeLists.txt index 4d50367e..e414d48b 100644 --- a/muse/CMakeLists.txt +++ b/muse/CMakeLists.txt @@ -26,8 +26,8 @@ if (NOT CMAKE_INSTALL_LIBDIR)  	SET(CMAKE_INSTALL_LIBDIR "lib")  endif (NOT CMAKE_INSTALL_LIBDIR) -# set(CMAKE_BUILD_TYPE debug) -set(CMAKE_BUILD_TYPE release) +set(CMAKE_BUILD_TYPE debug) +# set(CMAKE_BUILD_TYPE release)  # for debugging the make system uncomment next line:  # set(CMAKE_VERBOSE_MAKEFILE ON) diff --git a/muse/ChangeLog b/muse/ChangeLog index 372d2a53..b6f2f700 100644 --- a/muse/ChangeLog +++ b/muse/ChangeLog @@ -1,3 +1,5 @@ +04.03 (ng) +      - update III miditracker  02.02 (ng)        - updated partlistedit, direct editing of time & parameters on list edit  01.02 (ng) diff --git a/muse/muse/midiedit/CMakeLists.txt b/muse/muse/midiedit/CMakeLists.txt index 0d69b1f5..00fc169f 100644 --- a/muse/muse/midiedit/CMakeLists.txt +++ b/muse/muse/midiedit/CMakeLists.txt @@ -30,6 +30,7 @@ QT4_WRAP_CPP ( midiedit_mocs        pianoroll.h        prcanvas.h        miditracker.h +      trackpattern.h        )  QT4_WRAP_UI ( midiedit_ui_headers  diff --git a/muse/muse/midiedit/miditracker.cpp b/muse/muse/midiedit/miditracker.cpp index f0b6b961..6e6a9a5b 100644 --- a/muse/muse/midiedit/miditracker.cpp +++ b/muse/muse/midiedit/miditracker.cpp @@ -109,6 +109,7 @@ MidiTrackerEditor::MidiTrackerEditor(PartList* pl, bool /*init*/)    //-------------    _timingPattern =      new TimingPattern(this, "Timing", firstTick, lastTick, _quant); +  int nbrRow = _timingPattern->getAbsoluteNbrRow();    //---------------    //tracks matrices @@ -123,12 +124,20 @@ MidiTrackerEditor::MidiTrackerEditor(PartList* pl, bool /*init*/)        if(trackNotFound) {  	TrackPattern* tp;   	tp = new TrackPattern(this, track->name(), firstTick, lastTick, -			      _quant, pl, (MidiTrack*) track); +			      _quant, pl, (MidiTrack*) track, nbrRow);  	_trackPatterns.push_back(tp);        }      }    } +  //signals from TimingPattern and TrackPattern +  connect(_timingPattern, SIGNAL(moveCurrentRow(unsigned)), +	  this, SLOT(updateMoveCurrentRow(unsigned))); +  for(unsigned i = 0; i < _trackPatterns.size(); i++) { +    connect(_trackPatterns[i], SIGNAL(moveCurrentRow(unsigned)), +	    this, SLOT(updateMoveCurrentRow(unsigned))); +  } +    /*    addToolBarBreak();    toolbar = new Toolbar1(initRaster, initQuant); @@ -233,3 +242,7 @@ void MidiTrackerEditor::cmd(QAction* /*a*/) {  //    _trackPatterns[i]->fillTrackPat();  //  _timingPattern->fillTimmingPat();   //} + +void MidiTrackerEditor::updateMoveCurrentRow(unsigned index) { +  emit signalMoveCurrentRow(index); +} diff --git a/muse/muse/midiedit/miditracker.h b/muse/muse/midiedit/miditracker.h index edff20ee..aad3a090 100644 --- a/muse/muse/midiedit/miditracker.h +++ b/muse/muse/midiedit/miditracker.h @@ -27,6 +27,7 @@ using AL::Xml;  class MidiTrackerEditor : public MidiEditor {    Q_OBJECT +   private:    int _quant;    QuantCombo* _quantCombo; @@ -41,7 +42,9 @@ class MidiTrackerEditor : public MidiEditor {    TimingPattern* _timingPattern;   private slots: +  void updateMoveCurrentRow(unsigned);    virtual void cmd(QAction*); +   public:    MidiTrackerEditor(PartList*, bool);    ~MidiTrackerEditor() {} @@ -61,6 +64,9 @@ class MidiTrackerEditor : public MidiEditor {   protected:    //void resizeEvent(QResizeEvent *event); + + signals: +  void signalMoveCurrentRow(unsigned);  };  #endif diff --git a/muse/muse/midiedit/trackpattern.cpp b/muse/muse/midiedit/trackpattern.cpp index 781879f3..84f4aeda 100644 --- a/muse/muse/midiedit/trackpattern.cpp +++ b/muse/muse/midiedit/trackpattern.cpp @@ -4,6 +4,8 @@  class EventList; +#define MAX(x,y) (x>y?x:y) +  #define EMPTYCHAR "-"  #define NONREADCHAR "*"  #define SPACECHAR "-" @@ -11,10 +13,11 @@ class EventList;  #define STOPCHAR "="  #define SEPCHAR " "  //#define FONT "Console" -//#define FONT "Monospace" -#define FONT "MiscFixed" +#define FONT "Monospace" +//#define FONT "MiscFixed"  #define FONT_HEIGHT 14 -#define OFFSET_Y 4 +#define OFFSET_HEIGHT 3 +#define OFFSET_Y 3  //----------------------------------------------------------  // EventPat @@ -266,45 +269,110 @@ CtrlPat::~CtrlPat() {}  //----------------------------------------------------------  // BaseTrackPat  //---------------------------------------------------------- -BaseTrackPat::BaseTrackPat(QMainWindow* parent) { +BaseTrackPat::BaseTrackPat(QMainWindow* parent, unsigned anr) {    _parent = parent; -  _currentRow = 0; -  _numRow = 0; +  _tree = new QTreeWidget(this); + +  _absoluteNbrRow = anr; + +  _update = false; + +  connect(_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), +	  SLOT(currentItemChanged(QTreeWidgetItem*))); +  connect(_tree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),  +	  SLOT(currentItemChanged(QTreeWidgetItem*))); +  connect(_parent, SIGNAL(signalMoveCurrentRow(unsigned)), this, +	  SLOT(moveRowFromSignal(unsigned))); +  //connect(_tree, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelectionChanged()));  }  BaseTrackPat::~BaseTrackPat() {  } -void BaseTrackPat::setNumRow(unsigned nr) { -  _numRow = nr; +void BaseTrackPat::setRowMag() { +  _rowMag = (unsigned) height()/_fontHeight - OFFSET_Y; +  _lastRow = _firstRow + _rowMag - 1;  } - -unsigned BaseTrackPat::getNumRow() { -  return _numRow; +void BaseTrackPat::setFirstRow(unsigned f) { +  _firstRow = f; +  _lastRow = f + _rowMag - 1; +} +void BaseTrackPat::setRelativeCurrentRow(unsigned r) { +  _relativeCurrentRow = r; +  _absoluteCurrentRow = r + _firstRow; +} +void BaseTrackPat::setAbsoluteCurrentRow(unsigned a) { +  _absoluteCurrentRow = a; +  _relativeCurrentRow = a - _firstRow;  }  unsigned BaseTrackPat::getRowMag() { -  return (unsigned) height()/FONT_HEIGHT - OFFSET_Y; +  return _rowMag; +} +unsigned BaseTrackPat::getFirstRow() { +  return _firstRow; +} +unsigned BaseTrackPat::getLastRow() { +  return _lastRow; +} +unsigned BaseTrackPat::getRelativeCurrentRow() { +  return _relativeCurrentRow; +} +unsigned BaseTrackPat::getAbsoluteCurrentRow() { +  return _absoluteCurrentRow;  } -unsigned BaseTrackPat::getCurTreeRow() { -  unsigned rmd2 = getRowMag()/2; -  if(_currentRow < rmd2) return _currentRow; -  else if(_currentRow > getNumRow() - rmd2) -    return _currentRow - getNumRow() + getRowMag(); -  else return rmd2; +unsigned BaseTrackPat::getAbsoluteNbrRow() { +  return _absoluteNbrRow;  } -unsigned BaseTrackPat::getLowRow() { -  unsigned rmd2 = getRowMag()/2; -  if(_currentRow < rmd2) return 0; -  else if(_currentRow > getNumRow() - rmd2)  -    return _tree->topLevelItemCount() - getRowMag(); -  else return _currentRow - rmd2; +void BaseTrackPat::moveRelativeCurrentRow(unsigned newIndex) { +  if(newIndex==0 && getFirstRow()>0) { +    setFirstRow(getFirstRow() - 1); +    setRelativeCurrentRow(newIndex + 1); +    _update = true; +  } +  else if(newIndex==getRowMag()-1 && getLastRow()<_absoluteNbrRow-1) { +    setFirstRow(getFirstRow() + 1); +    setRelativeCurrentRow(newIndex - 1); +    _update = true; +  } +  else setRelativeCurrentRow(newIndex);  } -unsigned BaseTrackPat::getUpRow() { -  return getLowRow() + getRowMag(); +//void BaseTrackPat::itemSelectionChanged() { +void BaseTrackPat::currentItemChanged(QTreeWidgetItem* nitem) { +  int index; +  if(nitem) { +    index = _tree->indexOfTopLevelItem(nitem); + +    emit moveCurrentRow(index); +  } +} + +void BaseTrackPat::moveRowFromSignal(unsigned index) { +  moveRelativeCurrentRow(index); +  if(_update==true) { +    fillPattern(); +    _update = false; +  } +  selectCurrentRow(); +} + +void BaseTrackPat::resizeEvent(QResizeEvent* /*event*/) { +  setRowMag(); +  fillPattern(); +  selectCurrentRow(); +} + +void BaseTrackPat::selectCurrentRow() { +  _tree->blockSignals(true); + +  QTreeWidgetItem* item = _tree->topLevelItem(getRelativeCurrentRow()); +  item->setSelected(true); +  _tree->setCurrentItem(item); + +  _tree->blockSignals(false);  }  //---------------------------------------------------------- @@ -312,8 +380,8 @@ unsigned BaseTrackPat::getUpRow() {  //----------------------------------------------------------  TrackPattern::TrackPattern(QMainWindow* parent, QString name,  			   unsigned firstTick, unsigned lastTick, -			   int quant, PartList* pl, MidiTrack* t)  -  : BaseTrackPat(parent), BasePat(name, firstTick, lastTick, quant) { +			   int quant, PartList* pl, MidiTrack* t, unsigned anr)  +  : BaseTrackPat(parent, anr), BasePat(name, firstTick, lastTick, quant) {    //set attributs    _track = t; @@ -335,7 +403,6 @@ TrackPattern::TrackPattern(QMainWindow* parent, QString name,    parent->addDockWidget(Qt::LeftDockWidgetArea, this, Qt::Horizontal);    //build the treeWidget -  _tree = new QTreeWidget(this);    _tree->setColumnCount(_voiceColumns.size() + _ctrlColumns.size());    QStringList headerLabels;    for(unsigned i = 0; i < _voiceColumns.size(); i++) { @@ -349,13 +416,22 @@ TrackPattern::TrackPattern(QMainWindow* parent, QString name,    //set some display properties    _tree->setRootIsDecorated(false);    _tree->setUniformRowHeights(true); +  _tree->setAlternatingRowColors(true);    QFont font =_tree->font();    font.setFamily(FONT);    _tree->setFont(font); +  font.setPixelSize(FONT_HEIGHT); +  _fontHeight = font.pixelSize() + OFFSET_HEIGHT;    setWidget(_tree); +  //set the range of rows to display +  setFirstRow(10); //TODO : choose accordingly to current position of muse song +  setAbsoluteCurrentRow(10); //TODO : the same +  setRowMag(); +    //fill the treeWidget -  fillTrackPat();   +  fillPattern(); +  selectCurrentRow();    //Resize the columns    for(unsigned i = 0; i < _voiceColumns.size(); i++) @@ -363,7 +439,8 @@ TrackPattern::TrackPattern(QMainWindow* parent, QString name,  } -TrackPattern::~TrackPattern(){} +TrackPattern::~TrackPattern() { +}  void TrackPattern::add(const Event* e, unsigned tick) {    if(e->isNote()) { @@ -392,7 +469,6 @@ void TrackPattern::setQuant(int /*quant*/) {  }  void TrackPattern::buildEventMatrix() { -  _numRow = tick2row(_lastTick) - tick2row(_firstTick);    for(ciPart p = _partList->begin(); p != _partList->end(); p++) {      Part* part = p->second;      EventList* events = part->events(); @@ -404,12 +480,13 @@ void TrackPattern::buildEventMatrix() {    }  } -void TrackPattern::fillTrackPat() { -  getRowMag(); +void TrackPattern::fillPattern() { +  _tree->blockSignals(true); +    _tree->clear();    for(unsigned i = 0; i < _voiceColumns.size(); i++) { -    for(unsigned j = getLowRow(); j < getUpRow(); j++) { -      QTreeWidgetItem* item = _tree->topLevelItem(j); +    for(unsigned j = getFirstRow(); j <= getLastRow(); j++) { +      QTreeWidgetItem* item = _tree->topLevelItem(j - getFirstRow());        if(!item) item = new QTreeWidgetItem(_tree);        VoiceEventPat* vep = (_voiceColumns[i]->getEventsCol())[j];        if(vep) item->setText(i, vep->str()); @@ -419,13 +496,7 @@ void TrackPattern::fillTrackPat() {      //TODO CTRL    } -  //select the line corresponding to the current row -  QTreeWidgetItem* item = _tree->topLevelItem(getCurTreeRow()); -  item->setSelected(true); -} - -void TrackPattern::resizeEvent(QResizeEvent* /*event*/) { -  fillTrackPat(); +  _tree->blockSignals(false);  }  //--------------------------------------------------------------- @@ -434,6 +505,8 @@ void TrackPattern::resizeEvent(QResizeEvent* /*event*/) {  TimingEvent::TimingEvent(unsigned row) {    _row = row;  } +TimingEvent::~TimingEvent() { +}  void TimingEvent::setBarBeatTick(unsigned tick) {    AL::sigmap.tickValues(tick, &_bar, &_beat, &_tick); @@ -478,54 +551,58 @@ TimingPattern::TimingPattern(QMainWindow* parent, QString name,    parent->addDockWidget(Qt::LeftDockWidgetArea, this, Qt::Horizontal);    //build the treeWidget -  _tree = new QTreeWidget(this); -  _tree->setColumnCount(2);    QStringList headerLabels;    _tree->setHeaderLabels(QStringList("bar:bt:tick") + QStringList("row"));     _tree->setHeaderLabels(headerLabels);    //set some display properties    _tree->setRootIsDecorated(false);    _tree->setUniformRowHeights(true); +  _tree->setAlternatingRowColors(true);    QFont font =_tree->font();    font.setFamily(FONT);    _tree->setFont(font); +  font.setPixelSize(FONT_HEIGHT); +  _fontHeight = font.pixelSize() + OFFSET_HEIGHT;    setWidget(_tree); +  //set the range of rows to display +  setFirstRow(10); //TODO : choose accordingly to current position of muse song +  setAbsoluteCurrentRow(10); //TODO : the same +  setRowMag();   +    //fill the treeWidget -  fillTimingPat(); +  fillPattern(); +  selectCurrentRow(); + +  //resize the columns    for(int i = 0; i < _tree->columnCount(); i++)      _tree->resizeColumnToContents(i);  } -TimingPattern::~TimingPattern() {} +TimingPattern::~TimingPattern() { +}  void TimingPattern::buildTimingMatrix() { -  _numRow = 0;    for(unsigned tick = _firstTick; tick <= _lastTick; tick++) {      if(isRow(tick)) {        TimingEvent* te = new TimingEvent(tick2row(tick) - tick2row(_firstTick));        te->setBarBeatTick(tick);        _timingEvents.push_back(te); -      _numRow++;      }    } +  _absoluteNbrRow = _timingEvents.size();  } -void TimingPattern::fillTimingPat() { +void TimingPattern::fillPattern() { +  _tree->blockSignals(true); +    _tree->clear(); -  for(unsigned i = 0; i < getRowMag(); i++) { +  for(unsigned i = getFirstRow(); i <= getLastRow(); i++) {      QTreeWidgetItem* item = new QTreeWidgetItem(_tree); -    TimingEvent* te = _timingEvents[i + getLowRow()]; +    TimingEvent* te = _timingEvents[i];      item->setText(0, te->barBeatTickStr());      item->setText(1, te->rowStr());    } -  //select the line corresponding to the current row -  QTreeWidgetItem* item = _tree->topLevelItem(getCurTreeRow()); -  item->setSelected(true); -   -} - -void TimingPattern::resizeEvent(QResizeEvent* /*event*/) { -  fillTimingPat(); +  _tree->blockSignals(false);  } diff --git a/muse/muse/midiedit/trackpattern.h b/muse/muse/midiedit/trackpattern.h index ba2486a4..52bb87b3 100644 --- a/muse/muse/midiedit/trackpattern.h +++ b/muse/muse/midiedit/trackpattern.h @@ -132,22 +132,67 @@ class CtrlPat {  // BaseTrackPat  //------------------------------------------------------  class BaseTrackPat : public QDockWidget { +  Q_OBJECT +   protected:    QTreeWidget* _tree;    QMainWindow* _parent; -  unsigned _currentRow; -  unsigned _numRow; //contains the number of rows + +  unsigned _rowMag; //contains the number of rows +  unsigned _firstRow; //absolute index of the first row +  unsigned _lastRow; //absolute index of the last row, included +  unsigned _relativeCurrentRow; //index of the current according to the tree +  unsigned _absoluteCurrentRow; //index of the current row according to the +                                //event matrix +  unsigned _absoluteNbrRow; //contains the number of rows of the matrix + +  int _fontHeight; + +  bool _update; //if true then the tree must updated +   public: -  BaseTrackPat(QMainWindow* parent); +  BaseTrackPat(QMainWindow* parent, unsigned anr = 0);    ~BaseTrackPat(); -  void setNumRow(unsigned); -  unsigned getNumRow(); -  unsigned getRowMag(); //returns the number of rows to display according -                        //to the size of the window -  unsigned getCurTreeRow();  -  unsigned getLowRow(); -  unsigned getUpRow();  +  void setRowMag(); //set _rowMag with the number of rows to display according +                    //to the size of the window, adjust _lastRow accordingly, +                    //assum that first row is set appropriately +  void setFirstRow(unsigned f); //set _firstRow with f, that is the absolute index +                                //of the first row, adjust _lastRow appropriately +  void setRelativeCurrentRow(unsigned r); //set _relativeCurrentRow with r +                                          //and _absoluteCurrentRow accordingly +  void setAbsoluteCurrentRow(unsigned a); //set _absoluteCurrentRow with a +                                          //and _relativeCurrentRow accordingly + +  unsigned getRowMag(); +  unsigned getFirstRow(); +  unsigned getLastRow(); +  unsigned getRelativeCurrentRow(); +  unsigned getAbsoluteCurrentRow(); + +  unsigned getAbsoluteNbrRow(); + +  void moveRelativeCurrentRow(unsigned newIndex); //update _firstRow, _lastrow +                                                  //relativeCurrentRow, +                                                  //absoluteCurrentRow, considering +                                                  //that the new relative index is +                                                  //newIndex + +  void resizeEvent(QResizeEvent* /*event*/); + +  virtual void fillPattern() {} //fill the treeWidget with the right window of times +                                //according to _firstRow and _lastRow + + +  void selectCurrentRow(); //block the signals and select the current row + + signals: +  void moveCurrentRow(unsigned i); //send the signal that the current row is moved +                                   //at the relative index i + private slots: +  void currentItemChanged(QTreeWidgetItem* nitem); +  void moveRowFromSignal(unsigned index); +  };  //------------------------------------------------------ @@ -162,7 +207,7 @@ class TrackPattern : public BaseTrackPat, public BasePat {   public:    TrackPattern(QMainWindow* parent, QString name,   	       unsigned firstTick, unsigned lastTick, -	       int quant, PartList* pl, MidiTrack* t); +	       int quant, PartList* pl, MidiTrack* t, unsigned anr = 0);    ~TrackPattern();    void add(const Event* e, unsigned tick); //add the Event e and @@ -172,11 +217,8 @@ class TrackPattern : public BaseTrackPat, public BasePat {    MidiTrack* getTrack() {return _track;}    void setQuant(int quant);    void buildEventMatrix(); -  void fillTrackPat(); //fill the treeWidget with the right set of events -                       //according to _currentRow and the size of the window - protected: -  void resizeEvent(QResizeEvent *event); +  virtual void fillPattern();  };  //------------------------------------------------------ @@ -201,7 +243,7 @@ class TimingEvent {  class TimingPattern : public BasePat, public BaseTrackPat {   private: -  QTreeWidget* _tree; +  //QTreeWidget* _tree;    std::vector<TimingEvent*> _timingEvents;   public:    TimingPattern(QMainWindow* parent, QString name, unsigned firstTick, @@ -209,11 +251,8 @@ class TimingPattern : public BasePat, public BaseTrackPat {    ~TimingPattern();    void buildTimingMatrix(); -  void fillTimingPat(); //fill the treeWidget with the right window of times -                         //according to _currentRow and the size of the window - protected: -  void resizeEvent(QResizeEvent *event); +  virtual void fillPattern();  };  #endif | 
