aboutsummaryrefslogtreecommitdiff
path: root/src/midi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/midi.cpp')
-rw-r--r--src/midi.cpp146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/midi.cpp b/src/midi.cpp
new file mode 100644
index 0000000..1d63446
--- /dev/null
+++ b/src/midi.cpp
@@ -0,0 +1,146 @@
+/* GrIPD v0.1.1 - Graphical Interface for Pure Data
+** Copyright (C) 2003 Joseph A. Sarlo
+**
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License
+** as published by the Free Software Foundation; either version 2
+** of the License, or (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+**
+** jsarlo@ucsd.edu
+*/
+
+#include "midiiolib.h"
+#include <stdio.h>
+#ifndef NT
+#include <unistd.h>
+#endif
+#define MAXDEVS 16
+#define MAXEVENTS 4096
+
+#ifndef VISUAL
+using namespace std;
+#endif
+
+static int eventCount[MAXDEVS];
+static int eventCommand[MAXEVENTS][MAXDEVS];
+static int eventP0[MAXEVENTS][MAXDEVS];
+static int eventP1[MAXEVENTS][MAXDEVS];
+static int eventP2[MAXEVENTS][MAXDEVS];
+static int eventP3[MAXEVENTS][MAXDEVS];
+static MidiInput mInput[MAXDEVS];
+static int devCount = 0;
+static int devList[MAXDEVS];
+
+int openDevice(int dev) {
+ int i, devId, numPorts;
+
+ numPorts = MidiInPort::getNumPorts();
+ if (dev >= numPorts || dev < 0) {
+ return (-1);
+ }
+ else {
+ if (devCount == 0) {
+ for (i = 0; i < MAXDEVS; i++) {
+ devList[i] = 0;
+ }
+ }
+ for (i = 0; i < MAXDEVS; i++) {
+ if (devList[i] == 0) {
+ devId = i;
+ i = MAXDEVS;
+ }
+ }
+ devCount++;
+ eventCount[devId] = 0;
+ devList[devId] = 1;
+ mInput[devId].setPort(dev);
+ mInput[devId].open();
+ return (devId);
+ }
+}
+
+int closeDevice(int devno) {
+ if (devList[devno]) {
+ devCount--;
+ devList[devno] = 0;
+#ifndef LINUX
+ mInput[devno].close();
+#endif
+ return (1);
+ }
+ else
+ return (-1);
+}
+
+int readEvents(int devno) {
+ int i;
+ MidiMessage message;
+
+ if (devno < 0 || devno >= MAXDEVS)
+ return (-1);
+ eventCount[devno] = mInput[devno].getCount();
+ if (eventCount[devno] > MAXEVENTS) {
+ eventCount[devno] = MAXEVENTS;
+ }
+ for (i = 0; i < eventCount[devno]; i++) {
+ message = mInput[devno].extract();
+ eventCommand[i][devno] = message.getCommand();
+ eventP0[i][devno] = message.getP0();
+ eventP1[i][devno] = message.getP1();
+ eventP2[i][devno] = message.getP2();
+ eventP3[i][devno] = message.getP3();
+ }
+ return (eventCount[devno]);
+}
+
+int getEventCount(int devno) {
+ if (devno < 0 || devno >= MAXDEVS)
+ return (-1);
+ else
+ return (eventCount[devno]);
+}
+
+int getEventCommand(int devno, int eNum) {
+ if (eNum < 0 || eNum >= eventCount[devno] || devno < 0 || devno >= MAXDEVS)
+ return (-1);
+ else
+ return eventCommand[eNum][devno];
+}
+
+int getEventP0(int devno, int eNum) {
+ if (eNum < 0 || eNum >= eventCount[devno] || devno < 0 || devno >= MAXDEVS)
+ return (-1);
+ else
+ return eventP0[eNum][devno];
+}
+
+int getEventP1(int devno, int eNum) {
+ if (eNum < 0 || eNum >= eventCount[devno] || devno < 0 || devno >= MAXDEVS)
+ return (-1);
+ else
+ return eventP1[eNum][devno];
+}
+
+int getEventP2(int devno, int eNum) {
+ if (eNum < 0 || eNum >= eventCount[devno] || devno < 0 || devno >= MAXDEVS)
+ return (-1);
+ else
+ return eventP2[eNum][devno];
+}
+
+int getEventP3(int devno, int eNum) {
+ if (eNum < 0 || eNum >= eventCount[devno] || devno < 0 || devno >= MAXDEVS)
+ return (-1);
+ else
+ return eventP3[eNum][devno];
+}
+