summaryrefslogtreecommitdiff
path: root/muse_qt4_evolution/midiplugins
diff options
context:
space:
mode:
authorRobert Jonsson <spamatica@gmail.com>2009-12-27 11:30:35 +0000
committerRobert Jonsson <spamatica@gmail.com>2009-12-27 11:30:35 +0000
commitb703eab295330e6f81564fbb39a10a1a2fdd2f54 (patch)
treee46b5c9a6bc22fd661c15d1d2123f5bf631cef80 /muse_qt4_evolution/midiplugins
parent5d5fa0fdf913907edbc3d2d29a7548f0cb658c94 (diff)
moved old qt4 branch
Diffstat (limited to 'muse_qt4_evolution/midiplugins')
-rw-r--r--muse_qt4_evolution/midiplugins/CMakeLists.txt36
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/CMakeLists.txt50
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/drumglue.cpp250
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/drumglue.h86
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/drumgluegui.cpp68
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/drumgluegui.h41
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/drumgluegui.ui91
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.cpp153
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.h41
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.ui102
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.cpp45
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.h31
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.ui292
-rw-r--r--muse_qt4_evolution/midiplugins/dump/CMakeLists.txt40
-rw-r--r--muse_qt4_evolution/midiplugins/dump/dump.cpp48
-rw-r--r--muse_qt4_evolution/midiplugins/dump/dump.h28
-rw-r--r--muse_qt4_evolution/midiplugins/filter/CMakeLists.txt49
-rw-r--r--muse_qt4_evolution/midiplugins/filter/ctrlcombo.cpp56
-rw-r--r--muse_qt4_evolution/midiplugins/filter/ctrlcombo.h24
-rw-r--r--muse_qt4_evolution/midiplugins/filter/filter.cpp167
-rw-r--r--muse_qt4_evolution/midiplugins/filter/filter.h51
-rw-r--r--muse_qt4_evolution/midiplugins/filter/filtergui.cpp187
-rw-r--r--muse_qt4_evolution/midiplugins/filter/filtergui.h57
-rw-r--r--muse_qt4_evolution/midiplugins/filter/filtergui.ui269
-rw-r--r--muse_qt4_evolution/midiplugins/libmidiplugin/CMakeLists.txt26
-rw-r--r--muse_qt4_evolution/midiplugins/libmidiplugin/evdata.h64
-rw-r--r--muse_qt4_evolution/midiplugins/libmidiplugin/mempi.cpp81
-rw-r--r--muse_qt4_evolution/midiplugins/libmidiplugin/mempi.h97
-rw-r--r--muse_qt4_evolution/midiplugins/libmidiplugin/midievent.cpp21
-rw-r--r--muse_qt4_evolution/midiplugins/libmidiplugin/midievent.h87
-rw-r--r--muse_qt4_evolution/midiplugins/metronom/CMakeLists.txt46
-rw-r--r--muse_qt4_evolution/midiplugins/metronom/metronom.cpp167
-rw-r--r--muse_qt4_evolution/midiplugins/metronom/metronom.h53
-rw-r--r--muse_qt4_evolution/midiplugins/metronom/metronomgui.cpp75
-rw-r--r--muse_qt4_evolution/midiplugins/metronom/metronomgui.h36
-rw-r--r--muse_qt4_evolution/midiplugins/metronom/metronomgui.ui150
-rw-r--r--muse_qt4_evolution/midiplugins/splitlayer/CMakeLists.txt45
-rw-r--r--muse_qt4_evolution/midiplugins/splitlayer/splitlayer.cpp209
-rw-r--r--muse_qt4_evolution/midiplugins/splitlayer/splitlayer.h69
-rw-r--r--muse_qt4_evolution/midiplugins/splitlayer/splitlayergui.cpp263
-rw-r--r--muse_qt4_evolution/midiplugins/splitlayer/splitlayergui.h65
-rw-r--r--muse_qt4_evolution/midiplugins/transform/CMakeLists.txt45
-rw-r--r--muse_qt4_evolution/midiplugins/transform/transform.cpp904
-rw-r--r--muse_qt4_evolution/midiplugins/transform/transform.h126
-rw-r--r--muse_qt4_evolution/midiplugins/transform/transform.ui616
-rw-r--r--muse_qt4_evolution/midiplugins/trigg/CMakeLists.txt47
-rw-r--r--muse_qt4_evolution/midiplugins/trigg/trigg.cpp131
-rw-r--r--muse_qt4_evolution/midiplugins/trigg/trigg.h49
-rw-r--r--muse_qt4_evolution/midiplugins/trigg/trigggui.cpp56
-rw-r--r--muse_qt4_evolution/midiplugins/trigg/trigggui.h48
-rw-r--r--muse_qt4_evolution/midiplugins/trigg/trigggui.ui109
51 files changed, 5947 insertions, 0 deletions
diff --git a/muse_qt4_evolution/midiplugins/CMakeLists.txt b/muse_qt4_evolution/midiplugins/CMakeLists.txt
new file mode 100644
index 00000000..465e1983
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/CMakeLists.txt
@@ -0,0 +1,36 @@
+#=============================================================================
+# 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.
+#=============================================================================
+
+subdirs(
+ libmidiplugin
+ splitlayer
+ filter
+ metronom
+ transform
+ trigg
+ dump
+ drumglue
+ )
+
+set ( CMAKE_CXX_FLAGS
+ "${CMAKE_CXX_FLAGS} -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SHARED -fPIC"
+ )
+
+set ( CMAKE_LDD_FLAGS -module -avoid-version )
diff --git a/muse_qt4_evolution/midiplugins/drumglue/CMakeLists.txt b/muse_qt4_evolution/midiplugins/drumglue/CMakeLists.txt
new file mode 100644
index 00000000..f824c54b
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/CMakeLists.txt
@@ -0,0 +1,50 @@
+#=============================================================================
+# MusE
+# Linux Music Editor
+# $Id:$
+#
+# Copyright (C) 2002-2008 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.
+#=============================================================================
+
+QT4_WRAP_CPP ( drumglue_mocs drumgluegui.h globalinstrumentview.h outputinstrumentview.h )
+QT4_WRAP_UI ( drumglue_uis drumgluegui.ui globalinstrumentview.ui outputinstrumentview.ui )
+
+add_library ( drumglue SHARED
+ drumglue.cpp
+ drumgluegui.cpp
+ drumgluegui.h
+ globalinstrumentview.cpp
+ globalinstrumentview.h
+ outputinstrumentview.cpp
+ outputinstrumentview.h
+ ${drumglue_mocs}
+ ${drumglue_uis}
+ )
+
+target_link_libraries( drumglue
+ midiplugin awl
+ ${QT_LIBRARIES}
+ )
+
+# - tell cmake to name target name.so instead of
+# libname.so
+# - use precompiled header files
+set_target_properties ( drumglue
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /${CMAKE_INSTALL_LIBDIR}/${MusE_INSTALL_NAME}/midiplugins/ drumglue )
+
diff --git a/muse_qt4_evolution/midiplugins/drumglue/drumglue.cpp b/muse_qt4_evolution/midiplugins/drumglue/drumglue.cpp
new file mode 100644
index 00000000..7a9b6ed2
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/drumglue.cpp
@@ -0,0 +1,250 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+//
+// drumglue - filter
+//
+// (C) Copyright 2008 Robert Jonsson (rj@spamatica.se)
+// (C) Copyright 2005- Werner Schweer (ws@seh.de)
+// Copyright: See COPYING file that comes with this distribution
+//=========================================================
+
+#include "drumgluegui.h"
+#include "drumglue.h"
+#include "midi.h"
+#include "midievent.h"
+
+
+
+//---------------------------------------------------------
+// DrumInstrument - get next index
+// - next output instrument to use
+//---------------------------------------------------------
+int DrumInstrument::getNextIndex(int /*velocity*/)
+{
+ // for now we simply do a round robin
+ //
+ // future improvements are to keep track of
+ // the time since the last hit and the
+ // weight set for each instrument.
+ // the incoming velocity should be checked that it's in range
+ if (outputInstruments.size() == 0)
+ return -1;
+
+ if (lastOutputIndex+1 > outputInstruments.size()-1)
+ return 0;
+ else
+ return lastOutputIndex+1;
+}
+
+//---------------------------------------------------------
+// DrumInstrument - get velocity
+// - velocity value to use
+//---------------------------------------------------------
+int DrumInstrument::getVelocity(int /*index*/, int velocity)
+{
+ // for now we just return the same velocity
+ // future improvements are to allow for some
+ return velocity;
+}
+
+
+//---------------------------------------------------------
+// DrumGlue - constructor
+//---------------------------------------------------------
+DrumGlue::DrumGlue(const char* name, const MempiHost* h)
+ : Mempi(name, h)
+ {
+ gui = 0;
+ saveData = NULL;
+ }
+
+//---------------------------------------------------------
+// DrumGlue - destructor
+//---------------------------------------------------------
+DrumGlue::~DrumGlue()
+ {
+ if (gui)
+ delete gui;
+ if (saveData)
+ delete saveData;
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool DrumGlue::init()
+ {
+ gui = new DrumGlueGui(this, 0);
+ gui->setWindowTitle("MusE: "+QString(name()));
+ gui->show();
+ return false;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void DrumGlue::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ QPoint pos(gui->pos());
+ QSize size(gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void DrumGlue::setGeometry(int x, int y, int w, int h)
+ {
+ gui->resize(QSize(w, h));
+ gui->move(QPoint(x, y));
+ }
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+
+void DrumGlue::process(unsigned , unsigned , MidiEventList* il, MidiEventList* ol)
+ {
+
+ for (iMidiEvent i = il->begin(); i != il->end(); ++i) {
+ MidiEvent temp=*i;
+ if (temp.isNote() && !temp.isNoteOff())
+ {
+ foreach(DrumInstrument *di, drumInstruments) {
+ if (temp.dataA() == di->inKey) {
+ int inVelocity = temp.dataB();
+ int instrumentIdx = di->getNextIndex(inVelocity);
+ if (instrumentIdx==-1) {
+ // no instrument defined, yet, skip it
+ break;
+ }
+ int outKey = di->outputInstruments[instrumentIdx]->outKey;
+ int outVelocity= di->getVelocity(instrumentIdx, inVelocity);
+ printf("inKey=%d outKey =%d outVelocity=%d instrumentIdx=%d\n", di->inKey, outKey, outVelocity, instrumentIdx);
+ temp.setA(outKey);
+ temp.setB(outVelocity);
+
+ ol->insert(temp); // note on
+
+ temp.setB(0);
+ ol->insert(temp); // note off
+
+ di->lastOutputIndex = instrumentIdx;
+ di->outputTime = temp.time();
+ break;
+ }
+ }
+ }
+ if (temp.isNoteOff()) ; // we just throw it away, we will insert noteoffs for each note on
+ }
+ }
+
+//
+// getInitData - return configuration to MusE
+//
+void DrumGlue::getInitData(int* n, const unsigned char** p) const
+ {
+ QString saveStr;
+
+ foreach (DrumInstrument *di, drumInstruments) {
+ QString drumline = "DRUM " +di->name + " " + QString("%1").arg(di->inKey) + "\n";
+ saveStr.append(drumline);
+ foreach (DrumOutputInstrument *doi, di->outputInstruments) {
+ QString outputline = "OUTPUT " +
+ QString("%1").arg(doi->outKey) + " " +
+ QString("%1").arg(doi->lowestVelocity) + " " +
+ QString("%1").arg(doi->highestVelocity) + " " +
+ QString("%1").arg(doi->prefer) + " " +
+ QString("%1").arg(doi->preferFast) + "\n";
+ saveStr.append(outputline);
+
+ }
+ }
+
+ *n = saveStr.length();
+
+ if (saveData)
+ delete saveData;
+
+
+ saveData = new unsigned char[saveStr.length()];
+
+ strncpy((char*)saveData, saveStr.toLatin1().data(), saveStr.length());
+ saveData[saveStr.length()]=0;
+ printf("getInitData -\n%s\n",saveData);
+
+ *p = saveData;
+
+ }
+
+void DrumGlue::setInitData(int n, const unsigned char* p)
+ {
+ if (saveData)
+ delete saveData;
+ saveData = new unsigned char[n+1];
+
+ strncpy((char*)saveData,(char*)p,n);
+ saveData[n]=0;
+
+ QString loadStr = (char*)saveData;
+ printf("setInitData -\n%s\n",saveData);
+
+ QStringList loadList = loadStr.split("\n");
+
+ DrumInstrument *currentInstrument=NULL;
+ foreach (QString line, loadList) {
+ QStringList splitLine = line.split(" ");
+ if (splitLine[0] == "DRUM") {
+ if (currentInstrument)
+ drumInstruments.append(currentInstrument);
+
+ currentInstrument = new DrumInstrument();
+ currentInstrument->name = splitLine[1];
+ currentInstrument->inKey = splitLine[2].toInt();
+ }
+ if (splitLine[0] == "OUTPUT") {
+ DrumOutputInstrument *doi = new DrumOutputInstrument;
+ doi->outKey = splitLine[1].toInt();
+ doi->lowestVelocity = splitLine[2].toInt();
+ doi->highestVelocity = splitLine[3].toInt();
+ doi->prefer = splitLine[4].toInt();
+ doi->preferFast = splitLine[5].toInt();
+ currentInstrument->outputInstruments.append(doi);
+ }
+ }
+ if (currentInstrument)
+ drumInstruments.append(currentInstrument);
+
+ if (gui)
+ gui->init();
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+static Mempi* instantiate(const char* name, const MempiHost* h)
+ {
+ return new DrumGlue(name, h);
+ }
+
+extern "C" {
+ static MEMPI descriptor = {
+ "DrumGlue",
+ "Drum instrument mux filter",
+ "0.1", // filter version string
+ MEMPI_FILTER, // plugin type
+ MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
+ instantiate
+ };
+
+ const MEMPI* mempi_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/drumglue/drumglue.h b/muse_qt4_evolution/midiplugins/drumglue/drumglue.h
new file mode 100644
index 00000000..49a19b55
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/drumglue.h
@@ -0,0 +1,86 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+//
+// drumglue - filter
+//
+// (C) Copyright 2008 Robert Jonsson (rj@spamatica.se)
+// (C) Copyright 2005- Werner Schweer (ws@seh.de)
+// Copyright: See COPYING file that comes with this distribution
+//=========================================================
+
+#ifndef __DRUMGLUE_H__
+#define __DRUMGLUE_H__
+
+#include <QtGui>
+
+#include "../libmidiplugin/mempi.h"
+
+#include "drumgluegui.h"
+//---------------------------------------------------------
+// drumglue - filter
+//---------------------------------------------------------
+
+struct DrumOutputInstrument {
+ int outKey; // key to send
+ int lowestVelocity; // lower velocity valid for this instrument
+ int highestVelocity; // highest velocity valid for this instrument
+ bool prefer; // true if this instrument is preferred
+ bool preferFast; // true if this instrument is preferred for fast transitions
+};
+
+class DrumInstrument {
+ public:
+ DrumInstrument()
+ {
+ inKey=0;
+ lastOutputIndex=0;
+ outputTime=0;
+ }
+
+ int getNextIndex(int velocity);
+ int getVelocity(int index, int velocity);
+
+
+ int inKey; // the key which triggers this instrument
+ QString name;
+ QList <DrumOutputInstrument *> outputInstruments;
+
+// storage of runtime variables
+ int lastOutputIndex;
+ unsigned int outputTime;
+};
+
+
+
+
+class DrumGlue : public Mempi {
+ friend class DrumGlueGui;
+ friend class GlobalInstrumentView;
+ friend class OutputInstrumentView;
+
+ QList<DrumInstrument *> drumInstruments;
+
+ DrumGlueGui* gui;
+
+ mutable unsigned char *saveData;
+
+ virtual void process(unsigned, unsigned, MidiEventList*, MidiEventList*);
+
+ public:
+ DrumGlue(const char* name, const MempiHost*);
+ ~DrumGlue();
+ virtual bool init();
+
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const { return gui->isVisible(); }
+ virtual void showGui(bool val) { gui->setShown(val); }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+
+ virtual void getInitData(int*, const unsigned char**) const;
+ virtual void setInitData(int, const unsigned char*);
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/drumglue/drumgluegui.cpp b/muse_qt4_evolution/midiplugins/drumglue/drumgluegui.cpp
new file mode 100644
index 00000000..562adf2c
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/drumgluegui.cpp
@@ -0,0 +1,68 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+//
+// (C) Copyright 2008 Robert Jonsson (rj@spamatica.se)
+// (C) Copyright 2005- Werner Schweer (ws@seh.de)
+// Copyright: See COPYING file that comes with this distribution
+//=========================================================
+
+#include "drumgluegui.h"
+#include "drumglue.h"
+#include "globalinstrumentview.h"
+
+//---------------------------------------------------------
+// DrumGlueGui
+//---------------------------------------------------------
+
+DrumGlueGui::DrumGlueGui(DrumGlue* f, QWidget* parent)
+ : QDialog(parent)
+ {
+ drumGlue = f;
+ setupUi(this);
+ instrumentsTabWidget->clear();
+
+ connect (addInstrumentButton, SIGNAL(clicked()), this, SLOT(addInstrument()));
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+void DrumGlueGui::init()
+ {
+ foreach(DrumInstrument *di, drumGlue->drumInstruments) {
+ GlobalInstrumentView *giView = new GlobalInstrumentView(drumGlue,this, di->name);
+ instrumentsTabWidget->addTab(giView, di->name);
+ }
+ }
+
+//---------------------------------------------------------
+// addInstrument
+//---------------------------------------------------------
+void DrumGlueGui::addInstrument()
+ {
+ bool ok;
+ QString text = QInputDialog::getText(this, tr("Instrument name"),
+ tr("Name of instrument:"), QLineEdit::Normal,
+ "", &ok);
+ if (ok && !text.isEmpty()) {
+ DrumInstrument *di = new DrumInstrument();
+ di->name = text;
+ drumGlue->drumInstruments.append(di);
+ GlobalInstrumentView *giView = new GlobalInstrumentView(drumGlue,this, text);
+ instrumentsTabWidget->addTab(giView, text);
+ }
+ }
+
+//---------------------------------------------------------
+// removeInstrument
+//---------------------------------------------------------
+void DrumGlueGui::removeInstrument()
+ {
+ int ret = QMessageBox::warning(this, tr("Remove instrument"),
+ tr("Are you sure you want to remove current instrument?"),
+ QMessageBox::No,
+ QMessageBox::Yes);
+ if (ret == QMessageBox::Yes)
+ instrumentsTabWidget->removeTab(instrumentsTabWidget->currentIndex());
+ }
diff --git a/muse_qt4_evolution/midiplugins/drumglue/drumgluegui.h b/muse_qt4_evolution/midiplugins/drumglue/drumgluegui.h
new file mode 100644
index 00000000..cdbac7a3
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/drumgluegui.h
@@ -0,0 +1,41 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+//
+// (C) Copyright 2008 Robert Jonsson (rj@spamatica.se)
+// (C) Copyright 2005- Werner Schweer (ws@seh.de)
+// Copyright: See COPYING file that comes with this distribution
+//=========================================================
+
+#ifndef __DRUMGLUEGUI_H__
+#define __DRUMGLUEGUI_H__
+
+//#include "ui_drumglue.h"
+#include "ui_drumgluegui.h"
+
+
+//---------------------------------------------------------
+// DrumGlueGui
+//---------------------------------------------------------
+class DrumGlue;
+
+class DrumGlueGui : public QDialog, public Ui::DrumGlueBase {
+ Q_OBJECT
+
+ DrumGlue* drumGlue;
+
+ signals:
+ void hideWindow();
+
+ public:
+ DrumGlueGui(DrumGlue*, QWidget* parent=0);
+ void init();
+
+ private slots:
+ void addInstrument();
+ void removeInstrument();
+
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/drumglue/drumgluegui.ui b/muse_qt4_evolution/midiplugins/drumglue/drumgluegui.ui
new file mode 100644
index 00000000..ddd402c4
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/drumgluegui.ui
@@ -0,0 +1,91 @@
+<ui version="4.0" >
+ <class>DrumGlueBase</class>
+ <widget class="QDialog" name="DrumGlueBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>444</width>
+ <height>270</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Drumglue - midi filter</string>
+ </property>
+ <layout class="QGridLayout" >
+ <item row="0" column="0" >
+ <layout class="QVBoxLayout" >
+ <item>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QPushButton" name="addInstrumentButton" >
+ <property name="text" >
+ <string>Add instrument</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton" >
+ <property name="text" >
+ <string>Remove current</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="font" >
+ <font>
+ <family>Arial</family>
+ <pointsize>14</pointsize>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>DrumGlue 0.1</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTabWidget" name="instrumentsTabWidget" >
+ <property name="tabPosition" >
+ <enum>QTabWidget::North</enum>
+ </property>
+ <property name="tabShape" >
+ <enum>QTabWidget::Rounded</enum>
+ </property>
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <property name="elideMode" >
+ <enum>Qt::ElideLeft</enum>
+ </property>
+ <widget class="QWidget" name="Tab1" >
+ <attribute name="title" >
+ <string>Snare</string>
+ </attribute>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.cpp b/muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.cpp
new file mode 100644
index 00000000..5ca81054
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.cpp
@@ -0,0 +1,153 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+//
+// (C) Copyright 2008 Robert Jonsson (rj@spamatica.se)
+// (C) Copyright 2005- Werner Schweer (ws@seh.de)
+// Copyright: See COPYING file that comes with this distribution
+//=========================================================
+
+#include "globalinstrumentview.h"
+#include "outputinstrumentview.h"
+#include "drumglue.h"
+
+//---------------------------------------------------------
+// GlobalInstrumentView
+//---------------------------------------------------------
+
+GlobalInstrumentView::GlobalInstrumentView(DrumGlue* f, QWidget* parent, QString name)
+ : QWidget(parent)
+ {
+ setupUi(this);
+ drumGlue = f;
+
+ instrumentName=name;
+
+ DrumInstrument *di =getCurrentOutputInstrument();
+ printf("di->inKey=%d\n", di->inKey);
+ if (di)
+ inKeySpinBox->setValue(di->inKey);
+
+ connect (addOutputButton, SIGNAL(clicked()), this, SLOT(addOutput()));
+ connect (editOutputButton, SIGNAL(clicked()), this, SLOT(editOutput()));
+ connect (removeOutputButton, SIGNAL(clicked()), this, SLOT(removeOutput()));
+ connect (inKeySpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateInKey()));
+ updateList();
+ }
+
+
+DrumInstrument *GlobalInstrumentView::getCurrentOutputInstrument()
+{
+ // get the global instrument belonging to this instance
+ QList<DrumInstrument *>::iterator iter = drumGlue->drumInstruments.begin();
+ while(iter != drumGlue->drumInstruments.end()) {
+ printf("name = %s instrumentName= %s\n", (*iter)->name.toLatin1().data(), instrumentName.toLatin1().data());
+ if ((*iter)->name == instrumentName) {
+ break;
+ }
+ iter++;
+ }
+ if (iter == drumGlue->drumInstruments.end()) {
+ printf("Reached the end without getting a hit\n");
+ return NULL;
+ }
+ return *iter;
+}
+
+void GlobalInstrumentView::addOutput()
+ {
+ DrumInstrument *di = getCurrentOutputInstrument();
+ if (!di)
+ return;
+ // create new output
+ DrumOutputInstrument *doi = new DrumOutputInstrument;
+ di->outputInstruments.append(doi);
+
+ OutputInstrumentView *outputView = new OutputInstrumentView(doi,this);
+ int res = outputView->exec();
+ if (res == QDialog::Rejected) {
+ // roll back
+ di->outputInstruments.removeAll(doi);
+ delete doi;
+ }
+ delete outputView;
+ updateList();
+ }
+
+void GlobalInstrumentView::editOutput()
+ {
+ DrumInstrument *di = getCurrentOutputInstrument();
+
+ int currIdx = outputListWidget->currentRow();
+ if (currIdx < 0 || currIdx >= di->outputInstruments.size()) {
+ printf("out of range!!\n");
+ return;
+ }
+
+ DrumOutputInstrument *doi = di->outputInstruments[currIdx];
+
+ DrumOutputInstrument doi_backup = *doi;
+ OutputInstrumentView *outputView = new OutputInstrumentView(doi,this);
+ int res = outputView->exec();
+ if (res == QDialog::Rejected) {
+ // roll back
+ *doi = doi_backup;
+ }
+ delete outputView;
+ updateList();
+ }
+
+void GlobalInstrumentView::removeOutput()
+ {
+ int ret = QMessageBox::warning(this, tr("Remove output"),
+ tr("Are you sure you want to remove current output?"),
+ QMessageBox::No,
+ QMessageBox::Yes);
+ if (ret == QMessageBox::Yes) {
+ DrumInstrument *di = getCurrentOutputInstrument();
+
+ int currIdx = outputListWidget->currentRow();
+ if (currIdx < 0 || currIdx >= di->outputInstruments.size()) {
+ printf("out of range!!\n");
+ return;
+ }
+
+ DrumOutputInstrument *doi = di->outputInstruments[currIdx];
+ di->outputInstruments.removeAll(doi);
+ delete doi;
+ }
+ updateList();
+ }
+
+void GlobalInstrumentView::updateList()
+{
+ printf("updateList\n");
+ outputListWidget->clear();
+
+ QList<DrumInstrument *>::iterator iter = drumGlue->drumInstruments.begin();
+ while(iter != drumGlue->drumInstruments.end()) {
+ printf("name = %s instrumentName= %s\n", (*iter)->name.toLatin1().data(), instrumentName.toLatin1().data());
+ if ((*iter)->name == instrumentName) {
+ printf("updating current list\n");
+ foreach (DrumOutputInstrument *doi, (*iter)->outputInstruments) {
+ QListWidgetItem *outDrumItem = new QListWidgetItem(outputListWidget);
+ QString str = QString("%1 %2 %3 %4 %5").arg(doi->outKey).arg(doi->lowestVelocity).arg(doi->highestVelocity).arg(doi->prefer).arg(doi->preferFast);
+ printf("setting item to %s\n",str.toLatin1().data());
+ outDrumItem->setText(str);
+ }
+ }
+ iter++;
+ }
+}
+
+void GlobalInstrumentView::updateInKey()
+{
+ QList<DrumInstrument *>::iterator iter = drumGlue->drumInstruments.begin();
+ while(iter != drumGlue->drumInstruments.end()) {
+ if ((*iter)->name == instrumentName) {
+ (*iter)->inKey = inKeySpinBox->value();
+ }
+ iter++;
+ }
+
+}
diff --git a/muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.h b/muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.h
new file mode 100644
index 00000000..f923ec49
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.h
@@ -0,0 +1,41 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+//
+// (C) Copyright 2008 Robert Jonsson (rj@spamatica.se)
+// (C) Copyright 2005- Werner Schweer (ws@seh.de)
+// Copyright: See COPYING file that comes with this distribution
+//=========================================================
+
+#ifndef __GLOBALINSTRUMENTVIEW_H__
+#define __GLOBALINSTRUMENTVIEW_H__
+
+#include "ui_globalinstrumentview.h"
+
+#include "drumglue.h"
+//---------------------------------------------------------
+// GlobalInstrumentView
+//---------------------------------------------------------
+class DrumGlue;
+
+class GlobalInstrumentView : public QWidget, public Ui::GlobalInstrumentViewBase {
+ Q_OBJECT
+
+ DrumGlue *drumGlue;
+ QString instrumentName;
+ DrumInstrument *getCurrentOutputInstrument();
+
+ public:
+ GlobalInstrumentView(DrumGlue*, QWidget* parent, QString name);
+ private slots:
+ void addOutput();
+ void editOutput();
+ void removeOutput();
+ void updateInKey();
+
+ public slots:
+ void updateList();
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.ui b/muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.ui
new file mode 100644
index 00000000..e817906a
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/globalinstrumentview.ui
@@ -0,0 +1,102 @@
+<ui version="4.0" >
+ <class>GlobalInstrumentViewBase</class>
+ <widget class="QWidget" name="GlobalInstrumentViewBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>386</width>
+ <height>256</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Form</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="spacing" >
+ <number>-1</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="spacing" >
+ <number>-1</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" >
+ <property name="spacing" >
+ <number>-1</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Midi input key:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="inKeySpinBox" >
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="addOutputButton" >
+ <property name="text" >
+ <string>Add output</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="removeOutputButton" >
+ <property name="text" >
+ <string>Remove output</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="editOutputButton" >
+ <property name="text" >
+ <string>Edit output</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Midi output definitions:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QListWidget" name="outputListWidget" />
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.cpp b/muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.cpp
new file mode 100644
index 00000000..2e4c97ce
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.cpp
@@ -0,0 +1,45 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filtergui.cpp,v 1.4 2005/11/06 17:49:34 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "outputinstrumentview.h"
+#include "drumglue.h"
+#include <QtGui>
+//---------------------------------------------------------
+// OutputInstrumentView
+//---------------------------------------------------------
+
+OutputInstrumentView::OutputInstrumentView(DrumOutputInstrument* doi, QWidget* parent)
+ : QDialog(parent)
+ {
+ outputInstrument= doi;
+ setupUi(this);
+
+ midiOutputSpinBox->setValue(outputInstrument->outKey);
+ highRangeSlider->setValue(outputInstrument->highestVelocity);
+ lowRangeSlider->setValue(outputInstrument->lowestVelocity);
+ preferWhenFastCheckBox->setChecked(outputInstrument->preferFast);
+ highProbabiltyCheckBox->setChecked(outputInstrument->prefer);
+
+
+ connect(midiOutputSpinBox,SIGNAL(valueChanged(int)),this, SLOT(update()));
+ connect(highRangeSlider,SIGNAL(valueChanged(int)),this, SLOT(update()));
+ connect(lowRangeSlider,SIGNAL(valueChanged(int)),this, SLOT(update()));
+ connect(preferWhenFastCheckBox,SIGNAL(stateChanged(int)),this, SLOT(update()));
+ connect(highProbabiltyCheckBox,SIGNAL(stateChanged(int)),this, SLOT(update()));
+ }
+
+
+void OutputInstrumentView::update()
+{
+ outputInstrument->outKey = midiOutputSpinBox->value();
+ outputInstrument->highestVelocity = highRangeSlider->value();
+ outputInstrument->lowestVelocity = lowRangeSlider->value();
+ outputInstrument->preferFast = preferWhenFastCheckBox->isChecked();
+ outputInstrument->prefer = highProbabiltyCheckBox->isChecked();
+
+}
diff --git a/muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.h b/muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.h
new file mode 100644
index 00000000..b2b5dc12
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.h
@@ -0,0 +1,31 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+//
+// (C) Copyright 2008 Robert Jonsson (rj@spamatica.se)
+// (C) Copyright 2005- Werner Schweer (ws@seh.de)
+// Copyright: See COPYING file that comes with this distribution
+//=========================================================
+
+#ifndef __OUTPUTINSTRUMENTVIEW_H__
+#define __OUTPUTINSTRUMENTVIEW_H__
+
+#include "ui_outputinstrumentview.h"
+
+#include "drumglue.h"
+//---------------------------------------------------------
+// OutputInstrumentView
+//---------------------------------------------------------
+class DrumGlue;
+
+class OutputInstrumentView : public QDialog, public Ui::OutputInstrumentViewBase {
+ Q_OBJECT
+ DrumOutputInstrument *outputInstrument;
+ public:
+ OutputInstrumentView(DrumOutputInstrument*, QWidget* parent);
+ private slots:
+ void update();
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.ui b/muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.ui
new file mode 100644
index 00000000..250c2010
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/drumglue/outputinstrumentview.ui
@@ -0,0 +1,292 @@
+<ui version="4.0" >
+ <class>OutputInstrumentViewBase</class>
+ <widget class="QDialog" name="OutputInstrumentViewBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>449</width>
+ <height>150</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Dialog</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <item>
+ <layout class="QVBoxLayout" >
+ <item>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Midi output key:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="midiOutputSpinBox" >
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="highProbabiltyCheckBox" >
+ <property name="toolTip" >
+ <string>If this instrument is to be used more often than others check this box.</string>
+ </property>
+ <property name="statusTip" >
+ <string/>
+ </property>
+ <property name="text" >
+ <string>Prefer always</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="preferWhenFastCheckBox" >
+ <property name="toolTip" >
+ <string>If this instrument is to be used more often when used often, check this checkbox.</string>
+ </property>
+ <property name="statusTip" >
+ <string/>
+ </property>
+ <property name="text" >
+ <string>Prefer when fast</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="Line" name="line_4" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="label_3" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string> [low]</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_2" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_3" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_4" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="layoutDirection" >
+ <enum>Qt::RightToLeft</enum>
+ </property>
+ <property name="text" >
+ <string> [high]</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <item>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="lowRangeLabel" >
+ <property name="minimumSize" >
+ <size>
+ <width>24</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="lowRangeSlider" >
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string> use in range </string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" >
+ <item>
+ <widget class="QLabel" name="highRangeLabel" >
+ <property name="minimumSize" >
+ <size>
+ <width>24</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="text" >
+ <string>127</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="highRangeSlider" >
+ <property name="minimum" >
+ <number>1</number>
+ </property>
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="value" >
+ <number>127</number>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons" >
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>OutputInstrumentViewBase</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>OutputInstrumentViewBase</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>highRangeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>highRangeLabel</receiver>
+ <slot>setNum(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>215</x>
+ <y>107</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>165</x>
+ <y>108</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>lowRangeSlider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>lowRangeLabel</receiver>
+ <slot>setNum(int)</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>75</x>
+ <y>107</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>25</x>
+ <y>108</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/muse_qt4_evolution/midiplugins/dump/CMakeLists.txt b/muse_qt4_evolution/midiplugins/dump/CMakeLists.txt
new file mode 100644
index 00000000..c607ef1f
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/dump/CMakeLists.txt
@@ -0,0 +1,40 @@
+#=============================================================================
+# 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.
+#=============================================================================
+
+add_library ( dump SHARED
+ dump.cpp
+ )
+
+target_link_libraries( dump
+ midiplugin awl
+ ${QT_LIBRARIES}
+ )
+
+# - tell cmake to name target dump.so instead of
+# libdump.so
+# - use precompiled header files
+#
+set_target_properties ( dump
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /${CMAKE_INSTALL_LIBDIR}/${MusE_INSTALL_NAME}/midiplugins/ dump )
+
diff --git a/muse_qt4_evolution/midiplugins/dump/dump.cpp b/muse_qt4_evolution/midiplugins/dump/dump.cpp
new file mode 100644
index 00000000..e346a642
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/dump/dump.cpp
@@ -0,0 +1,48 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filter.cpp,v 1.10 2005/11/06 17:49:34 wschweer Exp $
+//
+// dump- simple midi event dump for testing purposes
+//
+// (C) Copyright 2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "dump.h"
+#include "midi.h"
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+
+void Dump::process(unsigned, unsigned, MidiEventList* il, MidiEventList* ol)
+ {
+ for (iMidiEvent i = il->begin(); i != il->end(); ++i) {
+ printf("Event %6d ch:%2d type:%2d 0x%02x 0x%02x\n", i->time(), i->channel(),
+ i->type(), i->dataA(), i->dataB());
+ ol->insert(*i);
+ }
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+static Mempi* instantiate(const char* name, const MempiHost* h)
+ {
+ return new Dump(name, h);
+ }
+
+extern "C" {
+ static MEMPI descriptor = {
+ "Dump",
+ "MusE Simple Midi Event Dump",
+ "0.1", // version string
+ MEMPI_FILTER, // plugin type
+ MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
+ instantiate
+ };
+
+ const MEMPI* mempi_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/dump/dump.h b/muse_qt4_evolution/midiplugins/dump/dump.h
new file mode 100644
index 00000000..2194e30f
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/dump/dump.h
@@ -0,0 +1,28 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filter.h,v 1.4 2005/06/12 08:18:37 wschweer Exp $
+//
+// dump- simple midi event dump for testing purposes
+//
+// (C) Copyright 2006 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __DUMP_H__
+#define __DUMP_H__
+
+#include "../libmidiplugin/mempi.h"
+
+//---------------------------------------------------------
+// dump - simple midi event dump
+//---------------------------------------------------------
+
+class Dump : public Mempi {
+ virtual void process(unsigned, unsigned, MidiEventList*, MidiEventList*);
+
+ public:
+ Dump(const char* name, const MempiHost* h) :Mempi(name, h) {}
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/filter/CMakeLists.txt b/muse_qt4_evolution/midiplugins/filter/CMakeLists.txt
new file mode 100644
index 00000000..7bdb8544
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/filter/CMakeLists.txt
@@ -0,0 +1,49 @@
+#=============================================================================
+# 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.
+#=============================================================================
+
+QT4_WRAP_CPP ( filter_mocs filtergui.h ctrlcombo.h )
+QT4_WRAP_UI ( filter_uis filtergui.ui )
+
+add_library ( filter SHARED
+ filter.cpp
+ filtergui.cpp
+ filtergui.h
+ ctrlcombo.cpp
+ ctrlcombo.h
+ ${filter_mocs}
+ ${filter_uis}
+ )
+
+target_link_libraries( filter
+ midiplugin awl
+ ${QT_LIBRARIES}
+ )
+
+# - tell cmake to name target filter.so instead of
+# libfilter.so
+# - use precompiled header files
+#
+set_target_properties ( filter
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /${CMAKE_INSTALL_LIBDIR}/${MusE_INSTALL_NAME}/midiplugins/ filter )
+
diff --git a/muse_qt4_evolution/midiplugins/filter/ctrlcombo.cpp b/muse_qt4_evolution/midiplugins/filter/ctrlcombo.cpp
new file mode 100644
index 00000000..b4c436c6
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/filter/ctrlcombo.cpp
@@ -0,0 +1,56 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ctrlcombo.cpp,v 1.2 2005/11/06 17:49:34 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "ctrlcombo.h"
+
+//---------------------------------------------------------
+// CtrlComboBox
+//---------------------------------------------------------
+
+CtrlComboBox::CtrlComboBox(QWidget* parent)
+ : QComboBox(parent)
+ {
+ const char* ctxt[] = {
+ "No Ctrl", "BankSelMSB", "Modulation", "BreathCtrl",
+ "Control 3", "Foot Ctrl", "Porta Time", "DataEntMSB",
+ "MainVolume", "Balance", "Control 9", "Pan",
+ "Expression", "Control 12", "Control 13", "Control 14",
+ "Control 15", "Gen.Purp.1", "Gen.Purp.2", "Gen.Purp.3",
+ "Gen.Purp.4", "Control 20", "Control 21", "Control 22",
+ "Control 23", "Control 24", "Control 25", "Control 26",
+ "Control 27", "Control 28", "Control 29", "Control 30",
+ "Control 31", "BankSelLSB", "Modul. LSB", "BrthCt.LSB",
+ "Control 35", "FootCt.LSB", "Port.T LSB", "DataEntLSB",
+ "MainVolLSB", "BalanceLSB", "Control 41", "Pan LSB",
+ "Expr. LSB", "Control 44", "Control 45", "Control 46",
+ "Control 47", "Gen.P.1LSB", "Gen.P.2LSB", "Gen.P.3LSB",
+ "Gen.P.4LSB", "Control 52", "Control 53", "Control 54",
+ "Control 55", "Control 56", "Control 57", "Control 58",
+ "Control 59", "Control 60", "Control 61", "Control 62",
+ "Control 63", "Sustain", "Porta Ped", "Sostenuto",
+ "Soft Pedal", "Control 68", "Hold 2", "Control 70",
+ "HarmonicCo", "ReleaseTime", "Attack Time", "Brightness",
+ "Control 75", "Control 76", "Control 77", "Control 78",
+ "Control 79", "Gen.Purp.5", "Gen.Purp.6", "Gen.Purp.7",
+ "Gen.Purp.8", "Porta Ctrl", "Control 85", "Control 86",
+ "Control 87", "Control 88", "Control 89", "Control 90",
+ "Effect1Dep", "Effect2Dep", "Effect3Dep", "Effect4Dep",
+ "Phaser Dep", "Data Incr", "Data Decr", "NRPN LSB",
+ "NRPN MSB", "RPN LSB", "RPN MSB", "Control102",
+ "Control103", "Control104", "Control105", "Control106",
+ "Control107", "Control108", "Control109", "Control110",
+ "Control111", "Control112", "Control113", "Control114",
+ "Control115", "Control116", "Control117", "Control118",
+ "Control119", "AllSndOff", "Reset Ctrl", "Local Ctrl",
+ "AllNoteOff", "OmniModOff", "OmniModeOn", "MonoModeOn",
+ "PolyModeOn"
+ };
+ for (unsigned int i = 0; i < sizeof(ctxt)/sizeof(*ctxt); ++i)
+ addItem(QString(ctxt[i]));
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/filter/ctrlcombo.h b/muse_qt4_evolution/midiplugins/filter/ctrlcombo.h
new file mode 100644
index 00000000..53044b20
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/filter/ctrlcombo.h
@@ -0,0 +1,24 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: ctrlcombo.h,v 1.2 2005/11/06 17:49:34 wschweer Exp $
+//
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __CTRLGRP_H__
+#define __CTRLGRP_H__
+
+//---------------------------------------------------------
+// CtrlComboBox
+//---------------------------------------------------------
+
+class CtrlComboBox : public QComboBox {
+ Q_OBJECT
+ public:
+ CtrlComboBox(QWidget* parent = 0);
+ };
+
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/filter/filter.cpp b/muse_qt4_evolution/midiplugins/filter/filter.cpp
new file mode 100644
index 00000000..ac99449e
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/filter/filter.cpp
@@ -0,0 +1,167 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filter.cpp,v 1.10 2005/11/06 17:49:34 wschweer Exp $
+//
+// filter - simple midi filter
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "filtergui.h"
+#include "filter.h"
+#include "midi.h"
+
+//---------------------------------------------------------
+// Filter
+//---------------------------------------------------------
+
+Filter::Filter(const char* name, const MempiHost* h)
+ : Mempi(name, h)
+ {
+ data.type = 0; // allow any events
+ for (int i = 0; i < 4; ++i)
+ data.ctrl[i] = -1;
+ gui = 0;
+ }
+
+//---------------------------------------------------------
+// Filter
+//---------------------------------------------------------
+
+Filter::~Filter()
+ {
+ if (gui)
+ delete gui;
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool Filter::init()
+ {
+ gui = new FilterGui(this, 0);
+ gui->setWindowTitle("MusE: "+QString(name()));
+ gui->show();
+ return false;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void Filter::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ QPoint pos(gui->pos());
+ QSize size(gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void Filter::setGeometry(int x, int y, int w, int h)
+ {
+ gui->resize(QSize(w, h));
+ gui->move(QPoint(x, y));
+ }
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+
+void Filter::process(unsigned, unsigned, MidiEventList* il, MidiEventList* ol)
+ {
+ for (iMidiEvent i = il->begin(); i != il->end(); ++i) {
+ if (!filterEvent(*i))
+ ol->insert(*i);
+ }
+ }
+
+//---------------------------------------------------------
+// filterEvent
+// return true if event filtered
+//---------------------------------------------------------
+
+bool Filter::filterEvent(const MidiEvent& event)
+ {
+ switch(event.type()) {
+ case ME_NOTEON:
+ case ME_NOTEOFF:
+ if (data.type & MIDI_FILTER_NOTEON)
+ return true;
+ break;
+ case ME_POLYAFTER:
+ if (data.type & MIDI_FILTER_POLYP)
+ return true;
+ break;
+ case ME_CONTROLLER:
+ if (data.type & MIDI_FILTER_CTRL)
+ return true;
+ for (int i = 0; i < 4; ++i) {
+ if (data.ctrl[i] == event.dataA())
+ return true;
+ }
+ break;
+ case ME_PROGRAM:
+ if (data.type & MIDI_FILTER_PROGRAM)
+ return true;
+ break;
+ case ME_AFTERTOUCH:
+ if (data.type & MIDI_FILTER_AT)
+ return true;
+ break;
+ case ME_PITCHBEND:
+ if (data.type & MIDI_FILTER_PITCH)
+ return true;
+ break;
+ case ME_SYSEX:
+ if (data.type & MIDI_FILTER_SYSEX)
+ return true;
+ break;
+ default:
+ break;
+ }
+ return false;
+ }
+
+void Filter::getInitData(int* n, const unsigned char** p) const
+ {
+ *n = sizeof(data);
+ *p = (unsigned char*)&data;
+ }
+
+void Filter::setInitData(int n, const unsigned char* p)
+ {
+ memcpy((void*)&data, p, n);
+ if (gui)
+ gui->init();
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+static Mempi* instantiate(const char* name, const MempiHost* h)
+ {
+ return new Filter(name, h);
+ }
+
+extern "C" {
+ static MEMPI descriptor = {
+ "Filter",
+ "MusE Simple Midi Filter",
+ "0.1", // filter version string
+ MEMPI_FILTER, // plugin type
+ MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
+ instantiate
+ };
+
+ const MEMPI* mempi_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/filter/filter.h b/muse_qt4_evolution/midiplugins/filter/filter.h
new file mode 100644
index 00000000..c8a357b4
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/filter/filter.h
@@ -0,0 +1,51 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filter.h,v 1.4 2005/06/12 08:18:37 wschweer Exp $
+//
+// filter - simple midi filter
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __FILTER_H__
+#define __FILTER_H__
+
+#include "../libmidiplugin/mempi.h"
+
+//---------------------------------------------------------
+// filter - simple midi filter
+//---------------------------------------------------------
+
+class Filter : public Mempi {
+ struct initData {
+ int type;
+ int ctrl[4];
+ } data;
+ FilterGui* gui;
+
+ bool filterEvent(const MidiEvent& event);
+ virtual void process(unsigned, unsigned, MidiEventList*, MidiEventList*);
+
+ public:
+ Filter(const char* name, const MempiHost*);
+ ~Filter();
+ virtual bool init();
+
+ int midiType() const { return data.type; }
+ void setMidiType(int t) { data.type = t; }
+ int midiCtrl(int i) const { return data.ctrl[i]; }
+ void setMidiCtrl(int i, int val) { data.ctrl[i] = val; }
+
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const { return gui->isVisible(); }
+ virtual void showGui(bool val) { gui->setShown(val); }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+
+ virtual void getInitData(int*, const unsigned char**) const;
+ virtual void setInitData(int, const unsigned char*);
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/filter/filtergui.cpp b/muse_qt4_evolution/midiplugins/filter/filtergui.cpp
new file mode 100644
index 00000000..306ae392
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/filter/filtergui.cpp
@@ -0,0 +1,187 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filtergui.cpp,v 1.4 2005/11/06 17:49:34 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "filtergui.h"
+#include "filter.h"
+#include "ctrlcombo.h"
+
+//---------------------------------------------------------
+// MidiFilterConfig
+//---------------------------------------------------------
+
+FilterGui::FilterGui(Filter* f, QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ filter = f;
+ connect(rf1, SIGNAL(toggled(bool)), SLOT(rf1Toggled(bool)));
+ connect(rf2, SIGNAL(toggled(bool)), SLOT(rf2Toggled(bool)));
+ connect(rf3, SIGNAL(toggled(bool)), SLOT(rf3Toggled(bool)));
+ connect(rf4, SIGNAL(toggled(bool)), SLOT(rf4Toggled(bool)));
+ connect(rf5, SIGNAL(toggled(bool)), SLOT(rf5Toggled(bool)));
+ connect(rf6, SIGNAL(toggled(bool)), SLOT(rf6Toggled(bool)));
+ connect(rf7, SIGNAL(toggled(bool)), SLOT(rf7Toggled(bool)));
+ connect(cb1, SIGNAL(activated(int)), SLOT(cb1Activated(int)));
+ connect(cb2, SIGNAL(activated(int)), SLOT(cb2Activated(int)));
+ connect(cb3, SIGNAL(activated(int)), SLOT(cb3Activated(int)));
+ connect(cb4, SIGNAL(activated(int)), SLOT(cb4Activated(int)));
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void FilterGui::init()
+ {
+ int midiType = filter->midiType();
+ rf1->setChecked(midiType & MIDI_FILTER_NOTEON);
+ rf2->setChecked(midiType & MIDI_FILTER_POLYP);
+ rf3->setChecked(midiType & MIDI_FILTER_CTRL);
+ rf4->setChecked(midiType & MIDI_FILTER_PROGRAM);
+ rf5->setChecked(midiType & MIDI_FILTER_AT);
+ rf6->setChecked(midiType & MIDI_FILTER_PITCH);
+ rf7->setChecked(midiType & MIDI_FILTER_SYSEX);
+ cb1->setCurrentIndex(filter->midiCtrl(0) + 1);
+ cb2->setCurrentIndex(filter->midiCtrl(1) + 1);
+ cb3->setCurrentIndex(filter->midiCtrl(2) + 1);
+ cb4->setCurrentIndex(filter->midiCtrl(3) + 1);
+ }
+
+//---------------------------------------------------------
+// cb1Activated
+//---------------------------------------------------------
+
+void FilterGui::cb1Activated(int idx)
+ {
+ filter->setMidiCtrl(0, idx - 1);
+ }
+
+//---------------------------------------------------------
+// cb2Activated
+//---------------------------------------------------------
+
+void FilterGui::cb2Activated(int idx)
+ {
+ filter->setMidiCtrl(1, idx - 1);
+ }
+
+//---------------------------------------------------------
+// cb3Activated
+//---------------------------------------------------------
+
+void FilterGui::cb3Activated(int idx)
+ {
+ filter->setMidiCtrl(2, idx - 1);
+ }
+
+//---------------------------------------------------------
+// cb4Activated
+//---------------------------------------------------------
+
+void FilterGui::cb4Activated(int idx)
+ {
+ filter->setMidiCtrl(3, idx - 1);
+ }
+
+//---------------------------------------------------------
+// rf1Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf1Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf1->isChecked())
+ midiType |= MIDI_FILTER_NOTEON;
+ else
+ midiType &= ~MIDI_FILTER_NOTEON;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf2Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf2Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf2->isChecked())
+ midiType |= MIDI_FILTER_POLYP;
+ else
+ midiType &= ~MIDI_FILTER_POLYP;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf3Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf3Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf3->isChecked())
+ midiType |= MIDI_FILTER_CTRL;
+ else
+ midiType &= ~MIDI_FILTER_CTRL;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf4Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf4Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf4->isChecked())
+ midiType |= MIDI_FILTER_PROGRAM;
+ else
+ midiType &= ~MIDI_FILTER_PROGRAM;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf5Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf5Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf5->isChecked())
+ midiType |= MIDI_FILTER_AT;
+ else
+ midiType &= ~MIDI_FILTER_AT;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf6Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf6Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf1->isChecked())
+ midiType |= MIDI_FILTER_PITCH;
+ else
+ midiType &= ~MIDI_FILTER_PITCH;
+ filter->setMidiType(midiType);
+ }
+
+//---------------------------------------------------------
+// rf7Toggled
+//---------------------------------------------------------
+
+void FilterGui::rf7Toggled(bool)
+ {
+ int midiType = filter->midiType();
+ if (rf7->isChecked())
+ midiType |= MIDI_FILTER_SYSEX;
+ else
+ midiType &= ~MIDI_FILTER_SYSEX;
+ filter->setMidiType(midiType);
+ }
diff --git a/muse_qt4_evolution/midiplugins/filter/filtergui.h b/muse_qt4_evolution/midiplugins/filter/filtergui.h
new file mode 100644
index 00000000..701bfec9
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/filter/filtergui.h
@@ -0,0 +1,57 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filtergui.h,v 1.4 2005/11/06 17:49:34 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __FILTERGUI_H__
+#define __FILTERGUI_H__
+
+#include "ui_filtergui.h"
+
+class Filter;
+
+enum {
+ MIDI_FILTER_NOTEON = 1,
+ MIDI_FILTER_POLYP = 2,
+ MIDI_FILTER_CTRL = 4,
+ MIDI_FILTER_PROGRAM = 8,
+ MIDI_FILTER_AT = 16,
+ MIDI_FILTER_PITCH = 32,
+ MIDI_FILTER_SYSEX = 64
+ };
+
+//---------------------------------------------------------
+// FilterGui
+//---------------------------------------------------------
+
+class FilterGui : public QDialog, public Ui::FilterBase {
+ Q_OBJECT
+
+ Filter* filter;
+
+ signals:
+ void hideWindow();
+
+ private slots:
+ void rf1Toggled(bool);
+ void rf2Toggled(bool);
+ void rf3Toggled(bool);
+ void rf4Toggled(bool);
+ void rf5Toggled(bool);
+ void rf6Toggled(bool);
+ void rf7Toggled(bool);
+ void cb1Activated(int);
+ void cb2Activated(int);
+ void cb3Activated(int);
+ void cb4Activated(int);
+
+ public:
+ FilterGui(Filter*, QWidget* parent=0);
+ void init();
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/filter/filtergui.ui b/muse_qt4_evolution/midiplugins/filter/filtergui.ui
new file mode 100644
index 00000000..8e1693f2
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/filter/filtergui.ui
@@ -0,0 +1,269 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>FilterBase</class>
+ <widget class="QDialog" name="FilterBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>388</width>
+ <height>213</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Midi Input Filter</string>
+ </property>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="GroupBoxx" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Event Filter</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="rf1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Note On</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Poly Pressure</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Controller</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Program Change</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf5" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>After Touch</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf6" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Pitch Bend</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="rf7" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Sysex</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="GroupBox4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Controller Filter</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>6</number>
+ </property>
+ <property name="spacing" >
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="CtrlComboBox" name="cb1" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="CtrlComboBox" name="cb2" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="CtrlComboBox" name="cb3" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="CtrlComboBox" name="cb4" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>CtrlComboBox</class>
+ <extends>QComboBox</extends>
+ <header>ctrlcombo.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>rf1</tabstop>
+ <tabstop>rf2</tabstop>
+ <tabstop>rf3</tabstop>
+ <tabstop>rf4</tabstop>
+ <tabstop>rf5</tabstop>
+ <tabstop>rf6</tabstop>
+ <tabstop>rf7</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse_qt4_evolution/midiplugins/libmidiplugin/CMakeLists.txt b/muse_qt4_evolution/midiplugins/libmidiplugin/CMakeLists.txt
new file mode 100644
index 00000000..5988205f
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/libmidiplugin/CMakeLists.txt
@@ -0,0 +1,26 @@
+#=============================================================================
+# 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.
+#=============================================================================
+
+add_library ( midiplugin mempi.cpp )
+
+set_target_properties( midiplugin
+ PROPERTIES COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all.h"
+ )
+
diff --git a/muse_qt4_evolution/midiplugins/libmidiplugin/evdata.h b/muse_qt4_evolution/midiplugins/libmidiplugin/evdata.h
new file mode 100644
index 00000000..8247b6e0
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/libmidiplugin/evdata.h
@@ -0,0 +1,64 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: evdata.h,v 1.2 2005/05/11 14:18:39 wschweer Exp $
+//
+// (C) Copyright 1999-2003 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __EVDATA_H__
+#define __EVDATA_H__
+
+//---------------------------------------------------------
+// EvData
+// variable len event data (sysex, meta etc.)
+//---------------------------------------------------------
+
+class EvData {
+ int* refCount;
+
+ public:
+ unsigned char* data;
+ int dataLen;
+
+ EvData() {
+ data = 0;
+ dataLen = 0;
+ refCount = new int(1);
+ }
+ EvData(const EvData& ed) {
+ data = ed.data;
+ dataLen = ed.dataLen;
+ refCount = ed.refCount;
+ (*refCount)++;
+ }
+
+ EvData& operator=(const EvData& ed) {
+ if (data == ed.data)
+ return *this;
+ if (--(*refCount) == 0) {
+ delete refCount;
+ delete[] data;
+ }
+ data = ed.data;
+ dataLen = ed.dataLen;
+ refCount = ed.refCount;
+ (*refCount)++;
+ return *this;
+ }
+
+ ~EvData() {
+ if (--(*refCount) == 0) {
+ delete[] data;
+ delete refCount;
+ }
+ }
+ void setData(const unsigned char* p, int l) {
+ data = new unsigned char[l];
+ memcpy(data, p, l);
+ dataLen = l;
+ }
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/libmidiplugin/mempi.cpp b/muse_qt4_evolution/midiplugins/libmidiplugin/mempi.cpp
new file mode 100644
index 00000000..91171c3b
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/libmidiplugin/mempi.cpp
@@ -0,0 +1,81 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mempi.cpp,v 1.4 2005/05/24 15:27:48 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "mempi.h"
+
+static const int FIFO_SIZE = 128;
+
+//---------------------------------------------------------
+// MidiEvent
+//---------------------------------------------------------
+
+MidiEvent::MidiEvent(unsigned t, int tpe, const unsigned char* data, int len)
+ {
+ _time = t;
+ edata.setData(data, len);
+ _type = tpe;
+ }
+
+//---------------------------------------------------------
+// operator <
+//---------------------------------------------------------
+
+bool MidiEvent::operator<(const MidiEvent& e) const
+ {
+ if (time() != e.time())
+ return time() < e.time();
+
+ // play note off events first to prevent overlapping
+ // notes
+
+ if (channel() == e.channel())
+ return type() == 0x80
+ || (type() == 0x90 && dataB() == 0);
+
+ int map[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, 13, 14, 15 };
+ return map[channel()] < map[e.channel()];
+ }
+
+//---------------------------------------------------------
+// MempiP
+// Mempi private data structure
+//---------------------------------------------------------
+
+struct MempiP {
+ int dummy;
+ };
+
+//---------------------------------------------------------
+// Mempi
+//---------------------------------------------------------
+
+Mempi::Mempi(const char* n, const MempiHost* h)
+ {
+ _name = strdup(n);
+ host = h;
+ d = new MempiP;
+ }
+
+Mempi::~Mempi()
+ {
+ delete _name;
+ delete d;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+// dummy
+//---------------------------------------------------------
+
+void Mempi::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ x = 0;
+ y = 0;
+ w = 0;
+ h = 0;
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/libmidiplugin/mempi.h b/muse_qt4_evolution/midiplugins/libmidiplugin/mempi.h
new file mode 100644
index 00000000..a5f114b6
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/libmidiplugin/mempi.h
@@ -0,0 +1,97 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mempi.h,v 1.10 2005/07/16 09:31:50 wschweer Exp $
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+//
+// MusE experimental midi plugin interface
+//
+
+#ifndef __MEMPI_H__
+#define __MEMPI_H__
+
+#define MEMPI_MAJOR_VERSION 1
+#define MEMPI_MINOR_VERSION 1
+
+#include <set>
+#include "evdata.h"
+#include "memory.h"
+#include "midievent.h"
+
+class MempiP;
+
+//---------------------------------------------------------
+// MempiHost
+// Host Infos
+//---------------------------------------------------------
+
+struct MempiHost {
+ virtual int division() const; // midi division
+ virtual int tempo(unsigned tick) const;
+ virtual unsigned tick2frame(unsigned tick) const;
+ virtual unsigned frame2tick(unsigned frame) const;
+ virtual void bar(int tick, int* bar, int* beat, unsigned* rest) const;
+ virtual unsigned bar2tick(int bar, int beat, int tick) const;
+ virtual ~MempiHost() {}
+ };
+
+//---------------------------------------------------------
+// Mempi
+// Instance class
+// MusE experimental midi plugin interface
+// Instance virtual interface class
+//---------------------------------------------------------
+
+class Mempi {
+ MempiP* d;
+ const char* _name; // mempi instance name
+
+ protected:
+ const MempiHost* host;
+
+ public:
+ // modul interface
+ Mempi(const char* name, const MempiHost*);
+ virtual ~Mempi();
+ virtual bool init() { return false; }
+ const char* name() const { return _name; }
+
+ // process interface
+ virtual void process(unsigned, unsigned, MidiEventList*, MidiEventList*) = 0;
+
+ // session interface
+ virtual void getInitData(int*, const unsigned char**) const {}
+ virtual void setInitData(int, const unsigned char*) {}
+
+ // GUI interface routines
+ virtual bool hasGui() const { return false; }
+ virtual bool guiVisible() const { return false; }
+ virtual void showGui(bool) {}
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int) {}
+ };
+
+//---------------------------------------------------------
+// MEMPI
+// Class descriptor
+//---------------------------------------------------------
+
+enum MempiType { MEMPI_FILTER = 0, MEMPI_GENERATOR = 1 };
+
+struct MEMPI {
+ const char* name;
+ const char* description;
+ const char* version;
+ MempiType type;
+ int majorMempiVersion, minorMempiVersion;
+ Mempi* (*instantiate)(const char* name, const MempiHost*);
+ };
+
+extern "C" {
+ const MEMPI* mempi_descriptor();
+ }
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/libmidiplugin/midievent.cpp b/muse_qt4_evolution/midiplugins/libmidiplugin/midievent.cpp
new file mode 100644
index 00000000..972bc8a2
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/libmidiplugin/midievent.cpp
@@ -0,0 +1,21 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mpevent.cpp,v 1.1 2005/05/08 17:01:30 wschweer Exp $
+//
+// (C) Copyright 2002-2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "midievent.h"
+
+//---------------------------------------------------------
+// MEvent
+//---------------------------------------------------------
+
+MEvent::MEvent(unsigned t, int tpe, const unsigned char* data, int len)
+ {
+ _time = t;
+ edata.setData(data, len);
+ _type = tpe;
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/libmidiplugin/midievent.h b/muse_qt4_evolution/midiplugins/libmidiplugin/midievent.h
new file mode 100644
index 00000000..a21bec88
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/libmidiplugin/midievent.h
@@ -0,0 +1,87 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mpevent.h,v 1.3 2005/06/06 14:24:53 wschweer Exp $
+//
+// (C) Copyright 1999-2002 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __MIDIEVENT_H__
+#define __MIDIEVENT_H__
+
+#include <set>
+#include "evdata.h"
+#include <ext/mt_allocator.h>
+
+class Event;
+class EvData;
+
+//---------------------------------------------------------
+// MidiEvent
+//---------------------------------------------------------
+
+class MidiEvent {
+ unsigned _time;
+ EvData edata;
+ unsigned char _channel, _type;
+ int _a, _b;
+
+ public:
+ MidiEvent() {}
+ MidiEvent(unsigned tm, int c, int t, int a, int b)
+ : _time(tm), _channel(c & 0xf), _type(t), _a(a), _b(b) {}
+ MidiEvent(unsigned t, int type, const unsigned char* data, int len);
+ MidiEvent(unsigned t, int tpe, EvData d) : _time(t), edata(d), _type(tpe) {}
+ MidiEvent(unsigned t, int channel, const Event& e);
+
+ ~MidiEvent() {}
+
+ MidiEvent& operator=(const MidiEvent& ed) {
+ _time = ed._time;
+ edata = ed.edata;
+ _channel = ed._channel;
+ _type = ed._type;
+ _a = ed._a;
+ _b = ed._b;
+ return *this;
+ }
+
+ int channel() const { return _channel; }
+ int type() const { return _type; }
+ int dataA() const { return _a; }
+ int dataB() const { return _b; }
+ unsigned time() const { return _time; }
+
+ void setChannel(int val) { _channel = val; }
+ void setType(int val) { _type = val; }
+ void setA(int val) { _a = val; }
+ void setB(int val) { _b = val; }
+ void setTime(unsigned val) { _time = val; }
+
+ const EvData& eventData() const { return edata; }
+ unsigned char* data() const { return edata.data; }
+ int len() const { return edata.dataLen; }
+ void setData(const EvData& e) { edata = e; }
+ void setData(const unsigned char* p, int len) { edata.setData(p, len); }
+ void dump() const;
+ bool isNote() const { return _type == 0x90; }
+ bool isNoteOff() const { return (_type == 0x80)||(_type == 0x90 && _b == 0); }
+ bool operator<(const MidiEvent&) const;
+ };
+
+//---------------------------------------------------------
+// MidiEventList
+//---------------------------------------------------------
+
+// typedef std::multiset<MidiEvent, std::less<MidiEvent>,
+// __gnu_cxx::__mt_alloc<MidiEvent> > MPEL;
+
+struct MidiEventList : public std::multiset<MidiEvent, std::less<MidiEvent> >
+ {
+ };
+
+typedef MidiEventList::iterator iMidiEvent;
+typedef MidiEventList::const_iterator ciMidiEvent;
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/metronom/CMakeLists.txt b/muse_qt4_evolution/midiplugins/metronom/CMakeLists.txt
new file mode 100644
index 00000000..5153e6d4
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/metronom/CMakeLists.txt
@@ -0,0 +1,46 @@
+#=============================================================================
+# 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.
+#=============================================================================
+
+QT4_WRAP_CPP ( metronom_mocs metronomgui.h )
+QT4_WRAP_UI ( metronom_uis metronomgui.ui )
+
+add_library ( metronom SHARED
+ metronom.cpp
+ metronomgui.cpp
+ metronomgui.h
+ ${metronom_mocs}
+ ${metronom_uis}
+ )
+target_link_libraries( metronom
+ midiplugin
+ ${QT_LIBRARIES}
+ )
+
+# - tell cmake to name target metronom.so instead of
+# libmetronom.so
+# - use precompiled header files
+#
+set_target_properties ( metronom
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /${CMAKE_INSTALL_LIBDIR}/${MusE_INSTALL_NAME}/midiplugins/ metronom )
+
diff --git a/muse_qt4_evolution/midiplugins/metronom/metronom.cpp b/muse_qt4_evolution/midiplugins/metronom/metronom.cpp
new file mode 100644
index 00000000..ece1e466
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/metronom/metronom.cpp
@@ -0,0 +1,167 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: metronom.cpp,v 1.3 2005/11/16 17:55:59 wschweer Exp $
+//
+// metronom - midi metronom
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "metronomgui.h"
+#include "metronom.h"
+#include "midi.h"
+#include "midievent.h"
+
+//---------------------------------------------------------
+// Metronom
+//---------------------------------------------------------
+
+Metronom::Metronom(const char* name, const MempiHost* h)
+ : Mempi(name, h)
+ {
+ gui = 0;
+ }
+
+//---------------------------------------------------------
+// Metronom
+//---------------------------------------------------------
+
+Metronom::~Metronom()
+ {
+ if (gui)
+ delete gui;
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool Metronom::init()
+ {
+ nextTick = 0;
+ lastTo = 0;
+ data.measureNote = 63;
+ data.measureVelo = 127;
+ data.beatNote = 63;
+ data.beatVelo = 70;
+
+ gui = new MetronomGui(this, 0);
+ gui->hide();
+ gui->setWindowTitle(QString(name()));
+
+ return false;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void Metronom::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ QPoint pos(gui->pos());
+ QSize size(gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void Metronom::setGeometry(int x, int y, int w, int h)
+ {
+ gui->resize(QSize(w, h));
+ gui->move(QPoint(x, y));
+ }
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+
+void Metronom::process(unsigned from, unsigned to, MidiEventList* /*il*/, MidiEventList* ol)
+ {
+ if (from == to) {
+ nextTick = 0;
+ return;
+ }
+ if (lastTo != from) { // seek?
+// printf(" seek? %d-%d\n", lastTo, from);
+ nextTick = 0;
+ }
+ lastTo = to;
+ if (nextTick > to)
+ return;
+ while (nextTick < to) {
+ int bar, beat;
+ unsigned tick;
+ if (nextTick < from) {
+ host->bar(from, &bar, &beat, &tick);
+ if (tick)
+ nextTick = host->bar2tick(bar, beat+1, 0);
+ else
+ nextTick = from;
+ }
+ host->bar(nextTick, &bar, &beat, &tick);
+ bool isMeasure = beat == 0;
+
+ MidiEvent ev(nextTick, 0, ME_NOTEON, data.beatNote, data.beatVelo);
+ if (isMeasure) {
+ ev.setA(data.measureNote);
+ ev.setB(data.measureVelo);
+ }
+ ol->insert(ev); // insert note on
+ ev.setB(0);
+ ev.setTime(nextTick + 10);
+ ev.setB(0);
+ ol->insert(ev); // insert note off
+
+ nextTick = host->bar2tick(bar, beat+1, 0);
+ }
+ }
+
+//---------------------------------------------------------
+// getInitData
+//---------------------------------------------------------
+
+void Metronom::getInitData(int* n, const unsigned char** p) const
+ {
+ *n = sizeof(data);
+ *p = (unsigned char*)&data;
+ }
+
+//---------------------------------------------------------
+// setInitData
+//---------------------------------------------------------
+
+void Metronom::setInitData(int n, const unsigned char* p)
+ {
+ memcpy((void*)&data, p, n);
+ if (gui)
+ gui->init();
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+static Mempi* instantiate(const char* name, const MempiHost* h)
+ {
+ return new Metronom(name, h);
+ }
+
+extern "C" {
+ static MEMPI descriptor = {
+ "Metronom",
+ "MusE Simple Midi Metronom",
+ "0.1", // version string
+ MEMPI_GENERATOR,
+ MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
+ instantiate
+ };
+
+ const MEMPI* mempi_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/metronom/metronom.h b/muse_qt4_evolution/midiplugins/metronom/metronom.h
new file mode 100644
index 00000000..3d570613
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/metronom/metronom.h
@@ -0,0 +1,53 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: metronom.h,v 1.3 2005/06/12 09:22:51 wschweer Exp $
+//
+// metronom - simple midi metronom
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __METRONOM_H__
+#define __METRONOM_H__
+
+#include "../libmidiplugin/mempi.h"
+
+//---------------------------------------------------------
+// metronom - simple midi metronom
+//---------------------------------------------------------
+
+class Metronom : public Mempi {
+
+ protected:
+ struct InitData {
+ char measureNote;
+ char measureVelo;
+ char beatNote;
+ char beatVelo;
+ } data;
+ MetronomGui* gui;
+ friend class MetronomGui;
+
+ unsigned int nextTick;
+ unsigned int lastTo;
+
+ virtual void process(unsigned, unsigned, MidiEventList*, MidiEventList*);
+
+ public:
+ Metronom(const char* name, const MempiHost*);
+ ~Metronom();
+ virtual bool init();
+
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const { return gui->isVisible(); }
+ virtual void showGui(bool val) { gui->setShown(val); }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+
+ virtual void getInitData(int*, const unsigned char**) const;
+ virtual void setInitData(int, const unsigned char*);
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/metronom/metronomgui.cpp b/muse_qt4_evolution/midiplugins/metronom/metronomgui.cpp
new file mode 100644
index 00000000..e6705f7c
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/metronom/metronomgui.cpp
@@ -0,0 +1,75 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: metronomgui.cpp,v 1.2 2005/10/05 17:02:03 lunar_shuttle Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "metronomgui.h"
+#include "metronom.h"
+
+//---------------------------------------------------------
+// MidiMetronomConfig
+//---------------------------------------------------------
+
+MetronomGui::MetronomGui(Metronom* f, QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ metronom = f;
+ init();
+ connect(beatNote, SIGNAL(valueChanged(int)), SLOT(beatNoteChanged(int)));
+ connect(measureVelocity, SIGNAL(valueChanged(int)), SLOT(measureVelocityChanged(int)));
+ connect(measureNote, SIGNAL(valueChanged(int)), SLOT(measureNoteChanged(int)));
+ connect(beatVelocity, SIGNAL(valueChanged(int)), SLOT(beatVelocityChanged(int)));
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void MetronomGui::init()
+ {
+ beatNote->setValue(metronom->data.beatNote);
+ measureNote->setValue(metronom->data.measureNote);
+ beatVelocity->setValue(metronom->data.beatVelo);
+ measureVelocity->setValue(metronom->data.measureVelo);
+ }
+
+//---------------------------------------------------------
+// beatNoteChanged
+//---------------------------------------------------------
+
+void MetronomGui::beatNoteChanged(int val)
+ {
+ metronom->data.beatNote = val;
+ }
+
+//---------------------------------------------------------
+// measureVelocityChanged
+//---------------------------------------------------------
+
+void MetronomGui::measureVelocityChanged(int val)
+ {
+ metronom->data.measureVelo = val;
+ }
+
+//---------------------------------------------------------
+// measureNoteChanged
+//---------------------------------------------------------
+
+void MetronomGui::measureNoteChanged(int val)
+ {
+ metronom->data.measureNote = val;
+ }
+
+//---------------------------------------------------------
+// beatVelocityChanged
+//---------------------------------------------------------
+
+void MetronomGui::beatVelocityChanged(int val)
+ {
+ metronom->data.beatVelo = val;
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/metronom/metronomgui.h b/muse_qt4_evolution/midiplugins/metronom/metronomgui.h
new file mode 100644
index 00000000..cceea61d
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/metronom/metronomgui.h
@@ -0,0 +1,36 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: metronomgui.h,v 1.3 2005/10/05 17:02:03 lunar_shuttle Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __METRONOMGUI_H__
+#define __METRONOMGUI_H__
+
+#include "ui_metronomgui.h"
+
+class Metronom;
+
+//---------------------------------------------------------
+// MetronomGui
+//---------------------------------------------------------
+
+class MetronomGui : public QDialog, public Ui::MetronomBase {
+ Q_OBJECT
+ Metronom* metronom;
+
+ private slots:
+ void beatNoteChanged(int);
+ void measureVelocityChanged(int);
+ void measureNoteChanged(int);
+ void beatVelocityChanged(int);
+
+ public:
+ MetronomGui(Metronom*, QWidget* parent=0);
+ void init();
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/metronom/metronomgui.ui b/muse_qt4_evolution/midiplugins/metronom/metronomgui.ui
new file mode 100644
index 00000000..188735d4
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/metronom/metronomgui.ui
@@ -0,0 +1,150 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>MetronomBase</class>
+ <widget class="QDialog" name="MetronomBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>429</width>
+ <height>164</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Midi Metronome</string>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font" >
+ <font>
+ <family>ZappedChancellor</family>
+ <pointsize>48</pointsize>
+ <weight>75</weight>
+ <italic>false</italic>
+ <bold>true</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="toolTip" >
+ <string>Metronome</string>
+ </property>
+ <property name="whatsThis" >
+ <string>Metronome</string>
+ </property>
+ <property name="text" >
+ <string>M</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>Measure Note</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="text" >
+ <string>Measure Velocity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QLabel" name="TextLabel4" >
+ <property name="text" >
+ <string>Beat Velocity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="text" >
+ <string>Beat Note</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QSpinBox" name="beatNote" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QSpinBox" name="measureVelocity" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="measureNote" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QSpinBox" name="beatVelocity" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse_qt4_evolution/midiplugins/splitlayer/CMakeLists.txt b/muse_qt4_evolution/midiplugins/splitlayer/CMakeLists.txt
new file mode 100644
index 00000000..b6803d8b
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/splitlayer/CMakeLists.txt
@@ -0,0 +1,45 @@
+#=============================================================================
+# 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.
+#=============================================================================
+
+QT4_WRAP_CPP ( splitlayer_mocs splitlayergui.h )
+## QT4_WRAP_UI ( splitlayer_uis splitlayergui.ui )
+
+add_library ( splitlayer SHARED
+ splitlayer.cpp
+ splitlayergui.cpp
+ splitlayergui.h
+ ${splitlayer_mocs}
+ )
+target_link_libraries( splitlayer
+ midiplugin
+ ${QT_LIBRARIES}
+ )
+
+# - tell cmake to name target splitlayer.so instead of
+# libsplitlayer.so
+# - use precompiled header files
+#
+set_target_properties ( splitlayer
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /${CMAKE_INSTALL_LIBDIR}/${MusE_INSTALL_NAME}/midiplugins/ splitlayer )
+
diff --git a/muse_qt4_evolution/midiplugins/splitlayer/splitlayer.cpp b/muse_qt4_evolution/midiplugins/splitlayer/splitlayer.cpp
new file mode 100644
index 00000000..7ea4ba3e
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/splitlayer/splitlayer.cpp
@@ -0,0 +1,209 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2006 by Werner Schweer
+//
+// 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 "splitlayergui.h"
+#include "splitlayer.h"
+#include "midi.h"
+#include "midievent.h"
+
+//---------------------------------------------------------
+// SplitLayer
+//---------------------------------------------------------
+
+SplitLayer::SplitLayer(const char* name, const MempiHost* h)
+ : Mempi(name, h)
+ {
+ gui = 0;
+ }
+
+//---------------------------------------------------------
+// SplitLayer
+//---------------------------------------------------------
+
+SplitLayer::~SplitLayer()
+ {
+ if (gui)
+ delete gui;
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool SplitLayer::init()
+ {
+ data.startVelo[0] = 0;
+ data.endVelo[0] = 128;
+ data.startPitch[0] = 0;
+ data.endPitch[0] = 128;
+ data.pitchOffset[0] = 0;
+ data.veloOffset[0] = 0;
+ for (int i = 1; i < MIDI_CHANNELS; ++i) {
+ data.startVelo[i] = 0;
+ data.endVelo[i] = 0;
+ data.startPitch[i] = 0;
+ data.endPitch[i] = 0;
+ data.pitchOffset[i] = 0;
+ data.veloOffset[i] = 0;
+ }
+ memset(notes, 0, 128 * sizeof(int));
+ learnMode = false;
+ gui = new SplitLayerGui(this, 0);
+ gui->hide();
+ gui->setWindowTitle(QString(name()));
+ gui->init();
+ return false;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void SplitLayer::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ QPoint pos(gui->pos());
+ QSize size(gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void SplitLayer::setGeometry(int x, int y, int w, int h)
+ {
+ gui->resize(QSize(w, h));
+ gui->move(QPoint(x, y));
+ }
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+
+void SplitLayer::process(unsigned, unsigned, MidiEventList* il, MidiEventList* ol)
+ {
+ for (iMidiEvent i = il->begin(); i != il->end(); ++i) {
+ if (i->type() != ME_NOTEON && i->type() != ME_NOTEOFF) {
+ ol->insert(*i);
+ continue;
+ }
+ int pitch = i->dataA();
+ int velo = i->dataB();
+ if (learnMode) {
+ if (learnStartPitch)
+ data.startPitch[learnChannel] = pitch;
+ else
+ data.endPitch[learnChannel] = pitch;
+ learnMode = false;
+ gui->sendResetLearnMode();
+ return;
+ }
+ if (i->type() == ME_NOTEON && velo) {
+ for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {
+ MidiEvent event(*i);
+ if (pitch >= data.startPitch[ch]
+ && pitch <= data.endPitch[ch]
+ && velo >= data.startVelo[ch]
+ && velo <= data.endVelo[ch]) {
+ notes[pitch] |= (1 << ch);
+ event.setChannel(ch);
+ int p = pitch;
+ int v = velo;
+ p += data.pitchOffset[ch];
+ if (p > 127)
+ p = 127;
+ else if (p < 0)
+ p = 0;
+ v += data.veloOffset[ch];
+ if (v > 127)
+ v = 127;
+ else if (v < 0)
+ v = 0;
+ event.setA(p);
+ event.setB(v);
+ ol->insert(event);
+ }
+ }
+ }
+ else {
+ for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {
+ if (notes[pitch] & (1 << ch)) {
+ MidiEvent event(*i);
+ event.setChannel(ch);
+ int p = pitch + data.pitchOffset[ch];
+ if (p < 0)
+ p = 0;
+ else if (p > 127)
+ p = 127;
+ event.setA(p);
+ ol->insert(event);
+ }
+ }
+ notes[pitch] = 0;
+ }
+ }
+ }
+
+//---------------------------------------------------------
+// getInitData
+//---------------------------------------------------------
+
+void SplitLayer::getInitData(int* n, const unsigned char** p) const
+ {
+ *n = sizeof(data);
+ *p = (unsigned char*)&data;
+ }
+
+//---------------------------------------------------------
+// setInitData
+//---------------------------------------------------------
+
+void SplitLayer::setInitData(int n, const unsigned char* p)
+ {
+ memcpy((void*)&data, p, n);
+ if (gui)
+ gui->init();
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+static Mempi* instantiate(const char* name, const MempiHost* h)
+ {
+ return new SplitLayer(name, h);
+ }
+
+extern "C" {
+ static MEMPI descriptor = {
+ "SplitLayer",
+ "MusE Midi Splits and Layers",
+ "0.1", // version string
+ MEMPI_FILTER,
+ MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
+ instantiate
+ };
+
+ const MEMPI* mempi_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/splitlayer/splitlayer.h b/muse_qt4_evolution/midiplugins/splitlayer/splitlayer.h
new file mode 100644
index 00000000..7c213c01
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/splitlayer/splitlayer.h
@@ -0,0 +1,69 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2006 by Werner Schweer
+//
+// 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 __METRONOM_H__
+#define __METRONOM_H__
+
+#include "../libmidiplugin/mempi.h"
+
+static const int MIDI_CHANNELS = 16;
+
+//---------------------------------------------------------
+// SplitLayer - splits and layers for midi input
+//---------------------------------------------------------
+
+class SplitLayer : public Mempi {
+
+ protected:
+ struct InitData {
+ int startVelo[MIDI_CHANNELS];
+ int endVelo[MIDI_CHANNELS];
+ int startPitch[MIDI_CHANNELS];
+ int endPitch[MIDI_CHANNELS];
+ int pitchOffset[MIDI_CHANNELS];
+ int veloOffset[MIDI_CHANNELS];
+ } data;
+ int notes[128]; // bitmapped note-on/channel values
+ bool learnMode;
+ int learnChannel;
+ bool learnStartPitch;
+
+ SplitLayerGui* gui;
+ friend class SplitLayerGui;
+
+ virtual void process(unsigned, unsigned, MidiEventList*, MidiEventList*);
+
+ public:
+ SplitLayer(const char* name, const MempiHost*);
+ ~SplitLayer();
+ virtual bool init();
+
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const { return gui->isVisible(); }
+ virtual void showGui(bool val) { gui->setShown(val); }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+
+ virtual void getInitData(int*, const unsigned char**) const;
+ virtual void setInitData(int, const unsigned char*);
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/splitlayer/splitlayergui.cpp b/muse_qt4_evolution/midiplugins/splitlayer/splitlayergui.cpp
new file mode 100644
index 00000000..b5d2bdb4
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/splitlayer/splitlayergui.cpp
@@ -0,0 +1,263 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2006 by Werner Schweer
+//
+// 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 "splitlayergui.h"
+#include "splitlayer.h"
+#include "gui.h"
+
+//---------------------------------------------------------
+// SplitLayerGui
+//---------------------------------------------------------
+
+SplitLayerGui::SplitLayerGui(SplitLayer* f, QWidget* parent)
+ : QWidget(parent)
+ {
+ sl = f;
+ QGridLayout* grid = new QGridLayout;
+ grid->setSpacing(1);
+ setLayout(grid);
+ QSignalMapper* m1 = new QSignalMapper(this);
+ QSignalMapper* m2 = new QSignalMapper(this);
+ QSignalMapper* m3 = new QSignalMapper(this);
+ QSignalMapper* m4 = new QSignalMapper(this);
+ QSignalMapper* m5 = new QSignalMapper(this);
+ QSignalMapper* m6 = new QSignalMapper(this);
+ connect(m1, SIGNAL(mapped(int)), SLOT(startPitchChanged(int)));
+ connect(m2, SIGNAL(mapped(int)), SLOT(endPitchChanged(int)));
+ connect(m3, SIGNAL(mapped(int)), SLOT(pitchOffsetChanged(int)));
+ connect(m4, SIGNAL(mapped(int)), SLOT(startVeloChanged(int)));
+ connect(m5, SIGNAL(mapped(int)), SLOT(endVeloChanged(int)));
+ connect(m6, SIGNAL(mapped(int)), SLOT(veloOffsetChanged(int)));
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ QLabel* l = new QLabel(QString("Ch %1").arg(i+1));
+ grid->addWidget(l, i, 0);
+
+ p1[i] = new Awl::PitchEdit(0);
+ p1[i]->setToolTip(tr("start pitch for split"));
+ connect(p1[i], SIGNAL(valueChanged(int)), m1, SLOT(map()));
+ m1->setMapping(p1[i], i);
+
+ a1[i] = new QAction(this);
+ a1[i]->setToolTip(tr("enable learn mode for start pitch"));
+ a1[i]->setCheckable(true);
+ QIcon icon;
+ icon.addFile(":/xpm/recordOn.svg", ICON_SIZE, QIcon::Normal, QIcon::On);
+ icon.addFile(":/xpm/recordOff.svg", ICON_SIZE, QIcon::Normal, QIcon::Off);
+ a1[i]->setIcon(icon);
+ a1[i]->setData(i);
+ QToolButton* rb1 = new QToolButton;
+ rb1->setDefaultAction(a1[i]);
+ connect(rb1, SIGNAL(triggered(QAction*)), SLOT(learnStartPitch(QAction*)));
+
+ p2[i] = new Awl::PitchEdit(0);
+ p2[i]->setToolTip(tr("end pitch for split"));
+ connect(p2[i], SIGNAL(valueChanged(int)), m2, SLOT(map()));
+ m2->setMapping(p2[i], i);
+
+ a2[i] = new QAction(this);
+ a2[i]->setToolTip(tr("enable learn mode for end pitch"));
+ a2[i]->setCheckable(true);
+ a2[i]->setIcon(icon);
+ a2[i]->setData(i);
+ QToolButton* rb2 = new QToolButton;
+ rb2->setDefaultAction(a2[i]);
+ connect(rb2, SIGNAL(triggered(QAction*)), SLOT(learnEndPitch(QAction*)));
+
+ p3[i] = new Awl::PitchEdit(0);
+ p3[i]->setToolTip(tr("pitch offset for split"));
+ p3[i]->setDeltaMode(true);
+ connect(p3[i], SIGNAL(valueChanged(int)), m3, SLOT(map()));
+ m3->setMapping(p3[i], i);
+
+ p4[i] = new QSpinBox;
+ p4[i]->setRange(0, 127);
+ p4[i]->setToolTip(tr("start velocity for split"));
+ connect(p4[i], SIGNAL(valueChanged(int)), m4, SLOT(map()));
+ m4->setMapping(p4[i], i);
+
+ p5[i] = new QSpinBox;
+ p5[i]->setRange(0, 127);
+ p5[i]->setToolTip(tr("end velocity for split"));
+ connect(p5[i], SIGNAL(valueChanged(int)), m5, SLOT(map()));
+ m5->setMapping(p5[i], i);
+
+ p6[i] = new QSpinBox;
+ p6[i]->setRange(-127, 127);
+ p6[i]->setToolTip(tr("velocity offset for split"));
+ connect(p6[i], SIGNAL(valueChanged(int)), m6, SLOT(map()));
+ m6->setMapping(p6[i], i);
+
+ grid->addWidget(p1[i], i, 1);
+ grid->addWidget(rb1, i, 2);
+ grid->addWidget(p2[i], i, 3);
+ grid->addWidget(rb2, i, 4);
+ grid->addWidget(p3[i], i, 5);
+ grid->addWidget(p4[i], i, 7);
+ grid->addWidget(p5[i], i, 8);
+ grid->addWidget(p6[i], i, 9);
+ }
+ QFrame* fr = new QFrame;
+ fr->setFrameStyle(QFrame::VLine | QFrame::Raised);
+ fr->setLineWidth(4);
+ grid->addWidget(fr, 0, 6, MIDI_CHANNELS, 1);
+
+ int filedes[2]; // 0 - reading 1 - writing
+ if (pipe(filedes) == -1) {
+ perror("SplitLayerGui:creating pipe");
+ exit(-1);
+ }
+ fd2 = filedes[0];
+ fd1 = filedes[1];
+
+ QSocketNotifier* socket = new QSocketNotifier(fd2,
+ QSocketNotifier::Read, this);
+ connect(socket, SIGNAL(activated(int)), SLOT(resetLearnMode(int)));
+ init();
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void SplitLayerGui::init()
+ {
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ p1[i]->setValue(sl->data.startPitch[i]);
+ p2[i]->setValue(sl->data.endPitch[i]);
+ p3[i]->setValue(sl->data.pitchOffset[i]);
+ p4[i]->setValue(sl->data.startVelo[i]);
+ p5[i]->setValue(sl->data.endVelo[i]);
+ p6[i]->setValue(sl->data.veloOffset[i]);
+ }
+ }
+
+//---------------------------------------------------------
+// learnStartPitch
+//---------------------------------------------------------
+
+void SplitLayerGui::learnStartPitch(QAction* a)
+ {
+ sl->learnChannel = a->data().toInt();
+ sl->learnStartPitch = true;
+ sl->learnMode = true;
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ if (a != a1[i])
+ a1[i]->setChecked(false);
+ if (a != a2[i])
+ a2[i]->setChecked(false);
+ }
+ }
+
+//---------------------------------------------------------
+// learnEndPitch
+//---------------------------------------------------------
+
+void SplitLayerGui::learnEndPitch(QAction* a)
+ {
+ sl->learnChannel = a->data().toInt();
+ sl->learnStartPitch = false;
+ sl->learnMode = true;
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ if (a != a1[i])
+ a1[i]->setChecked(false);
+ if (a != a2[i])
+ a2[i]->setChecked(false);
+ }
+ }
+
+//---------------------------------------------------------
+// startPitchChanged
+//---------------------------------------------------------
+
+void SplitLayerGui::startPitchChanged(int n)
+ {
+ sl->data.startPitch[n] = p1[n]->value();
+ }
+
+//---------------------------------------------------------
+// endPitchChanged
+//---------------------------------------------------------
+
+void SplitLayerGui::endPitchChanged(int n)
+ {
+ sl->data.endPitch[n] = p2[n]->value();
+ }
+
+//---------------------------------------------------------
+// pitchOffsetChanged
+//---------------------------------------------------------
+
+void SplitLayerGui::pitchOffsetChanged(int n)
+ {
+ sl->data.pitchOffset[n] = p3[n]->value();
+ }
+
+//---------------------------------------------------------
+// startVeloChanged
+//---------------------------------------------------------
+
+void SplitLayerGui::startVeloChanged(int n)
+ {
+ sl->data.startVelo[n] = p4[n]->value();
+ }
+
+//---------------------------------------------------------
+// endVeloChanged
+//---------------------------------------------------------
+
+void SplitLayerGui::endVeloChanged(int n)
+ {
+ sl->data.endVelo[n] = p5[n]->value();
+ }
+
+//---------------------------------------------------------
+// veloOffsetChanged
+//---------------------------------------------------------
+
+void SplitLayerGui::veloOffsetChanged(int n)
+ {
+ sl->data.veloOffset[n] = p6[n]->value();
+ }
+
+//---------------------------------------------------------
+// resetLearnMode
+//---------------------------------------------------------
+
+void SplitLayerGui::resetLearnMode(int fd)
+ {
+ char buffer[16];
+ read(fd, buffer, 16);
+
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ a1[i]->setChecked(false);
+ a2[i]->setChecked(false);
+ }
+ init();
+ }
+
+//---------------------------------------------------------
+// sendResetLearnMode
+//---------------------------------------------------------
+
+void SplitLayerGui::sendResetLearnMode()
+ {
+ write(fd1, "X", 1);
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/splitlayer/splitlayergui.h b/muse_qt4_evolution/midiplugins/splitlayer/splitlayergui.h
new file mode 100644
index 00000000..4f2006ca
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/splitlayer/splitlayergui.h
@@ -0,0 +1,65 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2006 by Werner Schweer
+//
+// 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 __SPLITLAYERGUI_H__
+#define __SPLITLAYERGUI_H__
+
+#include "awl/pitchedit.h"
+
+class SplitLayer;
+
+//---------------------------------------------------------
+// SplitLayerGui
+//---------------------------------------------------------
+
+class SplitLayerGui : public QWidget {
+ Q_OBJECT
+ SplitLayer* sl;
+
+ Awl::PitchEdit* p1[16];
+ Awl::PitchEdit* p2[16];
+ Awl::PitchEdit* p3[16];
+ QSpinBox* p4[16];
+ QSpinBox* p5[16];
+ QSpinBox* p6[16];
+
+ QAction* a1[16];
+ QAction* a2[16];
+ int fd1, fd2;
+
+ private slots:
+ void learnStartPitch(QAction*);
+ void learnEndPitch(QAction*);
+ void startPitchChanged(int);
+ void endPitchChanged(int);
+ void pitchOffsetChanged(int);
+ void resetLearnMode(int);
+ void startVeloChanged(int);
+ void endVeloChanged(int);
+ void veloOffsetChanged(int);
+
+ public:
+ SplitLayerGui(SplitLayer*, QWidget* parent=0);
+ void init();
+ void sendResetLearnMode();
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/transform/CMakeLists.txt b/muse_qt4_evolution/midiplugins/transform/CMakeLists.txt
new file mode 100644
index 00000000..1ac2652c
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/transform/CMakeLists.txt
@@ -0,0 +1,45 @@
+#=============================================================================
+# 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.
+#=============================================================================
+
+QT4_WRAP_CPP ( transform_mocs transform.h )
+QT4_WRAP_UI ( transform_uis transform.ui )
+
+add_library ( transform SHARED
+ transform.cpp
+ ${transform_mocs}
+ ${transform_uis}
+ )
+
+target_link_libraries( transform
+ midiplugin
+ ${QT_LIBRARIES}
+ )
+
+# - tell cmake to name target transform.so instead of
+# libtransform.so
+# - use precompiled header files
+#
+set_target_properties ( transform
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /${CMAKE_INSTALL_LIBDIR}/${MusE_INSTALL_NAME}/midiplugins/ transform )
+
diff --git a/muse_qt4_evolution/midiplugins/transform/transform.cpp b/muse_qt4_evolution/midiplugins/transform/transform.cpp
new file mode 100644
index 00000000..1376d2fc
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/transform/transform.cpp
@@ -0,0 +1,904 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: transform.cpp,v 1.8 2005/11/17 18:19:30 wschweer Exp $
+//
+// (C) Copyright 2001-2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "midievent.h"
+#include "transform.h"
+
+static int eventTypeTable[] = {
+ 1, 6, 4, 7, 8, 10, 11
+ };
+static int procVal2Map[] = { 0, 1, 2, 3, 4, 5, 6, 7, 10, 11 };
+
+struct TDict {
+ TransformFunction id;
+ const QString text;
+ TDict(TransformFunction f, const QString& s) : id(f), text(s) {}
+ };
+
+static const TDict oplist[] = {
+ TDict(Trans, QString("Transform")),
+ TDict(Delete, QString("Filter"))
+ };
+
+static const char* vall[] = {
+ "c","c#","d","d#","e","f","f#","g","g#","a","a#","h"
+ };
+static const char* valu[] = {
+ "C","C#","D","D#","E","F","F#","G","G#","A","A#","H"
+ };
+
+//---------------------------------------------------------
+// pitch2string
+//---------------------------------------------------------
+
+static QString pitch2string(int v)
+ {
+ if (v < 0 || v > 127)
+ return QString("----");
+ int octave = (v / 12) - 2;
+ QString o;
+ o.sprintf("%d", octave);
+ int i = v % 12;
+ QString s(octave < 0 ? valu[i] : vall[i]);
+ return s + o;
+ }
+//---------------------------------------------------------
+// Transform
+//---------------------------------------------------------
+
+Transform::Transform(const char* name, const MempiHost* h)
+ : Mempi(name, h)
+ {
+ }
+
+bool Transform::init()
+ {
+ gui = new TransformDialog(this, 0);
+ gui->setWindowTitle(QString(name()));
+ gui->show();
+
+ data.selEventOp = All;
+ data.selType = 0x90;
+ data.selVal1 = Ignore;
+ data.selVal1a = 0;
+ data.selVal1b = 0;
+ data.selVal2 = Ignore;
+ data.selVal2a = 0;
+ data.selVal2b = 0;
+ data.procEvent = Keep;
+ data.eventType = 0x90;
+ data.procVal1 = Keep;
+ data.procVal1a = 0;
+ data.procVal1b = 0;
+ data.procVal2 = Keep;
+ data.procVal2a = 0;
+ data.procVal2b = 0;
+ data.funcOp = Trans;
+ data.quantVal = host->division();
+ data.selChannel = Ignore;
+ data.selChannela = 0;
+ data.selChannelb = 0;
+ data.procChannel = Keep;
+ data.procChannela = 0;
+ data.procChannelb = 0;
+ return false;
+ }
+
+//---------------------------------------------------------
+// filterValOp
+//---------------------------------------------------------
+
+static bool filterValOp(ValOp op, int val, int val1, int val2)
+ {
+ switch (op) {
+ case Ignore:
+ break;
+ case Equal:
+ if (val != val1)
+ return true;
+ break;
+ case Unequal:
+ if (val == val1)
+ return true;
+ break;
+ case Higher:
+ if (val <= val1)
+ return true;
+ break;
+ case Lower:
+ if (val >= val1)
+ return true;
+ break;
+ case Inside:
+ if ((val < val1) || (val >= val2))
+ return true;
+ break;
+ case Outside:
+ if ((val >= val1) && (val < val2))
+ return true;
+ break;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// apply
+// apply Select filter
+// return 0 - not applied
+// 1 - drop event
+// 2 - event changed
+//---------------------------------------------------------
+
+void Transform::process(unsigned, unsigned, MidiEventList* il, MidiEventList* ol)
+ {
+ for (iMidiEvent i = il->begin(); i != il->end(); ++i) {
+ MidiEvent event(*i);
+ if (filterEvent(event) == 1)
+ continue;
+ ol->insert(event);
+ }
+ }
+
+//---------------------------------------------------------
+// filterEvent
+//---------------------------------------------------------
+
+int Transform::filterEvent(MidiEvent& event)
+ {
+ switch (data.selEventOp) {
+ case Equal:
+ switch(event.type()) {
+ case 0x90:
+ case 0x80:
+ if (data.selType != 0x90)
+ return 0;
+ break;
+ default:
+ if (event.type() != data.selType)
+ return 0;
+ break;
+ }
+ break;
+ case Unequal:
+ switch(event.type()) {
+ case 0x90:
+ case 0x80:
+ if (data.selType == 0x90)
+ return 0;
+ break;
+ default:
+ if (event.type() == data.selType)
+ return 0;
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ if (filterValOp(data.selVal1, event.dataA(), data.selVal1a, data.selVal1b))
+ return 0;
+ if (filterValOp(data.selVal2, event.dataB(), data.selVal2a, data.selVal2b))
+ return 0;
+ if (filterValOp(data.selChannel, event.channel(), data.selChannela, data.selChannelb))
+ return 0;
+
+ if (data.funcOp == Delete)
+ return 1; // discard event
+
+ // transform event
+ if (data.procEvent != Keep)
+ event.setType(data.eventType);
+
+ //---------------------------------------------------
+ // transform value A
+ //---------------------------------------------------
+
+ int val = event.dataA();
+ switch (data.procVal1) {
+ case Keep:
+ break;
+ case Plus:
+ val += data.procVal1a;
+ break;
+ case Minus:
+ val -= data.procVal1a;
+ break;
+ case Multiply:
+ val = int(val * (data.procVal1a/100.0) + .5);
+ break;
+ case Divide:
+ val = int(val / (data.procVal1a/100.0) + .5);
+ break;
+ case Fix:
+ val = data.procVal1a;
+ break;
+ case Value:
+ val = data.procVal2a;
+ break;
+ case Invert:
+ val = 127 - val;
+ break;
+ case ScaleMap:
+ printf("scale map not implemented\n");
+ break;
+ case Flip:
+ val = data.procVal1a - val;
+ break;
+ case Dynamic: // "crescendo"
+ printf("transform not implemented\n");
+ break;
+ case Random:
+ {
+ int range = data.procVal1b - data.procVal1a;
+ if (range > 0)
+ val = (rand() % range) + data.procVal1a;
+ else if (range < 0)
+ val = (rand() % -range) + data.procVal1b;
+ else
+ val = data.procVal1a;
+ }
+ break;
+ }
+ if (val < 0)
+ val = 0;
+ if (val > 127)
+ val = 127;
+ event.setA(val);
+
+ //---------------------------------------------------
+ // transform value B
+ //---------------------------------------------------
+
+ val = event.dataB();
+ switch (data.procVal2) {
+ case Plus:
+ val += data.procVal2a;
+ break;
+ case Minus:
+ val -= data.procVal2a;
+ break;
+ case Multiply:
+ val = int(val * (data.procVal2a/100.0) + .5);
+ break;
+ case Divide:
+ val = int(val / (data.procVal2a/100.0) + .5);
+ break;
+ case Fix:
+ val = data.procVal2a;
+ break;
+ case Value:
+ val = data.procVal1a;
+ break;
+ case Invert:
+ val = 127 - val;
+ break;
+ case Dynamic:
+ printf("transform not implemented\n");
+ break;
+ case Random:
+ {
+ int range = data.procVal2b - data.procVal2a;
+ if (range > 0)
+ val = (rand() % range) + data.procVal2a;
+ else if (range < 0)
+ val = (rand() % -range) + data.procVal2b;
+ else
+ val = data.procVal2a;
+ }
+ break;
+ case ScaleMap:
+ case Keep:
+ case Flip:
+ break;
+ }
+ if (val < 0)
+ val = 0;
+ if (val > 127)
+ val = 127;
+ event.setB(val);
+
+ //---------------------------------------------------
+ // transform channel
+ //---------------------------------------------------
+
+ val = event.channel();
+ switch (data.procChannel) {
+ case Plus:
+ val += data.procChannela;
+ break;
+ case Minus:
+ val -= data.procChannela;
+ break;
+ case Multiply:
+ val = int(val * (data.procChannela/100.0) + .5);
+ break;
+ case Divide:
+ val = int(val / (data.procChannela/100.0) + .5);
+ break;
+ case Fix:
+ val = data.procChannela;
+ break;
+ case Value:
+ val = data.procChannela;
+ break;
+ case Invert:
+ val = 16 - val;
+ break;
+ case Dynamic:
+ printf("transform not implemented\n");
+ break;
+ case Random:
+ {
+ int range = data.procChannelb - data.procChannela;
+ if (range > 0)
+ val = (rand() % range) + data.procChannela;
+ else if (range < 0)
+ val = (rand() % -range) + data.procChannelb;
+ else
+ val = data.procChannela;
+ }
+ break;
+ case ScaleMap:
+ case Keep:
+ case Flip:
+ break;
+ }
+ if (val < 0)
+ val = 0;
+ if (val > 15)
+ val = 15;
+ event.setChannel(val);
+ return 2;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void Transform::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ QPoint pos(gui->pos());
+ QSize size(gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void Transform::setGeometry(int x, int y, int w, int h)
+ {
+ gui->resize(QSize(w, h));
+ gui->move(QPoint(x, y));
+ }
+
+//---------------------------------------------------------
+// TransformDialog
+// Widgets:
+// selEventOp selType
+// selVal1Op selVal1a selVal1b
+// selVal2Op selVal2a selVal2b
+//
+// procEventOp procType
+// procVal1Op procVal1a procVal1b
+// procVal2Op procVal2a procVal2b
+// funcOp funcQuantVal
+// buttonNew buttonDelete
+//
+// selChannelOp selChannelVala selChannelValb
+// procChannelOp procChannelVala procChannelValb
+//---------------------------------------------------------
+
+TransformDialog::TransformDialog(Transform* tf, QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ cmt = tf;
+
+ for (unsigned i = 0; i < sizeof(oplist)/sizeof(*oplist); ++i)
+ funcOp->addItem(oplist[i].text, i);
+
+ connect(selEventOp, SIGNAL(activated(int)), SLOT(selEventOpSel(int)));
+ connect(selType, SIGNAL(activated(int)), SLOT(selTypeSel(int)));
+ connect(selVal1Op, SIGNAL(activated(int)), SLOT(selVal1OpSel(int)));
+ connect(selVal2Op, SIGNAL(activated(int)), SLOT(selVal2OpSel(int)));
+ connect(procEventOp, SIGNAL(activated(int)), SLOT(procEventOpSel(int)));
+ connect(procType, SIGNAL(activated(int)), SLOT(procEventTypeSel(int)));
+ connect(procVal1Op, SIGNAL(activated(int)), SLOT(procVal1OpSel(int)));
+ connect(procVal2Op, SIGNAL(activated(int)), SLOT(procVal2OpSel(int)));
+ connect(funcOp, SIGNAL(activated(int)), SLOT(funcOpSel(int)));
+ connect(selVal1a, SIGNAL(valueChanged(int)), SLOT(selVal1aChanged(int)));
+ connect(selVal1b, SIGNAL(valueChanged(int)), SLOT(selVal1bChanged(int)));
+ connect(selVal2a, SIGNAL(valueChanged(int)), SLOT(selVal2aChanged(int)));
+ connect(selVal2b, SIGNAL(valueChanged(int)), SLOT(selVal2bChanged(int)));
+ connect(procVal1a, SIGNAL(valueChanged(int)), SLOT(procVal1aChanged(int)));
+ connect(procVal1b, SIGNAL(valueChanged(int)), SLOT(procVal1bChanged(int)));
+ connect(procVal2a, SIGNAL(valueChanged(int)), SLOT(procVal2aChanged(int)));
+ connect(procVal2b, SIGNAL(valueChanged(int)), SLOT(procVal2bChanged(int)));
+ connect(selChannelOp, SIGNAL(activated(int)), SLOT(selChannelOpSel(int)));
+ connect(selChannelVala, SIGNAL(valueChanged(int)), SLOT(selChannelValaChanged(int)));
+ connect(selChannelValb, SIGNAL(valueChanged(int)), SLOT(selChannelValbChanged(int)));
+ connect(procChannelOp, SIGNAL(activated(int)), SLOT(procChannelOpSel(int)));
+ connect(procChannelVala, SIGNAL(valueChanged(int)), SLOT(procChannelValaChanged(int)));
+ connect(procChannelValb, SIGNAL(valueChanged(int)), SLOT(procChannelValbChanged(int)));
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+void TransformDialog::init()
+ {
+ selEventOp->setCurrentIndex(cmt->data.selEventOp);
+ selEventOpSel(cmt->data.selEventOp);
+
+ for (unsigned i = 0; i < sizeof(eventTypeTable)/sizeof(*eventTypeTable); ++i) {
+ if (eventTypeTable[i] == cmt->data.selType) {
+ selType->setCurrentIndex(i);
+ break;
+ }
+ }
+
+ selVal1Op->setCurrentIndex(cmt->data.selVal1);
+ selVal1OpSel(cmt->data.selVal1);
+
+ selVal2Op->setCurrentIndex(cmt->data.selVal2);
+ selVal2OpSel(cmt->data.selVal2);
+
+ selChannelOp->setCurrentIndex(cmt->data.selChannel);
+ selChannelOpSel(cmt->data.selChannel);
+
+ {
+ unsigned i;
+ for (i = 0; i < sizeof(oplist)/sizeof(*oplist); ++i) {
+ if (oplist[i].id == cmt->data.funcOp) {
+ funcOp->setCurrentIndex(i);
+ break;
+ }
+ }
+ if (i == sizeof(oplist)/sizeof(*oplist))
+ printf("internal error: bad OpCode\n");
+ funcOpSel(i);
+ }
+
+ procEventOp->setCurrentIndex(cmt->data.procEvent);
+ procEventOpSel(cmt->data.procEvent);
+
+ procVal1Op->setCurrentIndex(cmt->data.procVal1);
+ procVal1OpSel(cmt->data.procVal1);
+
+ for (unsigned i = 0; i < sizeof(procVal2Map)/sizeof(*procVal2Map); ++i) {
+ if (procVal2Map[i] == cmt->data.procVal2) {
+ procVal2Op->setCurrentIndex(i);
+ break;
+ }
+ }
+
+ selVal1a->setValue(cmt->data.selVal1a);
+ selVal1b->setValue(cmt->data.selVal1b);
+ selVal1aChanged(cmt->data.selVal1a);
+ selVal1bChanged(cmt->data.selVal1b);
+
+ selVal2a->setValue(cmt->data.selVal2a);
+ selVal2b->setValue(cmt->data.selVal2b);
+
+ selChannelVala->setValue(cmt->data.selChannela);
+ selChannelValb->setValue(cmt->data.selChannelb);
+
+ procVal1a->setValue(cmt->data.procVal1a);
+ procVal1b->setValue(cmt->data.procVal1b);
+
+ procVal2a->setValue(cmt->data.procVal2a);
+ procVal2b->setValue(cmt->data.procVal2b);
+
+ procChannelVala->setValue(cmt->data.procChannela);
+ procChannelValb->setValue(cmt->data.procChannelb);
+ }
+
+//---------------------------------------------------------
+// setValOp
+//---------------------------------------------------------
+
+void TransformDialog::setValOp(QWidget* a, QWidget* b, ValOp op)
+ {
+ switch (op) {
+ case Ignore:
+ a->setEnabled(false);
+ b->setEnabled(false);
+ break;
+ case Equal:
+ case Unequal:
+ case Higher:
+ case Lower:
+ a->setEnabled(true);
+ b->setEnabled(false);
+ break;
+ case Inside:
+ case Outside:
+ a->setEnabled(true);
+ b->setEnabled(true);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// selEventOpSel
+//---------------------------------------------------------
+
+void TransformDialog::selEventOpSel(int val)
+ {
+ selType->setEnabled(val != All);
+ cmt->data.selEventOp = ValOp(val);
+ selVal1aChanged(cmt->data.selVal1a);
+ selVal1bChanged(cmt->data.selVal1b);
+ }
+
+//---------------------------------------------------------
+// selTypeSel
+//---------------------------------------------------------
+
+void TransformDialog::selTypeSel(int val)
+ {
+ cmt->data.selType = eventTypeTable[val];
+ selVal1aChanged(cmt->data.selVal1a);
+ selVal1bChanged(cmt->data.selVal1b);
+ }
+
+//---------------------------------------------------------
+// selVal1OpSel
+//---------------------------------------------------------
+
+void TransformDialog::selVal1OpSel(int val)
+ {
+ setValOp(selVal1a, selVal1b, ValOp(val));
+ cmt->data.selVal1 = ValOp(val);
+ }
+
+//---------------------------------------------------------
+// selVal2OpSel
+//---------------------------------------------------------
+
+void TransformDialog::selVal2OpSel(int val)
+ {
+ setValOp(selVal2a, selVal2b, ValOp(val));
+ cmt->data.selVal2 = ValOp(val);
+ }
+
+//---------------------------------------------------------
+// procEventOpSel
+//---------------------------------------------------------
+
+void TransformDialog::procEventOpSel(int val)
+ {
+ TransformOperator op = val == 0 ? Keep : Fix;
+ procType->setEnabled(op == Fix);
+ cmt->data.procEvent = op;
+ }
+
+//---------------------------------------------------------
+// procEventTypeSel
+//---------------------------------------------------------
+
+void TransformDialog::procEventTypeSel(int val)
+ {
+ cmt->data.eventType = eventTypeTable[val];
+ }
+
+//---------------------------------------------------------
+// procVal1OpSel
+//---------------------------------------------------------
+
+void TransformDialog::procVal1OpSel(int val)
+ {
+ cmt->data.procVal1 = TransformOperator(val);
+ switch(TransformOperator(val)) {
+ case Keep:
+ case Invert:
+ procVal1a->setEnabled(false);
+ procVal1b->setEnabled(false);
+ break;
+ case Multiply:
+ case Divide:
+ procVal1a->setEnabled(true);
+ procVal1b->setEnabled(false);
+ break;
+ case Plus:
+ case Minus:
+ case Fix:
+ case Value:
+ case Flip:
+ procVal1a->setEnabled(true);
+ procVal1b->setEnabled(false);
+ break;
+ case Random:
+ case ScaleMap:
+ case Dynamic:
+ procVal1a->setEnabled(true);
+ procVal1b->setEnabled(true);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// procVal2OpSel
+//---------------------------------------------------------
+
+void TransformDialog::procVal2OpSel(int val)
+ {
+ TransformOperator op = TransformOperator(procVal2Map[val]);
+ cmt->data.procVal2 = op;
+
+ switch (op) {
+ case Keep:
+ case Invert:
+ procVal2a->setEnabled(false);
+ procVal2b->setEnabled(false);
+ break;
+ case Multiply:
+ case Divide:
+ procVal2a->setEnabled(true);
+ procVal2b->setEnabled(false);
+ break;
+ case Plus:
+ case Minus:
+ case Fix:
+ case Value:
+ procVal2a->setEnabled(true);
+ procVal2b->setEnabled(false);
+ break;
+ case Random:
+ case Dynamic:
+ procVal2a->setEnabled(true);
+ procVal2b->setEnabled(true);
+ break;
+ default:
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// funcOpSel
+//---------------------------------------------------------
+
+void TransformDialog::funcOpSel(int val)
+ {
+ TransformFunction op = oplist[val].id;
+
+ bool isFuncOp(op == Trans);
+
+ procEventOp->setEnabled(isFuncOp);
+ procType->setEnabled(isFuncOp);
+ procVal1Op->setEnabled(isFuncOp);
+ procVal1a->setEnabled(isFuncOp);
+ procVal1b->setEnabled(isFuncOp);
+ procVal2Op->setEnabled(isFuncOp);
+ procVal2a->setEnabled(isFuncOp);
+ procVal2b->setEnabled(isFuncOp);
+ procChannelOp->setEnabled(isFuncOp);
+ procChannelVala->setEnabled(isFuncOp);
+ procChannelValb->setEnabled(isFuncOp);
+ if (isFuncOp) {
+ procEventOpSel(cmt->data.procEvent);
+ procVal1OpSel(cmt->data.procVal1);
+ procVal2OpSel(cmt->data.procVal2);
+ procChannelOpSel(cmt->data.procChannel);
+ }
+ cmt->data.funcOp = op;
+ }
+
+//---------------------------------------------------------
+// selVal1aChanged
+//---------------------------------------------------------
+
+void TransformDialog::selVal1aChanged(int val)
+ {
+ cmt->data.selVal1a = val;
+ if ((cmt->data.selEventOp != All)
+ && (cmt->data.selType == 0x90)) {
+ selVal1a->setSuffix(" - " + pitch2string(val));
+ }
+ else
+ selVal1a->setSuffix(QString(""));
+ }
+
+//---------------------------------------------------------
+// selVal1bChanged
+//---------------------------------------------------------
+
+void TransformDialog::selVal1bChanged(int val)
+ {
+ cmt->data.selVal1b = val;
+ if ((cmt->data.selEventOp != All)
+ && (cmt->data.selType == 0x90)) {
+ selVal1b->setSuffix(" - " + pitch2string(val));
+ }
+ else
+ selVal1b->setSuffix(QString(""));
+ }
+
+//---------------------------------------------------------
+// selVal2aChanged
+//---------------------------------------------------------
+
+void TransformDialog::selVal2aChanged(int val)
+ {
+ cmt->data.selVal2a = val;
+ }
+
+//---------------------------------------------------------
+// selVal2bChanged
+//---------------------------------------------------------
+
+void TransformDialog::selVal2bChanged(int val)
+ {
+ cmt->data.selVal2b = val;
+ }
+
+//---------------------------------------------------------
+// procVal1aChanged
+//---------------------------------------------------------
+
+void TransformDialog::procVal1aChanged(int val)
+ {
+ cmt->data.procVal1a = val;
+ }
+
+//---------------------------------------------------------
+// procVal1bChanged
+//---------------------------------------------------------
+
+void TransformDialog::procVal1bChanged(int val)
+ {
+ cmt->data.procVal1b = val;
+ }
+
+//---------------------------------------------------------
+// procVal2aChanged
+//---------------------------------------------------------
+
+void TransformDialog::procVal2aChanged(int val)
+ {
+ cmt->data.procVal2a = val;
+ }
+
+//---------------------------------------------------------
+// procVal2bChanged
+//---------------------------------------------------------
+
+void TransformDialog::procVal2bChanged(int val)
+ {
+ cmt->data.procVal2b = val;
+ }
+
+//---------------------------------------------------------
+// selChannelOpSel
+//---------------------------------------------------------
+
+void TransformDialog::selChannelOpSel(int val)
+ {
+ setValOp(selChannelVala, selChannelValb, ValOp(val));
+ cmt->data.selChannel = ValOp(val);
+ }
+
+//---------------------------------------------------------
+// selChannelValaChanged
+//---------------------------------------------------------
+
+void TransformDialog::selChannelValaChanged(int val)
+ {
+ cmt->data.selChannela = val;
+ }
+
+//---------------------------------------------------------
+// selChannelValbChanged
+//---------------------------------------------------------
+
+void TransformDialog::selChannelValbChanged(int val)
+ {
+ cmt->data.selChannelb = val;
+ }
+
+//---------------------------------------------------------
+// procChannelOpSel
+//---------------------------------------------------------
+
+void TransformDialog::procChannelOpSel(int val)
+ {
+ cmt->data.procChannel = TransformOperator(val);
+ switch(TransformOperator(val)) {
+ case Keep:
+ case Invert:
+ procChannelVala->setEnabled(false);
+ procChannelValb->setEnabled(false);
+ break;
+ case Multiply:
+ case Divide:
+ procChannelVala->setEnabled(true);
+ procChannelValb->setEnabled(false);
+ break;
+ case Plus:
+ case Minus:
+ case Fix:
+ case Value:
+ case Flip:
+ procChannelVala->setEnabled(true);
+ procChannelValb->setEnabled(false);
+ break;
+ case Random:
+ case ScaleMap:
+ case Dynamic:
+ procChannelVala->setEnabled(true);
+ procChannelValb->setEnabled(true);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// procChannelValaChanged
+//---------------------------------------------------------
+
+void TransformDialog::procChannelValaChanged(int val)
+ {
+ cmt->data.procChannela = val;
+ }
+
+//---------------------------------------------------------
+// procChannelValbChanged
+//---------------------------------------------------------
+
+void TransformDialog::procChannelValbChanged(int val)
+ {
+ cmt->data.procChannelb = val;
+ }
+
+//---------------------------------------------------------
+// getInitData
+//---------------------------------------------------------
+
+void Transform::getInitData(int* n, const unsigned char** p) const
+ {
+ *n = sizeof(data);
+ *p = (unsigned char*)&data;
+ }
+
+//---------------------------------------------------------
+// setInitData
+//---------------------------------------------------------
+
+void Transform::setInitData(int n, const unsigned char* p)
+ {
+ memcpy((void*)&data, p, n);
+ if (gui)
+ gui->init();
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+static Mempi* instantiate(const char* name, const MempiHost* h)
+ {
+ return new Transform(name, h);
+ }
+
+extern "C" {
+ static MEMPI descriptor = {
+ "Transformator",
+ "MusE Midi Event Transformator",
+ "0.1", // version string
+ MEMPI_FILTER,
+ MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
+ instantiate
+ };
+
+ const MEMPI* mempi_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/transform/transform.h b/muse_qt4_evolution/midiplugins/transform/transform.h
new file mode 100644
index 00000000..6f68698d
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/transform/transform.h
@@ -0,0 +1,126 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: transform.h,v 1.5 2005/10/05 17:02:03 lunar_shuttle Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TRANSFORM_H__
+#define __TRANSFORM_H__
+
+#include "../libmidiplugin/mempi.h"
+#include "ui_transform.h"
+
+class Transform;
+
+namespace AL {
+ class Xml;
+ };
+using AL::Xml;
+
+enum ValOp {
+ All=0, Ignore=0, Equal=1, Unequal=2, Higher=3, Lower=4,
+ Inside=5, Outside=6
+ };
+
+enum TransformFunction {
+ Select, Quantize, Delete, Trans, Insert, Copy, Extract
+ };
+
+enum TransformOperator {
+ Keep, Plus, Minus, Multiply, Divide, Fix, Value, Invert,
+ ScaleMap, Flip, Dynamic, Random
+ };
+
+//---------------------------------------------------------
+// TransformDialog
+//---------------------------------------------------------
+
+class TransformDialog : public QDialog, public Ui::TransformDialogBase {
+ Q_OBJECT
+ Transform* cmt;
+
+ void setValOp(QWidget* a, QWidget* b, ValOp op);
+
+ signals:
+ void hideWindow();
+
+ private slots:
+ void selEventOpSel(int);
+ void selTypeSel(int);
+ void selVal1OpSel(int);
+ void selVal2OpSel(int);
+ void procEventOpSel(int);
+ void procEventTypeSel(int);
+ void procVal1OpSel(int);
+ void procVal2OpSel(int);
+ void funcOpSel(int);
+ void selVal1aChanged(int);
+ void selVal1bChanged(int);
+ void selVal2aChanged(int);
+ void selVal2bChanged(int);
+ void procVal1aChanged(int);
+ void procVal1bChanged(int);
+ void procVal2aChanged(int);
+ void procVal2bChanged(int);
+ void selChannelOpSel(int);
+ void selChannelValaChanged(int);
+ void selChannelValbChanged(int);
+ void procChannelOpSel(int);
+ void procChannelValaChanged(int);
+ void procChannelValbChanged(int);
+
+ public:
+ TransformDialog(Transform*, QWidget* parent);
+ void init();
+ };
+
+//---------------------------------------------------------
+// Transform
+//---------------------------------------------------------
+
+class Transform : public Mempi {
+ int filterEvent(MidiEvent& event);
+
+ public:
+ struct initData {
+ ValOp selEventOp;
+ int selType;
+
+ ValOp selVal1;
+ int selVal1a, selVal1b;
+ ValOp selVal2;
+ int selVal2a, selVal2b;
+ ValOp selChannel;
+ int selChannela, selChannelb;
+
+ TransformOperator procEvent;
+ int eventType;
+ TransformOperator procVal1;
+ int procVal1a, procVal1b;
+ TransformOperator procVal2;
+ int procVal2a, procVal2b;
+ TransformOperator procChannel;
+ int procChannela, procChannelb;
+
+ TransformFunction funcOp;
+ int quantVal;
+ } data;
+
+ TransformDialog* gui;
+ virtual void process(unsigned, unsigned, MidiEventList*, MidiEventList*);
+
+ Transform(const char* name, const MempiHost*);
+ virtual bool init();
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const { return gui->isVisible(); }
+ virtual void showGui(bool val) { gui->setShown(val); }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+ virtual void getInitData(int*, const unsigned char**) const;
+ virtual void setInitData(int, const unsigned char*);
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/transform/transform.ui b/muse_qt4_evolution/midiplugins/transform/transform.ui
new file mode 100644
index 00000000..c23cf343
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/transform/transform.ui
@@ -0,0 +1,616 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>TransformDialogBase</class>
+ <widget class="QDialog" name="TransformDialogBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>630</width>
+ <height>418</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Midi Input Transformator</string>
+ </property>
+ <property name="sizeGripEnabled" >
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="GroupBox3" >
+ <property name="title" >
+ <string>Filter</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <widget class="QComboBox" name="selEventOp" >
+ <item>
+ <property name="text" >
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QComboBox" name="selType" >
+ <item>
+ <property name="text" >
+ <string>Note</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Poly Pressure</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Control Change</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Aftertouch</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Pitch Bend</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>NRPN</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>RPN</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="TextLabel3" >
+ <property name="text" >
+ <string>Value 2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="TextLabel2" >
+ <property name="text" >
+ <string>Value 1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel1" >
+ <property name="text" >
+ <string>Event Type</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QComboBox" name="selVal1Op" >
+ <item>
+ <property name="text" >
+ <string>Ignore</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Higher</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Lower</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Inside</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Outside</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="selVal1b" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSpinBox" name="selVal2b" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="selVal1a" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QComboBox" name="selVal2Op" >
+ <item>
+ <property name="text" >
+ <string>Ignore</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Higher</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Lower</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Inside</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Outside</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QComboBox" name="selChannelOp" >
+ <item>
+ <property name="text" >
+ <string>Ignore</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Equal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Unequal</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Higher</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Lower</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Inside</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Outside</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLabel" name="TextLabel2_2" >
+ <property name="text" >
+ <string>Channel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSpinBox" name="selVal2a" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3" >
+ <widget class="QSpinBox" name="selChannelVala" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3" >
+ <widget class="QSpinBox" name="selChannelValb" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="GroupBox5" >
+ <property name="title" >
+ <string>Processing</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>11</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="TextLabel5" >
+ <property name="text" >
+ <string>Event Type</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QComboBox" name="procEventOp" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QComboBox" name="procType" >
+ <item>
+ <property name="text" >
+ <string>Note</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Poly Pressure</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Control Change</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Aftertouch</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Pitch Bend</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>NRPN</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>RPN</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QComboBox" name="procVal1Op" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Minus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Multiply</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Divide</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Value 2</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Invert</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>ScaleMap</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Flip</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Dyn</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Random</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="TextLabel6" >
+ <property name="text" >
+ <string>Value 1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QLabel" name="TextLabel7" >
+ <property name="text" >
+ <string>Value 2</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QSpinBox" name="procVal1b" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QSpinBox" name="procVal2b" >
+ <property name="maximum" >
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3" >
+ <widget class="QSpinBox" name="procChannelValb" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2" >
+ <widget class="QComboBox" name="procVal2Op" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Minus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Multiply</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Divide</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Value 1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Invert</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Dyn</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Random</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="1" column="3" >
+ <widget class="QComboBox" name="procChannelOp" >
+ <item>
+ <property name="text" >
+ <string>Keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Plus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Minus</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Multiply</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Divide</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Fix</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Value 1</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Invert</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Dyn</string>
+ </property>
+ </item>
+ <item>
+ <property name="text" >
+ <string>Random</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <widget class="QLabel" name="TextLabel2_2_2" >
+ <property name="text" >
+ <string>Channel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QComboBox" name="funcOp" />
+ </item>
+ <item row="2" column="1" >
+ <widget class="QSpinBox" name="procVal1a" />
+ </item>
+ <item row="2" column="2" >
+ <widget class="QSpinBox" name="procVal2a" />
+ </item>
+ <item row="2" column="3" >
+ <widget class="QSpinBox" name="procChannelVala" />
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+ <tabstops>
+ <tabstop>selEventOp</tabstop>
+ <tabstop>selType</tabstop>
+ <tabstop>selVal1Op</tabstop>
+ <tabstop>selVal1a</tabstop>
+ <tabstop>selVal1b</tabstop>
+ <tabstop>selVal2Op</tabstop>
+ <tabstop>selVal2a</tabstop>
+ <tabstop>selVal2b</tabstop>
+ <tabstop>selChannelOp</tabstop>
+ <tabstop>selChannelVala</tabstop>
+ <tabstop>selChannelValb</tabstop>
+ <tabstop>procEventOp</tabstop>
+ <tabstop>procType</tabstop>
+ <tabstop>procVal1Op</tabstop>
+ <tabstop>procVal1b</tabstop>
+ <tabstop>procVal2Op</tabstop>
+ <tabstop>procVal2b</tabstop>
+ <tabstop>procChannelOp</tabstop>
+ <tabstop>procChannelValb</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/muse_qt4_evolution/midiplugins/trigg/CMakeLists.txt b/muse_qt4_evolution/midiplugins/trigg/CMakeLists.txt
new file mode 100644
index 00000000..397ccf81
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/trigg/CMakeLists.txt
@@ -0,0 +1,47 @@
+#=============================================================================
+# 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.
+#=============================================================================
+
+QT4_WRAP_CPP ( trigg_mocs trigggui.h )
+QT4_WRAP_UI ( trigg_uis trigggui.ui )
+
+add_library ( trigg SHARED
+ trigg.cpp
+ trigggui.cpp
+ trigggui.h
+ ${trigg_mocs}
+ ${trigg_uis}
+ )
+
+target_link_libraries( trigg
+ midiplugin awl
+ ${QT_LIBRARIES}
+ )
+
+# - tell cmake to name target name.so instead of
+# libname.so
+# - use precompiled header files
+#
+set_target_properties ( trigg
+ PROPERTIES PREFIX ""
+ COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"
+ )
+
+install_targets ( /${CMAKE_INSTALL_LIBDIR}/${MusE_INSTALL_NAME}/midiplugins/ trigg )
+
diff --git a/muse_qt4_evolution/midiplugins/trigg/trigg.cpp b/muse_qt4_evolution/midiplugins/trigg/trigg.cpp
new file mode 100644
index 00000000..fb3703cb
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/trigg/trigg.cpp
@@ -0,0 +1,131 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filter.cpp,v 1.10 2005/11/06 17:49:34 wschweer Exp $
+//
+// filter - simple midi filter
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "trigggui.h"
+#include "trigg.h"
+#include "midi.h"
+#include "midievent.h"
+
+//---------------------------------------------------------
+// Trigg
+//---------------------------------------------------------
+
+Trigg::Trigg(const char* name, const MempiHost* h)
+ : Mempi(name, h)
+ {
+ data.note=30; // allow any events
+ data.velocity=127;
+ gui = 0;
+ }
+
+//---------------------------------------------------------
+// Trigg
+//---------------------------------------------------------
+
+Trigg::~Trigg()
+ {
+ if (gui)
+ delete gui;
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+
+bool Trigg::init()
+ {
+ gui = new TriggGui(this, 0);
+ gui->setWindowTitle("MusE: "+QString(name()));
+ gui->show();
+ return false;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+//---------------------------------------------------------
+
+void Trigg::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ QPoint pos(gui->pos());
+ QSize size(gui->size());
+ *x = pos.x();
+ *y = pos.y();
+ *w = size.width();
+ *h = size.height();
+ }
+
+//---------------------------------------------------------
+// setGeometry
+//---------------------------------------------------------
+
+void Trigg::setGeometry(int x, int y, int w, int h)
+ {
+ gui->resize(QSize(w, h));
+ gui->move(QPoint(x, y));
+ }
+
+//---------------------------------------------------------
+// process
+//---------------------------------------------------------
+
+void Trigg::process(unsigned , unsigned , MidiEventList* il, MidiEventList* ol)
+ {
+
+ for (iMidiEvent i = il->begin(); i != il->end(); ++i) {
+ MidiEvent temp=*i;
+ if (temp.isNote() || temp.isNoteOff())
+ {
+ // for each event modify note and velocity
+ printf("a=%d b=%d isNote=%d isNoteOff=%d\n",temp.dataA(),temp.dataB(),temp.isNote(),temp.isNoteOff());
+ temp.setA(data.note);
+ if (!temp.isNoteOff())
+ temp.setB(data.velocity);
+ printf("AFTER a=%d b=%d\n",temp.dataA(),temp.dataB());
+ }
+ ol->insert(temp);
+ }
+ }
+
+void Trigg::getInitData(int* n, const unsigned char** p) const
+ {
+ *n = sizeof(data);
+ *p = (unsigned char*)&data;
+ printf("::getInitData note=%d vel=%d\n",data.note,data.velocity);
+ }
+
+void Trigg::setInitData(int n, const unsigned char* p)
+ {
+ memcpy((void*)&data, p, n);
+ if (gui)
+ gui->init();
+ }
+
+//---------------------------------------------------------
+// inst
+//---------------------------------------------------------
+
+static Mempi* instantiate(const char* name, const MempiHost* h)
+ {
+ return new Trigg(name, h);
+ }
+
+extern "C" {
+ static MEMPI descriptor = {
+ "Trigg",
+ "Any note triggers a specified note with specified velocity",
+ "1.0", // filter version string
+ MEMPI_FILTER, // plugin type
+ MEMPI_MAJOR_VERSION, MEMPI_MINOR_VERSION,
+ instantiate
+ };
+
+ const MEMPI* mempi_descriptor() { return &descriptor; }
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/trigg/trigg.h b/muse_qt4_evolution/midiplugins/trigg/trigg.h
new file mode 100644
index 00000000..c29a06a0
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/trigg/trigg.h
@@ -0,0 +1,49 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filter.h,v 1.4 2005/06/12 08:18:37 wschweer Exp $
+//
+// filter - simple midi filter
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __TRIGG_H__
+#define __TRIGG_H__
+
+#include "../libmidiplugin/mempi.h"
+
+//---------------------------------------------------------
+// filter - simple midi filter
+//---------------------------------------------------------
+class Trigg : public Mempi {
+ struct initData {
+ int note;
+ int velocity;
+ } data;
+ friend class TriggGui;
+
+ TriggGui* gui;
+
+ virtual void process(unsigned, unsigned, MidiEventList*, MidiEventList*);
+
+ public:
+ Trigg(const char* name, const MempiHost*);
+ ~Trigg();
+ virtual bool init();
+
+ void setNote(int t) { data.note = t; }
+ void setVelocity(int t) { data.velocity = t; }
+
+ virtual bool hasGui() const { return true; }
+ virtual bool guiVisible() const { return gui->isVisible(); }
+ virtual void showGui(bool val) { gui->setShown(val); }
+ virtual void getGeometry(int* x, int* y, int* w, int* h) const;
+ virtual void setGeometry(int, int, int, int);
+
+ virtual void getInitData(int*, const unsigned char**) const;
+ virtual void setInitData(int, const unsigned char*);
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/trigg/trigggui.cpp b/muse_qt4_evolution/midiplugins/trigg/trigggui.cpp
new file mode 100644
index 00000000..0fd3c4c6
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/trigg/trigggui.cpp
@@ -0,0 +1,56 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filtergui.cpp,v 1.4 2005/11/06 17:49:34 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "trigggui.h"
+#include "trigg.h"
+
+//---------------------------------------------------------
+// MidiTriggConfig
+//---------------------------------------------------------
+
+TriggGui::TriggGui(Trigg* f, QWidget* parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ filter = f;
+
+ connect(noteEntry, SIGNAL(valueChanged(int)), SLOT(setNote(int)));
+ connect(velocityEntry, SIGNAL(valueChanged(int)), SLOT(setVelocity(int)));
+ }
+
+//---------------------------------------------------------
+// init
+//---------------------------------------------------------
+void TriggGui::init()
+ {
+ Trigg::initData *data;
+ int n;
+ filter->getInitData(&n,(const unsigned char **)&data);
+ printf("::init note=%d vel=%d\n",data->note,data->velocity);
+ noteEntry->setValue(data->note);
+ velocityEntry->setValue(data->velocity);
+ }
+
+//---------------------------------------------------------
+// setNote
+//---------------------------------------------------------
+void TriggGui::setNote(int value)
+ {
+ printf("TriggGui::setNote %d\n",value);
+ filter->setNote(value);
+ }
+
+//---------------------------------------------------------
+// setVelocity
+//---------------------------------------------------------
+void TriggGui::setVelocity(int value)
+ {
+ printf("TriggGui::setVelocity %d\n",value);
+ filter->setVelocity(value);
+ }
+
diff --git a/muse_qt4_evolution/midiplugins/trigg/trigggui.h b/muse_qt4_evolution/midiplugins/trigg/trigggui.h
new file mode 100644
index 00000000..f4c597fa
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/trigg/trigggui.h
@@ -0,0 +1,48 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: filtergui.h,v 1.4 2005/11/06 17:49:34 wschweer Exp $
+//
+// (C) Copyright 2005 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#ifndef __FILTERGUI_H__
+#define __FILTERGUI_H__
+
+#include "ui_trigggui.h"
+
+class Trigg;
+
+enum {
+ MIDI_FILTER_NOTEON = 1,
+ MIDI_FILTER_POLYP = 2,
+ MIDI_FILTER_CTRL = 4,
+ MIDI_FILTER_PROGRAM = 8,
+ MIDI_FILTER_AT = 16,
+ MIDI_FILTER_PITCH = 32,
+ MIDI_FILTER_SYSEX = 64
+ };
+
+//---------------------------------------------------------
+// TriggGui
+//---------------------------------------------------------
+
+class TriggGui : public QDialog, public Ui::TriggBase {
+ Q_OBJECT
+
+ Trigg* filter;
+
+ signals:
+ void hideWindow();
+
+ private slots:
+ void setNote(int );
+ void setVelocity(int );
+
+ public:
+ TriggGui(Trigg*, QWidget* parent=0);
+ void init();
+ };
+
+#endif
+
diff --git a/muse_qt4_evolution/midiplugins/trigg/trigggui.ui b/muse_qt4_evolution/midiplugins/trigg/trigggui.ui
new file mode 100644
index 00000000..5c096e24
--- /dev/null
+++ b/muse_qt4_evolution/midiplugins/trigg/trigggui.ui
@@ -0,0 +1,109 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>TriggBase</class>
+ <widget class="QDialog" name="TriggBase" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>233</width>
+ <height>125</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>MusE: Midi Input Trigg</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QGroupBox" name="GroupBoxx" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title" >
+ <string>Trigg</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="label_2" >
+ <property name="text" >
+ <string>Velocity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QSpinBox" name="noteEntry" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="value" >
+ <number>30</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QSpinBox" name="velocityEntry" >
+ <property name="maximum" >
+ <number>127</number>
+ </property>
+ <property name="minimum" >
+ <number>0</number>
+ </property>
+ <property name="value" >
+ <number>127</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="label" >
+ <property name="text" >
+ <string>Note</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>