hola, joe que deshanimao me teneis el foro. pero a lo que vamos voy a ponerme a programar un sintetizador sid a mi rollo 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)
- 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
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.
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.
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 entiende
aparte 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 con el taladro y el torno y a seguir trasteando
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 otro
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
minicnc 20x30
si 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
ENDM
para 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 mando
la idea de como generar una nota se entiende??, voy por buen camino, o podeis comentar como lo hariais vosotros
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.
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 ???
y otra vez me teneis por aqui, ya termine mi otro cacharrejo y quiero retomar este proyecto, pero otra vez desde cero 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
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
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.
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.
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
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
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
¿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