alogic Posted June 1, 2009 Report Share Posted June 1, 2009 hola, joe que deshanimao me teneis el foro. pero a lo que vamos voy a ponerme a programar un sintetizador sid a mi rollo :P pero claro os voy a copiar el hard. ;) y para ello por algun sitio hay que empezar busqueda de info: (que tengo que aprender a usarlo) - datasheet del sid6581 - y traduccion de Ariel Palazzesi (por cierto web con muy buenos tutoriales) - proyecto de Andrew Martens pero en el cual ya no se puede o se ha perdido los archivos asm del proyecto era un buen ejemplo ??? - otra traduccion - y para el que no tenga un sid puede usar un swinsid o eso dice el autor, yo de momento me abstengo pues para mi es demasiado tentador pillar el material y hasta aqui hay para rato, iré posteando como escribir en los registros del sid y si alguien se quiere apuntar ayudandome a entender, añadir mas info o como generar un sonido, de hay partimos para ir empezando. ya casi tengo terminadas las pcb mañana seguramente os empieze a dar el peñaso :Dun saludo Quote Link to comment Share on other sites More sharing options...
amando Posted June 1, 2009 Report Share Posted June 1, 2009 Hola alogic, tengo un 2413 de yamaha y un AY 8910 esperando que les llegue el turno, pero por ahora sigo con la baterÃa que ya está bastante avanzada, pero he tenido algunos problemas con los que no contaba y voy muy retrasado, tengo un diseño de placa para un 16f628 que incluye un regulador y un optoacoplador, que tal vez te pueda servir, yo lo he utilizado para hecer un mapeador para que un Yamaha shs10 pueda disparar correctamente los sonidos de mi EG 101 y en otro proyecto para que una pista de la MC 303 pueda disparar el sampler del EG 101 que esta fijo en el canal MIDI 11, y finalmente como trigger del modulo de percusión analogico con el que estoy ahora. Como ves es muy versátil a la vez que simple. Quote Link to comment Share on other sites More sharing options...
alogic Posted June 1, 2009 Author Report Share Posted June 1, 2009 veo que no solo yo tengo la mesa con tres o cuatro cosas a la vez ;), en que lenguaje lo estas programando??un saludo Quote Link to comment Share on other sites More sharing options...
amando Posted June 1, 2009 Report Share Posted June 1, 2009 Solo tengo una, el modulo basado en el AY 8910, seguramente espere un par de añitos, de momento la idea que tengo es hacer algo muy sencillo y aprovechar la MIDIBOX, el asunto serÃa el siguiente: El Pic recibe un dato MIDI (ya tengo un "esqueleto" de programa al que se añaden las lineas que la aplicación en concreto requiera) lo interpreta y lo envÃa al chip al registro requerido. Por ejemplo podrÃa utilizar un mensaje de control para seleccionar un registro y por ejemplo la rueda de vibrato para el valor de dicho registro, y para las notas hacer una tabla, que habrÃa que currarse. De esta manera serÃa un circuito muy simple, y creo que tampoco demasiado difÃcil de programar.El "esqueleto" de programa esta en ensamblador. Quote Link to comment Share on other sites More sharing options...
alogic Posted June 2, 2009 Author Report Share Posted June 2, 2009 asi te va a ser un minicircuito ;) y lo que dices aprovechas la midibox, u el ordena con un secuenciador, yo le estoy haciendo lo mismo en el programa para acceder con un CC a los registros del sid, sigo peleandome con la rutina de recepcion, la estoy haciendo con interrupciones y de momento se lia ??? pero ademas le voy a poner los potes y pulsadores por si acaso, si no la caja del commodore va a quedar muy vacia. y estoy pensando en ponerle un teclado, solo dos octavas, que vende un chino en ebay o de un casio antiguo pequeñin (si consigo que alguien me regale alguno :) ) y me dieron una idea ya que el programa que utilizo es el del midiscratch y mismo hard mas el sid utilizar el scratch para usarlo tipo... como explicarlo: para hacerlo silvar :S con la frecuencia del encoder no se si se me entiendeaparte soy un culo inquieto, tengo tres proyectos encima, y debajo, y al lado, de la mesa: el sid, encontre el commodore y no me pude resistir a comprarlo. el controlador, que ya solo me queda la tapa, por lo que me estoy haciendo una plegadora manual para aluminio(la preste y.... no presteis herramienta ni cd, ni libroooos ;) ), y claro llevaba tiempo detras de ello para hacerla bien del todo, casi tengo terminada la mecanica de una minicnc ha falta de, en un rato, poder seguir haciendo ruido :D con el taladro y el torno :D y a seguir trasteandoun saludo Quote Link to comment Share on other sites More sharing options...
alogic Posted June 2, 2009 Author Report Share Posted June 2, 2009 por cierto, estas usando para conectarlo al 16f628 registros de desplazamiento?? de esta forma podrias conectar mas modulos en cascada como el sid o algun otroun saludo Quote Link to comment Share on other sites More sharing options...
amando Posted June 2, 2009 Report Share Posted June 2, 2009 Intento utilizar el menor numero de circuitos, por eso si el pic se queda pequeño, buscarÃa otro con más salidas. También utilizo la interrupción para la recepción de datos y me costo lo suyo, hasta que hacÃa lo que yo querÃa, las tablas ni te cuento las que pasé. Quote Link to comment Share on other sites More sharing options...
alogic Posted June 3, 2009 Author Report Share Posted June 3, 2009 se desvia del tema pero es que la estoy terminando, me falta un taladro, y acabar los drivers para los motores, a ver que tal anda, que como funcione bien la pongo a trabajar en serie :Dminicnc 20x30si no me equivoco la configuracion de un sonido la podemos hacer que el programa principal este leyendo X potenciometros y X pulsadores, y guardar el resultado en la ram, deacuerdo al banco de memoria del sid yo me he echo este indice de memoria, en el banco 2 de la ram del pic. y una rutina que la copia en el sid, cada vez que desborda el timer0 solo si se ha modificado alguno de los valores;BANCO 2 RESERVADO PARA EL SID CBLOCK 0X110 PUNTEROS_SID REG_SINTH ENDC ;PINES DE SALIDA DE DATOS SERIE PARA EL SINTETIZADOR #DEFINE LATCHX_SINTH PORTD,5 #DEFINE CLOKX_SINTH PORTC,4 #DEFINE DATOX_SINTH PORTD,6 #DEFINE PWM PORTC,2 ; #DEFINE CS#0 PORTC,5 SIDIF EQU .7 ;BIT PARA INDICAR QUE ALGUNO DE LOS REGISTROS DEL SINTE SE HA MODIFICADO Y SE TIENEN QUE SACAR LOS DATOS A LOS REGISTROS ;############################################ ;# sintetizador 0 # ;############################################ #DEFINE REG_SINTH1 (REG_SINTH+.1) ;REGISTRO DONDE COMIENZA LA POSICION DE LOS RREGISTROS EN LA RAM PARA LOS VALORES #DEFINE FREC_L_0 (REG_SINTH+.1) ;DE LOS REGISTROS INTERNOS DE EL SINTETIZADOR #DEFINE FREC_H_0 (REG_SINTH+.2) #DEFINE PW_L_0 (REG_SINTH+.3) #DEFINE PW_H_0 (REG_SINTH+.4) #DEFINE CONTROL_REG_0 (REG_SINTH+.5) ;------------- NOISE_0 EQU 7 PULSE_0 EQU 6 SAWTOOTH_0 EQU 5 TRIANGLE_0 EQU 4 TEST_0 EQU 3 RING_MOD_0 EQU 2 SYNC_0 EQU 1 GATE_0 EQU 0 ;------------- #DEFINE ATTACK_DECAY_0 (REG_SINTH+.6) #DEFINE SUSTAIN_RELEASE_0 (REG_SINTH+.7) ;############################################ ;# sintetizador 1 # ;############################################ ; #DEFINE FREC_L_1 (REG_SINTH+.8) #DEFINE FREC_H_1 (REG_SINTH+.9) #DEFINE PW_L_1 (REG_SINTH+.10) #DEFINE PW_H_1 (REG_SINTH+.11) #DEFINE CONTROL_REG_1 (REG_SINTH+.12) ;------------- NOISE_1 EQU 7 PULSE_1 EQU 6 SAWTOOTH_1 EQU 5 TRIANGLE_1 EQU 4 TEST_1 EQU 3 RING_MOD_1 EQU 2 SYNC_1 EQU 1 GATE_1 EQU 0 ;------------- #DEFINE ATTACK_DECAY_1 (REG_SINTH+.13) #DEFINE SUSTAIN_RELEASE_1 (REG_SINTH+.14) ;############################################ ;# sintetizador 2 # ;############################################ ; #DEFINE FREC_L_2 (REG_SINTH+.15) #DEFINE FREC_H_2 (REG_SINTH+.16) #DEFINE PW_L_2 (REG_SINTH+.17) #DEFINE PW_H_2 (REG_SINTH+.18) #DEFINE CONTROL_REG_2 (REG_SINTH+.19) ;------------- NOISE_2 EQU 7 PULSE_2 EQU 6 SAWTOOTH_2 EQU 5 TRIANGLE_2 EQU 4 TEST_2 EQU 3 RING_MOD_2 EQU 2 SYNC_2 EQU 1 GATE_2 EQU 0 ;------------- #DEFINE ATTACK_DECAY_2 (REG_SINTH+.20) #DEFINE SUSTAIN_RELEASE_2 (REG_SINTH+.21) ;############################################ ;# filtro # ;############################################ #DEFINE FC_L (REG_SINTH+.23) #DEFINE FC_H (REG_SINTH+.24) #DEFINE RES_FILTER (REG_SINTH+.25) #DEFINE MODE_VOL (REG_SINTH+.26) ;LOS DEMAS REGISTROS SON DE SOLO LECTURA Y NO PODEMOS ACCEDER A ELLOS CON REGISTROS 74595 ;---------------------------------------------------------------------------------------- macro que saca los datos al sid para un 16f877 OUT_SHIFT_REGISTER_SID MACRO ENVIO_DATA_SID PAGESEL ENVIO_DATA_SID ;PONEMOS PCL EN LA PAGINA DE LAS RUTINAS PARA EL SID BANKSEL PUNTEROS_SID BCF PUNTEROS_SID,SIDIF CALL ENVIA_REGISTROS_SID BANKSEL PORTC BSF LATCHX_SINTH ;SACA LOS DATOS DEL CARRIL SERIE DE LOS 74595 A LAS SALIDAS PARALELO NOP NOP BCF LATCHX_SINTH NOP NOP PAGESEL FIN_INT RETURN ENVIA_REGISTROS_SID ;ENVIA LO QUE HAYA EN EL ARRAY DE REGISTROS PARA LAS SALIDAS LSD,MSD,CENT BANKSEL N_DIGITOS ;PAGE 0 MOVLW N_REG_SINTH ;Nº DE REGISTROS A LA SALIDA MOVWF N_DIGITOS MOVLW REG_SINTH1 ;DONDE ESTA EL PRIMER BYTE A SACAR EN SERIE MOVWF FSR BANKISEL REG_SINTH ;SE COLOCA EN EL BANCO DONDE ESTE EL REGISTRO REG_SINTH CLRF DIR_REG_SINTH ;PONE A CERO Nº DIRECCION ENVIAR_SPI_SID MOVF INDF,W LETRA_SID MOVWF REG_ENV_SPI ;DE W A REG_ENV_SPI MOVLW .9 ;Nº DE BITS DEL REGISTRO A W MOVWF N_BITS ;DE W A N_BITS REMONT_SID DECFSZ N_BITS,F ;DECREMENTA Nº DE BITS 8-0 GOTO ENVIA_BIT_SID ;SALTA A ENVIA_BIT MOVF DIR_REG_SINTH,W LETRA_SID_REG MOVWF REG_ENV_SPI MOVLW .9 MOVWF N_BITS REMONT_SID_REG DECFSZ N_BITS GOTO ENVIA_BIT_SID_REG DECFSZ N_DIGITOS,F GOTO OTRO_MAS_SID RETURN OTRO_MAS_SID INCF FSR,F ;FSR YA APUNTA A LA PAGINA DE LOS REGISTROS DEL SID, NO HAY QUE ACTUALIZAR BANKISEL INCF DIR_REG_SINTH,F ;INCREMENTA LA SIGUIENTE POSICION DE MEMORIA DEL SID GOTO ENVIAR_SPI_SID ENVIA_BIT_SID RLF REG_ENV_SPI,F ;ROTA A LA IZQUIERDA Y EL BIT DE MAS PESO VA AL CARRY, A LA SIGUIENTE ;ESTE VUELVE A ENTRAR POR EL CARRY;Y CUANDO PASAN 8 BITS VUELVE A DEJAR EL QUE ESTABA BTFSC STATUS,C ;TESTEA SI ES CERO O UNO GOTO ENVIA_UNO_SID ;SI FUE CERO NO SALTA Y VA A ENVIA _UNO ;--------------ENVIA CERO Y ESPERA NUEVO BIT------------------------------------ ENVIA_CERO_SID ;SI FUE CERO SALTA PARA ENVIAR CERO POR EL SPI BCF DATOX_SINTH ;PONE A CERO RA0 NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR BSF CLOKX_SINTH ;CLOCK EN ALTO RA1 PARA ENVIAR DATO NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR BCF CLOKX_SINTH ;PONE A CERO CLOCK PARA ESPERAR NUEVO DATO NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR GOTO REMONT_SID ;RETORNA PARA ENVIAR NUEVO BIT ;--------------ENVIA UNO Y ESPERA NUEVO BIT----------------------------------- ENVIA_UNO_SID ;SI EL CARRY ESTABA A UNO, NO SALTÓ BSF DATOX_SINTH ;1 EN DATO NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR BSF CLOKX_SINTH ;CLOCK A UNO PARA ENVIAR DATO NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR BCF CLOKX_SINTH ;PONE A CERO PARA ESPERAR NUEVO DATO NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR GOTO REMONT_SID ;RETORNA PARA ENVIAR NUEVO BIT ENVIA_BIT_SID_REG RLF REG_ENV_SPI,F ;ROTA A LA IZQUIERDA Y EL BIT DE MAS PESO VA AL CARRY, A LA SIGUIENTE ;ESTE VUELVE A ENTRAR POR EL CARRY;Y CUANDO PASAN 8 BITS VUELVE A DEJAR EL QUE ESTABA BTFSC STATUS,C ;TESTEA SI ES CERO O UNO GOTO ENVIA_UNO_SID_REG ;SI FUE CERO NO SALTA Y VA A ENVIA _UNO ;--------------ENVIA CERO Y ESPERA NUEVO BIT------------------------------------ ENVIA_CERO_SID_REG ;SI FUE CERO SALTA PARA ENVIAR CERO POR EL SPI BCF DATOX_SINTH ;PONE A CERO RA0 NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR BSF CLOKX_SINTH ;CLOCK EN ALTO RA1 PARA ENVIAR DATO NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR BCF CLOKX_SINTH ;PONE A CERO CLOCK PARA ESPERAR NUEVO DATO NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR GOTO REMONT_SID_REG ;RETORNA PARA ENVIAR NUEVO BIT ;--------------ENVIA UNO Y ESPERA NUEVO BIT----------------------------------- ENVIA_UNO_SID_REG ;SI EL CARRY ESTABA A UNO, NO SALTÓ BSF DATOX_SINTH ;1 EN DATO NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR BSF CLOKX_SINTH ;CLOCK A UNO PARA ENVIAR DATO NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR BCF CLOKX_SINTH ;PONE A CERO PARA ESPERAR NUEVO DATO NOP ;ESPERA PARA ESTABILIZAR NOP ;ESPERA PARA ESTABILIZAR GOTO REMONT_SID_REG ;RETORNA PARA ENVIAR NUEVO BIT ENDMpara generar una nota el valor de esta que llega por la usart puede ser note_on, seleccionaremos canal y nota asignada a cada uno de los osciladores + de 0-127 y con esto nos indica que nota, por lo que a partir de esto tendriamos que rellenar los registros de frecuencia, +0-127 el volumen de la nota, con este rellenaremos el... como no modifique algun registro del adsr como sustain, no se como regular volumen desde el sid. los demas registros se modifican si uno de los potenciometros o pulsadores cambian de valor con lo que el tipo de sonido se modifica a mano o como hablabamos ayer cuando recibe un mensaje CC asignado a tal mandola idea de como generar una nota se entiende??, voy por buen camino, o podeis comentar como lo hariais vosotros un saludo Quote Link to comment Share on other sites More sharing options...
amando Posted June 3, 2009 Report Share Posted June 3, 2009 La manera que propones es bastante lógica, pero te comento dos cosas, que me han traÃdo de cabeza para que las tengas en cuenta. Hay dos maneras de apagar una nota que son nota_off+valores_ignorados y nota_on_volumen0 te puede pasar que con un teclado todo te funcione y cambies a otro y no haga loi que esperas. El otro tema es el de las interupciones, porque no pasa mucho tiempo desde que llega un dato MIDI al siguiente, creo que unas 150 instrucciones con un reloj a 20Mhz, y si encima hay que cambiar de bancos, con el lÃo que conlleva... lo que yo hago es testar un bit del registro LSB del timer1 según la temporización que requieras, piensa que solo la rutina para discernir que interrupción se produjo (a no ser que vallas directo al grano) mas guardar y retaurar registros es tiempo valioso.PD: que buena pinta tiene esa cnc, eres un manitas. Quote Link to comment Share on other sites More sharing options...
alogic Posted June 4, 2009 Author Report Share Posted June 4, 2009 mmmm la usart, a mi me esta dando quebraderos de cabeza y me lio con los calculos 31250bauds:0,2" por instruccion=156250 :o como se calcula el nº de instrucciones?? voy a mirar esto a ver si por eso pierdo bytes como si fueran monedas, que entre byte de status BBBB xxxx nº de canal xxxx BBBB y los dos siguientes bytes, entre los que te envia la sincro y .... mucho de todo, ademas como dices, note off de dos formas es complicado pero saldrá ;) estaba mirando a ver si podia descompilar el .hex de midibox sid16f877 y mejor que ni lo intenteis vaya parrafada de cosas ???un saludo Quote Link to comment Share on other sites More sharing options...
alogic Posted January 17, 2010 Author Report Share Posted January 17, 2010 y otra vez me teneis por aqui, ya termine mi otro cacharrejo y quiero retomar este proyecto, pero otra vez desde cero :thumbsup: de esta forma depuro el soft anterior y lo hago exclusivo para manejar el sid. hasta el momento son solo rutinas sueltas. recepcion de la usart, rutinas para modulos din como encoders, pulsadores on/off, modulos dout, de momento tengo añadidas la rutina que usa el sid para cargar los datos y de otros proyectos los displays y leds que los tengo que añadir. me interesa que veais sobre todo esta, la del sid: se usa cargando el valor del registro sobre DATA_SID y la direccion del registro en DIR_MEM_SID se llama a la rutina y esto es lo que corre el programa ;MACROS PARA CARGAR DATOS EN EL SID ;-------------------------------------------------------------------------------------------------------------------------------------- SID6581_DATA MACRO WRITE_SID ;1º PONER A NIVEL BAJO #CS CHIP SELECT MINIMO TIEMPO ANTES DE ENVIAR LOS DATOS ;2º PONER A NIVEL BAJO R/W ESTE ESTA CONECTADO A TIERRA ASI QUE NOS OLVIDAMOS DE ÉL ;3º SACAR LOS DATOS DE DIRECCION DE MEMORIA A0-A4 ;4º SACAR LOS DATOS D0-D7 ;5º PONER A NIVEL ALTO #CS MINIMO TIEMPO 350nS BANKSEL PORTD BCF #CS NOP NOP MOVF DATA_SID,W MOVWF SERIAL_OUT_REG CALL WRITE_SID_1 MOVF DIR_MEM_SID,W MOVWF SERIAL_OUT_REG CALL WRITE_SID_1 CALL S_LATCH_ ;CALL DEMORA DE MINIMO 350nS ANTES DE SUBIR #CS BSF #CS NOP NOP RETURN ;----------- S_LATCH_ BCF S_LATCH NOP NOP NOP NOP BSF S_LATCH NOP NOP RETURN ;----------- WRITE_SID_1 MOVLW .9 MOVWF CON_SERIAL WRITE_SID_2 BCF S_CLK NOP NOP BCF S_DATA NOP NOP RRF DATA_SID,F BTFSC STATUS,C BSF S_DATA NOP NOP BSF S_CLK NOP NOP DECFSZ CON_SERIAL GOTO WRITE_SID_2 RETURN si os fijais en los siguientes pasos, ;1º PONER A NIVEL BAJO #CS CHIP SELECT MINIMO TIEMPO ANTES DE ENVIAR LOS DATOS ;2º PONER A NIVEL BAJO R/W ESTE ESTA CONECTADO A TIERRA ASI QUE NOS OLVIDAMOS DE ÉL ;3º SACAR LOS DATOS DE DIRECCION DE MEMORIA A0-A4 ;4º SACAR LOS DATOS D0-D7 ;5º PONER A NIVEL ALTO #CS MINIMO TIEMPO 350nS esto es lo que he sacado del datasheet lo podeis descargar de aqui por ej. http://hct.ece.ubc.ca/research/sidgroove/datasheets/6581.pdf en la pagina 9 abajo esta descrito el ciclo de escritura. ahora una vez echo esto tengo por un lado rutinas para encoders, estas detectan en que flanco esta girando modificando un registro, en el que guarda el nº de pasos que se movio 6-0 bits y en el 7 el estado de cada encoder. pulsadores lo mismo guardan la info de 6-0 y en el 7 el estado ademas este nos servira para indicar en un led si fue pulsado u no. ahora esto creo que ya esta listo para empezar. todo sea que las rutinas hagan lo que quiero. entonces llegado a este punto hay que saber de que forma vamos a cargar un sonido al sid. os comento como creo que se hace y de esta forma me podeis sugerir como deberia cargar los datos u si voy por buen camino, a partir de aqui un traspie puede tirar muchas horas de cogote al rojo :frantics: veamos, a ver si se me entiende. cada encoder y pulsador se asociara con una direccion del sid. para ello, he echo esta tabla de definiciones en la que se copiara el contenido de lo que haya cargado en el sid ;############################################ ;# oscilador 0 # ;############################################ #DEFINE REG_SINTH1 (REG_SINTH+.1) ;REGISTRO DONDE COMIENZA LA POSICION DE LOS RREGISTROS EN LA RAM PARA LOS VALORES #DEFINE FREC_L_0 (REG_SINTH+.1) ;DE LOS REGISTROS INTERNOS DE EL SINTETIZADOR #DEFINE FREC_H_0 (REG_SINTH+.2) #DEFINE PW_L_0 (REG_SINTH+.3) #DEFINE PW_H_0 (REG_SINTH+.4) #DEFINE CONTROL_REG_0 (REG_SINTH+.5) ;------------- NOISE_0 EQU 7 PULSE_0 EQU 6 SAWTOOTH_0 EQU 5 TRIANGLE_0 EQU 4 TEST_0 EQU 3 RING_MOD_0 EQU 2 SYNC_0 EQU 1 GATE_0 EQU 0 ;------------- #DEFINE ATTACK_DECAY_0 (REG_SINTH+.6) #DEFINE SUSTAIN_RELEASE_0 (REG_SINTH+.7) ;############################################ ;# oscilador 1 # ;############################################ ; #DEFINE FREC_L_1 (REG_SINTH+.8) #DEFINE FREC_H_1 (REG_SINTH+.9) #DEFINE PW_L_1 (REG_SINTH+.10) #DEFINE PW_H_1 (REG_SINTH+.11) #DEFINE CONTROL_REG_1 (REG_SINTH+.12) ;------------- NOISE_1 EQU 7 PULSE_1 EQU 6 SAWTOOTH_1 EQU 5 TRIANGLE_1 EQU 4 TEST_1 EQU 3 RING_MOD_1 EQU 2 SYNC_1 EQU 1 GATE_1 EQU 0 ;------------- #DEFINE ATTACK_DECAY_1 (REG_SINTH+.13) #DEFINE SUSTAIN_RELEASE_1 (REG_SINTH+.14) ;############################################ ;# oscilador 2 # ;############################################ ; #DEFINE FREC_L_2 (REG_SINTH+.15) #DEFINE FREC_H_2 (REG_SINTH+.16) #DEFINE PW_L_2 (REG_SINTH+.17) #DEFINE PW_H_2 (REG_SINTH+.18) #DEFINE CONTROL_REG_2 (REG_SINTH+.19) ;------------- NOISE_2 EQU 7 PULSE_2 EQU 6 SAWTOOTH_2 EQU 5 TRIANGLE_2 EQU 4 TEST_2 EQU 3 RING_MOD_2 EQU 2 SYNC_2 EQU 1 GATE_2 EQU 0 ;------------- #DEFINE ATTACK_DECAY_2 (REG_SINTH+.20) #DEFINE SUSTAIN_RELEASE_2 (REG_SINTH+.21) ;############################################ ;# filtro # ;############################################ #DEFINE FC_L (REG_SINTH+.23) #DEFINE FC_H (REG_SINTH+.24) #DEFINE RES_FILTER (REG_SINTH+.25) #DEFINE MODE_VOL (REG_SINTH+.26) ;LOS DEMAS REGISTROS SON DE SOLO LECTURA Y NO PODEMOS ACCEDER A ELLOS CON REGISTROS 74595 ;---------------------------------------------------------------------------------------- asi por ejemplo un pulsador asignado a NOISE_2 actvara desactivara el bit en la memoria del sid y en la memoria del pic, pero, siempre hay un pero como se genera un sonido?? usea una vez tenemos los encoders y pulsadores asignados a cada byte de la memoria, los colocamos como nos mole, y en ese momento llega un NOTE_ON por la usart. yo he pensado que sea con el nº de nota (segundo byte 0-127) modificar la frecuencia no se si seleccionar por canal el oscilador 1, 2 ó 3 y en base a la ecuacion. como ejemplo con el oscilador 1 ] Registros 00 y 01:Freq. LO/Freq. HI La unión de estos dos registros forman un número de 16 bits que controla linealmente la frecuencia del oscilador 1. La frecuencia se determina mediante al siguiente ecuación: Fout = (Fn * Fclk / 16777216) Hz Fn es el número de 16 bit mencionado antes, y Fclk es el reloj del sistema aplicado al pin 6 del circuito integrado. Para un reloj tÃpico de 1.0 MHz, la frecuencia esta dada por: Fout = (Fn * 0.059604645) Hz y el segundo byte recibido del note_on que modifique el registro pwm con la operacion Registros 02 y 03:PW LO/PW HI La unión de estos dos registros forman un número de 12 bits (los bits 4..7 de PW HI no existen) que controla linearmente el ancho del pulso (ciclo útil) de la forma de onda pulso del oscilador 1. El ancho del pulso es determinado por la siguiente ecuación: PWout = (PWn / 40.95) % PWn es el número de 12 bit mencionado. La resolución del ancho del pulso le permite ser variado suavemente. La forma de onda pulso seleccionarse para el oscilador 1, para que el valor de estos registros tenga algún efecto en la salida. Valores de 0 o 4095 ($FFF) en estos registros producirán una salida constante de corriente continua, mientras que un valor de 2048 ($800) producira una onda cuadrada con un ciclo útil del 50%. de seguido se activa el bit GATE del registro CONTROL_1 del oscilador en cuestion lo que hace es GATE (Bit 0) El bit GATE controla el generador de envolvente para la voz 1. Cuando se pone este bit a 1, el generador de envolvente se dispara y el ciclo de ATAQUE/DECAIMIENTO/SOSTENIMIENTO comienza. Cuando el bit vuelve a 0, comienza el ciclo de RELAJAMIENTO. El generador de envolvente controla la amplitud de salida del oscilador 1, por lo tanto, el bit GATE debe ser seteado (junto con parametros de envolvente adecuados) para que la salida seleccionada del oscilador 1 sea audible. y de esta forma creo que puede funxionar mas menos, ya sabeis cualquier comentario siempre es bien recibido. aunque sea solo por mover un poco el foro de spanish a por cierto os cuelgo la direccion de la wiki de ucontrol con la traduccion del data del sid6581 gracias Ariel e aqui http://www.ucontrol.com.ar/wiki/index.php/SID6581 para los duros de mollera como yo un saludo PD dejo los archivos con lo que llevo echo para que le echeis un ojo, hasta el momento solo estoy haciendo pruebas con las salidas de datos para el sid en la simulacion de proteus, claro sin sid solo comprobando que salen y entran los datos por los registros proximo capitulo ''mandos'' que encoders y pulsadores ponemos Quote Link to comment Share on other sites More sharing options...
amando Posted January 17, 2010 Report Share Posted January 17, 2010 Bueno, parece que ya lo tienes bastante claro, yo primero harÃa una carga de registros por sysex, y grabación en la eeprom para comprobar que todo funciona bien, me refiero al propio SID, hacer tablas para las equivalencias de las notas MIDI, volumen, etc... para luego complicar el asunto con los encoder, pulsadores, y led, y una pantalla LCD no estarÃa mal, vamos que tienes trabajo para rato. Saludos Quote Link to comment Share on other sites More sharing options...
alogic Posted January 18, 2010 Author Report Share Posted January 18, 2010 hola Amando cuanto tiempo, si es que os tengo abandonaos. de momento estoy intentando recibir un note on, luego ya probare con cadenas largas de sysex, para cargar configuraciones diferentes uso un bank stick IIC en el que guardo la configuracion o cargo otra sobre la eeprom, pero con sysex todavia nada. solo mensajes de spp, sinc y mtc ya sabes, solo sincronismo. si ves la rutina rx de la usart. bueno le falta pulir, probar y mucho curro todavia. pero creo que va por buen camino y con pocas lineas para diferenciar unas tramas de otras. a ver si para esta semana monto un protoboard-sid :rolleyes: y le doy caña. pero asi le puedes echar un ojo y si quieres darme algun consejillo... :whistle: INT_RX ; BCF PIR1,RCIF ;EL BIT RCIF SE BORRA POR HARDWARE MOVF RCREG,W ;AL LEER RCREG MOVWF RX_TEMP BTFSC PIR1,RCIF GOTO INT_RX ;SI NO ESTA BAJO, NO SE VACIO EL BUFFER RCREG BTFSS RCSTA,OERR GOTO RX_BIEN BCF RCSTA,OERR ;BORRA ERROR POR DESBORDAMIENTO BCF RCSTA,CREN MOVF RCREG,W ;AL LEER RCREG MOVF RCREG,W ;AL LEER RCREG MOVF RCREG,W ;AL LEER RCREG BCF RCSTA,FERR BSF RCSTA,CREN RX_BIEN BTFSS RX_TEMP,7 GOTO IS_DATA IS_STATUS MOVF RX_TEMP,W ;SI COINCIDE EN EL MISMO CANAL ANDLW B'01110000' MOVWF RX_TEMP2 RRF RX_TEMP2,F RRF RX_TEMP2,F RRF RX_TEMP2,F RRF RX_TEMP2,F ;SE ROTA CUATRO VECES PARA QUEDARNOS CON LA PARTE ALTA MOVF RX_TEMP2,W ;A W ADDWF PCL,F ;Y SE SUMA AL PC PARA QUE SALTE A LA ORDEN DE STATUS QUE SEA GOTO ST_NOTE_OFF GOTO ST_NOTE_ON GOTO ST_AFTERTOUCH GOTO ST_CONTROL_CHANGE GOTO ST_PROGRAM_CHANGE GOTO ST_AFTERTOUCH_CANAL GOTO ST_PITCH_BEND GOTO ST_SISTEM_EXCLUSIVE NOP ST_NOTE_OFF BANKSEL PUNTEROS_RX MOVF RX_TEMP,W MOVWF STATUS_TEMP ANDLW B'00001111' ;SEPARA LOS BITS DE Nº DE CANAL 0-15=16 CANALES SUBWF REG_CHANNEL BTFSS STATUS,Z GOTO DATO_NO_VALIDO BSF UN_BYTE ;PONE A UNO LOS INDICADORES DE QUE FALTAN POR LLEGAR DOS BYTES BSF DOS_BYTE BSF INDICADOR_RX ;ESTE ES PARA SABER QUE AUN FALTAN BYTES POR LLEGAR RETURN ST_NOTE_ON ;A PARTIR DE AQUI SE ESPERAN DOS BYTES DE DATOS POR LLEGAR BANKSEL PUNTEROS_RX MOVF RX_TEMP,W MOVWF STATUS_TEMP ANDLW B'00001111' ;SEPARA LOS BITS DE Nº DE CANAL 0-15=16 CANALES SUBWF REG_CHANNEL BTFSS STATUS,Z GOTO DATO_NO_VALIDO BSF UN_BYTE ;PONE A UNO LOS INDICADORES DE QUE FALTAN POR LLEGAR DOS BYTES BSF DOS_BYTE BSF INDICADOR_RX ;ESTE ES PARA SABER QUE AUN FALTAN BYTES POR LLEGAR RETURN ST_AFTERTOUCH RETURN ST_CONTROL_CHANGE RETURN ST_PROGRAM_CHANGE RETURN ST_AFTERTOUCH_CANAL RETURN ST_PITCH_BEND RETURN ST_SISTEM_EXCLUSIVE RETURN IS_DATA BTFSS INDICADOR_RX GOTO DATO_NO_VALIDO BTFSC UN_BYTE GOTO UN_BYTE_ BTFSC DOS_BYTE GOTO DOS_BYTE_ DATO_NO_VALIDO RETURN ;------- UN_BYTE_ ;LLEGADO AQUI EL BYTE DE STATUS NOTE ON YA LLEGO Y FALTA OTRO POR LLEGAR BCF UN_BYTE ;LO PONE A CERO PARA EN EL SIGUIENTE BYTE_RX SALTAR MOVF RX_TEMP,W MOVWF UN_BYTE_TEMP ;ES UN NUMERO DE 0-127 INDICA LA NOTA QUE TIENE QUE SONAR MOVWF DATA_SID MOVF STATUS_TEMP,W ANDLW B'00000011' ADDWF PCL,F GOTO FREC_OSC_0 GOTO FREC_OSC_1 GOTO FREC_OSC_2 GOTO DATO_NO_VALIDO FREC_OSC_0 MOVF RX_TEMP,W BANKSEL REG_SINTH MOVWF FREC_H_0 BANKSEL DATA_SID MOVLW .1 MOVWF DIR_MEM_SID CALL SID6581_DATA ;CARGA EL DATO EN EL SID MOVLW .0 MOVWF DIR_MEM_SID CLRF DATA_SID ;A CERO EL VOLUMEN ES SOLO DE 0-127 CALL SID6581_DATA ;CARGA EL DATO EN EL SID RETURN ;Y RETORNA, A ESPERAR AL SIGUIENTE BYTE FREC_OSC_1 MOVF RX_TEMP,W BANKSEL REG_SINTH MOVWF FREC_H_1 BANKSEL DATA_SID MOVLW .8 MOVWF DIR_MEM_SID CALL SID6581_DATA ;CARGA EL DATO EN EL SID MOVLW .7 MOVWF DIR_MEM_SID CLRF DATA_SID ;A CERO EL VOLUMEN ES SOLO DE 0-127 CALL SID6581_DATA ;CARGA EL DATO EN EL SID RETURN ;Y RETORNA, A ESPERAR AL SIGUIENTE BYTE FREC_OSC_2 MOVF RX_TEMP,W BANKSEL REG_SINTH MOVWF FREC_H_2 BANKSEL DATA_SID MOVLW .15 MOVWF DIR_MEM_SID CALL SID6581_DATA ;CARGA EL DATO EN EL SID MOVLW .14 MOVWF DIR_MEM_SID CLRF DATA_SID ;A CERO EL VOLUMEN ES SOLO DE 0-127 CALL SID6581_DATA ;CARGA EL DATO EN EL SID RETURN ;Y RETORNA, A ESPERAR AL SIGUIENTE BYTE ;ESTE DATO HAY QUE ENVIARLO CONVERTIDO A 16 BITS AL REGISTRO FRECUENCIA RETURN ;DE MOMENTO SOLO LO GUARDA EN EL REGISTRO ESPERANDO EL SIGUIENTE DOS_BYTE DOS_BYTE_ BCF DOS_BYTE ;LO PONE A CERO PARA EN EL SIGUIENTE BYTE_RX SALTAR MOVF RX_TEMP,W MOVWF DOS_BYTE_TEMP ;ES UN NUMERO DE 0-127 INDICA LA NOTA QUE TIENE QUE SONAR ;AQUI LLEGARON LOS TRES BYTES QUE COMPONEN UN NOTE_ON BCF INDICADOR_RX ;BAJA EL INDICADOR PARA NO ALMACENAR MAS DATOS RETURN ;Y TERMINA YA NO QUEDAN MAS BYTES POR ESPERAR ;AQUI SE DEBERIAN ENVIAR LOS DATOS AL SID :D CON LA NOTA QUE TIENE QUE SONAR ENDM como decia mucho por pulir frec_osc_0, 1, 2 es lo mismo solo cambian las direcciones, quiero hacerlo por direccionamiento indirecto y demas, me falta seguir puliendo. sobre todo imagiarme las rutinas para control change y esa de sysex para el final. de momento no esta terminada ni el segundo byte de note por cierto, estuve buscando los dxf para el sid en el foro y solo encontre uno y no del original, alguno que no este peleado con el buscador. me haria el favor de buscar alguno que sea el original para el teclado de commodore :rolleyes: u otras versiones que creais que merece la pena y coger ideas para hacer uno nuevo. un saludo Quote Link to comment Share on other sites More sharing options...
alogic Posted May 1, 2010 Author Report Share Posted May 1, 2010 WooHaHaHa pues de momento en el simulador ya envia la direccion y valor de cada encoder y pulsador al sid :sorcerer: terminadas rutinas de RX para note y control change, que creo va a dar bastante juego desde el secuenciador irle modificando parametros :thumbsup: lo unico que lo estoy haciendo de otra forma, no me parecia divertido ponerle un pulsador para ir cambiando los mandos de las tres voces. asi que ha quedado para ponerle los mandos de esta forma, dadme vuestra opinion a ver que os parece ;mandos asociados a los registros ;------------------------------------------------- ;osciladores X3 para los tres osciladores ;encoders =6x3=24 ;-1 frecuencia H/L ;-2 pwn ;-3 A ;-4 D ;-5 S ;-6 R ;pulsadores =6x3=24 ;-control_reg ;1- NOISE_0 ;2-PULSE_0 ;3-SAWTOOTH_0 ;4-TRIANGLE_0 ;5-RING_MOD_0 ;6-SYNC_0 ;------------------------------------------------- ;filtro X1 ;encoders 2 ;-1 cutt of (frecuencia de corte) ;-2 resonance ;pulsadores 8 ;-1 filt 1 ;-2 filt 2 ;-3 filt 3 ;-4 filt 4 ;5- lp ;6- bp ;7- hp ;8- 3o ;------------------------------------------------- ;adicionales ;encoders ;1- volumen general ;2- modificar valor ;pulsadores ;1- menu, enter, ok... ;2- up ;3- down ;4- right ;5- left ;---------------------------------------------------------------------------------------- en el archivo adjunto teneis una simulacion para proteus y el codigo, para probar a cargar diferentes registros hay que cambiar los valores de la eeprom, asi cada mando se puede direccionar a un registro diferete del sid, referido a esta tabla, segun el valor que devuelva la lectura de eeprom saltara a un lado u otro SELECCION_REG_SID ADDWF PCL,F GOTO MEM_FREC_LH_0 GOTO MEM_PW_LH_0 GOTO MEM_CONTROL_REG_NOISE_0 GOTO MEM_CONTROL_REG_PULSE_0 GOTO MEM_CONTROL_REG_SAWTOOTH_0 GOTO MEM_CONTROL_REG_TRIANGLE_0 GOTO MEM_CONTROL_REG_TEST_0 GOTO MEM_CONTROL_REG_RING_MOD_0 GOTO MEM_CONTROL_REG_SYNC_0 GOTO MEM_CONTROL_REG_GATE_0 GOTO MEM_ATTACK_0 GOTO MEM_DECAY_0 GOTO MEM_SUSTAIN_0 GOTO MEM_RELEASE_0 GOTO MEM_FREC_LH_1 GOTO MEM_PW_LH_1 GOTO MEM_CONTROL_REG_NOISE_1 GOTO MEM_CONTROL_REG_PULSE_1 GOTO MEM_CONTROL_REG_SAWTOOTH_1 GOTO MEM_CONTROL_REG_TRIANGLE_1 GOTO MEM_CONTROL_REG_TEST_1 GOTO MEM_CONTROL_REG_RING_MOD_1 GOTO MEM_CONTROL_REG_SYNC_1 GOTO MEM_CONTROL_REG_GATE_1 GOTO MEM_ATTACK_1 GOTO MEM_DECAY_1 GOTO MEM_SUSTAIN_1 GOTO MEM_RELEASE_1 GOTO MEM_FREC_LH_2 GOTO MEM_PW_LH_2 GOTO MEM_CONTROL_REG_NOISE_2 GOTO MEM_CONTROL_REG_PULSE_2 GOTO MEM_CONTROL_REG_SAWTOOTH_2 GOTO MEM_CONTROL_REG_TRIANGLE_2 GOTO MEM_CONTROL_REG_TEST_2 GOTO MEM_CONTROL_REG_RING_MOD_2 GOTO MEM_CONTROL_REG_SYNC_2 GOTO MEM_CONTROL_REG_GATE_2 GOTO MEM_ATTACK_2 GOTO MEM_DECAY_2 GOTO MEM_SUSTAIN_2 GOTO MEM_RELEASE_2 GOTO MEM_FC_LH GOTO MEM_RES_FILTER GOTO MEM_MODE_VOL ahora lo que me va a dar guerra va a ser el porron de led que tengo pensado ponerle, conoceis algun circuito simple tipo vumetros de led para poner a la salida del sid y asi no cargar mas la memoria del pic con rutinas come memoria Quote Link to comment Share on other sites More sharing options...
alogic Posted May 2, 2010 Author Report Share Posted May 2, 2010 bueno he pensado que asi seguramente me entendais mejor, una imagen vale mas que mil palabras este es el frontal en el que estoy pensando Quote Link to comment Share on other sites More sharing options...
amando Posted May 4, 2010 Report Share Posted May 4, 2010 ¿No vas a poner un LCD?, Tengo unas lineas para manejarlo con 4 bit mas las de control, por si te hacen falta alguna vez. Quote Link to comment Share on other sites More sharing options...
cimo Posted May 6, 2010 Report Share Posted May 6, 2010 ... parece que no pero os estamos asechando ... Quote Link to comment Share on other sites More sharing options...
amando Posted May 6, 2010 Report Share Posted May 6, 2010 Pues tendremos que cuidarnos de no enojar, a TK, "visto lo visto", yo tengo que mirar muy arriba. Para la barra de leds, creo que hay unos chip UAA170 y UAA180 que manejaban estas barras de led que sustituyeron a los vumetros que se usaban en las cadenas HiFi, de hecho compre uno y lleva 20 años esperando que le llegue el turno, si es que lo encuentro... Quote Link to comment Share on other sites More sharing options...
alogic Posted May 9, 2010 Author Report Share Posted May 9, 2010 ... parece que no pero os estamos asechando ... hey, gracias por decir que estais por ahÃ, :thumbsup: ¿No vas a poner un LCD?, Tengo unas lineas para manejarlo con 4 bit mas las de control, por si te hacen falta alguna vez. gracias Amando el lcd se lo puse con los registros de desplazamiento para usar varios en cascada. luego de estar probando me di cuenta de que mi cacharro tiene muy pocas opciones al estar todos los mandos sobre el panel. solo cambio de canal y cargar guardar un nuevo pad. ademas me gustan bastante mis rusticos displays, son mu faciles de manejar, es el tmr0 del micro el que los maneja, si te fijas en el programa cuando desborda saca por los 74hc595 los datos cargados en unos registros actualizando los displays de forma automatica, por lo que una vez echo esto, solo hay que guardar la informacion a mostrar en esos registros. y el timer ya los sacara por los displays Pues tendremos que cuidarnos de no enojar, a TK, "visto lo visto", yo tengo que mirar muy arriba. por que dices esto?? por que se hiba a enfadar TK?? Para la barra de leds, creo que hay unos chip UAA170 y UAA180 que manejaban estas barras de led que sustituyeron a los vumetros que se usaban en las cadenas HiFi, de hecho compre uno y lleva 20 años esperando que le llegue el turno, si es que lo encuentro.. chachi¡¡ estoy mirando los UAA170, UAA180 y algun otro en cuanto me decida ire subiendo esquemitas y pruebas Quote Link to comment Share on other sites More sharing options...
cimo Posted May 23, 2010 Report Share Posted May 23, 2010 Pues tendremos que cuidarnos de no enojar, a TK, "visto lo visto", yo tengo que mirar muy arriba. por que dices esto?? por que se hiba a enfadar TK?? nay! solo se referÃa al tamaño del notas.. :) Quote Link to comment Share on other sites More sharing options...
amando Posted May 24, 2010 Report Share Posted May 24, 2010 Si era por eso. A ver si puedo sacar alguna foto para poner yo también, es el problema cuando es uno el que lleva la cámara, tengo fotos de todo el mundo pero de mà mismo apenas ninguna que merezca la pena. Quote Link to comment Share on other sites More sharing options...
alogic Posted June 12, 2010 Author Report Share Posted June 12, 2010 sigo haciendo cositas, a ratitos. aqui teneis la version 0.1 de mi sid´logic :thumbsup: a espera de que tenga mas tiempo para ponerme a montarlo, y dinero, pues tiene unos cuantos encoder, teneis algun link ande los vendan mu baratos ?? tengo los led, pulsadores, placas, y el aluminio pa el chasis, pero hasta que no sepa exactamente el modelo de encoder no me puedo poner a montar. para que os hagais una idea de como va el diseño en el adjunto teneis el codigo y una simlacion para proteus, hay que seguir añadiendo pulsadores y por supuesto no hay emulacion para el sid pero sirve para hacer las pruebas Quote Link to comment Share on other sites More sharing options...
amando Posted June 12, 2010 Report Share Posted June 12, 2010 ya veo que has estado entretenido, menuda placa. Quote Link to comment Share on other sites More sharing options...
alogic Posted June 12, 2010 Author Report Share Posted June 12, 2010 ya veo que has estado entretenido, menuda placa. bueno si te fijas son 5 placas para el frontal, una core y la del sid, se podria hacer poniendo algunas din y dout y tirar cablecillos, cosa que odio . pero vamos curro pa rato :rolleyes: Quote Link to comment Share on other sites More sharing options...
yota Posted July 7, 2010 Report Share Posted July 7, 2010 que b uena pinta que tiene!! como haras las placas? las mandas hacer, o en casa? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.