Java Sound Midi

melmager

Erfahrenes Mitglied
Also als Level in Java habe ich immer noch begeisterte Anfängerin :-)

OK zum Problem / Frage

Ich habe ein MIDI Keyboard an USB angeschlossen und suche nun eine Möglichkeit die MIDI Ereignisse (Taste am Keyboard gedrückt) in Java einzulesen. Ausgabe dann etwa so : Taste C gedrückt ...

Ich habe mich schon durch ettliche Beschreibungen durchgelesen - Wie man eine Midinote im System erzeugt und dann ausgibt wird beschrieben - über new ShortMessage() und denn myMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93); z.B.

Aber ich sehe keine Möglichkeit an eine MIDI Message heranzukommen die von extern kommt.

Geht das überhaupt mit Java ? MIDI einlesen ?

das einzige was ich gefunden habe ist in der Classe Track ein Get um an ein MIDi Event heranzukommen.
Ich denke mal das geht nur wenn ich in der Klasse Sequence eine MIDI File einlese.
Oder Lege ich eine leere Sequence an, dann ein neuen Track und starte recording und kann dann ein Midi event das vom Keyboard kommt einlesen ?
Ich glaubs ja nicht ...

Also Frage an die Leute die sich besser auskennen - kann ich ein Midi Event das über USB kommt einlesen - wenn wenn ja wie muss ich vorgehen - grobe Richtung reicht mir erstmal - ich will ja wat lernen

Zusatzfrage - Device auflisten habe ich hinbekommen aber mein USB Keyboard taucht 3 mal auf .. woher weiss ich welches ich als MIDI IN ansprechen muss ?
und warum 3 mal ? 2 mal hätte ich ja verstanden einmal IN einmal OUT aber Nummer 3 ?
 
Zuletzt bearbeitet:
Prinzipiell geht das schon. Da das Gerät per USB angeschlossen ist, brauchst du aber einen Treiber für das MIDI-Keyboard. Und einen Java-Wrapper für diesen Treiber.
Alternative wäre, vom MIDI Keyboard in Datei schreiben und diese dann per Java auszulesen – das ist zwar nicht so schön, aber deutlich einfacher.
Hast du Treiber für das Gerät? Hast du schon eine Java-Bibliothek im Auge? oder eine native Bibliothek?
 
Also Treiber für das Keyboard gibt es nicht.
Und als Wrapper habe ich auf die Schnelle nur den jVSTwRapper gefunden - der setzt auf Java auf.

was ich schon vorher gefunden habe ist dat:
http://www.jsresources.org/examples/MidiInDump.html

soweit ich das Programm verstehe machen die das tatsächlich so, das die eine Sequenze anlegen eine Midi Datei anlegen und dann die Datei auslesen.

Ich glaube ich werde dann doch dort mal ansetzen - mal kucken ob ich es hinbekomme dann zeitgleich aus der Midi Datei wider auszulesen

sprich erst MIDI Devices anzeigen - den Receiver und Transmitter entsprechend setzen, dann eine leere Sequenze und leeren Track anlegen , aufzeichnen und das dann ausgeben. Wenn dat soweit geht mal kucken wie ich an die MIDI Daten sofort rankomme und nicht Zeitversetzt.

Komisch wenn ich mir ein Projekt aussuche wird das immer etwas komplexer
 
Zuletzt bearbeitet:
Welches Betriebssystem nutzt du?
Auf Unixen müsstest du eigentlich auch in Pipes schreiben können, damit kannst du vom Treiber/Wrapper aus in eine virtuelle Datei schreiben und der Inhalt wird sofort an ein beliebiges Programm weitergeleitet.
Windows müsste so was ähnliches (abgespeckt) können, aber damit kenn ich mich nicht so aus...
 
Also MIDI ist schon eine Plattform Übergreifende Schnittstelle! Schließlich wird diese von diversen Elektronischen Musikinstrumenten benutzt und Java macht nichts anderes als die MIDI Bytes aus dem System zu lesen (oder zu schrieben) die in der Hardware rum düsen!!

Dein Ansatz mit der myMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93) ist nicht verkehrt, aber schon mal daran gedacht das du das MIDI Signal nur lesen müsstest und die werte die du bekommst um zu formatieren. Schau mal in die Sourcen der Standard Java Bibliothek, du musst ja eigentlich nur auf dem System MIDI stream (in den Sourcen müsste man sehen können welcher das ist) Lauschen und die Hex werte Korrekt Interpretieren, dann müsstest du dir die Umwege über die Sound Objekte in Java sparen.

Sounds mit Java, gerade wenn man so Hardware nahe ist wie hier, sind recht unterentwickelt. Das einzige was in Java richtig gut geht ist fertige Sound Formate.
 
