Controlador MIDI por USB con PIC para Virtual Dj

Hola!!

Lo de "spv midi dj" es el nombre que le di yo, que son mis iniciales y demás. Yo creo que el problema está en el Virtual dj. No tendría porque colgarse. Yo tambien utilizo Windows 7 64bits, y anda perfecto. Si tienes mal los archivos DEVICE y MAPPER, simplemente no te lo reconoce el Virtual Dj, pero no tendría porque colgarse.
No puedo enviarte estos archivos porque supongo que no estaré en mi casa hasta el sábado... nada más que esté te los envio para que pruebes.

Si que es raro que con el midi trace lo veas enviando notas...

Lo de mis leds, creo que tengo mal los endpoints de recibir en el pic, pero lo mismo, hasta el sábado no podré probar. Tengo ganas de estar allí para eso, jajajaja
 
En realidad no era justamente eso lo que no entendia del nombre, sinó el hecho de que aparezca FFFF/FFFF delante del nombre en el midi trace, porque en otras interfaces que tengo me sale 1/67, 1/66, 1/1b... etc.



Y está comprobado que tu código funciona y se comporta como una interfaz midi, en fruity loops me marca claramente el note on/off...
Ahora capaz que lo pruebo en ableton live a ver si lo toma bien, que es muy probable que si.
Pongamonos las pilas y diseñemos algo, que con el mismo hardware se pueda comportar como hid o como midi... yo mas atrás subi unos esquemas de los modulos de entrada y demas, son los de midibox.
Yo quise hacer lo de midibox pero como no consigo ese pic me incline por hacer mi propio diseño, y ademas a mi me gusta saber el por qué de las cosas :)
 
Última edición:
Para que funcione como midi y hid habría que implementar los dos tipos de comunicación en un mismo pic, y de algún modo seleccionar el tipo al arrancar, bien sea con un selector o algo.
No creo que sea muy dificil, salvo que había que tener en cuenta la memoria que podría ocupar...
 
Vos que manejas mejor el CCS podrias ver de hacer algo que dependiendo de una entrada del pic ejecute un código para hid y sino salte a un código midi... seria cuestión de indicarle que descriptor cargar... o tener el pic con bootloader y dos hex diferentes. Esta última seria la mas sencilla.
Existe la posibilidad si mientras se está cargando un hex por bootloader y se desconecta el usb no se pueda volver a realizar la carga? o no pasa nada?... porque suponé que uno quiera vender la consola y el usuario hace mal algo.. se queda sin posibilidad de actualizarla por usb?
 
Hola:

¿El hex se puede guardar en el pic para que lo cargue? Yo lo tengo con bootloader, pero el hex se lo mando desde el pc. Muchas veces se para la transferencia y lo tengo que volver a mandar, pero nunca se ha estropeado el bootloader.

Pongo aquí el DEVICE y el MAPPER que tengo hecho para probar y funciona con midi y el virtual dj.

A ver si esta tarde hago funcionar lo de los leds...y en otro momento me pongo con lo de los 2 protocolos.

Un saludo
 

Adjuntos

  • Virtual dj.rar
    784 bytes · Visitas: 151
Soy imcapaz de enviar leds desde el Virtual dj!!! Alto tengo mal en el Device, en el Mapper o en el descriptor HID, pero no se que. En el analizador de USB no veo que en Virtual dj envíe nada hacia el pic.
Si alguien lo consigue que me explique como, que me estoy desesperando, jajajaja
Con el midi ya lo tenia funcionando.
 
Soy imcapaz de enviar leds desde el Virtual dj!!! Alto tengo mal en el Device, en el Mapper o en el descriptor HID, pero no se que. En el analizador de USB no veo que en Virtual dj envíe nada hacia el pic.
Si alguien lo consigue que me explique como, que me estoy desesperando, jajajaja
Con el midi ya lo tenia funcionando.

