summaryrefslogtreecommitdiff
path: root/muse2/synti/libsynti/mess.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'muse2/synti/libsynti/mess.cpp')
-rw-r--r--muse2/synti/libsynti/mess.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/muse2/synti/libsynti/mess.cpp b/muse2/synti/libsynti/mess.cpp
new file mode 100644
index 00000000..639ffee6
--- /dev/null
+++ b/muse2/synti/libsynti/mess.cpp
@@ -0,0 +1,122 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: mess.cpp,v 1.2 2004/04/15 13:46:18 wschweer Exp $
+// (C) Copyright 2004 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include "mess.h"
+#include "muse/midi.h"
+
+static const int FIFO_SIZE = 32;
+
+//---------------------------------------------------------
+// MessP
+//---------------------------------------------------------
+
+struct MessP {
+ // Event Fifo synti -> Host:
+ MidiPlayEvent fifo[FIFO_SIZE];
+ volatile int fifoSize;
+ int fifoWindex;
+ int fifoRindex;
+ };
+
+//---------------------------------------------------------
+// Mess
+//---------------------------------------------------------
+
+Mess::Mess(int n)
+ {
+ _channels = n;
+ _sampleRate = 44100;
+ d = new MessP;
+ d->fifoSize = 0;
+ d->fifoWindex = 0;
+ d->fifoRindex = 0;
+ }
+
+//---------------------------------------------------------
+// Mess
+//---------------------------------------------------------
+
+Mess::~Mess()
+ {
+ delete d;
+ }
+
+//---------------------------------------------------------
+// getGeometry
+// dummy
+//---------------------------------------------------------
+
+void Mess::getGeometry(int* x, int* y, int* w, int* h) const
+ {
+ x = 0;
+ y = 0;
+ w = 0;
+ h = 0;
+ }
+
+//---------------------------------------------------------
+// sendEvent
+// send Event synti -> host
+//---------------------------------------------------------
+
+void Mess::sendEvent(MidiPlayEvent ev)
+ {
+ if (d->fifoSize == FIFO_SIZE) {
+ printf("event synti->host fifo overflow\n");
+ return;
+ }
+ d->fifo[d->fifoWindex] = ev;
+ d->fifoWindex = (d->fifoWindex + 1) % FIFO_SIZE;
+ ++(d->fifoSize);
+ }
+
+//---------------------------------------------------------
+// receiveEvent
+// called from host
+//---------------------------------------------------------
+
+MidiPlayEvent Mess::receiveEvent()
+ {
+ MidiPlayEvent ev = d->fifo[d->fifoRindex];
+ d->fifoRindex = (d->fifoRindex + 1) % FIFO_SIZE;
+ --(d->fifoSize);
+ return ev;
+ }
+
+//---------------------------------------------------------
+// eventsPending
+// called from host:
+// while (eventsPending()) {
+// receiveEvent();
+// ...
+//---------------------------------------------------------
+
+int Mess::eventsPending() const
+ {
+ return d->fifoSize;
+ }
+
+//---------------------------------------------------------
+// processEvent
+// return true if synti is busy
+//---------------------------------------------------------
+
+bool Mess::processEvent(const MidiPlayEvent& ev)
+ {
+ switch(ev.type()) {
+ case ME_NOTEON:
+ return playNote(ev.channel(), ev.dataA(), ev.dataB());
+ case ME_NOTEOFF:
+ return playNote(ev.channel(), ev.dataA(), 0);
+ case ME_SYSEX:
+ return sysex(ev.len(), ev.data());
+ case ME_CONTROLLER:
+ return setController(ev.channel(), ev.dataA(), ev.dataB());
+ }
+ return false;
+ }
+