So spielen Sie eine MIDI-Datei mit der Java Sound API ab (geben Sie das zu verwendende MIDI-Gerät an)

Einführung

Dies ist eine Fortsetzung des vorherigen Artikels (https://qiita.com/absol_abcX/items/e9c230b808e522154ae5).

Überblick

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.

Beispielcode

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();
    }
}

Kommentar

Holen Sie sich eine Liste der verfügbaren Geräteinformationen

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();

Geräteobjekt abrufen

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();
}

Schließen Sie den Sequenzer und das Gerät an

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. Device Configuration.png

Damit ist die Geräteverbindung abgeschlossen.

Recommended Posts

So spielen Sie eine MIDI-Datei mit der Java Sound API ab (geben Sie das zu verwendende MIDI-Gerät an)
So spielen Sie eine MIDI-Datei mit der Java Sound API ab
[Java] Verwendung der toString () -Methode
Studieren der Verwendung des Konstruktors (Java)
[Verarbeitung × Java] Verwendung der Schleife
[Verarbeitung × Java] Verwendung der Klasse
[Verarbeitung × Java] Verwendung der Funktion
[Java] Verwendung der Calendar-Klasse
Verwendung der Java-API mit Lambda-Ausdrücken
Verwendung der replace () -Methode (Java Silver)
Zusammenfassung der Java-Kommunikations-API (1) Verwendung von Socket
Zusammenfassung der Java-Kommunikations-API (3) Verwendung von SocketChannel
So verwenden Sie Play Framework ohne typsicheren Aktivator
Zusammenfassung der Java-Kommunikations-API (2) Verwendung von HttpUrlConnection
Verwendung der Ketten-API
[Java] Verwendung von Map
Verwendung von Java Optional
Verwendung der Java-Klasse
[Java] Verwendung von removeAll ()
Verwendung von Java Map
Verwendung von Java-Variablen
Verwendung von Maven zum Platzieren von Ressourcendateien außerhalb von JAR
[Ein Muss für einen Java-Ingenieurlehrling] Verwendung der Stream-API
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Aufrufen und Verwenden der API in Java (Spring Boot)
Verwendung von HttpClient (Get) von Java
Verwendung der Methode form_with
[java8] Um die Stream-API zu verstehen
So zerlegen Sie eine Java-Klassendatei
Verwendung von HttpClient (Post) von Java
[Java] Verwendung der Join-Methode
Verwendung der Wrapper-Klasse
[Verarbeitung × Java] Verwendung von Variablen
So dekompilieren Sie eine Java-Klassendatei
[JavaFX] [Java8] Verwendung von GridPane
Verwendung von Klassenmethoden [Java]
[Java] Verwendung von List [ArrayList]
Wie verwende ich Klassen in Java?
[Verarbeitung × Java] Verwendung von Arrays
Verwendung von Java-Lambda-Ausdrücken
[Java] Verwendung der Math-Klasse
Verwendung des Java-Aufzählungstyps
So verwenden Sie das Befehlszeilentool "Java" ... So vermeiden Sie das Auftauchen
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
Der Operator, der geboren wurde, um geboren zu werden, instanceof (Java) ~ So verwenden Sie den instanceof-Operator ~
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
Verwendung von binding.pry für die Ansichtsdatei
Verwendung von BootStrap mit Play Framework
Versuchen Sie es mit der Stream-API in Java
Verwendung der Submit-Methode (Java Silver)
[Java] So berechnen Sie das Alter mit LocalDate