Midi Synthesizer für externes Gerät erzeugen, aber wie?

occ2510

Grünschnabel
Liebe Forum-Mitglieder!

Ich hätte eine kurze Frage zu dem im Titel beschriebenen Thema, zudem ich bei Google seit Wochen auf keine Lösung stoße.
Ich schildere am Besten die Situation:

Wir müssen als Maturaprojekt eine App zum Verwalten von Midi-Geräten erstellen.
Die zentrale Funktion davon ist das Einlesen und Abspeichern des eingestellten Sond (id + name) von einem oder mehreren Midi-Geräten wie zum Beispiel einem Keyboard.
Im Sinne meiner Recherche bin ich zu dem Ergebnis gekommen, dass dies prinzipell über den Java Midi Sythes möglich ist, funktioniert auch einwandfrei, nur verwendet Java dazu das "Default Midi Device" das bei mir Gervil heißt und computer-intern ist.

Jetzt suche ich einen Weg den "Default Midi Device" auf mein externes Gerät "USB2.0-MIDI" zu ändern oder
noch besser ein neues Sequenzer-Objekt mit dem externes Gerät zu erzeugen.

Wär super wenn sich jemand damit auskennt und mir helfen könnte einen Lösungsweg zu finden! :)

Danke schon im vorhinaus!
Michael
 
Wobei man wissen solle das man nur die angeschlossenen MIDI Geräte einlesen kann - in deinem Fall das "USB-Midi" nicht den Sound der dort eingestellt ist ..

"Die zentrale Funktion davon ist das Einlesen und Abspeichern des eingestellten Sond (id + name) von einem oder mehreren Midi-Geräten wie zum Beispiel einem Keyboard."

genau das geht also nicht.

Was geht ist ein bestimmten Sound am Keyboard einstellen also: schreiben ja ; lesen nein
 
Zuletzt bearbeitet:
@sheel:
Ich hab das ausprobiert genauso wie es dort unter "Obtaining a Desired Device" steht, bekomme aber genauso nur den Default Device "Gervill" raus, für mein externes Device "USB2.0-MIDI" scheint es keinen Synthesizer zu geben.

EDIT: bin mir gerade drauf gekommen, dass ich mich bei der Angabe verschrieben habe:
"noch besser ein neues SYNTHESIZER-Objekt mit dem externes Gerät zu erzeugen" nicht Sequencer.

@melmager:
"Wobei man wissen solle das man nur die angeschlossenen MIDI Geräte einlesen kann - in deinem Fall das "USB-Midi" nicht den Sound der dort eingestellt ist .."

Damit du mich nicht falsch verstehst, ich will nicht den "Sound" einlesen, sondern nur die ID (schön wär auch der Name) des eingestellten Sounds (Program) z.B.: 30 Violin 1 (Keyboard), dass ich über Midi mit der Id 10 einstellen kann.

Zum Einstellen des Sound verwende ich folgenden Code (mit Try-Catch klarerweise):

outRcvr = device.getReceiver();
shortMsg = new ShortMessage();
int channel = 0, v1 = 10, v2 = 0;
long timeStamp = -1;

shortMsg.setMessage(ShortMessage.CONTROL_CHANGE, channel, v1, v2);
outRcvr.send(shortMsg, timeStamp);

Dies funktioniert einwandfrei, aber nur beim Abfragen der eingestellen Sound-Id bin ich auf dem Holzweg.

Mein Lösungsansatz wäre halt über einen Synthesizer, da ich bei dem die entsprechenden Funktionen gefunden habe:

Synthesizer syn = MidiSystem.getSynthesizer();
syn.open();

MidiChannel[] channel = syn.getChannels();
channel[0].programChange(15);
System.out.println(channel[0].getProgram());

Funktioniert super, einziges Problem dabei, falscher Synthesizer!
(ist vom internen Gerät Gervill nicht vom gewünschten externen USB2.0-Midi)

Ich hoffe durch die Codeschnipsel mein Vorhaben besser verständlich gemacht zu haben.

Wäre echt froh, wenn jemand Lösungsvorschläge dazu hätte :)
 
