Dies ist eine Fortsetzung des vorherigen Artikels (https://qiita.com/absol_abcX/items/e9c230b808e522154ae5).
Implementieren Sie die MIDI-Synthesizer-Auswahlfunktion, die im vorherigen Beispiel für die Wiedergabe von MIDI-Dateien verwendet werden soll. Unten sehen Sie den eigentlichen Ausführungsbildschirm.
[0] Gervill
[1] LoopBe Internal MIDI
[2] Microsoft MIDI Mapper
[3] CoolSoft MIDIMapper
[4] Microsoft GS Wavetable Synth
[5] VirtualMIDISynth #1
[6] LoopBe Internal MIDI
[7] Real Time Sequencer
Geben Sie die Nummer des zu verwendenden MIDI-Geräts ein>> 4
[Microsoft GS Wavetable Synth]Ist offen...
MIDI-Dateipfad>> sample.mid
Spielen...
Geben Sie die entsprechende Zeichenfolge ein, um den Vorgang abzuschließen.
>>a
Halt
Apropos, Das 0. Gerät namens "Gervill" ist ein MIDI-Synthesizer, der von der Java-Bibliothek bereitgestellt wird. Standardmäßig ist dieses Gerät angegeben.
Der diesmal verwendete "Microsoft GS Wavetable Synth" ist ein Synthesizer, der standardmäßig mit Windows geliefert wird.
SamplePlayer.java
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiDevice;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
public class SamplePlayer {
public static void main(String[] args) {
//Hardware zur Wiedergabe von MIDI-Daten/Eine Instanz eines Softwaregeräts.
Sequencer sequencer = null;
Scanner scanner = new Scanner(System.in);
try {
//Holen Sie sich eine Sequencer-Instanz.
sequencer = MidiSystem.getSequencer(false);
//Öffnen Sie das Gerät und erwerben Sie Ressourcen.
sequencer.open();
//Holen Sie sich eine Liste der verfügbaren MIDI-Geräte.
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (int i=0; i<infos.length; i++) {
String line = String.format("[%s] %s", i, infos[i].getName());
System.out.println(line);
}
System.out.println();
int index = 0;
while (true) {
//Rufen Sie den Index des zu verwendenden MIDI-Geräts über die Konsoleneingabe ab.
System.out.print("Geben Sie die Nummer des zu verwendenden MIDI-Geräts ein>> ");
String str = scanner.next();
try {
index = Integer.parseInt(str);
}
catch (NumberFormatException nfe) {
continue;
}
break;
}
//Fordern Sie ein MIDI-Gerät mit Geräteinformationen an, die das für das System interessante Gerät darstellen.
MidiDevice device = MidiSystem.getMidiDevice(infos[index]);
System.out.println("[" + device.getDeviceInfo().getName() + "]Ist offen...");
//Öffnen Sie ein MIDI-Gerät.
if (device.isOpen() == false) {
device.open();
}
//Verbinden Sie den MIDI OUT des Sequenzers mit dem MIDI IN des MIDI-Geräts.
Receiver receiver = device.getReceiver();
sequencer.getTransmitter().setReceiver(receiver);
}
catch (MidiUnavailableException e) {
e.printStackTrace();
}
System.out.println();
//Rufen Sie den Pfad der MIDI-Datei von der Konsoleneingabe ab.
System.out.print("MIDI-Dateipfad>> ");
String path = scanner.next();
try {
//MIDI-Daten aus der MIDI-Datei(Sequenzobjekt)Erhalten.
File file = new File(path);
Sequence sequence = MidiSystem.getSequence(file);
//Stellen Sie die erfassten MIDI-Daten im Sequenzer ein.
sequencer.setSequence(sequence);
}
catch (InvalidMidiDataException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
//Sequenzer-Wiedergabe
sequencer.start();
System.out.println("Spielen...");
//Warten auf Tasteneingabe
System.out.println("Geben Sie die entsprechende Zeichenfolge ein, um den Vorgang abzuschließen.");
System.out.print(">>");
scanner.next();
scanner.close();
//Sequenzer stoppen
sequencer.stop();
System.out.println("Halt");
//Schließen Sie den Sequenzer und geben Sie die verwendeten Ressourcen frei.
sequencer.close();
}
}
Ruft ein Objektarray aller verfügbaren MIDI-Geräteinformationen ab.
//Holen Sie sich eine Liste der verfügbaren MIDI-Geräte.
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
Sie können das entsprechende Gerät abrufen, indem Sie getMidiDevice mit dem erhaltenen Geräteinformationsobjekt aufrufen. Sie können es bedienen, indem Sie auf dem erfassten Gerät open aufrufen.
//Fordern Sie ein MIDI-Gerät mit Geräteinformationen an, die das für das System interessante Gerät darstellen.
MidiDevice device = MidiSystem.getMidiDevice(infos[index]);
//Öffnen Sie ein MIDI-Gerät.
if (device.isOpen() == false) {
device.open();
}
Die MIDI-Geräteklasse bietet zwei Schnittstellen:
Name der Schnittstelle | Überblick | Häufig verwendet |
---|---|---|
Transmitter | Senden Sie MIDI-Daten. | Sequenzer, MIDI-Eingabegerät usw. |
Receiver | Empfangen Sie MIDI-Daten. | Synthesizer / MIDI-Ausgabegerät |
Verbinden Sie diesmal den MIDI-Empfangsport (Receiver) des angegebenen MIDI-Geräts mit dem MIDI-Sendeport (Transmitter) des Sequenzers.
//Verbinden Sie den MIDI OUT des Sequenzers mit dem MIDI IN des MIDI-Geräts.
Receiver receiver = device.getReceiver();
sequencer.getTransmitter().setReceiver(receiver);
Dann sieht das Konfigurationsabbild folgendermaßen aus.
Damit ist die Geräteverbindung abgeschlossen.
Recommended Posts