Controlador MIDI por USB con PIC para Virtual Dj

Estoy tratando de construir un controlador Midi para controlar el Virtual Dj (para los que no entiendan, un software para mezclar música). Todo ello lo hago con un pic, el cual tiene que hacer 2 funciones: enviar datos y recibir datos.

La parte de enviar los datos ya funciona perfectamente, es decir, las teclas y todo lo que controla al software.

Pero lo que quiero hacer, es que el software envíe datos hacia el pic, como por ejemplo, los leds, el display con el nombre de las canciones, etc... Esto segundo se puede hacer utilizando el VDJscript

http://www.virtualdj.com/wiki/ControllerDefinitionHID.html

Si alguien se quiere animar a unirse al proyecto estaría muy agradecido. Todavía no se como utilizar el VDJscript ni como enviar los datos hacia el pic.

Un saludo y muchas gracias.
 
muy buenas, soy de sevilla , me llamo narciso, y estoy interesado en eso que quieres hacer porque yo quiero hacer lo mismo , pero utilizando un teclado, utilizo mucho ultimamente el virtual dj, y quiero fabricar mi propia consola,
un saludo y espero noticas, gracias
 
Ahora he cambiado la forma de comunicarse, y en vez de HID, estoy utilizando midi por usb, pero ahora tengo el problema que el virtual dj no me reconoce el controlador, sin embargo el traktor si que lo reconoce y lo puedo configurar.
habra que seguir investigando
 
De momento sigo haciendo pruebas, solamente tengo una protoboard con un circuito para hacer pruebas de comunicación y botones y demás. De momento lo tengo todo hecho por partes: la comunicación con el pc, el control de botones, la comunicación con el otro pic que es el plato B...Te puedo enseñar el programa que cargo en el pic con el que envio un botón por ejemplo para el play, pero lo dicho, en formato MIDI, el virtual dj no me lo reconoce. Sin embargo, el traktor lo reconoce y funcionan los botones, e incluso me envía hacia el pic el estado de leds.

este programa que subo, envia un botón que simula on/off cada 1500ms.
Empezamos con esto y luego ya vamos trabajando sobre ello.
Saludos.

Pongo también el .hex del programa anterior para un PIC18F2455. si alguien lo carga y consigue hacerlo funcionar en Virtual Dj que avise, porque se agradeceria mucho el avance.
Saludos.
 

Adjuntos

  • Prueba MIDI.rar
    3.7 KB · Visitas: 870
  • MIDIUSB_HEX.rar
    3.9 KB · Visitas: 470
Última edición:
k fantastico yo me sumo ,hace tiempo atraz hise un control para el pc dj pero solo emulaba las teclas del teclado.que buena me intereza yo te apoyo tienes info de el protocolo midi
saludos,,
 
Muy buenas pana,
mira estoy tratando de hacer el control para Virtual dj pero no se como empezar, he visto otros foros y veo que utilizan los "jostick" pero me intereza hacer con un pic y que sea usb, no se si me podria ayudar con lo que tienes hecho??,
 
No se si esto se puede hacer, pero en otro foro estamos con el mismo tema.
Pongo aqui el enlace:
http://www.todopic.com.ar/foros/index.php?topic=31194.0

hola como estas mira tengo una regunta vi tu archivo descriptor pero tambien veo o mas bien no veo donde colocas el numero de botones cuantos son analogos y ese tipo de cosas me podrías ayudar? es que hay otro tema en el cual mas o menos explican ero para hacer un joystick normal usb y cuando se hace un joystick hay que colocar una parte donde se coloca el numero de botones y todo eso
 
bueno, yo no se mucho de dj`s pero ¿han probado el fl studio? sin teclado, miren lo que se puede hacer... incluso yo pude hacer mi propia version de mision imposible y todo sin teclado. solo miren :)


y mi version de mision imposible :D

saludosss
 
Lo estoy construyendo poco a poco y lo del otro foro fue quedando parado. Últimamente no tengo demasiado tiempo y lo tengo que ir haciendo en ratillos libres, jejeje. Lo que tengo hecho es lo de la foto. Se comunica por USB, lo utilizo con el Traktor, y el protocolo para la comunicación es Midi.
Como por la web hay cosas parecidas, y ninguno me convencía, al final decidí hacerlo a mi manera, por lo que habrá cosas buenas y cosas malas, pero de momento va funcionando lo que hago.
Saludos
 

Adjuntos

  • Foto01191.jpg
    Foto01191.jpg
    124.9 KB · Visitas: 562
bueno, yo no se mucho de dj`s pero ¿han probado el fl studio? sin teclado, miren lo que se puede hacer... incluso yo pude hacer mi propia version de mision imposible y todo sin teclado. solo miren :)