Para enviar en el xxxdevice.xml tiene que poner algo como esto
Código:
 <page type="out">
  <constant text="ECA" />
  <led bit="0x1B" name="LED_JOG" default="JOG_TOUCH" />
  <led bit="0x1C" name="LED_PLAY" default="PLAY" />
  <led bit="0x1D" name="LED_CUE" default="CUE" />
  <led bit="0x1E" name="LED_SCRATCH" default="SCRATCH" />
  <led bit="0x1F" name="LED_REVERSE" default="REV" />
  <led bit="0x20" name="LED_RELAY" default="RELAY" />
  <led bit="0x21" name="LED_JOG2" />
  <led bit="0x22" name="LED_JOG3" />
  <led bit="0x23" name="LED_CUE3" default="CUE3" />
  <led bit="0x24" name="LED_CUE2" default="CUE2" />
  <led bit="0x25" name="LED_CUE1" default="CUE1" />
  <led bit="0x26" name="LED_MEMO" default="MEMO" />
  <led bit="0x27" name="LED_DUMP" default="DUMP" />
  <led bit="0x28" name="LED_LOOPA" default="LOOPA" />
  <led bit="0x29" name="LED_LOOPB" default="LOOPB" />
  <led bit="0x2A" name="LED_RELOOP" default="RELOOP" />
  <led bit="0x2B" name="LED_NEXT" default="NEXTTRACK" />
  <led bit="0x2C" name="LED_JOG4" />
  <led bit="0x2D" name="LED_EDIT" default="EDIT" />
  <led bit="0x2E" name="LED_ONOFF" default="ONOFF" />
  <led bit="0x2F" name="LED_KEY" default="KEY" />
  <led bit="0x30" name="LCD_PC" />
  <led bit="0x31" name="LCD_TOTALREMAIN" />
  <led bit="0x32" name="LCD_REMAIN" />
  <led bit="0x33" name="LCD_ELAPSED" />
  <led bit="0x34" name="LCD_CONTINUE" />
  <led bit="0x35" name="LCD_SINGLE" />
  <led bit="0x36" name="LCD_SINGLEREPLAY" />
  <led bit="0x39" name="LCD_MT" />
  <led bit="0x3A" name="LCD_PLAY" />
  <led bit="0x3B" name="LCD_PAUSE" />
  <led bit="0x3C" name="LCD_LOOP" />
  <led bit="0x3D" name="LCD_CUE" />
  <led bit="0x3E" name="LCD_SEARCH" />
  <led bit="0x45" name="LCD_SEARCH-" />
  <led bit="0x46" name="LCD_SEARCH+" />
  <digit byte="11" size="word" endian="little" enablebit="0xDD" plusbit="0x37" minusbit="0x38" dotbit2="0x44" name="DIGIT_KEY" />
  <digit byte="13" enablebit="0xDE" name="DIGIT_MINUTES" />
  <digit byte="14" enablebit="0xDE" enablebit2="0x42" name="DIGIT_SECONDS" />
  <digit byte="15" enablebit="0xDE" enablebit2="0x43" name="DIGIT_FRAMES" />
  <digit byte="16" size="word" endian="little" enablebit="0xDF" dotbit="0x41" name="DIGIT_BPM" />
  <digit byte="18" enablebit="0x3F" name="DIGIT_START" />
  <digit byte="19" enablebit="0x40" name="DIGIT_BRAKE" />
  <digit byte="20" size="word" endian="little" enablebit="0xDB" name="DIGIT_TOTALTRACK" />
  <digit byte="22" size="word" endian="little" enablebit="0xDC" name="DIGIT_NOWTRACK" />
  <bar bit="0xC1" nbbits="7" max="80" enablebit="0xDA" minusbit="0xC0" name="PROGRESSBAR" />
 </page>

