Frage

Ich habe ein Java-Projekt geerbt, die eine alte C ++ dll MIDI-Daten von a zu erhalten Klavier mit dem Computer verbunden.

Nun, da Java hat eine integrierte Unterstützung für MIDI-Geräte, möchte ich der Legacy-C ++ dll loszuwerden und verwenden nur reine Java. Ist die Java-Unterstützung Daten von einem Klavier mit dem Computer empfangen? Ich habe Beispiele ohne Erfolg Google gesucht.

War es hilfreich?

Lösung

Ja, der Javasound-API verwendet wird MIDI-Daten von einem MIDI-Gerät zu lesen.

JFugue ist eine Java-API für Musikprogrammierung, die den Javasound-API verwendet, und hilft, Ihre Interaktion vereinfachen kann mit Javasound. In JFugue 5.x Codebeispiel 10 Sekunden von MIDI-Daten zu erfassen, von einem MIDI-Gerät ist wie folgt:

MidiDevice device = /* specify a MIDI device */
MusicTransmitterToSequence transmitter = new MusicTransmitterToSequence(device); 
transmitter.listenForMillis(10000); 
Sequence music = transmitter.getSequence();

Sie können auch starten und stoppen zu einem Gerät hören:

MidiDevice device = /* specify a MIDI device */
MusicTransmitterToSequence transmitter = new MusicTransmitterToSequence(device); 
transmitter.startListening(); 
// Do stuff
transmitter.stopListening(); 
Sequence music = transmitter.getSequence();

Andere Tipps

Wenn Sie nur mit dem MIDI api von Java aufzuzeichnen (javax.sound.midi. *) Dies ist sehr leicht gemacht. Dies ist der Code nicht zu kopieren und einzufügen, aber es sollten Sie Ihre eigenen MIDI-Recorder startet helfen Programmierung, die eigentlich ganz einfach ist.

Der erste Schritt ist die Eingabe und Ausgabe MidiDevice zu definieren. Also zuerst müssen Sie eine Liste von IO Möglichkeiten finden und eine GUI machen, in dem die Ein- und Ausgabegerät für MIDI-Aufnahme und Wiedergabe auswählen können.

Info[] infos = MidiSystem.getMidiDeviceInfo();
for(int i=0;i<infos.length;i++)
{
    System.out.println(infos[i].getName() + " - " + infos[i].getDescription());
}

So gibt es eine Liste Ihrer MIDI-Geräte. Als nächstes wollen Sie ein MIDI-Gerät zu wählen, zum Beispiel, um die Indizes in den Info Array wählen bekommen.

MidiDevice inputDevice = MidiSystem.getMidiDevice(infos[x]);
MidiDevice outputDevice = MidiSystem.getMidiDevice(infos[y]);

Sie wollen auch einige Globals angeben. Sequenzer, Sender und Empfänger

Sequencer sequencer = MidiSystem.getSequencer();
Transmitter transmitter;
Receiver receiver;

Jetzt gibt es eine Aufnahmetaste Sie verwenden möchten.

// Open a connection to your input device
inputDevice.open();
// Open a connection to the default sequencer (as specified by MidiSystem)
sequencer.open();
// Get the transmitter class from your input device
transmitter = inputDevice.getTransmitter();
// Get the receiver class from your sequencer
receiver = sequencer.getReceiver();
// Bind the transmitter to the receiver so the receiver gets input from the transmitter
transmitter.setReceiver(receiver);

// Create a new sequence
Sequence seq = new Sequence(Sequence.PPQ, 24);
// And of course a track to record the input on
Track currentTrack = seq.createTrack();
// Do some sequencer settings
sequencer.setSequence(seq);
sequencer.setTickPosition(0);
sequencer.recordEnable(currentTrack, -1);
// And start recording
sequencer.startRecording();

Achtung: , dieser Code kann MidiUnavailableExceptions werfen und Sie sollten die Nähe Methoden auf all die Dinge, rufen Sie in einer finally-Anweisung geöffnet haben.

Aber das ist nur der Kern dessen, was der Code aussehen sollte. Es zeichnet alles auf die Sequenz seq sobald Sie die Methode sequencer.startRecording() nennen.

Dann mögen Sie die Aufnahme zu stoppen, und in der Lage, die Sequenz als MIDI in eine Datei zu speichern oder eine Wiedergabe tun. Zum Beispiel könnte dies Code sein, wenn Sie die Stopp-Aufnahmetaste oder etwas drücken.

// Stop recording
if(sequencer.isRecording())
{
    // Tell sequencer to stop recording
    sequencer.stopRecording();

    // Retrieve the sequence containing the stuff you played on the MIDI instrument
    Sequence tmp = sequencer.getSequence();

    // Save to file
    MidiSystem.write(tmp, 0, new File("MyMidiFile.mid"));
}

Auch die Track-Klasse (eine Folge kann mehrere Spuren hat) enthält die eigentlichen Eingangsdaten, die Sie leicht durch eine get-Methode zugreifen können. Die Track-Klasse besteht aus MidiEvents. Zum Beispiel ist der Track:

MidiEvent 0: The C key is pressed
MidiEvent 1: The D key is pressed
MidiEvent 2: The C key of MidiEvent 0 is released
MidiEvent 3: The sustain pedal is pressed
etc...

Und jedes Midievent hat einen gewissen Zeitstempel, die in MIDI Ticks ausgedrückt wird, so können Sie einfach das Tempo ändern, durch Erhöhen oder die Anzahl der Ticks pro Sekunde abnehmen.

Das schwierigste Problem ist, dass MidiEvents in Byte-Code ausgedrückt werden, damit Sie ein Referenz-Bytecode Blatt verwenden müssen, die Ihnen sagt, was Byte repräsentiert, welche Aktion. Dies sollte man damit beginnen: http://www.onicos.com /staff/iz/formats/midi-event.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top