diff options
| author | Werner Schweer <ws.seh.de> | 2006-09-01 21:05:40 +0000 | 
|---|---|---|
| committer | Werner Schweer <ws.seh.de> | 2006-09-01 21:05:40 +0000 | 
| commit | d7e887c06328cb708bd28d598b92fcc5d2806bd8 (patch) | |
| tree | 1317556f59b14680bfe8e039a9bd29c01199d982 | |
| parent | 98f6d7feddcde52442ee1af5e2254f4d324ebf9b (diff) | |
add new files
| -rw-r--r-- | muse/muse/midiedit/midicmd.cpp | 118 | ||||
| -rw-r--r-- | muse/muse/midiedit/midicmd.h | 52 | 
2 files changed, 170 insertions, 0 deletions
diff --git a/muse/muse/midiedit/midicmd.cpp b/muse/muse/midiedit/midicmd.cpp new file mode 100644 index 00000000..fd3f29ed --- /dev/null +++ b/muse/muse/midiedit/midicmd.cpp @@ -0,0 +1,118 @@ +//============================================================================= +//  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 "midicmd.h" +#include "song.h" +#include "widgets/gatetime.h" +#include "audio.h" + +//--------------------------------------------------------- +//   processEvents +//--------------------------------------------------------- + +void MidiCmd::processEvents(CItemList* items) +      { +      modified = 0; +      song->startUndo(); +      range = 0; //editor->applyTo(); +      process(items, &range); +//      editor->setApplyTo(range); +      song->endUndo(modified); +      } + +//--------------------------------------------------------- +//   eventInRange +//--------------------------------------------------------- + +bool MidiCmd::itemInRange(CItem* item) +      { +      unsigned tick = item->event.tick(); +      bool selected = item->isSelected(); +      bool inLoop   = (tick >= song->lpos()) && (tick < song->rpos()); +      return ( +            (range == 0) +         || (range == 1 && selected) +         || (range == 2 && inLoop) +         || (range == 3 && selected && inLoop) +         ); +      } + +//--------------------------------------------------------- +//   changeEvent +//--------------------------------------------------------- + +void MidiCmd::changeEvent(Event oldEvent, Event newEvent, Part* part) +      { +      audio->msgChangeEvent(oldEvent, newEvent, part, false); +      modified = SC_EVENT_MODIFIED; +      } + +//================================================================== + +//--------------------------------------------------------- +//   ModifyGateTimeCmd +//--------------------------------------------------------- + +class ModifyGateTimeCmd : public MidiCmd +      { +   protected: +      virtual void process(CItemList* items, int* range); + +   public: +      ModifyGateTimeCmd() {} +      }; + +//--------------------------------------------------------- +//   process +//    return true if events are modified +//--------------------------------------------------------- + +void ModifyGateTimeCmd::process(CItemList* items, int* range) +      { +      GateTime w(0); +      w.setRange(*range); +      if (!w.exec()) +            return; +      *range     = w.range();        // all, selected, looped, sel+loop +      int rate   = w.rateVal(); +      int offset = w.offsetVal(); + +      for (iCItem k = items->begin(); k != items->end(); ++k) { +            CItem* item = k->second; +            Event event = item->event; +            if (event.type() != Note) +                  continue; + +            if (itemInRange(item)) { +                  unsigned len   = event.lenTick(); +                  len = rate ? (len * 100) / rate : 1; +                  len += offset; +                  if (len <= 1) +                        len = 1; + +                  if (event.lenTick() != len) { +                        Event newEvent = event.clone(); +                        newEvent.setLenTick(len); +                        changeEvent(event, newEvent, item->part); +                        } +                  } +            } +      } + diff --git a/muse/muse/midiedit/midicmd.h b/muse/muse/midiedit/midicmd.h new file mode 100644 index 00000000..2cfabb26 --- /dev/null +++ b/muse/muse/midiedit/midicmd.h @@ -0,0 +1,52 @@ +//============================================================================= +//  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. +//============================================================================= + +#ifndef __MIDICMD_H__ +#define __MIDICMD_H__ + +#include "citem.h" + +//--------------------------------------------------------- +//   MidiCmd +//    abstract base class for midi commands +//--------------------------------------------------------- + +class MidiCmd { +      int modified; + +   protected: +      int range; + +      // convenience classes for derived classes +      bool itemInRange(CItem* item); +      void changeEvent(Event oldEvent, Event newEvent, Part* part); + +      // virtual functions provided by derived classes +      virtual void process(CItemList*, int*) = 0; + +   public: +      MidiCmd() {} +      virtual ~MidiCmd() {} +      void processEvents(CItemList*); +      }; + + +#endif +  | 
