diff options
| -rw-r--r-- | AUTHORS (renamed from muse2/AUTHORS) | 0 | ||||
| -rw-r--r-- | ChangeLog (renamed from muse2/ChangeLog) | 12 | ||||
| -rw-r--r-- | LICENSE | 2 | ||||
| -rw-r--r-- | NEWS (renamed from muse2/NEWS) | 0 | ||||
| -rw-r--r-- | README (renamed from muse2/README) | 31 | ||||
| -rw-r--r-- | README.de (renamed from muse2/README.de) | 2 | ||||
| -rw-r--r-- | README.effects-rack (renamed from muse2/README.effects-rack) | 0 | ||||
| -rw-r--r-- | README.instruments (renamed from muse2/README.instruments) | 0 | ||||
| -rw-r--r-- | README.ladspaguis (renamed from muse2/README.ladspaguis) | 0 | ||||
| -rw-r--r-- | README.shortcuts (renamed from muse2/README.shortcuts) | 0 | ||||
| -rw-r--r-- | README.softsynth (renamed from muse2/README.softsynth) | 0 | ||||
| -rw-r--r-- | README.translate (renamed from muse2/README.translate) | 0 | ||||
| -rw-r--r-- | README.usage (renamed from muse2/README.usage) | 0 | ||||
| -rw-r--r-- | SECURITY (renamed from muse2/SECURITY) | 0 | ||||
| -rw-r--r-- | muse2/CMakeLists.txt | 24 | ||||
| -rw-r--r-- | muse2/README.svn-branch | 125 | ||||
| -rw-r--r-- | muse2/config.h.in | 2 | ||||
| -rw-r--r-- | muse2/muse/main.cpp | 5 | ||||
| -rw-r--r-- | muse2/muse/miditransform.cpp | 28 | ||||
| -rw-r--r-- | muse2/muse/miditransform.h | 17 | ||||
| -rw-r--r-- | muse2/muse/mplugins/midiitransform.cpp | 59 | ||||
| -rw-r--r-- | muse2/muse/mplugins/midiitransform.h | 1 | ||||
| -rw-r--r-- | muse2/muse/widgets/aboutbox.ui | 2 | ||||
| -rw-r--r-- | muse2/muse/widgets/aboutbox_impl.cpp | 4 | ||||
| -rw-r--r-- | muse2/muse/widgets/itransformbase.ui | 15 | ||||
| -rwxr-xr-x | muse2/share/scripts/RemoveDoubles | 52 | 
26 files changed, 232 insertions, 149 deletions
diff --git a/muse2/ChangeLog b/ChangeLog index 37efb381..7a81f9a1 100644 --- a/muse2/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +02.09.2013: +         - Display git hash and date in the about box instead of svn revision (Orcan) +         - Bumped the year string to 2013 in the about box +01.09.2013: +         - Mods/fixes to Midi Input Transformator plugin: (Tim) +           Fixed some bugs when reading procVal2Op from song. +           'Program' is now allowed 'Event type' selection. +           'Toggle' is a new Processing Value#2 Operation. It toggles between Value#1 and Value#2. +           This means for example a standard midi foot controller (which only sends program changes) +            can now be used to send TOGGLED midi CC values, say back to an effects unit +            thus the foot controller becomes like regular 'chained' stomp boxes, operating +            upon individual effects.  14.05.2013:           - When midi in is enabled in drum editor the selected track is moved along with             the triggered key (rj) diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..f94bdcc1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,2 @@ +please see muse2/COPYING. + @@ -5,9 +5,38 @@  Welcome to MusE, the open source MIDI/Audio sequencer.  MusE is distributed under the GNU General Public License (GPL). -Please check out the file COPYING in this directory for more +Please check out the file COPYING in the muse2/ directory for more  details. + +  ============================= +      Features: +  ============================= +       +      MIDI sequencing: +         - Realtime record/playback +         - Midi file import/export +         - Input filter +         - Support for internal softsynth plugins using +           DSSI, VST and MESS +         - much more + +      Audio sequencing: +         - Realtime Record/Playback several mono/stereo inputs/outputs +         - Graphical editing of automation +         - Support for LADSPA, DSSI, VST plugins + +      Technologies supported: +         - LASH - for session control with external LASH enabled applications  +         - JACK - The Jack Audio Connection Kit can be used for audio and midi +         - ALSA midi output +         - Plugin formats: DSSI, VST(i), MESS +         - FLAM plugin guis. +         - Built on QT4 + + + +  ,-----------------------------------------------------------------.  | NOTICE                                                          |  |-----------------------------------------------------------------| diff --git a/muse2/README.de b/README.de index 75aaf57f..b89ae98b 100644 --- a/muse2/README.de +++ b/README.de @@ -6,7 +6,7 @@ Guten Tag!  dies ist MusE, der Open Source MIDI/Audio Sequencer.  MusE steht unter der GNU General Public Licence (GPL). -Für Einzelheiten siehe COPYING. +Für Einzelheiten siehe muse2/COPYING.  ,-----------------------------------------------------------------.  | HINWEIS                                                         | diff --git a/muse2/README.effects-rack b/README.effects-rack index 071ba08e..071ba08e 100644 --- a/muse2/README.effects-rack +++ b/README.effects-rack diff --git a/muse2/README.instruments b/README.instruments index 1bc66e7f..1bc66e7f 100644 --- a/muse2/README.instruments +++ b/README.instruments diff --git a/muse2/README.ladspaguis b/README.ladspaguis index c1b168ff..c1b168ff 100644 --- a/muse2/README.ladspaguis +++ b/README.ladspaguis diff --git a/muse2/README.shortcuts b/README.shortcuts index e5227853..e5227853 100644 --- a/muse2/README.shortcuts +++ b/README.shortcuts diff --git a/muse2/README.softsynth b/README.softsynth index 662ef423..662ef423 100644 --- a/muse2/README.softsynth +++ b/README.softsynth diff --git a/muse2/README.translate b/README.translate index f4741a4d..f4741a4d 100644 --- a/muse2/README.translate +++ b/README.translate diff --git a/muse2/README.usage b/README.usage index 2c799bd3..2c799bd3 100644 --- a/muse2/README.usage +++ b/README.usage diff --git a/muse2/SECURITY b/SECURITY index e0fa68a5..e0fa68a5 100644 --- a/muse2/SECURITY +++ b/SECURITY diff --git a/muse2/CMakeLists.txt b/muse2/CMakeLists.txt index f417347a..66a2ea1b 100644 --- a/muse2/CMakeLists.txt +++ b/muse2/CMakeLists.txt @@ -109,14 +109,22 @@ SET(MusE_SHARE_DIR ${SHARE_INSTALL_PREFIX}/${MusE_INSTALL_NAME})  ## Lib directory  SET(MusE_LIB_DIR ${LIB_INSTALL_DIR}/${MusE_INSTALL_NAME}) -FIND_PROGRAM(SVNVER svnversion) -if (${SVNVER} STREQUAL "SVNVER-NOTFOUND") -      SET (MusE_SVNVER 0) -else (${SVNVER} STREQUAL "SVNVER-NOTFOUND") -      EXEC_PROGRAM( svnversion -            ARGS ${PROJECT_SOURCE_DIR} -            OUTPUT_VARIABLE MusE_SVNVER ) -endif (${SVNVER} STREQUAL "SVNVER-NOTFOUND") +include(FindGit) +if (GIT_FOUND) +      EXEC_PROGRAM( ${GIT_EXECUTABLE} +            ARGS "log -1 --format='%ci'" +            OUTPUT_VARIABLE MusE_GITDATE ) +      EXEC_PROGRAM( ${GIT_EXECUTABLE} +            ARGS "log -1 --format='%t'" +            OUTPUT_VARIABLE MusE_GITHASH ) +      EXEC_PROGRAM( ${GIT_EXECUTABLE} +            ARGS "rev-parse --abbrev-ref HEAD" +            OUTPUT_VARIABLE MusE_GITBRANCH ) +      SET(MusE_GITSTRING "git: ${MusE_GITBRANCH} - ${MusE_GITHASH} - ${MusE_GITDATE}") +else (GIT_FOUND) +      SET(MusE_GITSTRING "") +endif (GIT_FOUND) +  option ( ENABLE_LASH        "Enable LASH Audio Session Handler (or LADISH compatibility layer)"     ON)  option ( ENABLE_OSC         "Enable Lightweight Open Sound Control (liblo) (DSSI also recommended)"  ON) diff --git a/muse2/README.svn-branch b/muse2/README.svn-branch deleted file mode 100644 index 94e44ed8..00000000 --- a/muse2/README.svn-branch +++ /dev/null @@ -1,125 +0,0 @@ -Branches are handy for developing larger features (especially if you -temporarily break muse and then fix it again). You might want to ask -why you shouldn't simply develop in your local working copy, and then -commit a huge chunk. Well, this has multiple reasons: -  o with branches, you'll have a history, because there are many small -    commits. this makes bisecting for finding a bug possible. -  o when you develop your feature publicly, others can check out half-done -    versions, and already test the one half. they also could fix bugs. -  o another advantage of keeping it public is: others can see whether you -    may exclude some use case and inform you about that in time. otherwise -    you'd spend lots of work in a design which was obsolete from the -    beginning. -  o and it shows that there's something going on :) - -also, branching makes "feature freezes" easier, for release planning. - -General note: ^/trunk means [url of the repo]/trunk. when you're inside -a working copy, svn understands the ^/trunk notation. -i assume you're inside some working copy - -whenever merging, make sure you're in the correct directory! - -CREATING A BRANCH -  the following command creates a branch called yourbranch in the branches -  directory, which is built upon the current (NOT the checked out!) trunk -  revision: - -  svn copy ^/trunk ^/branches/yourbranch - -  svn copy does a "light copy", that is, as long as you don't change files, -  they don't occupy any disk space. - -USING THE BRANCH -  you might want to checkout every branch relevant to you into another local -  copy. believe me, it makes life easier. alternatively, svn switch is your -  friend. -  just develop inside the working copy, then commit. - -MERGING WITH THE PARENT BRANCH (in my example: the trunk) -  from time to time, you want to update your branch to represent the -  current trunk plus your changes (and not an ancient trunk plus your -  changes). to be safe, only merge with the parent branch, and only -  merge in one direction (usually from trunk into your branch), unless -  you know what you're doing. if you're reading and not skimming this, -  you're probably NOT knowing. svn help and google are your friends. - -  be in your branch'es working directory root (the dir which is containing -  all the files/dirs also trunk (the parent) is containing as well. - -  svn merge ^/trunk --accept postpone - -  does the job for you. there might be conflicts, when both in your branch -  and in trunk some file has been changes at a similar location. svn by -  default asks you what to do then, which is annoying. --accept postpone -  turns this off, and gives you a summary at the end of the merge. -   -  If There Were Conflicts: -    if any file in "svn status"'s output has a C in front of it, there are -    conflicts. open the file in your editor, and look for markers like -    "<<<<<", "=====" and ">>>>>". these show what code is in the trunk -    (between <<<< and ====), and what code is in your branch (between -    ==== and >>>>) (or vice versa. svn tells you). -    you have to make it work again and save the file. -     -    with "svn resolved FILENAME" or "svn resolved -R some/directory" you -    mark the conflicts for FILENAME or all files below some/directory as -    solved. -   -  Another word about conflicts: there may be conflicts, even if svn doesn't -  note them. ALWAYS recompile the merged code and test it. -   -  if done, you can commit the merge normally using "svn commit" -   -PUTTING YOUR WORK BACK INTO THE PARENT BRANCH (in my example: trunk) -  do a final merge from your parent branch into your branch. compile and -  test. -  then there are several ways to proceed: -    o use svn merge --reintegrate, which doesn't work with the old repo -      version muse is using :( -    o go into the trunk (or the parent branch'es directory), and issue -         svn merge ^/branches/yourbranch --accept theirs-full -      the problem with the merge is, that every previous merge from trunk -      into your branch will be applied a second time, which doesn't work. -      --accept theirs-full will basically use the files in your branch. -      you might want to verify with diff: -         diff -R /path/to/local/trunk /path/to/local/yourbranch -      there should be no differences. -       -      commit that to trunk: svn commit - -      then, "fake-merge" trunk into your branch again. otherwise, with the -      next merge from trunk into your branch, we would have the duplicate -      changes problem again. if you're _SURE_ that you aren't using the -      branch any more, you can leave this step out. - -      svn merge ^/trunk ^/branches/yourbranch --record-only -      svn commit -      - -  this solution is a bit hackish :( but it works - - -NOTES FOR RELEASE BRANCHES -  after creating the release branch, ALL commits which are fixing bugs -  must go into the release branch. ALL commits which are adding features -  must go into trunk or other branches. -  the team should focus on fixing bugs in the release branch. -  to get the fixes into the trunk, from time to time run: - -  svn merge ^/branches/releasebranch ^/trunk -  svn commit (in trunk's local copy) -   -  when releasing the release branch, merge it into the trunk a last time, -  and then never touch the release branch again. -  for the next release, create a new one. - -TAGGING -  when there's any reason for tagging a revision, simply do -  svn copy ^/whatever ^/tags/yourtagname -  read the svn manual for details - -GETTING HELP: -  svn help <command> (usage notes, short explanations) -  google (everything) -  the svn book (->google) (long explanations) diff --git a/muse2/config.h.in b/muse2/config.h.in index ddcd51e1..7dc31c59 100644 --- a/muse2/config.h.in +++ b/muse2/config.h.in @@ -29,7 +29,7 @@  #cmakedefine USE_SSE  #define VERSION          "${MusE_VERSION_FULL}" -#define SVNVERSION       "${MusE_SVNVER}" +#define GITSTRING        "${MusE_GITSTRING}"  #define PACKAGE_NAME     "MusE"  #define DOCDIR           "${MusE_DOC_DIR}"  #define SHAREDIR         "${MusE_SHARE_DIR}" diff --git a/muse2/muse/main.cpp b/muse2/muse/main.cpp index feb14324..2d2165d1 100644 --- a/muse2/muse/main.cpp +++ b/muse2/muse/main.cpp @@ -127,7 +127,10 @@ static void getCapabilities()  static void printVersion(const char* prog)        { -      fprintf(stderr, "%s: Linux Music Editor; Version %s, (svn revision %s)\n", prog, VERSION, SVNVERSION); +      if (strcmp("", GITSTRING)) +            fprintf(stderr, "%s: Linux Music Editor; Version %s, (%s)\n", prog, VERSION, GITSTRING); +      else +            fprintf(stderr, "%s: Linux Music Editor; Version %s\n", prog, VERSION);        }  //--------------------------------------------------------- diff --git a/muse2/muse/miditransform.cpp b/muse2/muse/miditransform.cpp index 3f0f9235..723e067b 100644 --- a/muse2/muse/miditransform.cpp +++ b/muse2/muse/miditransform.cpp @@ -48,7 +48,7 @@ namespace MusECore {  //  // Order of events: -// Note, Poly Pressure, Control, AfterTouch, Pitch Bend, NRPN, RPN +// Note, Poly Pressure, Control, AfterTouch, Pitch Bend, NRPN, RPN, Program  //  #define MIDITRANSFORM_NOTE        0  #define MIDITRANSFORM_POLY        1 @@ -57,11 +57,12 @@ namespace MusECore {  #define MIDITRANSFORM_PITCHBEND   4  #define MIDITRANSFORM_NRPN        5  #define MIDITRANSFORM_RPN         6 +#define MIDITRANSFORM_PROGRAM     7  static int eventTypeTable[] = {        MIDITRANSFORM_NOTE, MIDITRANSFORM_POLY, MIDITRANSFORM_CTRL, MIDITRANSFORM_ATOUCH, -         MIDITRANSFORM_PITCHBEND, MIDITRANSFORM_NRPN, MIDITRANSFORM_RPN +         MIDITRANSFORM_PITCHBEND, MIDITRANSFORM_NRPN, MIDITRANSFORM_RPN, MIDITRANSFORM_PROGRAM        };  static int procVal2Map[] = { 0, 1, 2, 3, 4, 5, 6, 7, 10, 11 }; @@ -545,6 +546,8 @@ void MidiTransformerDialog::transformEvent(MusECore::Event& event, MusECore::Mid                          val = cmt->procVal1a;                    }                    break; +            default: +                  break;              }        if (val < 0)              val = 0; @@ -598,6 +601,7 @@ void MidiTransformerDialog::transformEvent(MusECore::Event& event, MusECore::Mid              case MusECore::ScaleMap:              case MusECore::Keep:              case MusECore::Flip: +            case MusECore::Toggle:                    break;              }        if (val < 0) @@ -634,6 +638,7 @@ void MidiTransformerDialog::transformEvent(MusECore::Event& event, MusECore::Mid              case MusECore::Keep:              case MusECore::Flip:              case MusECore::Value: +            case MusECore::Toggle:                    break;              }        if (len < 0) @@ -666,6 +671,7 @@ void MidiTransformerDialog::transformEvent(MusECore::Event& event, MusECore::Mid              case MusECore::Keep:              case MusECore::Flip:              case MusECore::Value: +            case MusECore::Toggle:                    break;              }        if (pos < 0) @@ -1139,6 +1145,8 @@ void MidiTransformerDialog::procVal1OpSel(int val)                    procVal1a->setEnabled(true);                    procVal1b->setEnabled(true);                    break; +            default: +                  break;              }        procVal1aChanged(data->cmt->procVal1a);        procVal1bChanged(data->cmt->procVal1b); @@ -1152,7 +1160,15 @@ void MidiTransformerDialog::procVal2OpSel(int val)        {        MusECore::TransformOperator op = MusECore::TransformOperator(MusECore::procVal2Map[val]);        data->cmt->procVal2 = op; +      procVal2OpUpdate(op); +      } + +//--------------------------------------------------------- +//   procVal2OpUpdate +//--------------------------------------------------------- +void MidiTransformerDialog::procVal2OpUpdate(MusECore::TransformOperator op) +      {        switch (op) {              case MusECore::Keep:              case MusECore::Invert: @@ -1699,6 +1715,14 @@ bool MidiTransformerDialog::typesMatch(const MusECore::Event& e, unsigned selTyp                    matched = (c == MusECore::MidiController::RPN);                    }              } +         case MIDITRANSFORM_PROGRAM: +            { +            if (e.type() == MusECore::Controller) { +                  MusECore::MidiController::ControllerType c = MusECore::midiControllerType(e.dataA()); +                  matched = (c == MusECore::MidiController::Program); +                  } +            break; +            }           default:              fprintf(stderr, "Error matching type in MidiTransformerDialog: unknown eventtype!\n");              break; diff --git a/muse2/muse/miditransform.h b/muse2/muse/miditransform.h index 626c83c5..5ff78357 100644 --- a/muse2/muse/miditransform.h +++ b/muse2/muse/miditransform.h @@ -50,7 +50,21 @@ enum TransformFunction {  enum TransformOperator {        Keep, Plus, Minus, Multiply, Divide, Fix, Value, Invert, -      ScaleMap, Flip, Dynamic, Random +      ScaleMap, Flip, Dynamic, Random, Toggle +      }; + +class TransformToggleState { +    private: +      bool _ctrlStates[128]; + +    public: +      TransformToggleState()  +      { +        for(int i = 0; i < 128; ++i) +          _ctrlStates[i] = false; +      } +      bool ctrlState(int ctl_num) { return _ctrlStates[ctl_num & 0x7f]; } +      void setCtrlState(int ctl_num, bool state) { _ctrlStates[ctl_num & 0x7f] = state; }        };  extern void writeMidiTransforms(int level, Xml& xml); @@ -93,6 +107,7 @@ class MidiTransformerDialog : public QDialog, public Ui::MidiTransformDialogBase        void procEventTypeSel(int);        void procVal1OpSel(int);        void procVal2OpSel(int); +      void procVal2OpUpdate(MusECore::TransformOperator op);        void procLenOpSel(int);        void procPosOpSel(int);        void funcOpSel(int); diff --git a/muse2/muse/mplugins/midiitransform.cpp b/muse2/muse/mplugins/midiitransform.cpp index 4be99f9d..dea7ce8b 100644 --- a/muse2/muse/mplugins/midiitransform.cpp +++ b/muse2/muse/mplugins/midiitransform.cpp @@ -51,20 +51,21 @@  #define MIDITRANSFORM_PITCHBEND   4  #define MIDITRANSFORM_NRPN        5  #define MIDITRANSFORM_RPN         6 +#define MIDITRANSFORM_PROGRAM     7  namespace MusECore {  static int selTypeTable[] = {        MIDITRANSFORM_NOTE, MIDITRANSFORM_POLY, MIDITRANSFORM_CTRL, MIDITRANSFORM_ATOUCH, -         MIDITRANSFORM_PITCHBEND, MIDITRANSFORM_NRPN, MIDITRANSFORM_RPN +         MIDITRANSFORM_PITCHBEND, MIDITRANSFORM_NRPN, MIDITRANSFORM_RPN, MIDITRANSFORM_PROGRAM        };  static int procTypeTable[] = {        MIDITRANSFORM_POLY, MIDITRANSFORM_CTRL, MIDITRANSFORM_ATOUCH, -         MIDITRANSFORM_PITCHBEND, MIDITRANSFORM_NRPN, MIDITRANSFORM_RPN +         MIDITRANSFORM_PITCHBEND, MIDITRANSFORM_NRPN, MIDITRANSFORM_RPN, MIDITRANSFORM_PROGRAM        }; -static int procVal2Map[] = { 0, 1, 2, 3, 4, 5, 6, 7, 10, 11 }; +static int procVal2Map[] = { 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12 };  struct TDict {        TransformFunction id; @@ -86,6 +87,8 @@ class MidiInputTransformation {        QString name;        QString comment; +      MusECore::TransformToggleState toggleState; +              ValOp selEventOp;        int selType; @@ -145,7 +148,7 @@ class MidiInputTransformation {              procChannelb = 0;              }        void write(int level, Xml& xml) const; -      int apply(MidiRecordEvent& ev) const; +      int apply(MidiRecordEvent& ev);        bool typesMatch(MidiRecordEvent& e, int selType) const;        }; @@ -234,7 +237,7 @@ static bool filterValOp(ValOp op, int val, int val1, int val2)  //            2 - event changed  //--------------------------------------------------------- -int MidiInputTransformation::apply(MidiRecordEvent& event) const +int MidiInputTransformation::apply(MidiRecordEvent& event)        {        int t = event.type(); @@ -312,6 +315,9 @@ int MidiInputTransformation::apply(MidiRecordEvent& event) const              event.setType(ME_CONTROLLER);            }              break; +          case MIDITRANSFORM_PROGRAM: +            event.setType(ME_PROGRAM); +          break;            default:            break;          } @@ -366,6 +372,8 @@ int MidiInputTransformation::apply(MidiRecordEvent& event) const                          val = procVal1a;                    }                    break; +            default: +                  break;              }        if (val < 0)              val = 0; @@ -414,6 +422,28 @@ int MidiInputTransformation::apply(MidiRecordEvent& event) const                          val = procVal2a;                    }                    break; +            case Toggle: +                  { +                    if(event.type() == ME_CONTROLLER) +                    { +                      int num = event.dataA(); +                      bool state = toggleState.ctrlState(num); +                      if(state) +                      { +                        state = false; +                        val = procVal2a; +                      } +                      else +                      { +                        state = true; +                        val = procVal2b; +                      } +                      toggleState.setCtrlState(num, state); +                    } +                    else +                      printf("toggle implemented only for controllers\n"); +                  } +                  break;              case ScaleMap:              case Keep:              case Flip: @@ -469,6 +499,7 @@ int MidiInputTransformation::apply(MidiRecordEvent& event) const              case ScaleMap:              case Keep:              case Flip: +            case Toggle:                    break;              }        if (val < 0) @@ -521,6 +552,7 @@ int MidiInputTransformation::apply(MidiRecordEvent& event) const              case ScaleMap:              case Keep:              case Flip: +            case Toggle:                    break;              }        if (val < 0) @@ -578,6 +610,9 @@ bool MidiInputTransformation::typesMatch(MidiRecordEvent& e, int selType) const                    }              }              break; +         case MIDITRANSFORM_PROGRAM: +            matched = (t == ME_PROGRAM); +            break;           default:              fprintf(stderr, "Error matching type in MidiTransformerDialog: unknown eventtype!\n");              break; @@ -1116,6 +1151,7 @@ void MidiInputTransformDialog::procVal1OpSel(int val)              case MusECore::Random:              case MusECore::ScaleMap:              case MusECore::Dynamic: +            case MusECore::Toggle:                    procVal1a->setDecimals(0);                    procVal1a->setEnabled(true);                    procVal1b->setEnabled(true); @@ -1133,7 +1169,15 @@ void MidiInputTransformDialog::procVal2OpSel(int val)        {        MusECore::TransformOperator op = MusECore::TransformOperator(MusECore::procVal2Map[val]);        cmt->procVal2 = op; +      procVal2OpUpdate(op); +      } +//--------------------------------------------------------- +//   procVal2OpUpdate +//--------------------------------------------------------- + +void MidiInputTransformDialog::procVal2OpUpdate(MusECore::TransformOperator op) +      {        switch (op) {              case MusECore::Keep:              case MusECore::Invert: @@ -1156,6 +1200,7 @@ void MidiInputTransformDialog::procVal2OpSel(int val)                    break;              case MusECore::Random:              case MusECore::Dynamic: +            case MusECore::Toggle:                    procVal2a->setDecimals(0);                    procVal2a->setEnabled(true);                    procVal2b->setEnabled(true); @@ -1192,7 +1237,7 @@ void MidiInputTransformDialog::funcOpSel(int val)        if (isFuncOp) {              procEventOpSel(cmt->procEvent);              procVal1OpSel(cmt->procVal1); -            procVal2OpSel(cmt->procVal2); +            procVal2OpUpdate(cmt->procVal2);              procPortOpSel(cmt->procPort);              procChannelOpSel(cmt->procChannel);              } @@ -1507,6 +1552,7 @@ void MidiInputTransformDialog::procPortOpSel(int val)              case MusECore::Random:              case MusECore::ScaleMap:              case MusECore::Dynamic: +            case MusECore::Toggle:                    procPortVala->setDecimals(0);                    procPortVala->setEnabled(true);                    procPortValb->setEnabled(true); @@ -1563,6 +1609,7 @@ void MidiInputTransformDialog::procChannelOpSel(int val)              case MusECore::Random:              case MusECore::ScaleMap:              case MusECore::Dynamic: +            case MusECore::Toggle:                    procChannelVala->setDecimals(0);                    procChannelVala->setEnabled(true);                    procChannelValb->setEnabled(true); diff --git a/muse2/muse/mplugins/midiitransform.h b/muse2/muse/mplugins/midiitransform.h index 30dabd13..b183bc53 100644 --- a/muse2/muse/mplugins/midiitransform.h +++ b/muse2/muse/mplugins/midiitransform.h @@ -84,6 +84,7 @@ class MidiInputTransformDialog : public QDialog, public Ui::MidiInputTransformDi        void procEventTypeSel(int);        void procVal1OpSel(int);        void procVal2OpSel(int); +      void procVal2OpUpdate(MusECore::TransformOperator op);        void funcOpSel(int);        void presetChanged(QListWidgetItem*);        void nameChanged(const QString&); diff --git a/muse2/muse/widgets/aboutbox.ui b/muse2/muse/widgets/aboutbox.ui index bf14e099..29497422 100644 --- a/muse2/muse/widgets/aboutbox.ui +++ b/muse2/muse/widgets/aboutbox.ui @@ -58,7 +58,7 @@     <item>      <widget class="QLabel" name="textLabel1">       <property name="text"> -      <string>(C) Copyright 1999-2012 Werner Schweer and others. +      <string>(C) Copyright 1999-2013 Werner Schweer and others.  See http://www.muse-sequencer.org for new versions and  more information. diff --git a/muse2/muse/widgets/aboutbox_impl.cpp b/muse2/muse/widgets/aboutbox_impl.cpp index b53e246f..fcb96a1d 100644 --- a/muse2/muse/widgets/aboutbox_impl.cpp +++ b/muse2/muse/widgets/aboutbox_impl.cpp @@ -31,8 +31,8 @@ AboutBoxImpl::AboutBoxImpl()    setupUi(this);    imageLabel->setPixmap(*aboutMuseImage);    QString version(VERSION); -  QString svnrevision(SVNVERSION); -  versionLabel->setText("Version: " + version + " (svn  revision: "+ svnrevision +")"); +  QString gitstring(GITSTRING); +  versionLabel->setText("Version: " + version + (gitstring == QString() ? "" : "\n("+ gitstring + ")"));  }  } diff --git a/muse2/muse/widgets/itransformbase.ui b/muse2/muse/widgets/itransformbase.ui index 52c29a7e..882f383f 100644 --- a/muse2/muse/widgets/itransformbase.ui +++ b/muse2/muse/widgets/itransformbase.ui @@ -94,6 +94,11 @@            <string>RPN</string>           </property>          </item> +        <item> +         <property name="text"> +          <string>Program</string> +         </property> +        </item>         </widget>        </item>        <item row="0" column="2"> @@ -432,6 +437,11 @@            <string>RPN</string>           </property>          </item> +        <item> +         <property name="text"> +          <string>Program</string> +         </property> +        </item>         </widget>        </item>        <item row="1" column="1"> @@ -615,6 +625,11 @@            <string>Random</string>           </property>          </item> +        <item> +         <property name="text"> +          <string>Toggle</string> +         </property> +        </item>         </widget>        </item>        <item row="1" column="4"> diff --git a/muse2/share/scripts/RemoveDoubles b/muse2/share/scripts/RemoveDoubles new file mode 100755 index 00000000..df455922 --- /dev/null +++ b/muse2/share/scripts/RemoveDoubles @@ -0,0 +1,52 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# MusE external midi processing script +# By: Robert Jonsson (c) 2013 +# RemoveDoubles +#============================================================================= +#  MusE +#  Linux Music Editor +#  $Id:$ +# +#  Copyright (C) 2002-2013 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 +#  as published by the Free Software Foundation; either version 2 +#  of the License, or (at your option) any later version. +# +#  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., +#  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +#============================================================================= + +import sys,time +testFile = file(sys.argv[1],"r") +inputEvents = testFile.readlines() +testFile.close() + +outputEvents=[] +#loop through events and omitt doubles +for line in inputEvents: +      if line.startswith('NOTE'): +            tag,tick,pitch,length,velocity = line.split(' ') +            found=False +            for outline in outputEvents: +                outtag,outtick,outpitch,outlength,outvelocity = outline.split(' ') +                if tick == outtick and pitch == outpitch and outvelocity == outvelocity: +                    found=True +                    break +            if not found: +              newline = tag + " " + str(int(tick)) + " " + pitch + " " + length + " " + velocity +              outputEvents.append(newline) + +testFile = file(sys.argv[1],"w") +testFile.writelines(outputEvents) +testFile.close() +  | 
