se me olvidó decir que tengo un interface de m-audio (el UNO) con el que conecto mi ordenador al los midi IN/OUT de los dispositivos.
Cuando un byte es tan gordo como 0XFFFFFFB0, que ocupa 32 bits, ya no es un byte, es un dword. El byte es 0xB0.
Así que quieres mandar un mensaje midi con un 0xB0 como status, un 0x58 como primer dato y 0x0B como segundo.
Un mensaje midi es un int en el que el byte más bajo es el status, del que el nibble más bajo es el comando y el más alto el canal, el segundo byte es el primer dato si lo hubiera, el siguiente es el segundo dato si lo hubiera, y byte más significativo es 0. Si quieres mandar un 0xB0 con 0x58 como primer dato y 0xB0 como segundo tienes que formar el int 0x00B058B0.
Para ello Java tiene la clase ShortMessage, con la función setMessage, a la que, o le pasas ese int, o le pasas los tres bytes, o le pasas 2 nibbles y 2 bytes. O sea:
ShortMessage miMensajito = new ShortMessage();
ya tenemos la clase creada. Ahora llamamos la función de esa clase para formar el mensaje con los parámetros:
miMensajito.setMessage(0x00B058B0);
o
miMensajito.setMessage(0xB0, 0x58, 0x0B);
o
miMensajito.setMessage(ShortMessage.CONTROL_CHANGE, 0, 0x58, 0x0B);
La clase ShortMessage tiene definidas una serie de valores static que se corresponden con los distintos comandos midi. En este caso le mandaríamos la variable CONTROL_CHANGE y como canal el 0.
Ya tenemos el mensaje midi. Ahora necesitamos algo para mandarlo. Para ello tenemos la clase MidiSystem, que tiene la función getReceiver, que devuelve un Receiver.
Receiver miReceiver = new MidiSystem.getReceiver();
Y ese Receiver tiene la función send(). Y lo mandamos tal que:
miReceiver.send(miMensajito, -1);
Ya está el mensaje mandado. El -1 es el timeStamp. Antes se usaba a la hora de recibir mensajes midi. Ahora ni eso, así que tiene que ser un -1.
Hola amigo!
mil gracias por tu respuesta... no lograba acceder para agradecerte la atención prestada.
voy a intentar como me dices pero ando pez en java... por eso pedia una clase ( un archivo.java ) que enviara el mensajito... voy a ver si con un import midi puedo.
ya te cuento.
salud!!
Ufff... he intentado esto pero ya netbeans me dice que ya lleva errores antes de compilar.... me puedes echar un cable?
import java.util.*;
import javax.sound.midi.*;
class Hispa{
public static void main(String[] args) {
ShortMessage miMensajito = new ShortMessage();
// miMensajito.setMessage(0x00B058B0);
// miMensajito.setMessage(0xB0, 0x58, 0x0B);
miMensajito.setMessage(ShortMessage.CONTROL_CHANGE, 0, 0x58, 0x0B);
Receiver miReceiver = new MidiSystem.getReceiver();
miReceiver.send(miMensajito, -1);
}
}
import java.util.*;
import javax.sound.midi.*;
import javax.sound.midi.MidiSystem.*;
class Hispa{
public static void main(String[] args) {
ShortMessage miMensajito = new ShortMessage();
// miMensajito.setMessage(0x00B058B0);
// miMensajito.setMessage(0xB0, 0x58, 0x0B);
try {
miMensajito.setMessage(ShortMessage.NOTE_ON, 0, 0x38, 0x70);
} catch (InvalidMidiDataException e) {
e.printStackTrace();
}
try {
Receiver miReceiver = MidiSystem.getReceiver();
miReceiver.send(miMensajito, -1);
} catch (MidiUnavailableException e) {
e.printStackTrace();
}
}
}
A mí eso me funciona perfectamente, manda una nota midi. La manda al dispositivo midi que esté seleccionado por defecto en el sistema.
Gracias compi!... pero no sé porqué me sigue dando error en:
ShortMessage miMensajito = new ShortMessage();
Dando el siguiente mensaje:
run:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous tree type: ShortMessage
at Hispa2.main(Hispa2.java:7)
Java Result: 1
GENERACIÓN CORRECTA (total time: 0 seconds)
arggggg!! si lo lanzo desde el cakewalk o desde la fcb1010 la pedalera se lo traga sin problemas y pero no sé porque java no quiere.