J'ai conçu mon propre synthétiseur en java et je veux maintenant le connecter avec un clavier midi. Ma classe ci-dessous recherche tous les appareils midi qui ont des émetteurs. Elle trouve avec succès mon clavier midi. J'ajoute mes propres récepteurs à chaque émetteur pour chaque appareil afin qu'il puisse capter tout ce qui est possible. En lisant tous les documents d'aide et la doc Java, je sais qu'un émetteur envoie des événements Midi à un récepteur qui les traite ensuite avec la méthode d'envoi. J'ai donc écrit ma propre classe interne implémentant le récepteur et j'ai simplement utilisé une instruction println pour vérifier si quelque chose avait été détecté dans la méthode d'envoi. Cependant, rien n'est détecté du tout. Il semble y avoir très peu d'aide pour faire une chose aussi simple et j'ai regardé tous les fichiers d'aide, javadoc et forum. Je suis sûr qu'il doit y avoir quelque chose de vraiment évident qui m'a échappé.
Mon synthétiseur ne doit pas être confondu avec le synthétiseur d'interface et ce n'est pas un instrument midi. Il utilise un algorithme de synthèse et possède une méthode de lecture. En gros, j'ai juste besoin que le clavier midi envoie un événement note on qui invoquera la méthode de lecture.
import javax.sound.midi.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
public class MidiHandler
{
//ArrayList of MidiDevices
private ArrayList<MidiDevice> devices = new ArrayList<MidiDevice>();
public MidiHandler()
{
MidiDevice device;
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (int i = 0; i < infos.length; i++) {
try {
device = MidiSystem.getMidiDevice(infos[i]);
//does the device have any transmitters?
if (device.getTransmitters().size() > 0) {
//if it does, add it to the device list
System.out.println(infos[i] + ": " + device.getTransmitters().size());
devices.add(device);
}
} catch (MidiUnavailableException e) {}
}
//if any transmitting devices were found
if(devices.size()>0) {
//for each device
for(int i = 0; i<devices.size(); i++) {
try {
//get all transmitters
List<Transmitter> transmitters = devices.get(i).getTransmitters();
//and for each transmitter
for(int j = 0; j<transmitters.size();j++) {
//create a new receiver
transmitters.get(i).setReceiver(
//using my own MidiInputReceiver
new MidiInputReceiver(devices.get(i).getDeviceInfo().toString())
);
}
//open each device
devices.get(i).open();
//if code gets this far without throwing an exception
//print a success message
System.out.println(devices.get(i).getDeviceInfo()+" Was Opened");
} catch (MidiUnavailableException e) {}
}
}
}
//tried to write my own class. I thought the send method handles an MidiEvents sent to it
public class MidiInputReceiver implements Receiver {
public String name;
public MidiInputReceiver(String name) {
this.name = name;
}
public void send(MidiMessage msg, long timeStamp) {
System.out.println("midi received");
}
public void close() {}
}
}
NOTE : J'ai déjà vu cela : Java MIDI - obtenir des données du piano ? .
et ceci : http://www.jsresources.org/examples/MidiInDump.html
Le séquenceur d'interface semble trop compliqué pour ce que je veux aussi.