midi zu shellbefehl
-
Tachschen.
Was die Programmierung in C betrifft, betrette Ich Neuland. Und nun zum Problem:
Ich brauche ein Programm, welches mir aus einem Midisignal (Channel 9 Note c') einen shellbefehl macht. Das mit dem shellbefehl, scheint bereits zu funktionieren. aber wie bekomme Ich es hin, dass mein Programm das midisignal aufschnappt?
Vermutlich in <alsa/asoundlib.h> aber wie lautet der Befehl?
Gruß MarioNetz
-
MarioNetz schrieb:
... aus einem Midisignal (Channel 9 Note c') einen shellbefehl ...
Was hat ein MIDI-Datenstrom ("Signal") mit einem Shellbefehl zu tun???
Du könntest auch fragen, wie man aus einer Quadratwurzel ein Glas Milch macht, das wäre in etwa genauso sinnvoll.
Um ein Shell-Programm zu "machen", musst Du schon den C-Compiler benutzen. Durch das Anlegen von MIDI-Signalen wurden meines Wissens noch keine Programme automatisch erzeugt...Oder meintest Du vielleicht, wie man ein Konsolenprogramm (Shell-Befehl) schreibt, das eine MIDI-Sequenz ausgibt? Manche Soundkarten-Treiber bieten dafür das Device /dev/sequencer, an das man direkt MIDI-Daten schicken kann (z. B. mit dem Befehl "cat") - vorausgesetzt, Deine Soundkarte hat einen MIDI-Port herausgeführt.
-
Yeah, richtig, also das erste. Was du mit der 2. Sache meinst, kann Ich nicht nachvollziehen, das gibts doch schon 1001 mal.
Ich versuche, das wenn die Quadratwurzel kommt, die Kaffeemaschine angeht. Oder besser, wenn Ich auf mein Midipedal trete, soll ein bestimmter Soundserver mit bestimmten Synthis starten. Da Ich während des Bassspielens und Singens nicht auch noch in die Küche gehen kann um die Kaffeemaschine anzuschmeißen, habe Ich mir gedacht, das macht mein Rechner, wenn Ich auf das Midiboard trete. Das Ding liegt ja eh vor mir.
Also:
Quadratwurzel = Midisignal
Milch = ShellbefehlIst zwar umständlich erklärt, aber du wolltest es ja so haben
Glaub jetzt weiß du was Ich will und du kannst mir bestimmt auch sagen wie das nun geht.
Gruß MarioNetz
-
Du sprichst nach wie vor in Rätseln..
(Ist das vielleicht der Grund, warum Du noch keine gescheite Antwort bekommen hast?)
Ich interpretiere Deine Quadratwurzel-MIDI-Analogie mal so: Du möchtest ein Programm schreiben, das bei Eintreffen einer bestimmten MIDI-Sequenz eine Aktion ausführt, z. B. ein anderes Programm startet (und nicht "macht").
Habe ich das so richtig wiedergegeben?Wenn ja, dann musst Du "einfach" die ankommenden Bytes (/dev/sequencer - sofern vorhanden) mit der erwarteten Sequenz vergleichen und bei Übereinstimmung mit system() das andere Programm ("Kaffeemaschine") starten.
-
Naja, Ich finde eigentlich, so kompliziert habe Ich das auch schon anfangs nicht erfragt.?.? Egal...
Ich nehme mal deine Aussage als Grundlage:
Du musst "einfach" die ankommenden Bytes (/dev/sequencer - sofern vorhanden) mit der erwarteten Sequenz vergleichen ...Genau dieses "einfach" ist für mich nicht so einfach wie es klingt. Wie geht das denn? Wie lautet die Funktion? Was erwarte Ich eigentlich? Ich finde das alles andere als einfach.
und bei Übereinstimmung mit system() das andere Programm ("Kaffeemaschine") starten.
Das ist einfach, dass habe Ich ohne C-Kenntnisse bereits richtig erraten. Wie Ich auch schon zu Anfang erwähnt habe.
Also die Frage:
Wie funktioniert "einfach"? Am besten mit einem Beispiel.
Danke ...
Gruß MarioNetz
-
MarioNetz schrieb:
... Wie geht das denn? Wie lautet die Funktion?
Na im Zweifelsfalle read() oder fread()
Leider habe ich diesbezüglich nur Erfahrung auf einem recht alten System (Pentium 60MHz mit SuSE Linux 4.1), da mein aktueller Rechner keinen MIDI-Anschluss hat. Bei dem alten System ist eine SoundBlaster-Karte eingebaut. Der Treiber dazu stellt das Device /dev/sequencer zur Verfügung, das man mit open() öffnen kann. Dann kann man mit read() Daten auslesen. Ich wühl' mal in meinen Archiven; ich hatte mal ein Programm zum Auslesen und Speichern eines Bulk-Dumps von meinem MIDI-Keyboard geschrieben. Leider war der Rechner damals für die Datenmenge zu langsam und hat ab und zu mal ein Zeichen "verschluckt". Wenn ich das Programm finde, poste ich mal den relevanten Code.MarioNetz schrieb:
... Was erwarte Ich eigentlich?
Diesbezüglich bist Du hier im falschen Forum! Wie die MIDI-Sequenz für das Anschlagen der Note c' aussieht, hat weder mit Linux noch mit "C" zu tun (auch wenn c' und C nicht unähnlich sind
).
Dazu rate ich Dir: Einfach mal ausprobieren! Wie? Ganz einfach:> od -b < /dev/sequencer
Dann siehst Du die Zeichen, die vom Keyboard (oder was auch immer) kommen.
Solltest Du kein Device /dev/sequencer auf deinem System haben, kann ich Dir im Moment leider auch nicht weiterhelfen.
-
Wie versprochen, hier der Quelltext für ein kleines Programm, das die kompletten Settings (Bulk-Dump) eines Yamaha-Keyboards per MIDI einliest - geschrieben für eine "SoundBlaster 16 Pro". (Das Device heißt übrigens /dev/midi, eventuell ist das aber auch nur ein Link auf /dev/sequencer - oder umgekehrt.)
/* get_bulk_dump.c Keyboard-Settings (Bulk Dump) einlesen */ # include <stdio.h> int main(int argc, char *argv[]) { int c, i; FILE *in_stream, *out_stream; if (argc == 1) out_stream = stdout; else if ((argc == 2) && (strcmp(argv[1], "-h") != 0)) { if ((out_stream=fopen(argv[1], "wb")) == NULL) { fprintf(stderr, "\n%s: Can't open output file '%s'.\n\n", argv[0], argv[1]); return(5); } } else { printf("Usage: %s [output-file]\n", argv[0]); return(1); } if ((in_stream=fopen("/dev/midi", "rb")) == NULL) { fprintf(stderr, "\n%s: Can't open device '/dev/midi'.\n\n", argv[0]); return(6); } i = 0; fprintf(stderr, "\nPlease start bulk dump now!\n"); while((c=fgetc(in_stream)) != 0xf0); fprintf(stderr, "Reading data...\n"); do { fputc(c, out_stream); i++; } while((c=fgetc(in_stream)) != 0xf7); fputc(c, out_stream); fprintf(stderr, "%d bytes read.\n", i+1); return(0); }
Vielleicht hilft Dir das ja weiter.