mss.c - eine MIDI-Ein- und Ausgabebibliothek fuer C/C++ unter Linux und Win95/98/NT - Midi lib for data exchange using the Midi format V 1.02 (c) 11.1999 by Daniel Berger, Michael Hoch 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., 675 Mass Ave, Cambridge, MA 02139, USA. To contact the author try these: Michael Hoch ZKM, Lorezstr. 19, 76135 Karlsruhe, Germany mpunkt@zkm.de daniel.berger@caramail.com MSS ist eine C/C++ Bibliothek zum Datenaustausch ueber das MIDI-Format. Sie ermoeglicht es, sowohl MIDI-spezifische als auch allgemeine Kontrollinformationen zwischen einem PC und einem MIDI-Endgeraet auszutauschen. Ein MIDI-Endgeraet ist z.B. ein Sampler, Synthesizer oder auch die Macintosh-Software MAX. Die Betriebssysteme Linux und Win95/98/NT werden unterstuetzt. Wenn Sie Windows verwenden, linken Sie bitte die Bibliothek winmm.lib zu ihrem Projekt dazu. Die Bibliothek besteht aus den Dateien mss.c und mss.h; zusaetzlich gibt es einige Beispielprogramme die die Funktionalitaet unter den beiden Betriebssystemen zeigt. Die Beispielprogramme sind im Einzelnen: --------------------------------------- - fuer Windows: win/testmidi.cpp Dieses Beispiel enthaelt einen Linux-Teil und einen Windows-Teil; mit #define linux waehlt man den Linux-Teil aus, #define WIN32 selektiert die Windows-Version. Das Beispiel demonstriert die Uebertragung von Daten mit Midi-Sysex (senden und empfangen), und das Ansteuern eines Synthesizers (eine Tonleiter wird gespielt). - fuer Linux: linux/simple/simplein.c Ein Beispiel das die Eingabe von Midi-Daten unter Linux zeigt. Die Daten werden Byte fuer Byte eingelesen und angezeigt. linux/simple/simpleout.c Ein Beispiel das die Ausgabe von Midi-Daten (eine Tonleiter wird gespielt), sowie die Eingabe zeigt (wird der Midi-Ausgang des Rechners an den Midi-Eingang angeschlossen, bzw. per MIDI-THRU zurueckgefuehrt, werden die Daten auf dem Bildschirm angezeigt). linux/simple/testmidi.c Dieses Beispiel enthaelt einen Linux-Teil und einen Windows-Teil; mit #define linux waehlt man den Linux-Teil aus, #define WIN32 selektiert die Windows-Version. Das Beispiel demonstriert die Uebertragung von Daten mit Midi-Sysex (senden und empfangen). linux/video/testgrab.c Dieses relativ komplexe Beispiel zeigt das Steuern eines MIDI-Geraetes ueber eine (an eine WinTV-Karte angeschlossene) Kamera. Bewegungen vor der Kamera werden in Toene umgesetzt. Dabei ist die X-Achse im Kamerabild die Tonhoehe, und die Y-Achse die Lautstaerke. Ein kleiner (im Moment auskommentierter) Programmteil zeigt die Verwendung der Sysex- Datenuebertragungsroutinen. Die von mss.c zur Verfuegung gestellten Routinen: ------------------------------------------------- int midi_init(int indevnr, int outdevnr); Diese Routine initialisiert die Midi-Routinenbibliothek. Bitte zu Beginn einmal aufrufen. indevnr und outdevnr geben die zu verwendenden MIDI-Schnittstellen an (wenn die Standard- Midi-Schnittstelle verwendet werden soll, bitte auf -1 setzen). int midi_exit(int noteoffs); Diese Routine beendet die Midi-Routinenbibliothek. Bitte beim Beenden des Programmes einmal aufrufen. Wenn noteoffs !=0 ist, werden alle Noten gestoppt (*nur unter Windows). int midi_check(); Unter Linux: Gibt zurueck, ob IRGENDWELCHE Midi-Daten eingetroffen sind. Unter Windows: Gibt zurueck, ob relevante Sysex-Daten (mit korrektem Sysexcode) eingetroffen sind. 0=Nein, 1=Ja int midi_sysexerror(); Unter Linux: Liefert 0 zurueck Unter Windows: Liefert 1 zurueck, wenn seit dem letzten Aufruf Sysex-Daten verloren gegangen sind (auf Grund von Bufferueberlauf z.B.), 0 falls keine Daten verloren gegangen sind. void midi_write(unsigned char *buf, int nr); Schickt nr viele Bytes an rohen Midi-Daten aus dem Buffer buf. Achtung - diese Routine sollte nur verwendet werden, wenn keine Synthesizer oder andere MIDI- Geraete in der Midi-Chain haengen, die die Daten missverstehen koennten. void midi_read(unsigned char *buf, int nr); Linux: Liest maximal nr empfangene Roh-Mididaten in den Buffer buf ein. Windows: Diese Routine tut gar nichts (Windows laesst den Programmierer nicht tief genug an die Midi-Schnittstelle ran als dass so eine Routine einfach implementierbar waere). void midi_noteon(unsigned char channel, unsigned char note, unsigned char velocity); Diese Routine schickt ein Note-On-Signal auf Midi-Kanal channel mit Tonhoehe note und Lautstaerke velocity. void midi_noteoff(unsigned char channel, unsigned char note, unsigned char velocity); Diese Routine schickt ein Note-Off-Signal auf Midi-Kanal channel mit Tonhoehe note und Lautstaerke velocity. void midi_keypressure(unsigned char channel, unsigned char note, unsigned char velocity); Diese Routine schickt ein Keypressure-Signal auf Midi-Kanal channel mit Tonhoehe note und Lautstaerke velocity. void midi_controlchange(unsigned char channel, unsigned char controller, unsigned char value); Diese Routine schickt ein Controlchange-Signal auf Midi-Kanal channel fuer den Kontroller controller mit dem Wert value. void midi_programchange(unsigned char channel, unsigned char program); Diese Routine schickt ein Programchange-Signal auf Midi-Kanal channel mit der Programmnummer program. void midi_channelpressure(unsigned char channel, unsigned char pressure); Diese Routine schickt ein Channelpressure-Signal auf Midi-Kanal channel mit dem Wert pressure. void midi_pitchwheelchange(unsigned char channel, int value); Diese Routine schickt ein Pitchwheelchange-Signal auf Midi-Kanal channel mit dem Wert value. void midi_setsysexcode(unsigned char newsysexcode); Diese Routine setzt den fuer die Routinen midi_senddata und midi_receivedata zu verwendenden Sysex-Code auf den Wert newsysexcode. Es koennen Werte zwischen 0 und 127 angegeben werden. Passen Sie auf dass sie keine von angeschlossenen Synthesizern verwendeten Sysex-Codes verwenden, ausser sie beabsichtigen das. void midi_senddata(unsigned char *buf, int nr); Sendet nr viele Rohdaten (Bytes) aus dem Buffer buf als Sysex-Message. Die Bytes werden in je zwei Nibbles (4-Bit-Werte) codiert, um in die Sysex-Message zu passen. Es wird der mittels midi_setsysexcode gesetzte Sysex-Code verwendet. int midi_receivedata(unsigned char *buf, int size); Uebertraegt maximal size bytes der bisher empfangenen Sysex-Messages (mit dem eingestellten Sysex-Code) in den Buffer buf. Gibt die Anzahl der uebertragenen Bytes zurueck. Achtung - alle anderen Sysex-Daten (mit anderen Sysex-Codes als dem eingestellten) werden weggeworfen. Unter Windows kann es passieren, dass Sysex-Daten verloren gehen, weil interne Buffer ueberlaufen. In diesem Fall setzt mss die interne Variable sysexerror, die mit midi_sysexerr() abgefragt werden kann. - Loesungen gegen den Buffer-Ueberlauf: erhoehen der Buffergroesse (mi_buflength in mss.cpp). Ein anderer Grund, weshalb Sysex-Daten verloren gehen, haengt damit zusammen, dass intern der naechste Sysex-Buffer zu spaet bereitgestellt wird (was notgedrungen in einem eigenen Thread stattfindet). Loesung: Daten langsamer uebertragen. Oder das Sleep(10) im midithread verringern. --------------------------------------------------------------------------------------- Weitere Hilfe bekommen Sie entweder ueber die Beispielprogramme oder den dokumentierten Source-Code.