Dies funktioniert einwandfrei, aber nur beim Abfragen der eingestellen Sound-Id bin ich auf dem Holzweg.

Du kommst nicht an die Information heran.
da man sich mit dem Keyboard über MIDI Befehle unterhält und bei den Midibefehlen sehe ich keinen einzigen der Informationen aus dem Keyboard abfragen kann um die Sound ID zu ermitteln oder die eingestellte Bank.

Du kannst Befehle absenden um den Sound zu wechseln - jepp aber abfragen sehe ich keinen Weg.

mal im Klartext:
Midi Out Programmchange 23 Channel 4 - geht (machste ja bereits)
aber einlesen - NO da keine MIDI Befehle vorhanden sind um das zu tun.

Zuordnung von ID zu Sound ist auch nur für die werte 1-128 durch den General Midi genormt, was drüber hinaus geht da kann jeder Hersteller sein eigenes Süppchen kochen.

Sound ID 144 ist bei mir z.B. eine Kirchenorgel
dazu brauchts auch ein Bankchange aber das nur am Rande.

Also Aufgabenstellung: ich lese die Sounds/SoundID von Midigeräten ein - geht schlicht und einfach nicht weil das nicht bei Midi vorgesehen ist.

Siehe auch : Table 4 - Universal System Exclusive Messages
http://www.midi.org/techspecs/midimessages.php
und die Befehle sind ein kann ... siehe Warnhinweis

Das was dein Programm aber leisten kann ist einstellen der Sounds auf dem Gerät (da aber nur im General Midi bereich)

ich habe ja oben den Kanal 4 genommen - der Sound kann dann nur extern über den PC gespielt werden das was beim Keyboard gespielt wird landet bei meinem immer auf Kanal 0.

Also Soundwechsel auf Kanal 0 über Midi(PC) = das Keyboard hört sich anders an, wenn du am Keyboard selber den Sound wechsels bekommt das der PC nicht mit.

Darum Schreiben ja - Lesen Nein.

Konsequenz - Ihr müsst die Aufgabenstellung für euer Projekt ändern.

######
Me: Projekt Grabeloven - Lernprogramm fürs Keyboard spielen in Java - in Arbeit seit einem Jahr :)
 
Zuletzt bearbeitet:
Gut, das muss ich jetzt erst mal verarbeiten, da es einen Großteil der von uns geplanten Userfreundlichkeit über den Haufen haut.

Was mir jetzt aber doch gut weiterhilft ist die Info:

Zuordnung von ID zu Sound ist auch nur für die werte 1-128 durch den General Midi genormt

Damit kann ich dem User schon mal die Möglichkeit bieten 1-128 einzustellen, da ich die Namen kenne, die Namen der restlichen Sounds muss er sich halt selber namentlich einspeichern.

Vermutlich, so wie du mir das beschrieben hast, wird es folglich auch nicht möglich sein, den Gerätnamen (z.B.: YAMAHA PSS-795) auszulesen.


Gut, ich danke dir vielmals, für deine großartige Hilfe!
Ich werde mich jetzt auf die Suche nach einer Tabelle für 1-128 begeben und
zu dem Thema Bankchange googeln ...

Thema erledigt!
 
http://de.wikipedia.org/wiki/General_MIDI

Kleine Anregung: ich habe ein jTree der mir die möglichen Sounds anzeigt, Als UserObjekt habe ich eine Classe die ID und Sound beinhaltet und wie das bei mir aussieht siehe unten:

da der Interne Synthesizer vom PC natürlich auch den GM Standart erfüllt bekommt man so auch eine Ausgabe:
Code:
void getIntruments() {
        String sar[];
        try {
            javax.sound.midi.Instrument istru[] = MidiSystem.getSynthesizer().getAvailableInstruments();
            sar = new String[istru.length];
            for (int loo = 0; loo < sar.length; loo++) {
                sar[loo] = istru[loo].toString();
                System.out.println(sar[loo]);
            }
        } catch (Exception ex) {
        }

    }
 

Anhänge

  • Bildschirmfoto11.png
    Bildschirmfoto11.png
    49,2 KB · Aufrufe: 23
Zuletzt bearbeitet:

Neue Beiträge

Zurück