http://www.youtube.com/watch?v=0uk7GcVKcsM

y mi version de mision imposible :D

http://www.youtube.com/watch?v=MrVCYa6G1Nc
saludosss


hola dario que mas, mira si es verdad lo que dices tu pero por lo menos yo quiero utilizar esto es para hacer una pedalera que funcione con guitar rig y este solo permite entradas midi hay programas según para adaptar la señal ero mi idea es poderlo conectar directamente

Lo estoy construyendo poco a poco y lo del otro foro fue quedando parado. Últimamente no tengo demasiado tiempo y lo tengo que ir haciendo en ratillos libres, jejeje. Lo que tengo hecho es lo de la foto. Se comunica por USB, lo utilizo con el Traktor, y el protocolo para la comunicación es Midi.
Como por la web hay cosas parecidas, y ninguno me convencía, al final decidí hacerlo a mi manera, por lo que habrá cosas buenas y cosas malas, pero de momento va funcionando lo que hago.
Saludos

hola rachelies una pregunta el codigo que estas utilizando es el mismo que colocaste en el "prueba MIDI"? la cosa es que no logro entender en que parte del descriptor esta el "const char USB_CLASS_SPECIFIC_DESC[] = {" que hasta donde se es el que dice cuantas teclas tiene cuales son analogas y todo eso.

he estado tratando de entender el pdf "Universal Serial Bus Device Class Definition for MIDI Devices" ero no entiendo casi nada
 
Última edición:
El código no es el mismo, pero el descriptor Midi si. Yo en ningún sitio digo cuantas teclas son analogicas o digitales, eso no importa. Yo solamente envío por el USB los comandos de las notas como nota_on, nota_off y los cc, pordonde envío los valores analogicos.
 
rachelies podrias pasarme el archivo '.c' que estas utilizando es que estoy utilizando algo asi

if (bit_test(PORTD,0)==0){
out_data[1] = 0x90; //Note on
out_data[0]= out_data[1]>>4;
out_data[2] = 0x00; // Nota 0
out_data[3] = 0x7F; // Volumen 127
usb_put_packet(1,out_data,4,USB_DTS_TOGGLE);
bit_set(PORTA,3);
delay_ms(1500);
bit_clear(PORTA,3);
out_data[1] = 0x80; //Note off
out_data[0]=out_data[1]>>4;
out_data[2] = 0x00; //Nota 0
out_data[3] = 0x00; // Volumen 0
usb_put_packet(1,out_data,4,USB_DTS_TOGGLE);
}
/*else{
bit_clear(PORTA,3);
out_data[1] = 0x80; //Note off
out_data[0]=out_data[1]>>4;
out_data[2] = 0x00; //Nota 0
out_data[3] = 0x00; // Volumen 0
usb_put_packet(1,out_data,4,USB_DTS_TOGGLE);
}*/

con el mismo descriptor que colocaste aquí pero no tengo ninguna respuesta
 
Lo siento mucho, pero el código entero no quiero darlo. Lo que pretendo es ayudar a que cada uno lo haga a su manera, no hacer una copia del mio, jejjej
Yo no utilizo el Note_ON, y Note_Off. Sólo utilizo Note_On, y lo que cambio es el volumen: Lo pongo a 0x7F para activar, y 0x00 para desactivar.
Donde tú utilizas out_data[1]=0x80, cambialo por 0x90 y me comentas, ok?
Un saludo a todos
 
no hay problema jejej anoche despues de mucho darle y darle funciono solo le tengo conectado 8 pulsadores y 2 potenciometros muchas gracias por el descritor por alli encontre otro que que parece muy pedagogico lo adjunto
Código:
/* Name: usbconfig.h
 * Project: AVR USB driver
 * Author: Christian Starkjohann
 * Creation Date: 2005-04-01
 * Tabsize: 4
 * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
 * License: Proprietary, free under certain conditions. See Documentation.
 * This Revision: $Id: usbconfig-prototype.h 216 2006-07-14 21:51:00Z cs $
 */

