Generar audio con PIC

Ok gracias.
me ayude con un programa llamado mozart, y buscando por internet las notas musicales de algunas canciones, ya pude hacer algo aceptable.
Gracias de nuevo.
 
Hola a todos, seria interesante saber como generar sonidos usando transformada z, antiworldx ¿podrias comentar mas sobre el tema?
 
Pues en teoria... un generador sencillo de sonidos, es usando un par de senos en Z, de manera que se modifica W para obtener dos senos de diferente frecuencia, y al sumarlos, tenemos un sonido con una fundamental y una armónica.

Audio = z K1 sin(ω T1) z K2 sin(ω T2)
---------------------- + -----------------------
z2 − 2 z cos(ω T1) + 1 z2 − 2 z cos(ω T2) + 1

T1 y T2 son las constantes que modifican la frecuencia de ambas frecuencias
K1 y K2 modifican la amplitud de cada una.
 
Pues en teoria... un generador sencillo de sonidos, es usando un par de senos en Z, de manera que se modifica W para obtener dos senos de diferente frecuencia, y al sumarlos, tenemos un sonido con una fundamental y una armónica.

Audio = z K1 sin(ω T1) z K2 sin(ω T2)
---------------------- + -----------------------
z2 − 2 z cos(ω T1) + 1 z2 − 2 z cos(ω T2) + 1

T1 y T2 son las constantes que modifican la frecuencia de ambas frecuencias
K1 y K2 modifican la amplitud de cada una.

Voy repasar mi transformada z, pero me parece muy interesante y muy apropiado para ser programado, Gracias

Yo también estoy diseñando un generador de sonidos simple con un PIC16F876A...lo de la transformada Z no es mala idea, pero si creen poder modelar a assembler (ó C) una función tan compleja? y en un PIC de medio rango (16F84)???

El problema de memoria se soluciona de varias maneras:
Para manipular en tiempo real el sonido que estes generando:
1 - usando la RAM (no alcanza).

2- Usando RAM Externa (si alcanzaría, pero siempre se borrarian los datos)

Solamente para Reproducir Sonidos:
1 - Usando la EEPROM (no alcanza).

2 - Usando La Memoria FLash como Tabla de datos (solo 8bit por linea, y ademas esta el problema de las tablas mayores a 255, y la paginacion....cosa que es solucionable).

3 - Usando la memoria FLASH pero leyéndola directamente como su fuera la EEPROM (14bit por linea), si cada muestra es de 8 bit (1 Byte), se obtendrian 7168 Bytes si se tienen unas 4k lineas de FLASH [(4096x14bit)/8Bit]

Con la solucion 3 hay nuevos inconvenientes:
- uno es que la lectura o escritura desde la FLASH es un poco diferente a la de la EEPROM (se deben escribir 4 lineas de codigo al tiempo)

- Habría que empaquetar los 14 bit en 2 Registros y acomodar los 2 bit faltantes desde la siguiente lectura.

- habría que evitar la ejecución de las lineas de código con las muestras de sonido... también hay que tener en cuenta la paginación de memoria (no se si realmente importe)

- habría que ver los tiempos de lectura cuando se usa la FLASH....

- también hay que mirar si el PIC soporta Auto-lectura/escritura .,....bastante trabajo pero creo que valdría la pena probarlo..

Salu2
 
Bien... por eso es que existen los dsPIC, con un pic, usar una ecuacion recurrente de transformada Z, sin instrucciones mac, ni módulo, ni redondeo de acumulador, es un verdadero martirio, sin contar que el tiempo de proceso se incrementa sustancialmente, de manera que cada muestra puede tomar hasta 20mS en un micro de 8bits!!!!
 
Hola a todos.
He estado buscando como reproducir sonido desde el pic16f877a, ya he leido todos los comentarios aquí escritos pero no he entendido nada.
Ya tengo el BTc sound encoder, pero no sé qué archivo (de los que genera) usar para el sonido en el ni como programar el sonido en PIC CCS.
Otra duda que tengo es ¿cómo es el esquemático para conectar el parlante (una bocina de 8ohms a 0.25W) al pic 16f877a?
Si alguien sabe, dígame, porfa.
 
De hecho lo acabo de encontrar y ya le hice unas pruebas tanto en proteus como en físico.
Me encantó! =D
Me servirá mucho para mi proyecto (un despertador).
Gracias de todas formas ejeje.
De todos modos me gustaría aprender a cargar archivos btc en PIC CCS.
Alguien sabe como se hace?
 
hola a todos,

espero alguien me pueda guiar, descargue el programa de black y muy bueno por cierto, converti mi sonido a asm, btc y el otro pero no logro entender como hacer para ejecutar el codigo.

