summaryrefslogtreecommitdiff
path: root/muse_qt4_evolution/midiplugins/drumglue/drumglue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'muse_qt4_evolution/midiplugins/drumglue/drumglue.cpp')
-rw-r--r--muse_qt4_evolution/midiplugins/drumglue/drumglue.cpp250
1 files changed, 250 insertions, 0 deletions
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; }
+ }
+