Question

J'ai hérité d'un projet Java utilisé un vieux C ++ dll pour recevoir des données MIDI d'un piano, connecté à l'ordinateur.

Maintenant que Java a un support intégré pour les périphériques MIDI, je veux me débarrasser de l'héritage C ++ dll et il suffit d'utiliser Java pur. Est-ce que le support de Java réception de données à partir d'un piano connecté à l'ordinateur? Je l'ai cherché Google pour des exemples, mais en vain.

Était-ce utile?

La solution

Oui, l'API JavaSound peut être utilisé pour lire des données MIDI à partir d'un périphérique MIDI.

JFugue est une API Java pour la programmation musicale qui utilise l'API JavaSound et peut aider à simplifier votre interaction avec JavaSound. Dans 5.x JFugue, le code d'échantillon pour capturer 10 secondes de données MIDI à partir d'un appareil MIDI est la suivante:

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

Vous pouvez également démarrer et arrêter d'écouter un appareil:

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

Autres conseils

Si vous voulez enregistrer avec juste l'api MIDI par Java (javax.sound.midi. *) Cela se fait très facilement. Ce n'est pas le code à copier et coller, mais il devrait vous aider à commencer à programmer votre enregistreur MIDI, ce qui est assez facile en fait.

La première étape consiste à définir votre entrée et de sortie MidiDevice. Donc, d'abord, vous devrez trouver une liste de possibilités d'entrées-sorties et créer une interface dans laquelle vous pouvez sélectionner le périphérique d'entrée et de sortie pour l'enregistrement et la lecture MIDI.

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

Il y a une liste de vos périphériques MIDI. Ensuite, vous voulez sélectionner un périphérique MIDI, par exemple, vous pouvez choisir les index dans le tableau infos.

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

Vous voudrez aussi spécifier certains: GLOBALS. Séquenceur, émetteur et récepteur

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

Maintenant, il y a un bouton d'enregistrement que vous souhaitez utiliser.

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

Attention , ce code peut jeter MidiUnavailableExceptions et vous devriez appeler les méthodes proches de toutes les choses que vous avez ouvert dans une finally.

Mais ce n'est que le cœur de ce qui devrait ressembler le code. Il enregistre tout au seq de séquence dès que vous appelez la méthode sequencer.startRecording().

Alors, vous voulez arrêter l'enregistrement, et être en mesure d'enregistrer la séquence MIDI dans un fichier, ou faire une lecture. Par exemple, cela pourrait être le code lorsque vous appuyez sur le bouton d'enregistrement d'arrêt ou quelque chose.

// 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"));
}

Aussi la classe Track (une séquence peut avoir plusieurs pistes) contient les données d'entrée réelles, que vous pouvez facilement accéder par une méthode get. La classe de piste se compose de MidiEvents. Par exemple, la piste est:

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...

Et chaque MidiEvent a une certaine horodatage, qui est exprimée en MIDI Tiques, ainsi vous pouvez facilement changer le tempo en augmentant ou en diminuant le nombre de tiques par seconde.

Le plus dur problème ici est que MidiEvents sont exprimés en code binaire, vous devrez donc utiliser une feuille de code octet de référence qui vous indique quel octet représente ce que l'action. Cela devrait vous aider à démarrer avec que: http://www.onicos.com /staff/iz/formats/midi-event.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top