alguien me puede explicar con detalle como hacer para que funcione?

gracias
 
hola no se que lenguaje de programacion uses

la verdad reproducir audio es muy facil

hay 2 tipos de sonido que puedes generar audio como reproducir una cancion o simplemente por tonos beep beep

el de los tonos es muy facil de entender solo hay que generar un tren de pulsos a una frecuencia determinada y durar un tiempo generando eses tonos, los tonos como dije son trenes de pulsos que van de 0 a X Hz

ya sera tu cuenta hacer escalas mucicales do,re,mi ,etc.

la segunda

tambien es facil de entendery puedes hacer el experimento con un pic con un ADC.

la idea es asi como lees el ADC enviar por un puerto de 8 bits el DAC lo puedes hacer con un DAC R2R
y podrar reproducir una melodia
otra forma un poco mas compleja pero igualmente buena es en lugar de ocupar 8 bits de todo un puerto puedes ocupar solo 1 pin

eso se hace con PWM ya sea por software o por el modulo CCP de los pic

la idea es asi como lees del del ADC le que lees del ADC lo metes a un registro y este registro modifica el ancho de pulso del PWM. el pwm debe trabajar a unos 12khz para tener un sonido aceptable.


teniendo esta pequeña teoria del sonido por ADC te puedes dar cuenta que en lugar de tener un ADC puedes tener una memoria nose una EEPROM por ejemplo
que tenga una frase grabada la idea asi como lees la EEPROM enviarla atraves del DAC ya sea R2R o el DAC por PWM

no es dificil

yo recomendaria que intentarar primero el experimento del ADC y el DAC para que te des una idea

espero que mi respuesta haya aclarado algunas dudas respecto al audio.
hay algoritmos mas complejos y hardwares mas robustos que implican MP3 y tarjetas SD pero si no sabemos prender un led y un rele pues mejor ni le movemos.

la idea de usar transformada Z y un pic16f84a en ASM se me hace una idea fumada pues si es posible pero es muy obsoleto es como tratar de cosntruir una nave espaciael con herramientas de piedra , cuero y madera
 
Última edición:
hola

gracias por responder.

mira yo tengo un programa que descargue de romanblack.com, el me convierte el archivo wav que ocupo en tres tipo uno es asm, C o binario el problema que tengo es no entiendo como usar ese archivo, yo programa en C con PIC C COMPILER pero no logro entender como relacionar mi programa con la libreria que me da ese programa. Creo que es una secuencia numerica que solo debo leer en formato de array pero no estoy seguro.

tu has usado este programa? sabras como puedo hacer para ejecutarlo con C?

gracias.
 
Es muy complicado y obsoleto el proceso propuesto en esa página.
Aparte para hacer compatible con PICC Compiler el código generado, tardarás bastante y se necesita mucha memoria.

Algo sencillo, es generar tonos con PIC Compiler. Mira este ejemplo: Música de Happy Birthday con PICC

Algo más desarrollado, es usando una memoria microSD y guardar archivos WAV o MP3.
Si son archivos WAV PCM, los puedes leer secuencialmente desde la memoria usando comunicación SPI y por medio del módulo CCP usar PWM para generar el audio. Así como te explicó TRILO-BYTE.
Si son archivos MP3, puedes usar un decodificador externo y el proceso de comandos lo realizas con el PIC.
 
hola

gracias por la respuesta.

supongo que no sabras como se puede hacer para crear sonidos como lasers o espadas laser o cosas asi con esos tonos?... ya hice un test y funciono bien pero ocupo un sonido solido.

saludos
 
Para generar ese tipo de sonidos uso PICBasic Pro con MicroCode Studio.
Ese lenguaje cuenta con dos instrucciones con las que se pueden generar sonidos muy fácilmente.
SOUND Pin,[Note,Duration{,Note,Duration...}]
FREQOUT Pin,Onms,Frequency1{,Frequency2}

Con algunos bucles y el cambio de valor de variables, puedes lograr el sonido que deseas.

La instalación incluye ejemplos y en la ayuda el uso de las instrucciones.
 
un truco que hago es el siguiente

hacer un tono es facil haciendo un tren de pulsos y una duracion

para modificar sonidos solo varias la frecuencia del tren de pulsos
algo asi
haces una funcion que te genere un tren de pulsos con un timer

int sonido(in frecuencia)
{
//haces aqui tu codigo
}


for(i=0 ; i!=1000 ; i++ )
{
sonido(i);
delay(//tu delay);
}


y hacer esto con un pèqueño bucle sea for o while
este bucle te va hacer el varrido de hacer tonos se oira feo como los antiguos atari 2600
pero podras hacer sonidos como los de los juegos ochenteros
 
Atrás
Arriba