Sign in to follow this  
Followers 0
alogic

midibox sid desde cero

28 posts in this topic

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  :D

un saludo

Share this post


Link to post
Share on other sites

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.     

Share this post


Link to post
Share on other sites

veo que no solo yo tengo la mesa con tres o cuatro cosas a la vez ;), en que lenguaje lo estas programando??

un saludo

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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  :D con el taladro y el torno  :D y a seguir trasteando

un saludo

Share this post


Link to post
Share on other sites

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

un saludo

Share this post


Link to post
Share on other sites

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é.

Share this post


Link to post
Share on other sites

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  :D

minicnc 20x30

img4248g.jpg

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

un saludo

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

frontalsid.jpg

Share this post


Link to post
Share on other sites

¿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.

Share this post


Link to post
Share on other sites

... parece que no pero os estamos asechando ...

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites
... 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

vu_meter_for_power_amp2.gif

Share this post


Link to post
Share on other sites

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.. :)

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

sidlogic.jpg

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

Share this post


Link to post
Share on other sites

ya veo que has estado entretenido, menuda placa.

Share this post


Link to post
Share on other sites

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:

Share this post


Link to post
Share on other sites

que b uena pinta que tiene!!

como haras las placas? las mandas hacer, o en casa?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0