2016-06-01 17 views
0

Ich habe ein MIDI-Keyboard. Alles, was ich will, ist ein Beispiel, wie ich den Standard-Software-Synthesizer einrichten kann, um Sounds zu spielen, während ich die Tastatur spiele.Java MIDI: Verbinden der MIDI-Tastatur mit dem Standard-Synthesizer

package cleffsgame; 

import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.sound.midi.MidiDevice; 
import javax.sound.midi.MidiSystem; 
import javax.sound.midi.MidiUnavailableException; 

public class CheckDevices { 

    public static void main(String[] args) { 
     MidiDevice device; 
     // display each device's properties 
     for (MidiDevice.Info info: MidiSystem.getMidiDeviceInfo()) { 

      try { 
       device = MidiSystem.getMidiDevice(info); 

       System.out.println("\nDevice: "); 
       System.out.println("Name: " + device.getDeviceInfo().getName()); 
       System.out.println("Vendor: " + device.getDeviceInfo().getVendor()); 
       System.out.println("Version: " + device.getDeviceInfo().getVersion()); 
       System.out.println("Description: " + device.getDeviceInfo().getDescription()); 
       System.out.println("Transmitters: " + device.getMaxTransmitters()); 
       System.out.println("Receivers: " + device.getMaxReceivers()); 

      } catch (MidiUnavailableException ex) { 
       Logger.getLogger(CheckDevices.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 
} 

Durch den obigen Code ausgeführt wird, erhalte ich die folgende Ausgabe:

Lauf:

Device: Name: Gervill Lieferant: OpenJDK Version: 1.0 Beschreibung: Software MIDI-Synthesizer-Sender: 0 Empfänger: -1

Gerät: Name: Oxygen 49 Hersteller: M-Audio Version: Unbekannte Version Beschreibung: Oxygen 49 Sender: -1 Empfänger: 0

Device: Name: Oxygen 49 Hersteller: M-Audio-Version: Unbekannt Version Beschreibung: Oxygen 49 Sender: 0-Receiver: -1

Device: Name: Echtzeit-Sequenzer Hersteller: Oracle Corporation Version: Version 1.0 Beschreibung: Software-Sequenzer-Sender: -1 Empfänger: -1 ERFOLGREICH (Gesamtzeit: 2 Sekunden) BUILD

Aber wenn ich den Code ausführen, kein Ton abgespielt wird, wenn ich die Schlüssel getroffen.

package cleffsgame; 

import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.sound.midi.MidiDevice; 
import javax.sound.midi.MidiSystem; 
import javax.sound.midi.MidiUnavailableException; 
import javax.sound.midi.Receiver; 
import javax.sound.midi.Synthesizer; 
import javax.sound.midi.Transmitter; 

/** 
* 
* @author umberto 
*/ 
public class Test { 

    public static void main(String[] args) { 
     MidiDevice inputDevice = null, synthDevice = null; 
     Transmitter transmitter = null; 
     Synthesizer synthesizer = null; 
     Receiver receiver = null; 

     try { 
      inputDevice = MidiSystem.getMidiDevice(MidiSystem.getMidiDeviceInfo()[1]); 
      synthDevice = MidiSystem.getMidiDevice(MidiSystem.getMidiDeviceInfo()[0]); 

     } catch (MidiUnavailableException ex) { 
      Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     // goodDevice must be Oxygen 49 transmitter (MIDI Input) 
     if (inputDevice != null && synthDevice != null) { 
      try { 
       transmitter = inputDevice.getTransmitter(); 
       System.out.println("Transmitter: " + inputDevice.getDeviceInfo()); 
       System.out.println(String.format("T/R: %s/%s", inputDevice.getMaxTransmitters(), inputDevice.getMaxReceivers())); 

       receiver = synthDevice.getReceiver(); 
       System.out.println("Receiver: " + synthDevice.getDeviceInfo()); 
       System.out.println(String.format("T/R: %s/%s", synthDevice.getMaxTransmitters(), synthDevice.getMaxReceivers())); 

       transmitter.setReceiver(receiver); 
       System.out.println("GoodDevice is open... check sound\n"); 
       inputDevice.open(); 
       synthDevice.open(); 

      } catch (Exception ex) { 
       Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

    } 


} 

Es scheint, dass es mehr eine Synthesizer.receiver zu einem InputDevice.transmitter als Verbindungs ​​wie ich aus dem docs https://docs.oracle.com/javase/tutorial/sound/MIDI-synth.html zu erledigen ist.

+0

Müssten Sie dem Synthesizer kein Patch-Instrument zuweisen? – Ishmael

+0

yu muss was? – gpasch

+0

@Ishmael Wenn Sie können, überprüfen Sie bitte den folgenden Code. Ich habe das kb-Gerät und den Synth geöffnet, bevor ich sie manipuliere. Ich habe auch ein Instrument geladen, aber überhaupt keinen Ton. Wenn du ein bisschen Hallo Welt snnipet schreiben kannst, würde es wirklich helfen, da ich nie zuvor mit Midi gearbeitet habe. –

Antwort

0

Es könnte eine gute Idee sein, die Geräte zu öffnen, bevor Sie ihren Sender/Empfänger erwerben.

Aber das eigentliche Problem ist, dass dieses Programm sofort beendet, so dass die Geräte für eine nützliche Zeit nicht geöffnet sind.

+0

Glauben Sie, dass der folgende Code funktioniert? ' public static void main (Zeichenfolge [] args) { Synthesizer s = MS.getSynthesizer(); s.open(); Instrument [] inst = s.getAvailableInstruments(); s.loadInstrument (inst [0]); Empfänger r = s.getReceiver(); MidiDevice kb = MidiSystem.getMidiDevice (MidiSystem.getMidiDeviceInfo() [1]); kb.open(); Sender t = kb.getTransmitter(); t.setReceiver (r); // am Leben erhalten .. JFrame frame = neuer JFrame ("Test"); frame.add (...); } ' –

+0

Entschuldigung für den unformatierten Code oben. Jedenfalls habe ich versucht, die Midi-Tastatur und den Synth zu öffnen, bevor ich andere Methoden anrief und trotzdem hatte ich überhaupt keinen Ton. Meine Tastatur funktioniert gut in anderen Anwendungen wie Logic Pro und Virtual Midi Piano Kb. Ich benötige einen Hello World Code, um Sound von MIDI Keyboard zu bekommen. –

+0

Nun, bleibt Ihr Programm offen? –