From e40fc849149dd97c248866a4a1d026dda5e57b62 Mon Sep 17 00:00:00 2001 From: Robert Jonsson Date: Mon, 7 Mar 2011 19:01:11 +0000 Subject: clean3 --- .../midiplugins/drumglue/drumglue.cpp | 250 +++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 attic/muse_qt4_evolution/midiplugins/drumglue/drumglue.cpp (limited to 'attic/muse_qt4_evolution/midiplugins/drumglue/drumglue.cpp') diff --git a/attic/muse_qt4_evolution/midiplugins/drumglue/drumglue.cpp b/attic/muse_qt4_evolution/midiplugins/drumglue/drumglue.cpp new file mode 100644 index 00000000..7a9b6ed2 --- /dev/null +++ b/attic/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; } + } + -- cgit v1.2.3