diff options
author | Florian Jung <flo@windfisch.org> | 2013-09-18 22:40:48 +0200 |
---|---|---|
committer | Florian Jung <flo@windfisch.org> | 2013-09-18 22:40:48 +0200 |
commit | 32589cdd760755d685a76d31469798fde74ad827 (patch) | |
tree | d50afd9a2a176846dd6c5b19d734ed9108e44aad | |
parent | af09b4f881888b97903cda57907cda571be83b18 (diff) | |
parent | 48a93993cfce160fb7d4cf0b67b4b77e22db19e5 (diff) |
Merge branch 'master' into audiomsg_overhaul
-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() + |