#ifndef __usbconfig_h_included__
#define __usbconfig_h_included__

/*
General Description:
This file is an example configuration (with inline documentation) for the USB
driver. It configures AVR-USB for an ATMega8 with USB D+ connected to Port D
bit 2 (which is also hardware interrupt 0) and USB D- to Port D bit 0. You may
wire the lines to any other port, as long as D- is on bit 0 and D+ is also
wired to INT0.
To create your own usbconfig.h file, copy this file to the directory
containing "usbdrv" (that is your project firmware source directory) and
rename it to "usbconfig.h". Then edit it accordingly.
*/

/* ---------------------------- Hardware Config ---------------------------- */

#define USB_CFG_IOPORTNAME      D
/* This is the port where the USB bus is connected. When you configure it to
 * "B", the registers PORTB, PINB and DDRB will be used.
 */
#define USB_CFG_DMINUS_BIT      3
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
 * This may be any bit in the port.
 */
#define USB_CFG_DPLUS_BIT       2
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
 * This may be any bit in the port. Please note that D+ must also be connected
 * to interrupt pin INT0!
 */

/* ----------------------- Optional Hardware Config ------------------------ */

#define USB_CFG_PULLUP_IOPORTNAME   D
/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
 * V+, you can connect and disconnect the device from firmware by calling
 * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
 * This constant defines the port on which the pullup resistor is connected.
 */
#define USB_CFG_PULLUP_BIT          4
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
 * above) where the 1.5k pullup resistor is connected. See description
 * above for details.
 */
/* #define  USB_BUFFER_SECTION         ".bss" */
/* The USB receive buffer (variable "usbRxBuf") with a length of 22 bytes
 * MUST NOT cross a 256 byte boundary. We have introduced this configuration
 * option to allow you to change the data segment where this buffer is
 * allocated. If you have problems with the default segment (start of .bss),
 * you may change this setting. See the comment in usbdrv.h for details.
 * On IAR C, the default is the TINY_Z segment (first 256 bytes). You must
 * change this default for devices which don't have RAM below 0x100.
 */

/* --------------------------- Functional Range ---------------------------- */

#define USB_CFG_HAVE_INTRIN_ENDPOINT    1
/* Define this to 1 if you want to compile a version with two endpoints: The
 * default control endpoint 0 and an interrupt-in endpoint 1.
 */
#define USB_CFG_HAVE_INTRIN_ENDPOINT3   0
/* Define this to 1 if you want to compile a version with three endpoints: The
 * default control endpoint 0, an interrupt-in endpoint 1 and an interrupt-in
 * endpoint 3. You must also enable endpoint 1 above.
 */
#define USB_CFG_IMPLEMENT_HALT          1
/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
 * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
 * it is required by the standard. We have made it a config option because it
 * bloats the code considerably.
 */
#define USB_CFG_INTR_POLL_INTERVAL      10
/* If you compile a version with endpoint 1 (interrupt-in), this is the poll
 * interval. The value is in milliseconds and must not be less than 10 ms for
 * low speed devices.
 */
#define USB_CFG_IS_SELF_POWERED         0
/* Define this to 1 if the device has its own power supply. Set it to 0 if the
 * device is powered from the USB bus.
 */
#define USB_CFG_MAX_BUS_POWER           100
/* Set this variable to the maximum USB bus power consumption of your device.
 * The value is in milliamperes. [It will be divided by two since USB
 * communicates power requirements in units of 2 mA.]
 */
#define USB_CFG_SAMPLE_EXACT            1
/* This variable affects Sampling Jitter for USB receiving. When it is 0, the
 * driver guarantees a sampling window of 1/2 bit. The USB spec requires
 * that the receiver has at most 1/4 bit sampling window. The 1/2 bit window
 * should still work reliably enough because we work at low speed. If you want
 * to meet the spec, set this value to 1. This will unroll a loop which
 * results in bigger code size.
 * If you have problems with long cables, try setting this value to 1.
 */
#define USB_CFG_IMPLEMENT_FN_WRITE      1
/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
 * transfers. Set it to 0 if you don't need it and want to save a couple of
 * bytes.
 */