y en el xxxmaper.xml
Código:
 <map value="LED_JOG2" action="off" />
  <map value="LED_JOG3" action="off" />
  <map value="LED_JOG4" action="off" />
  <map value="LED_EDIT" action="deck 2 select" />
  <map value="TEXT1" action="get text 1" />
  <map value="TEXT2" action="get text 2" />
  <map value="DIGIT_KEY" action="get pitch" />
  <map value="DIGIT_MINUTES" action="get time_min" />
  <map value="DIGIT_SECONDS" action="get time_sec" />
  <map value="DIGIT_FRAMES" action="get time_ms" />
  <map value="DIGIT_BPM" action="get bpm" />
  <map value="DIGIT_START" action="off" />
  <map value="DIGIT_BRAKE" action="off" />
  <map value="DIGIT_TOTALTRACK" action="off" />
  <map value="DIGIT_NOWTRACK" action="off" />
  <map value="PROGRESSBAR" action="song_pos" />
  <map value="LCD_PC" action="true" />
  <map value="LCD_TOTALREMAIN" action="off" />
  <map value="LCD_REMAIN" action="display_time &apos;remain&apos;" />
  <map value="LCD_ELAPSED" action="display_time &apos;elapsed&apos;" />
  <map value="LCD_CONTINUE" action="off" />
  <map value="LCD_SINGLE" action="off" />
  <map value="LCD_SINGLEREPLAY" action="off" />
  <map value="LCD_MT" action="key_lock" />
  <map value="LCD_PLAY" action="play" />
  <map value="LCD_PAUSE" action="play ? false : true" />
  <map value="LCD_LOOP" action="loop" />
  <map value="LCD_CUE" action="cue" />
  <map value="LCD_SEARCH" action="off" />
  <map value="LCD_SEARCH-" action="off" />
  <map value="LCD_SEARCH+" action="off" />

eso es lo que trae un controlador comercial que tengo es hid prueba talvez funcione
 
En el nombre del dispositivo va "SPV" o "spv midi dj"? porque a mi con en código que subiste me aparece de la segunda forma en todos lados...

Es "spv midi dj".

Tecniloco80, muchas gracias, lo probaré cuando esté en casa. Si eso es de uno comercial hid, ?sería mucho pedir que subas los archivos completos?

Gracias y un saludo
 
Ah bueno, me habia surgido esa duda...
Como haces para recibir los datos de los leds en el pic? serias tan amable de hacer un minitutorial sobre el tema? :)
 
Para los leds, el Virtual dj me tendría que enviar 8 bytes (de los que al final solo utilizo 2 en mi controlador). En el pic detecto que me llegan mediante:
Código:
if (usb_kbhit(1)) 
{
  usb_get_packet(1,recibe,8);
detecta_led();
}

Previamente habría que mappear lo que va en cada bit de esos bytes en el Virtual dj (que creo que es lo que tengo mal), y una vez recibidos en el pic, gestionar cada led con la información recibida.

Así es como yo lo tengo hecho y no me funciona, jajajaja. En modo midi funciona, por lo que el error tiene que estar en el archivo DEVICE o MAPPER del Virtual dj, o en el descriptor hid, no se.
 
Es "spv midi dj".

Tecniloco80, muchas gracias, lo probaré cuando esté en casa. Si eso es de uno comercial hid, ?sería mucho pedir que subas los archivos completos?

Gracias y un saludo

