summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Jung <flo@windfisch.org>2013-09-18 22:40:48 +0200
committerFlorian Jung <flo@windfisch.org>2013-09-18 22:40:48 +0200
commit32589cdd760755d685a76d31469798fde74ad827 (patch)
treed50afd9a2a176846dd6c5b19d734ed9108e44aad
parentaf09b4f881888b97903cda57907cda571be83b18 (diff)
parent48a93993cfce160fb7d4cf0b67b4b77e22db19e5 (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--LICENSE2
-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.txt24
-rw-r--r--muse2/README.svn-branch125
-rw-r--r--muse2/config.h.in2
-rw-r--r--muse2/muse/main.cpp5
-rw-r--r--muse2/muse/miditransform.cpp28
-rw-r--r--muse2/muse/miditransform.h17
-rw-r--r--muse2/muse/mplugins/midiitransform.cpp59
-rw-r--r--muse2/muse/mplugins/midiitransform.h1
-rw-r--r--muse2/muse/widgets/aboutbox.ui2
-rw-r--r--muse2/muse/widgets/aboutbox_impl.cpp4
-rw-r--r--muse2/muse/widgets/itransformbase.ui15
-rwxr-xr-xmuse2/share/scripts/RemoveDoubles52
26 files changed, 232 insertions, 149 deletions
diff --git a/muse2/AUTHORS b/AUTHORS
index db045180..db045180 100644
--- a/muse2/AUTHORS
+++ b/AUTHORS
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.
+
diff --git a/muse2/NEWS b/NEWS
index 96613ef6..96613ef6 100644
--- a/muse2/NEWS
+++ b/NEWS
diff --git a/muse2/README b/README
index 925e3381..e7fe89e9 100644
--- a/muse2/README
+++ b/README
@@ -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()
+