#define USB_CFG_IMPLEMENT_FN_READ       1
/* Set this to 1 if you need to send control replies which are generated
 * "on the fly" when usbFunctionRead() is called. If you only want to send
 * data from a static buffer, set it to 0 and return the data from
 * usbFunctionSetup(). This saves a couple of bytes.
 */
#define USB_CFG_IMPLEMENT_FN_WRITEOUT   1
/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoint 1.
 * You must implement the function usbFunctionWriteOut() which receives all
 * interrupt/bulk data sent to endpoint 1.
 */
#define USB_CFG_HAVE_FLOWCONTROL        0
/* Define this to 1 if you want flowcontrol over USB data. See the definition
 * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
 * usbdrv.h.
 */

/* -------------------------- Device Description --------------------------- */

#define  USB_CFG_VENDOR_ID       0xc0, 0x16	/* VOTI / obdev subrange */
/* USB vendor ID for the device, low byte first. If you have registered your
 * own Vendor ID, define it here. Otherwise you use obdev's free shared
 * VID/PID pair. Be sure to read USBID-License.txt for rules!
 * This template uses obdev's shared VID/PID pair: 0x16c0/0x5e4.
 * Use this VID/PID pair ONLY if you understand the implications!
 */
#define  USB_CFG_DEVICE_ID       0xe4, 0x05	/* 0x05e4 = 1508, obdev MIDI */
/* This is the ID of the product, low byte first. It is interpreted in the
 * scope of the vendor ID. If you have registered your own VID with usb.org
 * or if you have licensed a PID from somebody else, define it here. Otherwise
 * you use obdev's free shared VID/PID pair. Be sure to read the rules in
 * USBID-License.txt!
 */
#define USB_CFG_DEVICE_VERSION  0x01, 0x00
/* Version number of the device: Minor number first, then major number.
 */
#define USB_CFG_VENDOR_NAME     'w', 'w', 'w', '.', 'c', 'r', 'y', 'p', 't', 'o', 'm', 'y', 's', '.', 'd', 'e'
#define USB_CFG_VENDOR_NAME_LEN 16
/* These two values define the vendor name returned by the USB device. The name
 * must be given as a list of characters under single quotes. The characters
 * are interpreted as Unicode (UTF-16) entities.
 * If you don't want a vendor name string, undefine these macros.
 * ALWAYS define a vendor name containing your Internet domain name if you use
 * obdev's free shared VID/PID pair. See the file USBID-License.txt for
 * details.
 */
#ifdef DEBUG_LEVEL
#	define USB_CFG_DEVICE_NAME     'V', '-', 'U', 'S', 'B', '-', 'M', 'I', 'D', 'I', '-', 'D', 'B', 'G'
#	define USB_CFG_DEVICE_NAME_LEN 14
#else
#	define USB_CFG_DEVICE_NAME     'V', '-', 'U', 'S', 'B', '-', 'M', 'I', 'D', 'I'
#	define USB_CFG_DEVICE_NAME_LEN 10
#endif
/* Same as above for the device name. If you don't want a device name, undefine
 * the macros. See the file USBID-License.txt before you assign a name if you
 * use a shared VID/PID.
 */
/*#define USB_CFG_SERIAL_NUMBER   'N', 'o', 'n', 'e' */
/*#define USB_CFG_SERIAL_NUMBER_LEN   0 */
/* Same as above for the serial number. If you don't want a serial number,
 * undefine the macros.
 * It may be useful to provide the serial number through other means than at
 * compile time. See the section about descriptor properties below for how
 * to fine tune control over USB descriptors such as the string descriptor
 * for the serial number.
 */
#define USB_CFG_DEVICE_CLASS        0	/* Defined at interface level */
#define USB_CFG_DEVICE_SUBCLASS     0	/* Defined at interface level */
/* See USB specification if you want to conform to an existing device class.
 */