El controlador es turro no es muy bueno no tiene muchas funciones y solo tengo uno
este es el codigo completo del xxdevice.xml
Código:
<?xml version="1.0" encoding="UTF-8"?>
<device name="CDMP700" author="Atomix Productions" type="HID" vid="0x190f" pid="0x0700" reportsize="32" decks="1">
 <page type="init">
  <constant buffer="45430102030405060708090A0B0C0D0E0F101112131415161718191A1B1C0229" />
 </page>
 <page type="wait">
  <constant text="MP" />
  <constant byte="29" value="0x1C" />
 </page>
 <page type="exit">
  <constant text="ECA" />
  <constant byte="29" value="0xFF" />
 </page>
 <page type="in">
  <constant text="MP" />
  <button byte="2" value="1" name="TRACK_ENTER" />
  <button byte="2" value="2" name="BACK" />
  <button byte="2" value="3" name="PROG" />
  <button byte="2" value="4" name="FAST+" />
  <button byte="2" value="5" name="FAST-" />
  <button byte="2" value="6" name="KEY" />
  <button byte="2" value="7" name="ONOFF" />
  <button byte="2" value="8" name="RANGE" />
  <button byte="2" value="9" name="PITCHBEND-" />
  <button byte="2" value="10" name="PITCHBEND+" />
  <button byte="3" value="1" name="NEXTTRACK" />
  <button byte="3" value="2" name="EDIT" />
  <button byte="3" value="3" name="RELOOP" />
  <button byte="3" value="4" name="LOOPB" />
  <button byte="3" value="5" name="LOOPA" />
  <button byte="3" value="6" name="CUE3" />
  <button byte="3" value="7" name="TIME" />
  <button byte="3" value="8" name="CONT" />
  <button byte="3" value="9" name="TITLE" />
  <button byte="3" value="10" name="MENU" />
  <button byte="4" value="1" name="CUE2" />
  <button byte="4" value="2" name="CUE1" />
  <button byte="4" value="3" name="MEMO" />
  <button byte="4" value="4" name="RELAY" />
  <button byte="4" value="5" name="DUMP" />
  <button byte="4" value="6" name="REV" />
  <button byte="4" value="7" name="SCRATCH" />
  <button byte="4" value="8" name="BOP" />
  <button byte="4" value="9" name="CUE" />
  <button byte="4" value="10" name="PLAY" />
  <button byte="5" value="1" name="TAP" />
  <button byte="6" value="1" name="JOG_TOUCH" />
  <jog bit="57" nbbits="15" max="589" name="JOG" />
  <encoder byte="12" max="19" name="TRACK" />
  <slider byte="15" size="word" max="511" inverted="true" name="PITCH" />
  <slider byte="17" size="word" max="511" name="START" />
  <slider byte="19" size="word" max="511" name="BRAKE" />
 </page>
 <page type="out">
  <constant text="ECA" />
  <led bit="0x1B" name="LED_JOG" default="JOG_TOUCH" />
  <led bit="0x1C" name="LED_PLAY" default="PLAY" />
  <led bit="0x1D" name="LED_CUE" default="CUE" />
  <led bit="0x1E" name="LED_SCRATCH" default="SCRATCH" />
  <led bit="0x1F" name="LED_REVERSE" default="REV" />
  <led bit="0x20" name="LED_RELAY" default="RELAY" />
  <led bit="0x21" name="LED_JOG2" />
  <led bit="0x22" name="LED_JOG3" />
  <led bit="0x23" name="LED_CUE3" default="CUE3" />
  <led bit="0x24" name="LED_CUE2" default="CUE2" />
  <led bit="0x25" name="LED_CUE1" default="CUE1" />
  <led bit="0x26" name="LED_MEMO" default="MEMO" />
  <led bit="0x27" name="LED_DUMP" default="DUMP" />
  <led bit="0x28" name="LED_LOOPA" default="LOOPA" />
  <led bit="0x29" name="LED_LOOPB" default="LOOPB" />
  <led bit="0x2A" name="LED_RELOOP" default="RELOOP" />
  <led bit="0x2B" name="LED_NEXT" default="NEXTTRACK" />
  <led bit="0x2C" name="LED_JOG4" />
  <led bit="0x2D" name="LED_EDIT" default="EDIT" />
  <led bit="0x2E" name="LED_ONOFF" default="ONOFF" />
  <led bit="0x2F" name="LED_KEY" default="KEY" />
  <led bit="0x30" name="LCD_PC" />
  <led bit="0x31" name="LCD_TOTALREMAIN" />
  <led bit="0x32" name="LCD_REMAIN" />
  <led bit="0x33" name="LCD_ELAPSED" />
  <led bit="0x34" name="LCD_CONTINUE" />
  <led bit="0x35" name="LCD_SINGLE" />
  <led bit="0x36" name="LCD_SINGLEREPLAY" />
  <led bit="0x39" name="LCD_MT" />
  <led bit="0x3A" name="LCD_PLAY" />
  <led bit="0x3B" name="LCD_PAUSE" />
  <led bit="0x3C" name="LCD_LOOP" />
  <led bit="0x3D" name="LCD_CUE" />
  <led bit="0x3E" name="LCD_SEARCH" />
  <led bit="0x45" name="LCD_SEARCH-" />
  <led bit="0x46" name="LCD_SEARCH+" />
  <digit byte="11" size="word" endian="little" enablebit="0xDD" plusbit="0x37" minusbit="0x38" dotbit2="0x44" name="DIGIT_KEY" />
  <digit byte="13" enablebit="0xDE" name="DIGIT_MINUTES" />
  <digit byte="14" enablebit="0xDE" enablebit2="0x42" name="DIGIT_SECONDS" />
  <digit byte="15" enablebit="0xDE" enablebit2="0x43" name="DIGIT_FRAMES" />
  <digit byte="16" size="word" endian="little" enablebit="0xDF" dotbit="0x41" name="DIGIT_BPM" />
  <digit byte="18" enablebit="0x3F" name="DIGIT_START" />
  <digit byte="19" enablebit="0x40" name="DIGIT_BRAKE" />
  <digit byte="20" size="word" endian="little" enablebit="0xDB" name="DIGIT_TOTALTRACK" />
  <digit byte="22" size="word" endian="little" enablebit="0xDC" name="DIGIT_NOWTRACK" />
  <bar bit="0xC1" nbbits="7" max="80" enablebit="0xDA" minusbit="0xC0" name="PROGRESSBAR" />
 </page>
 <page type="out">
  <constant text="7SA" />
  <text byte="3" nbchars="14" name="TEXT1" />
  <text byte="17" nbchars="14" name="TEXT2" />
 </page>
