Controlador MIDI por USB con PIC para Virtual Dj

electrochispa si quieres trabajar midi usb lo mas importante primero es montar el circuito bien, con figurar el reloj bien, y tener el descriptor indicado, como te dije yo hice un comentario anterior el programa funciona no perfecto ero funciona yo lo monte con un 18f4550 y un reloj de 20Mhz hay dos carpetas en el zip uno es prueba middi alli adentro hay un archivo .h llamado descriptor ese archivo se lo cargas al pic ara que el cuando sea conectado a una c el le diga a la pc que es un controlador de audio. en la carpeta prueba midi 2 esta el programa que estuve haciendo también funciona aunque faltan algunos detalles, en el puerto d coloque 8 pulsadores y coloque un capacitor de 470nanofaradios entre el in 18 (Vusb) y tierra.
 
Hola Josb86 pues te cuento que por ahora estoy comenzando con pulsadores (botones) pero si me facilitan tambien los ejemplos de código completos para ecordér y potenciómetro yo no me disgustaría para nada jajaja
Gente yo creo que con lo que comentamos en el foro con rachelies ya les da como para empezar a hacer sus cosas, ejemplos hay de todo... ahora le quedaria estudiarlos y entenderlos para poder hacer sus propios equipos ;)
 
Hola fernandoae!! Estoy contigo, creo que hemos comentado tantas posibilidades que ya está todo en el hilo, solo queda unir partes y que cada uno lo adapte a sus necesidades, por que lo que es cierto, no existe un código completo que sirva para todos los controladores.
Cada uno tiene que pensar la configuración de su controlador y luego adaptar el código, que ya está todo aqui explicado.

Un saludo
 
Saludos a todos, quiero contarles que solucione el problema de la inestabilidad del Pic colocando un condensador de 100nf en la alimentación. Por otro lado haciendo pruebas descubrí algo que me tiene pensando, tengo un potenciómetro y tres botones cuando oprimo un botón no puedo usar otra función por decir el potenciómetro u otro botón solo hace una tarea a la vez me pregunto si me pueden colaborar con el asunto ustedes me dirán si posteo mi código a ver que puede estar ocurriendo.
Gracias.
 
fernandoae gracias por la ayuda, al igual que muchos aquí emprendimos este proyecto sin conocer nada del lenguaje pero con paciencia hemos ido aprendiendo un poco, como voz dices seguramente está mal diseñado “no sería nada raro :)”.
Este es el codigo que tengo "tengan compasión de mi"

Código:
#include <18F4550.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN      //~~~ 20MHZ OSCILLATOR CONFIGS ~~~//
#use delay(clock=48000000)


#DEFINE USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP2_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //size to allocate for the tx endpoint 1 buffer
#define USB_EP2_RX_SIZE    64   //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>
#include <descriptors.h>   //USB Configuration and Device descriptors 
#include <usb.c>           //handles usb setup tokens and get descriptor reports

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#use fast_io(A)
#use fast_io(B)


#byte PORTB=0xF82


int tempoA1,tempoA2,tempoA11;
int envia[4];  
unsigned char tempA[4];

void envia_nota()
{   usb_put_packet(1,envia,4,USB_DTS_TOGGLE);
}

void main(void) {
   
   tempoA11=tempoA2=0;
   envia[1]=0x90;
   envia[0]=envia[1]>>4;
   setup_adc_ports(AN0_TO_AN1);  
   setup_adc(ADC_CLOCK_INTERNAL);
   usb_init_cs();

   while (TRUE) {
      usb_task();

      if(usb_enumerated()) 
    {

      {   set_adc_channel(0);
         delay_us(30);
         tempoA1=read_adc();
         tempoA11=tempoA1/2;      
                       
        
         if(tempoA11!=tempoA2)   
            {   tempA[1]=0xB0;
               tempA[0]=tempA[1]>>4;
               tempA[2]=0x00;
               tempA[3]=tempoA11;
               usb_put_packet(1,tempA,4,USB_DTS_TOGGLE);
               tempoA2=tempoA11;
            }
               
          { If (input (PIN_B0))          
      {  delay_ms (10);             
         If (input (PIN_B0));       
            envia[1] = 0x90; //Note on
            envia[0] = envia[1]>>4;
            envia[2] = 0x00; // Nota 0
            envia[3] = 0x7F; // Volumen 127
            envia_nota();
            
         {  do { } while (input (PIN_B0));  
            bit_set(PORTB,0);
            delay_ms(60);
            bit_clear(PORTB,0);
            envia[1] = 0x90; //Note off
            envia[0] = envia[1]>>4;
            envia[2] = 0x00; //Nota 0
            envia[3] = 0x00; // Volumen 0
            envia_nota();
                }
      }
                
                { If (input (PIN_B1))          
      {  delay_ms (10);             
         If (input (PIN_B1));     
            envia[1] = 0x90; //Note on
            envia[0] = envia[1]>>4;
            envia[2] = 0x01; // Nota 0
            envia[3] = 0x7F; // Volumen 127
            envia_nota();
            
         {  do { } while (input (PIN_B1));  
            bit_set(PORTB,1);
            delay_ms(60);
            bit_clear(PORTB,1);
            envia[1] = 0x90; //Note off
            envia[0] = envia[1]>>4;
            envia[2] = 0x01; //Nota 0
            envia[3] = 0x00; // Volumen 0
            envia_nota();
             }
      }
                
                { If (input (PIN_B2))          
      {  delay_ms (10);             
         If (input (PIN_B2));      
            envia[1] = 0x90; //Note on
            envia[0] = envia[1]>>4;
            envia[2] = 0x02; // Nota 0
            envia[3] = 0x7F; // Volumen 127
            envia_nota();
            
         {  do { } while (input (PIN_B2));  
            bit_set(PORTB,2);
            delay_ms(60);
            bit_clear(PORTB,2);
            envia[1] = 0x90; //Note off
            envia[0] = envia[1]>>4;
            envia[2] = 0x02; //Nota 0
            envia[3] = 0x00; // Volumen 0
            envia_nota();
                }
              }
            }
          }
        }
      }
     }
   }
}
 
Hola Niht. Veo que has utilizado los comentarios y la forma de mi código, jejejje. Me alegro, así me resulta más fácil de leer. La forma de gestionar los botones no es la más correcta. Te explico:

-Detectas si el botón ha sido pulsado con "If (input (PIN_Bx)" y luego envias el note_on. Ok, está bien, pero luego dejas parado el programa con el "do{} while (input (PIN_Bx)", y hasta que no lo sueltas y envía el note_off, el programa está esperando en ese "do{}..." y no puede hacer nada más.

Yo lo he hecho de otra forma. Cuando presiono un botón, entro en una interrupción, detecto que botón se ha pulsado, y calculo si lo que tengo que enviar es un note_on o un note_off, salgo de la interrupción y sigo con otras cosas, incluso puedo pulsar otro botón mientras tengo ese pulsado, y luego, cuando suelto, entro de nuevo en la interrupción y vuelvo a hacer lo mismo.
Claro, esto puedes hacerlo con botones conectados en el puerto B, pines 4,5,6 y 7.

Y no te preocupes, haciendo una matriz puedes conectar un montón de botones, no solo 4, jejejej.

venga, mira a ver si puedes solucionar algo y nos comentas. Un saludo
 
Atrás
Arriba