Schau mal in die Sourcen der Standard Java Bibliothek, du musst ja eigentlich nur auf dem System MIDI stream (in den Sourcen müsste man sehen können welcher das ist) Lauschen und die Hex werte Korrekt Interpretieren, dann müsstest du dir die Umwege über die Sound Objekte in Java sparen.

Tja die Frage ist doch wie komme ich an den Stream dran
ich kenne stream von von Dateioperationen
Transmitter und Receiver kennen keine Function Stream
sprich ich wüsste nicht wie ich da auf die MIDI Functionen einen Stream draufsetzen soll -

http://download.oracle.com/javase/6/docs/api/javax/sound/midi/Transmitter.html
 
Zuletzt bearbeitet:
Tja die Frage ist doch wie komme ich an den Stream dran
ich kenne stream von von Dateioperationen
Transmitter und Receiver kennen keine Function Stream
sprich ich wüsste nicht wie ich da auf die MIDI Functionen einen Stream draufsetzen soll -

http://download.oracle.com/javase/6/docs/api/javax/sound/midi/Transmitter.html

Nö, ich meinte nicht den Stream von irgenwo holen sondern aus den Sourcen (QuellCode) raus lesen wie es in der Java Bib gemacht wird und selber erzeugen (und Werte auslesen).

In der java Bib wandeln die selber die werte die du rein gibst (und raus holst) irgendwo in Hex (von Hex zu java Repräsentation) Werte um und diese werden an die MIDI Komponente im Computer gesandt, diese stelle müsstest du dir mal anschauen und für deine Zwecke ab- und umschreiben.

Wenn du in deiner Entwiklungsumgebung das JDK hast ist das kein problem, ich habe nur leider keine zeit das für dich raus zu suchen ;)
 
Nö, ich meinte nicht den Stream von irgenwo holen sondern aus den Sourcen (QuellCode) raus lesen wie es in der Java Bib gemacht wird und selber erzeugen (und Werte auslesen).

In der java Bib wandeln die selber die werte die du rein gibst (und raus holst) irgendwo in Hex (von Hex zu java Repräsentation) Werte um und diese werden an die MIDI Komponente im Computer gesandt, diese stelle müsstest du dir mal anschauen und für deine Zwecke ab- und umschreiben.

Wenn du in deiner Entwiklungsumgebung das JDK hast ist das kein problem, ich habe nur leider keine zeit das für dich raus zu suchen ;)

das ist mir zu komplex - dazu habe ich noch zu wenig ahnung von Java

Ich hatte mal vor Jahren ein Projekt mit JNI - und da war es nur ein Zugriff auf ein bestehenden Treiber der in C geschrieben war - da bin ich ja schon schier verzweifelt weil die damaligen Beschreibungen eher ungenau waren

Ich werde mich mal melden wenn ich das Problem gelöst habe - da ich aber auch in Swing einsteige mit dem Projekt kann dat etwas dauern - im moment habe ich auch ein paar Verständnisprobleme mit Swing
 
ich verstehe mal wider nix (ok das ist Dauerzustand :-( )

ich habe eine eigene Midi Classe erstellt
und da ist diese declaration drin:

Java:
private MidiDevice.Info[] infos;

String[] getMidiPorts() {
         //MIDI:
        infos = MidiSystem.getMidiDeviceInfo();
        // hier ist das Array gefüllt und kann zugegriffen werden
        //...... code ....
        return sdev;
    }

 void openMidi(int devindex) {
 // und hier ist infos ungülig - bzw leer
  }

wenn ich aber in einer Function das Array nutze ist es in der nächsten Function leer

ich dachte immer Variablen sind innerhalb der Classe immer gültig ?
 
Zuletzt bearbeitet:
1. In welcher Reihenfolge die Methoden in einer Klasse stehen, ist völlig irrelevant! wahrscheinlich hast du die Methode openMidi() vor der Methode getMidiPorts() aufgerufen. Das ist so weit auch ok.
2. Du solltest eine Methode erstellen, die den Midi-Zugriff initialisiert. In diese Methode gehört dann so was wie die Zuweisung
Java:
infos = MidiSystem.getMidiDeviceInfo();
. Dazu gibt es 4 Wege:
a) Initialisierung in einem static-Block (nicht empfehlenswert, verzögert den Start der Anwendung unnötig
b) Initialisierung im Constructor
c) Initialisierung per init-Methode (nicht empfehlenswert da fehleranfällig wenn diese init-Methode nicht aufgerufen wurde
d) Initialisierung beim ersten mal, wenn eine Methode aufgerufen wird, die diese Daten braucht (umständlich)
 
Zurück