</device>
este es del xxmaper.xml
Código:
<?xml version="1.0" encoding="UTF-8"?>
<mapper device="CDMP700" description="Audiophony PLAY" author="Atomix Productions" version="600" date="16/02/2009">
  <map value="JOG" action="touchwheel" />
  <map value="PLAY" action="play_pause" />
  <map value="CUE" action="cue_stop" />
  <map value="PITCH" action="pitch_slider" />
  <map value="JOG_TOUCH" action="touchwheel_touch" />
  <map value="SCRATCH" action="vinyl_mode" />
  <map value="REV" action="reverse" />
  <map value="DUMP" action="dump" />
  <map value="PITCHBEND-" action="pitch_bend -2% 500ms" />
  <map value="PITCHBEND+" action="pitch_bend +2% 500ms" />
  <map value="RANGE" action="pitch_range" />
  <map value="ONOFF" action="pitch_reset" />
  <map value="KEY" action="key_lock" />
  <map value="FAST-" action="seek -4" />
  <map value="FAST+" action="seek +4" />
  <map value="RELAY" action="relay_play" />
  <map value="LOOPA" action="loop_in" />
  <map value="LOOPB" action="loop_out" />
  <map value="RELOOP" action="reloop" />
  <map value="TRACK" action="browser_scroll" />
  <map value="TRACK_ENTER" action="browser_enter" />
  <map value="BACK" action="browser_folder" />
  <map value="EDIT" action="deck active select" />
  <map value="NEXTTRACK" action="automix" />
  <map value="BOP" action="sync" />
  <map value="TAP" action="sync" />
  <map value="MEMO" action="menu" />
  <map value="TIME" action="display_time 'elapsed,remain'" />
  <map value="CUE1" action="menu_button 1 'hotcue,sampler,effect'" />
  <map value="CUE2" action="menu_button 2 'hotcue,sampler,effect'" />
  <map value="CUE3" action="menu_button 3 'hotcue,sampler,effect'" />
  <map value="TIME" action="display_time 'elapsed,remain'" />
  <map value="START" action="effect slider 1" />
  <map value="BRAKE" action="effect slider 2" />
  <map value="LED_JOG2" action="off" />
  <map value="LED_JOG3" action="off" />
  <map value="LED_JOG4" action="off" />
  <map value="LED_EDIT" action="deck 2 select" />
  <map value="TEXT1" action="get text 1" />
  <map value="TEXT2" action="get text 2" />
  <map value="DIGIT_KEY" action="get pitch" />
  <map value="DIGIT_MINUTES" action="get time_min" />
  <map value="DIGIT_SECONDS" action="get time_sec" />
  <map value="DIGIT_FRAMES" action="get time_ms" />
  <map value="DIGIT_BPM" action="get bpm" />
  <map value="DIGIT_START" action="off" />
  <map value="DIGIT_BRAKE" action="off" />
  <map value="DIGIT_TOTALTRACK" action="off" />
  <map value="DIGIT_NOWTRACK" action="off" />
  <map value="PROGRESSBAR" action="song_pos" />
  <map value="LCD_PC" action="true" />
  <map value="LCD_TOTALREMAIN" action="off" />
  <map value="LCD_REMAIN" action="display_time &apos;remain&apos;" />
  <map value="LCD_ELAPSED" action="display_time &apos;elapsed&apos;" />
  <map value="LCD_CONTINUE" action="off" />
  <map value="LCD_SINGLE" action="off" />
  <map value="LCD_SINGLEREPLAY" action="off" />
  <map value="LCD_MT" action="key_lock" />
  <map value="LCD_PLAY" action="play" />
  <map value="LCD_PAUSE" action="play ? false : true" />
  <map value="LCD_LOOP" action="loop" />
  <map value="LCD_CUE" action="cue" />
  <map value="LCD_SEARCH" action="off" />
  <map value="LCD_SEARCH-" action="off" />
  <map value="LCD_SEARCH+" action="off" />
  <map value="MENU" action="reinit_controller 'CDMP700' 200" />