#define USB_CFG_INTERFACE_CLASS     1	/* AUDIO class */
#define USB_CFG_INTERFACE_SUBCLASS  3	/* MIDI streaming */
#define USB_CFG_INTERFACE_PROTOCOL  0	/*  */
/* See USB specification if you want to conform to an existing device class or
 * protocol.
 * This template defines a HID class device. If you implement a vendor class
 * device, set USB_CFG_INTERFACE_CLASS to 0 and USB_CFG_DEVICE_CLASS to 0xff.
 */
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH    0	/* total length of report descriptor */
/* Define this to the length of the HID report descriptor, if you implement
 * an HID device. Otherwise don't define it or define it to 0.
 * Since this template defines a HID device, it must also specify a HID
 * report descriptor length. You must add a PROGMEM character array named
 * "usbHidReportDescriptor" to your code which contains the report descriptor.
 * Don't forget to keep the array and this define in sync!
 */

/* ------------------- Fine Control over USB Descriptors ------------------- */
/* If you don't want to use the driver's default USB descriptors, you can
 * provide our own. These can be provided as (1) fixed length static data in
 * flash memory, (2) fixed length static data in RAM or (3) dynamically at
 * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
 * information about this function.
 * Descriptor handling is configured through the descriptor's properties. If
 * no properties are defined or if they are 0, the default descriptor is used.
 * Possible properties are:
 *   + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
 *     at runtime via usbFunctionDescriptor().
 *   + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
 *     in static memory is in RAM, not in flash memory.
 *   + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
 *     the driver must know the descriptor's length. The descriptor itself is
 *     found at the address of a well known identifier (see below).
 * List of static descriptor names (must be declared PROGMEM if in flash):
 *   char usbDescriptorDevice[];
 *   char usbDescriptorConfiguration[];
 *   char usbDescriptorHidReport[];
 *   char usbDescriptorString0[];
 *   int usbDescriptorStringVendor[];
 *   int usbDescriptorStringDevice[];
 *   int usbDescriptorStringSerialNumber[];
 * Other descriptors can't be provided statically, they must be provided
 * dynamically at runtime.
 *
 * Descriptor properties are or-ed or added together, e.g.:
 * #define USB_CFG_DESCR_PROPS_DEVICE   (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
 *
 * The following descriptors are defined:
 *   USB_CFG_DESCR_PROPS_DEVICE
 *   USB_CFG_DESCR_PROPS_CONFIGURATION
 *   USB_CFG_DESCR_PROPS_STRINGS
 *   USB_CFG_DESCR_PROPS_STRING_0
 *   USB_CFG_DESCR_PROPS_STRING_VENDOR
 *   USB_CFG_DESCR_PROPS_STRING_PRODUCT
 *   USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
 *   USB_CFG_DESCR_PROPS_HID
 *   USB_CFG_DESCR_PROPS_HID_REPORT
 *   USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
 *
 */

#define USB_CFG_DESCR_PROPS_DEVICE                  USB_PROP_IS_DYNAMIC
#define USB_CFG_DESCR_PROPS_CONFIGURATION           USB_PROP_IS_DYNAMIC
#define USB_CFG_DESCR_PROPS_STRINGS                 0
#define USB_CFG_DESCR_PROPS_STRING_0                0
#define USB_CFG_DESCR_PROPS_STRING_VENDOR           0
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT          0
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER    0
#define USB_CFG_DESCR_PROPS_HID                     0	// USB_PROP_IS_DYNAMIC
#define USB_CFG_DESCR_PROPS_HID_REPORT              0
#define USB_CFG_DESCR_PROPS_UNKNOWN                 0

/* ----------------------- Optional MCU Description ------------------------ */

/* The following configurations have working defaults in usbdrv.h. You
 * usually don't need to set them explicitly. Only if you want to run
 * the driver on a device which is not yet supported or with a compiler
 * which is not fully supported (such as IAR C) or if you use a differnt
 * interrupt than INT0, you may have to define some of these.
 */
/* #define USB_INTR_CFG            MCUCR */
/* #define USB_INTR_CFG_SET        ((1 << ISC00) | (1 << ISC01)) */
/* #define USB_INTR_CFG_CLR        0 */
/* #define USB_INTR_ENABLE         GIMSK */
/* #define USB_INTR_ENABLE_BIT     INT0 */
/* #define USB_INTR_PENDING        GIFR */
/* #define USB_INTR_PENDING_BIT    INTF0 */

#endif				/* __usbconfig_h_included__ */


hay cosas que no entiendo pero este codigo sigue las explicaciones precisas y en orden del midi10.pdf
 
Atrás
Arriba