Pregunta

He heredado un proyecto Java que utiliza una DLL de C ++ de edad para recibir datos MIDI desde un el piano conectado al ordenador.

Ahora que Java se ha incorporado en el soporte para dispositivos MIDI, que quieren deshacerse del legado C ++ DLL y sólo tiene que utilizar Java puro. ¿son compatibles con Java recibir datos de un piano conectado al ordenador? He buscado en Google para ver ejemplos en vano.

¿Fue útil?

Solución

Sí, el API JavaSound se puede utilizar para leer datos MIDI desde un dispositivo MIDI.

JFugue es una API Java para la programación de música que utiliza la API JavaSound, y puede ayudar a simplificar su interacción con JavaSound. En JFugue 5.x, código de ejemplo para capturar 10 segundos de datos MIDI desde un dispositivo MIDI es el siguiente:

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

También puede iniciar y detener la escucha de un dispositivo:

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

Otros consejos

Si desea grabar con sólo la API de Java MIDI (javax.sound.midi. *) Esto se hace muy fácilmente. Esto no es código para copiar y pegar, pero le ayudará a empezar a programar su propia grabadora MIDI, que es bastante fácil en realidad.

El primer paso es definir su entrada y salida MidiDevice. Así que primero tendrá que encontrar una lista de posibilidades IO y hacer una interfaz gráfica de usuario en la que se puede seleccionar el dispositivo de entrada y salida para la grabación y reproducción MIDI.

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

Así que no es una lista de los dispositivos MIDI. Próxima vez que desee seleccionar un dispositivo MIDI, por ejemplo, que pueden escoger los índices de la matriz informaciones.

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

También tendrá que especificar algunas variables globales:. Secuenciador, transmisor y receptor

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

Ahora hay un botón de grabación que desea utilizar.

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

Cuidado , este código puede lanzar MidiUnavailableExceptions y debe llamar a los métodos de cerca todas las cosas que ha abierto finalmente en un comunicado.

Pero esto es sólo el núcleo de lo que el código debe ser similar. Se registra todo a la seq Secuencia tan pronto como se llama al método sequencer.startRecording().

A continuación, desea detener la grabación, y ser capaz de guardar la secuencia como MIDI a un archivo o hacer una reproducción. Por ejemplo, esto podría ser un código cuando se pulsa el botón de grabación de parada o algo así.

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

También la clase de pista (una secuencia puede tener varias pistas) contiene los datos de entrada reales, que se puede acceder fácilmente por un método get. La clase de pista consiste en MidiEvents. Por ejemplo, la pista es:

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

Y cada MidiEvent tiene una cierta marca de tiempo, que se expresa en MIDI garrapatas, así que puede cambiar fácilmente el tempo aumentando o disminuyendo el número de pulsaciones por segundo.

El problema más difícil aquí es que MidiEvents se expresan en código de bytes, por lo que tendrá que utilizar una hoja de código de bytes de referencia, que le dice lo que representa bytes que acción. Esto debería ayudarle a empezar con eso: http://www.onicos.com /staff/iz/formats/midi-event.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top