</mapper>
Bueno ahora les tengo una pregunta si me pueden ayudar
cuantos potes se le pueden poner aun pic con codigo para hid ya que estoy escribiendo un codigo y solo le puedo hacer funcionar 7 vi por ahi que se puede poner mas poniendo mas "paginas" no se nada de estas paginas alguien que sepa de esto
 
No estoy del todo seguro, pero en una "pagina" podes enviar 256 bytes... con eso mandás la cantidad de potes y botones que desees.
Novedades con el tema de los leds? hasta ahora yo tampoco puedo! tengo un dispositivo sencillito con 8 bytes de entrada y 8 de salida, el hidtrace me pone 8/8 asi que parece que esta bien... pero de ahi no paso. Vamos a seguir mañana! cuando haya novedades vuelvo. Ya medio que me puso loco el tema ;)
 
Se borró el mensaje de rachelies:
Para los leds, el Virtual dj me tendría que enviar 8 bytes (de los que al final solo utilizo 2 en mi controlador). En el pic detecto que me llegan mediante:

Código:
---------
if (usb_kbhit(1))
{
usb_get_packet(1,recibe,8);
detecta_led();
}
---------
Previamente habría que mappear lo que va en cada bit de esos bytes en el Virtual dj (que creo que es lo que tengo mal), y una vez recibidos en el pic, gestionar cada led con la información recibida.

Así es como yo lo tengo hecho y no me funciona, jajajaja. En modo midi funciona, por lo que el error tiene que estar en el archivo DEVICE o MAPPER del Virtual dj, o en el descriptor hid, no se.
La verdad que a mi me funciona enviandole bytes desde visual basic en xp... o sea que la base está funcionando, el pic recibe y saca esos datos por el PORTB del pic 18F2550. Pero lo que no se es si el vdj envia los datos al lugar incorrecto por problemas en el mapper o el device, o, simplemente no envia nada.
En este caso, con 8 Bytes de entrada y 8 de salida... en el tamaño del reporte va un 8 o un 16? o hay que usar la definición "outreportsize"? vamos viendo de aclarar dudas...
 
Hola fernandoae. En el archivo adjunto has puesto dos veces el DEVICE, falta el mapper, jejejje.
¿Para leer los bits empleas mi código? yo tengo esto:
Código:
recibe[2]=recibe[2]-32;
Porque en el midi, en este byte enviaba las notas, que enviaba desde la 0x20, y le resto 32 para que el pic la entienda como nota cero en este caso.

Tecniloco80, muchas gracias por los archivos, a ver si saco algo en claro para que me envíe leds el mío. En cuanto al numero máximo de datos analógicos a enviar por hid no lo sé, pero en este foro se que vi un día un post sobre dispositivos hid para juegos y fue lo que me animó a empezar con el pic y el USB. Seguro que ahí hay gente que sabe la respuesta.
Saludos
 
Ah pequeño error ;) ahora lo adjunto.
Para recibir hice un pequeño codigo con el easy hid para proton, le especifique 8 bytes de entrada y ocho de salida, pero es raro es como si trabajara con los dos unidos... todavia no termino de entenderlo bien, posiblemente tenga que ver con los endpoints y esas cosas.
PERO LO BUENO ES QUE FUNCIONA!
 

Adjuntos

  • MAPPER.rar
    303 bytes · Visitas: 94
Yo tengo el descriptor hecho para proton, y es el de dispositivo hid generico...busca algo asi para ccs, que te de un par de bytes de entrada y otros de salida... y en base a eso empeza a probar con el device y el mapper que adjunté. Suerte!
 
Atrás
Arriba