enviar un midi control change en java

--312411--
#1 por --312411-- el 21/08/2013
Hola amig@s!

Necesito una clase de ejemplo para enviar el siguiente control change desde java.

BYTE: 1 0XFFFFFFB0
BYTE: 2 0X58
BYTE: 3 0X0B

Me estoy volviendo "creisi" en google y releyendo la doc de java pero no doy con el tema.

Por favor, si alguien fuera tan amable de indicarme como. Se lo agradezco.

Pórtense mal!
Subir
--312411--
#2 por --312411-- el 21/08/2013
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.
Subir
#3 por plastamix el 24/08/2013
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.
Subir
--312411--
#4 por --312411-- el 27/08/2013
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!!
Subir
--312411--
#5 por --312411-- el 27/08/2013
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);
}
}
Subir
#6 por plastamix el 29/08/2013
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.
Subir
--312411--
#7 por --312411-- el 29/08/2013
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)
Subir
--312411--
#8 por --312411-- el 29/08/2013
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.
Subir
Respuesta rápida

Regístrate o para poder postear en este hilo