Enviar un midi control change en java

yoyasieso
#1 por yoyasieso 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
OFERTASVer todas
  • beyerdynamic DT-770 Pro
    138 €
    Ver oferta
  • -8%
    Behringer X Air XR18
    645 €
    Ver oferta
  • -21%
    Zoom H4n Pro Black
    158 €
    Ver oferta
yoyasieso
#2 por yoyasieso 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
plastamix
#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
yoyasieso
#4 por yoyasieso 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
yoyasieso
#5 por yoyasieso 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
plastamix
#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
yoyasieso
#7 por yoyasieso 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
yoyasieso
#8 por yoyasieso 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
plastamix
Hilos similares
Nuevo post

Regístrate o para poder postear en este hilo