Alguien escribió:
#ifndef MS3_WRITE_INTERVAL_MSEC
const byte MS3_WRITE_INTERVAL_MSEC = 20;
#endif
#ifndef MS3_READ_INTERVAL_MSEC
const byte MS3_READ_INTERVAL_MSEC = 200;
#endif
#ifndef MS3_RECEIVE_INTERVAL_MSEC
const byte MS3_RECEIVE_INTERVAL_MSEC = 20;
#endif
#ifndef MS3_HEADER
const byte MS3_HEADER[6] = {0x41, 0x00, 0x00, 0x00, 0x00, 0x33}; //Katana header
#endif
#ifndef MS3_QUEUE_SIZE
const byte MS3_QUEUE_SIZE = 20;
#endif
Katanafloor - Pedalera USB para Katana
OFERTAS Ver todas
-
Harley Benton ST-20HSS SBK Standard Series
-
-29%Boss T-Shirt CCB-MT2TMC (Talla M)
-
-11%Boss DD-500
Buenas, he probado mandar los mensajes Sysex para ponerlo en modo editor y luego mandar el envio de canal directamente sin usar la liberia MS3 y ha funcionado.
Mira esto es lo que he hecho:
void sendMidi() {
const byte HANDSHAKE[15] = {0xF0, 0x7E, 0x00, 0x06, 0x02, 0x41, 0x33, 0x03, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0xF7};
const byte KATANA_EDIT[15] = {0xF0, 0x41, 0x00, 0x00, 0x00, 0x00, 0x33, 0x12, 0x7F, 0x00, 0x00, 0x01, 0x01, 0x7F, 0xF7};
const byte CANAL2[16] = {0xF0, 0x41, 0x00, 0x00, 0x00, 0x00, 0x33, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x7D, 0xF7};
int datalength = 15;
int datalength1 = 16;
byte result;
result = Midi.SendSysEx((byte *)HANDSHAKE, datalength);
delay(20);
Serial.print("Result: ");
Serial.println(result);
result = Midi.SendSysEx((byte *)HANDSHAKE, datalength);
delay(20);
Serial.print("Result: ");
Serial.println(result);
result = Midi.SendSysEx((byte *)KATANA_EDIT, datalength);
delay(20);
Serial.print("Result: ");
Serial.println(result);
result = Midi.SendSysEx((byte *)CANAL2, datalength1);
delay(20);
Serial.print("Result: ");
Serial.println(result);
}
Lo que no entiendo es por qué no funciona entonces la libería MS3?
Mira esto es lo que he hecho:
void sendMidi() {
const byte HANDSHAKE[15] = {0xF0, 0x7E, 0x00, 0x06, 0x02, 0x41, 0x33, 0x03, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0xF7};
const byte KATANA_EDIT[15] = {0xF0, 0x41, 0x00, 0x00, 0x00, 0x00, 0x33, 0x12, 0x7F, 0x00, 0x00, 0x01, 0x01, 0x7F, 0xF7};
const byte CANAL2[16] = {0xF0, 0x41, 0x00, 0x00, 0x00, 0x00, 0x33, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x7D, 0xF7};
int datalength = 15;
int datalength1 = 16;
byte result;
result = Midi.SendSysEx((byte *)HANDSHAKE, datalength);
delay(20);
Serial.print("Result: ");
Serial.println(result);
result = Midi.SendSysEx((byte *)HANDSHAKE, datalength);
delay(20);
Serial.print("Result: ");
Serial.println(result);
result = Midi.SendSysEx((byte *)KATANA_EDIT, datalength);
delay(20);
Serial.print("Result: ");
Serial.println(result);
result = Midi.SendSysEx((byte *)CANAL2, datalength1);
delay(20);
Serial.print("Result: ");
Serial.println(result);
}
Lo que no entiendo es por qué no funciona entonces la libería MS3?
Lo que está pasando es que en el init no se está inicializando el MIDI Device y entonces no carga una serie de variables para hacer los calculos.
En la librería usbh_midi.cpp no se carga la estructura epInfo y por eso no funciona. Uno de los datos que necesita es epInfo.maxPktSize que al ser 0 está provocando que no envíe el sysex correctamente.
Lo que no sé es como forzar el init, porque entiendo que cuando hace el katana.begin() desde la libería MS3, llama al usb.init()
Es más, cuando tengo el DEBUG habilitado en la libería usbh_midi, en el programa que no uso MS3 me muestra la carga del Device. Sin embargo, cuando lo hago con la librería MS3 no me muestra nada. Es como si no la llamara.
A ver si se te ocurre algo.
En la librería usbh_midi.cpp no se carga la estructura epInfo y por eso no funciona. Uno de los datos que necesita es epInfo.maxPktSize que al ser 0 está provocando que no envíe el sysex correctamente.
Lo que no sé es como forzar el init, porque entiendo que cuando hace el katana.begin() desde la libería MS3, llama al usb.init()
Es más, cuando tengo el DEBUG habilitado en la libería usbh_midi, en el programa que no uso MS3 me muestra la carga del Device. Sin embargo, cuando lo hago con la librería MS3 no me muestra nada. Es como si no la llamara.
A ver si se te ocurre algo.
Bingo!!!
Lo conseguí!!!
Alucinante. Dije que parecía que no estaba haciendo el init del usb. Así que le puse un Serial.println el constructor de la librería usbh_midi.cpp para ver si pasaba por ahí.
Pues, a partir de ahí, emepezó a funcionar. Y ya consiguo cambiar de canal, que cuando cambie de canal en el katana se refresque la pedalera.
Lo que no entiendo es por qué al ponerle esa instrucción ha empezado a fucionar.
Esto es lo que le he puesto. La linea del println.
USBH_MIDI::USBH_MIDI(USB *p) :
pUsb(p),
bAddress(0),
bNumEP(1),
bPollEnable(false),
isMidiFound(false),
readPtr(0) {
// initialize endpoint data structures
Serial.println(F("inicializando epInfo"));
for(uint8_t i=0; i<MIDI_MAX_ENDPOINTS; i++) {
epInfo.epAddr = 0;
epInfo.maxPktSize = (i) ? 0 : 8;
epInfo.bmNakPower = (i) ? USB_NAK_NOWAIT : USB_NAK_MAX_POWER;
}
// register in USB subsystem
if (pUsb) {
pUsb->RegisterDeviceClass(this);
}
}
Lo conseguí!!!
Alucinante. Dije que parecía que no estaba haciendo el init del usb. Así que le puse un Serial.println el constructor de la librería usbh_midi.cpp para ver si pasaba por ahí.
Pues, a partir de ahí, emepezó a funcionar. Y ya consiguo cambiar de canal, que cuando cambie de canal en el katana se refresque la pedalera.
Lo que no entiendo es por qué al ponerle esa instrucción ha empezado a fucionar.
Esto es lo que le he puesto. La linea del println.
USBH_MIDI::USBH_MIDI(USB *p) :
pUsb(p),
bAddress(0),
bNumEP(1),
bPollEnable(false),
isMidiFound(false),
readPtr(0) {
// initialize endpoint data structures
Serial.println(F("inicializando epInfo"));
for(uint8_t i=0; i<MIDI_MAX_ENDPOINTS; i++) {
epInfo.epAddr = 0;
epInfo.maxPktSize = (i) ? 0 : 8;
epInfo.bmNakPower = (i) ? USB_NAK_NOWAIT : USB_NAK_MAX_POWER;
}
// register in USB subsystem
if (pUsb) {
pUsb->RegisterDeviceClass(this);
}
}
Pues si, probaré a oonerle un delay
El shift register va de lujo. No se nota ningun tipo de lag, y la verdad es que con 3 pines lo controlas. Y te da 8 salidas. Y si necesitas más puedes poner otro conectado a este y te da 16 salidas.
Bueno, ahora le voy a añadir una pantalla lcd de 20x4 y ya voy a ir pensando en la caja donde meterlo todo.
Gracias por la información. Cuando lo tenga mas avanzado ire poniendo fotos.
El shift register va de lujo. No se nota ningun tipo de lag, y la verdad es que con 3 pines lo controlas. Y te da 8 salidas. Y si necesitas más puedes poner otro conectado a este y te da 16 salidas.
Bueno, ahora le voy a añadir una pantalla lcd de 20x4 y ya voy a ir pensando en la caja donde meterlo todo.
Gracias por la información. Cuando lo tenga mas avanzado ire poniendo fotos.
Que va, hay una libreria de Adafruit que lo hace muy facil de manejar. Es como este:
https://es.aliexpress.com/item/33034301759.html?src=google&src=google&albch=shopping&acnt=494-037-6276&isdl=y&slnk=&plac=&mtctp=&albbt=Gploogle_7_shopping&aff_atform=google&aff_short_key=UneMJZVf&&albagn=888888&albcp=2047572441&albag=80829465588&trgt=743612850714&crea=es33034301759&netw=u&device=c&albpg=743612850714&albpd=es33034301759&gclid=CjwKCAjwiMj2BRBFEiwAYfTbCpX05dOAnGF41Gy_kM4WShypKWED-ygmjjGoBOp-a7xU96P8t0JOrxoCjrkQAvD_BwE&gclsrc=aw.ds
Lo bueno es que con dos cables se maneja por el bus I2C. Pero tendras que mirar si tienes los pins del I2C libres.
https://es.aliexpress.com/item/33034301759.html?src=google&src=google&albch=shopping&acnt=494-037-6276&isdl=y&slnk=&plac=&mtctp=&albbt=Gploogle_7_shopping&aff_atform=google&aff_short_key=UneMJZVf&&albagn=888888&albcp=2047572441&albag=80829465588&trgt=743612850714&crea=es33034301759&netw=u&device=c&albpg=743612850714&albpd=es33034301759&gclid=CjwKCAjwiMj2BRBFEiwAYfTbCpX05dOAnGF41Gy_kM4WShypKWED-ygmjjGoBOp-a7xU96P8t0JOrxoCjrkQAvD_BwE&gclsrc=aw.ds
Lo bueno es que con dos cables se maneja por el bus I2C. Pero tendras que mirar si tienes los pins del I2C libres.
Hilos similares
Nuevo post
Regístrate o identifícate para poder postear en este hilo