Página 248 · ¿Qué es un Microcontrolador?
Capítulo 8: Frecuencia y Sonido SU DÍA Y LOS BEEPS ELECTRÓNICOS Estos son algunos ejemplos de beeps que usted puede oir durante un día normal: El beep del horno de microondas cuando termina de cocinar su comida. El teléfono celular toca diferentes tonos de beeps de canciones para llamar su atención que está recibiendo una llamada. El cajero automático emite beeps para recordarle que no olvide su tarjeta. La caja registradora de la tienda emite beeps para decirle a la cajera que el código de barras de los abarrotes que pasó sobre el escaner ya lo registró. Algunas calculadoras emiten beeps cuando se presionan incorrectamente las teclas. Usted empezó su día con los beeps de un reloj despertador.
MICROCONTROLADORES, BOCINAS Y SEÑALES APAGADO/ ENCENDIDO Todos los beeps que usted oye durante su rutina diaria los generan microcontroladores conectados a bocinas. El microcontrolador crea estos beeps mandando señales rápidas de apag/enc a varios tipos de bocinas. La velocidad de estas señales se llama frecuencia y determina el tono del beep. Cada vez que una señal apag/enc se repite a sí misma se llama ciclo. Usted verá frecuentemente que al número de ciclos por segundo se le llama hertz y se abrevia Hz. Por ejemplo, una de las frecuencias más comunes de los beeps que ayudan a las máquinas a llamar su atención es 2 kHz. Esto significa que las señales high/low se repiten 2000 veces por segundo. Presentando a las Bocinas Piezoeléctricas
En esta actividad usted experimentará mandando una variedad de señales a una común, pequeña y barata bocina lllamada bocina piezoeléctrica. A una bocina piezoeléctrica comunmente se le llama bocina piezo o zumbador piezo. Su símbolo esquemático y su dibujo lo muestra la Figura 8-1.
Figura 8-1 Bocina Piezoeléctrica. símbolo esquemático.
Dibujo
y
Frequencia y Sonido · Página 249
ACTIVIDAD #1: CONSTRUYENDO Y VERIFICANDO LA BOCINA En esta actividad usted contruirá y verificará el circuito de la bocina piezoeléctrica. Partes del Circuito de la Bocina
Una bocina piezoeléctrica Dos cables para puentes. Construyendo el Circuito de la Bocina Piezoeléctrica.
La terminal negativa de la bocina piezoeléctrica deberá conectarse a Vss, y la terminal positiva deberá conectarse a un pin E/S. El BASIC Stamp deberá programarse para mandar señales high/low a la terminal positiva de la bocina piezoeléctrica.
9 Si su bocina tiene un aislante quíteselo (no necesita lavarlo) 9 Construya el circuito que muestra la Figura 8-2 Vdd
Vin
Vss
X3
P9
Vss
P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2
+
Figura 8-2 Circuito de la bocina piezoeléctrica, Diagrama esquemático y de alambrado.
Funcionamiento de la Bocina Piezoeléctrica
Cuando la cuerda de una guitarra vibra, causa cambios en la presión del aire. Estos cambios en la presión del aire nuestro oido los detecta como un tono. Con cambios rápidos en la presión del aire es mayor el tono, y para cambios lentos en la presión del aire, menor es el tono. El elemento dentro de la caja de plástico de la bocina piezoeléctrica se llama elemento piezoeléctrico. Cuando las señales high/low se aplican a la terminal positiva de la bocina, el elemento piezoeléctrico vibra, y genera cambios en la presión del aire como lo hace la cuerda de la bocina. Y como la cuerda de la bocina, su
Página 250 · ¿Qué es un Microcontrolador?
oido detecta los cambios en la presión del aire que genera la bocina piezoeléctrica, y suena típicamente como un beep o un tono. Programando el Control de la Bocina
La instrucción FREQOUT es una forma conveniente de mandar señales high/low a la bocina para que haga un sonido. El Manual del BASIC Stamp muestra que la sintaxis de la instrucción es: FREQOUT Pin, Duration, Freq1 {, Freq2}
Y como la mayoría de las otras instrucciones usadas en este libro, “Pin” es un valor que usted puede usar para escoger que pin del BASIC Stamp usar. El argumento “Duration” es un valor que le dice a la instrucción FRECOUT que tan largo, en milisengundos, es el tono que deberá tocar. El argumento Freq1, se usa para fijar en hertz la frecuencia del tono, , en hertz . Hay un argumento opcional Freq2 que puede usarse para tocar dos tonos diferentes al mismo tiempo. Así se manda un tono al pin E/S P9 que dura 1.5 segundos y tiene una frecuencia de 2 kHz: FREQOUT 9, 1500, 2000
Programa Ejemplo: TestPiezoWithFreqout.bs2
Este Programa Ejemplo manda un tono de 2 kHz a la bocina en el pin E/S P9 durante 1.5 segundos. Usted puede usar la Terminal Debug para ver cuando la bocina emite beeps y cuando se detiene. 9 Meta y corra el programa TestPiezoWithFreqout.bs2 9 Verifique que la bocina hacer un tono claramente audible durante el tiempo que la Terminal Debug muestrael mensaje: “Tone sending” (Mandando Tono) ' ¿Que es un Microcontroladirr - TestPiezoWithFreqout.bs2 ' Manda un tono a la bocina piezo usando la instrucción FREQOUT. '{$STAMP BS2} '{$PBASIC 2.5} PAUSE 1000 DEBUG "Mandando Tono...", CR FREQOUT 9, 1500, 2000 DEBUG "Hecho el Tono ."
Frequencia y Sonido · Página 251
Su Turno – Ajustando la Frecuencia y Duración
9 9 9 9
Guarde el programa TestPiezoWithFreqout.bs2 con un nombre diferente. Trate algunos valores diferentes para los argumentos de Duration y Freq1. Después de cada cambio, ejecute el programa y escriba el efecto. Conforme el argumento Freq1 se hace mayor ¿sube o baja el tono? Trate valores de 1500, 2000, 2500 y 3000 para responder este pregunta.
ACTIVIDAD #2: SONIDOS EN ACCIÓN Algunos juguetes contienen microcontroladores que se usan para hacer “sonidos en acción”. Sonidos en acción involucra cambiar rápidamente la frecuencia de la bocina. Usted puede tambien obtener algunos efectos interesantes jugando juntos dos tonos diferentes usando el argumento opcional Freq2 de la instrucción FREQOUT. Esta actividad presenta ambas técnicas. Programando Sonidos en Acción
La acción y aplicación de sonidos tiene tres componentes diferentes: 1. Pausa 2. Duración 3. Frecuencia La pausa es el tiempo entre tonos, y usted puede usar la instrucción PAUSE para crearla. La duración es la cantidad de tiempo que dura un tono, usted puede fijarla usando el argumento Duration de la instrucción FREQOUT. La frecuencia determina la característica del tono. A mayor frecuencia, mayor es el tono, a menor frecuencia menor es el tono. Esto lo determina, naturalmente, el argumento Freq1 de la instrucción FREQOUT. Programa Ejemplo: ActionTones.bs2
El programa ActionTones.bs2 demuestra unas pocas combinaciones de pausa, duración y frecuencia. Esta primer secuencia de tonos suena parecido a su reloj despertador electrónico. El segundo suena como hablaría un robot de película familiar de ciencia ficción. El tercero es un tipo de efecto de sonido que usted podría oir en un video juego antiguo. 9 Meta y ejecute el programa ActionTones.bs2
Página 252 · ¿Qué es un Microcontrolador?
' ¿Que es un Microcontrolador - ActionTones.bs2 ' Demuestra diferentes combinaciones de pausa, duracion, frecuencia ' pueden usarse para efectos de sonico. '{$STAMP BS2} '{$PBASIC 2.5} duration frequency
VAR VAR
Word Word
PAUSE 1000 DEBUG "Alarm...", CR PAUSE 100 FREQOUT 9, 500, 1500 PAUSE 500 FREQOUT 9, 500, 1500 PAUSE 500 FREQOUT 9, 500, 1500 PAUSE 500 FREQOUT 9, 500, 1500 PAUSE 500 DEBUG "Robot reply...", CR PAUSE 100 FREQOUT 9, 100, 2800 FREQOUT 9, 200, 2400 FREQOUT 9, 140, 4200 FREQOUT 9, 30, 2000 PAUSE 500 DEBUG "Hyperspace...", CR PAUSE 100 FOR duration = 15 TO 1 STEP 1 FOR frequency = 2000 TO 2500 STEP 20 FREQOUT 9, duration, frequency NEXT NEXT DEBUG "Done", CR END
Funcionamiento de ActionTones.bs2
La rutina “Alarma” suena como un reloj despertador. Esta rutina toca un tono con una frecuencia fija de 1.5 kHz que dura 1.5 segundos con retardos fijos entre tonos de 0.5 segundos. La rutina “Robot reply” usa varias frecuencia de duración corta.
Frequencia y Sonido · Página 253
La rutina “Hyperspace” no usa retardos, pero varia a la duración y la frecuencia. Usando bucles FOR...NEXT para cambiar rapidamente las variables frecuencia y duración, usted puede obtener algunos efectos interesantes de sonidos. Cuando uno de los bucles FOR...NEXT se ejecuta dentro de otro bucle, se le llama “bucles anidados”. Así trabaja el bucle anidado FOR...NEXT. La variable duración empieza en 15, entonces el bucle For frequency...lo toma y manda frecuencias a la bocina piezoeléctrica de 2000, luego 2020, luego 2040, etc, hasta llegar a 2500. Cuando termina el bucle FOR frequency, el bucle For duration...solo se ha repetido una de sus 15 ves. Entonces resta un 1 al valor de duración y repite el bucle For frequency una y otra vez. FOR duration = 15 TO 1 FOR frequency = 2000 TO 2500 STEP 15 FREQOUT 9, duration, frequency NEXT NEXT
Programa Ejemplo: NestedLoops.bs2
Para comprender mejor como funciona el bucle anidado FOR...NEXT, el programa NestedLoops.bs2 usa la instrucción DEBUG para mostrar el valor de una versión menos complicada de bucles anidados que utizamos en el programa ActionTones.bs2. 9 Meta y ejecute el programa NestedLoops.bs2. 9 Examine la salida de la Terminal Debug, y verifique que cambian las variables duration y frequency cada vez que pasan por el bucle. ' ¿Que es un Microcontrolador? - NestedLoops.bs2 ' Demonstración del funcionamiento del bucle anidad del programa ActionTones.bs2. '{$STAMP BS2} '{$PBASIC 2.5} duration frequency
VAR VAR
Word Word
PAUSE 1000 DEBUG "Duration "--------
Frequency", CR, ---------", CR
Página 254 · ¿Qué es un Microcontrolador?
FOR duration = 4000 TO 1000 STEP 1000 FOR frequency = 1000 TO 3000 STEP 500 DEBUG " " , DEC5 duration, " ", DEC5 frecuencia, CR FREQOUT 9, duration, frecuencia NEXT DEBUG CR NEXT END
Su Turno – Más Efectos de Sonido
Hay muchas formas bonitas e ilimitadas que al modificar ActionTones.bs2 genere diferentes combinaciones de sonido. Esta es una modificación a la rutine “Hyperspace”. DEBUG "Hyperspace jump...", CR FOR duration = 15 TO 1 STEP 3 FOR frequency = 2000 TO 2500 STEP 15 FREQOUT 9, duration, frequency NEXT NEXT FOR duration = 1 TO 36 STEP 3 FOR frequency = 2500 TO 2000 STEP 15 FREQOUT 9, duration, frequency NEXT NEXT
9 Guarde su Programa Ejemplo con el nombre ActionTonesYourTurn.bs2. 9 Alégrese con esta y otras modificaciones de su propia creación. Dos Frecuencias al Mismo tiempo
Usted puede tocar dos frecuencias diferentes al mismo tiempo. Recuerde la sintaxis de la instrucción FREQOUT de la Actividad #1. FREQOUT Pin, Duration, Freq1 {, Freq2}
Usted puede usar el argumento opcional Freq2 para tocar dos frecuencias con una sola instrucción FREQOUT. Por ejemplo, usted puede tocar 2 kHz y 3 kHz de la siguiente forma: FREQOUT 9, 1000, 2000, 3000
Frequencia y Sonido · Página 255
Cada tono de teclado es también un ejemplo de dos frecuencias juntas combinadas. En Telecomunicaciones a esto se le llama DTMF (Dual Tone Multi Frequency) Frecuencia Dual Muti Tono. En PBASIC también hay una instrucción llamada DTMFOUT que esta diseñada justamente para mandar tonos de teléfono. Para ejemplos vea esta instrucción en el Manual BASIC Stamp o en Ayuda.
Programa Ejemplo: PairsOfTones.bs2
Este Programa Ejemplo demuestra la diferencia en tono cuando tocó juntas 2 kHz y 3 kHz. También demuestra un fenomeno interesante que ocurre cuando usted suma dos ondas de sonida que están muy cerca en frecuencia. Cuando usted toca 2000 Hz y 2001 Hz al mismo tiempo el tono entra y sale una vez cada segundo (a un frecuencia de 1 Hz). Si usted toca 2000 Hz y 2002 Hz, el tono entra y sale dos veces por segundo (2Hz) y así sucesivamente. Batido es cuando dos tonos muy cercanos en frecuencia se tocan juntan originando que el tono que usted oye entra y salga. La frecuencia de ese desvanecimiento es la diferencia entre las dos frecuencias. Si la diferencia es 1 Hz, el tono entra y sale a 1 Hz. Si la diferencia es 2 Hz, el tono entra y sale a 2 Hz. Las variaciones en la presión del aire que hace la bocina piezoeléctrica se llaman “ondas de sonid” Cuando el tono es más grabe, las variaciones en la presión del aire causadas por las dos frecuencias se agregan una a otra (a esto se le llama superposición). Cuando el tono esta en lo más quieto , las variaciones en la presión del aire se cancelan unas a otras (a esto se se llama interferencia).
9 Meta y ejecute el programa PairsOfTones.bs2. 9 De un vistaso a la Terminal Debug cuando están tocando los tonos, y observe los efectos diferentes que se obtienen al mezclar los tonos diferentes. ' ¿Que es un Microcontrolador - PairsOfTones.bs2 ' Demostación de algunos de los efectos que ocurren cuando mezcla dos tonos. '{$STAMP BS2} '{$PBASIC 2.5} PAUSE 1000 DEBUG "Frequency = 2000", CR FREQOUT 9, 4000, 2000 DEBUG "Frequency = 3000", CR FREQOUT 9, 4000, 3000 DEBUG "Frequency = 2000 + 3000", CR FREQOUT 9, 4000, 2000, 3000
Página 256 · ¿Qué es un Microcontrolador?
DEBUG "Frequency = 2000 + 2001", CR FREQOUT 9, 4000, 2000, 2001 DEBUG "Frequency = 2000 + 2002", CR FREQOUT 9, 4000, 2000, 2002 DEBUG "Frequency = 2000 + 2003", CR FREQOUT 9, 4000, 2000, 2003 DEBUG "Frequency = 2000 + 2005", CR FREQOUT 9, 4000, 2000, 2005 DEBUG "Frequency = 2000 + 2010", CR FREQOUT 9, 4000, 2000, 2010 DEBUG "Hecho", CR END
Su Turno – Optimización del Código
El programa PairsOfTones.bs2 se escribió para demostrar fenómenos interesantes que suceden cuando usted toca al mismo tiempo dos frecuencias diferentes usando el argumento opcional Freq2 de la instrucción FREQOUT. Sin embargo, es muy ineficiente. 9 Modifique el programa PairsOfTones.bs2 para que recicle el argumento Freq2 en el rango de 2001 a 2005 usando una variable tamaño “word” y un bucle.
ACTIVIDAD #3: NOTAS MUSICALES Y CANCIONES SENCILLAS La Figura 8-3 muestra las 25 teclas más a la derecha del teclado de un piano. Tambien muestra las frecuencias a las cuales vibra cada alambre dentro del piano cuando usted la golpea.
Frequencia y Sonido · Página 257
Figura 8-3 Teclas del Piano a la derecha y sus Frecuencias
Las teclas y sus notas correspondientes están marcadas C6 hasta C8. Estas teclas están separadas en dos grupos de 12, 7 son teclas blancas y 5 son teclas negras. La secuencia de notas se repite en si misma cada 12 teclas. Notas de la misma letra están relacionadas con la frecuencia que se dobla cada octava mayor. Por ejemplo, C7 es dos veces la frecuencia de C6, y C8 es el doble de C7. De igual forma, si va una octava hacia abajo, la frecuencia será la mitad del valor, por ejemplo, A6 es la mitad de frecuencia de A7. Si usted ha escucha a un cantante practicar sus notas cantando el Solfeo, “Do Re Mi Fa Sol La Si Do,” el cantante está intentando igualar la notas que usted obtiene de golpear las teclas blancas del teclado de un piado. Estas teclas blancas se llaman teclas naturales, y el nombre octava se relaciona al doblar la frecuencia con cada ocho teclas naturales. La tecla negra del piano se le llama Bemol o Sostenido. Por ejemplo la tecla negra entre C y D se llama C Bemol (C#)o D Sostenido El nombre x o y depende de la pieza particular que se está tocado, y las reglas de esto pertenecen a las lecciones de música. Programando Notas Musicales
La instrucción FREQOUT también es útil para notas musicales. Programar el BASIC Stamp para tocar música usando un bocina piezo involucra seguir una variedad de reglas
Página 258 · ¿Qué es un Microcontrolador?
usadas al tocar música usando otro instrumento musical. Estas reglas se aplican a los mismos elementos que se usaron para hacer efectos de sonido: frecuencia, duración y pausa. El siguiente Programa Ejemplo toca algunas de las frecuencias de las notas musicales en la bocina piezo cada una con una duración de medio segundo. Programa Ejemplo: DoReMiFaSolLaTiDo.bs2
9 Meta y ejecute el programa DoReMiFaSolLaTiDo.bs2 ' ¿Que es un Microcontrolador - DoReMiFaSolLaTiDo.bs2 ' Manda notas de una octava medio segundo usando una bocina piezo. '{$STAMP BS2} '{$PBASIC 2.5} PAUSE 1000 'Solfege
Tone
Note
DEBUG "Do...", CR:
FREQOUT 9,500,1047
' C6
DEBUG "Re...", CR:
FREQOUT 9,500,1175
' D6
DEBUG "Mi...", CR:
FREQOUT 9,500,1319
' E6
DEBUG "Fa...", CR:
FREQOUT 9,500,1396
' F6
DEBUG "Sol..", CR:
FREQOUT 9,500,1568
' G6
DEBUG "La...", CR:
FREQOUT 9,500,1760
' A6
DEBUG "Ti...", CR:
FREQOUT 9,500,1976
' B6
DEBUG "Do...", CR:
FREQOUT 9,500,2093
' C7
END
Su Turno – Notas Bemol/Sostenido
Use las frecuencias mostradas en la Figura 8-3 para agregar las cinco notas bemol/sostenido al programa DoReMiFaSolLaTiDo.bs2. Modifique su programa para que toque la siguiente octava superior. Sugerencia: Haga sus operaciones y use la operación * 2 depués de cada argumento Freq1. Por ejemplo, FREQOUT 9, 500, 1175 * 2 esto multiplicara D6 por 2 y le dará a usted D7, que es la nota D en la séptima octava.
Frequencia y Sonido · Página 259
Almacenando y Retirando Secuencias de Notas Musicales
Una forma de guardar notas musicales es almacenandola en el módulo EEPROM del BASIC Stamp. Aunque usted podría usar algunas instrucciones WRITE para hacer esto, una mejor forma es usar la directiva DATA. Esta es la sintaxis para la directiva DATA: {Symbol} DATA {Word} DataItem {, {Word} DataItem, … }
Este es un ejemplo para usar la directiva DATA para almacenar los caracteres que corresponden a las notas musicales. Notes DATA "C","C","G","G","A","A","G"
Usted puede usar la instrucción READ para accesar estos caracteres. La letra “C” se localiza en la dirección Notes + 0, la segunda letra “C” se localiza en Notes + 1. Entonces, hay una letra “G” en Notas + 2, y así sucesivamente. Por ejemplo si usted desea cargar la última letra “G” en una variable byte llamada noteLetter, use la instrucción: READ Notes + 6, noteLetter
Usted también puede almacenar listas de números usando la directiva DATA. Los valores de Frecuencia y duración que usa el BASIC Stamp para las notas musicales necesitan estar almacenadas en variables tamaño “word” porque son generalmente mayores a 255. Así es como se hace con la directiva DATA. Frequencies DATA Word 2093, Word 2093, Word 3136, Word 3136, Word 3520, Word 3520, Word 3136
Como cada uno de estos valores ocupa dos bytes, para accesarlos con la instrucción READ es diferente a accesar caracteres. El primer 2093 está en Frequencies + 0, pero el segundo 2093 se localiza en Frequencies + 2. El primer 3136 se localiza en Frecuencies +4, y el segundo 3136 se localiza en Frequencies + 6. Los valores en la directiva DATA Frequencies corresponde con notas musicales in la directiva Notes DATA directive.
Este es un bucle FOR...NEXT que coloca Notes DATA en una variable llamada noteLetter, luego coloca Frequencies DATA en una variable llamada noteFreq. FOR index = 0 to 6
Página 260 · ¿Qué es un Microcontrolador?
READ Notes + index, noteLetter READ Frequencies + (index * 2), Word noteFreq DEBUG noteLetter, " ", DEC noteFreq, CR NEXT ¿Qué hace (index * 2)? Cada valor almacenado en la directiva Frequencies DATA toma un “word” (dos bytes), mientras cada carácter en la directiva Notes DATA solamente toma un byte. El valor de index se incrementa por 1 cada vez en el bucle FOR...NEXT. Esto está bien al accesar los caracteres de las notas usando la instruccón READ Notes + index, noteLetter. El problema es que para cada uno de los bytes en Notes, la variable index necesita apuntar dos veces hacia debajo de la lista Frequencies. La instrucción READ Frequencies + (index * 2), Word noteFreq, se encarga de esto.
El siguiente Programa Ejemplo almacena notas y duraciones usando DATA, y usa la instrucción FREQOUT para tocar cada frecuencia de nota en una duración específica. El resultado es las primeras pocas notas de la canción de niños “Twinkle Twinkle Little Star.” {XW” Twinkle Twinkle Little Star ”} La canción “El Alfabeto” la usan los niños para memorizar las letras “ABCDs”y usa las mismas notas de “Twinkle Twinkle Little Star.”
Programa Ejemplo: TwinkleTwinkle.bs2
Este programa ejemplo demuestra como usar la directiva DATA para almacenar listas y como usar la instrucción READ para accesar los valores de las listas. 9 Meta y ejecute el programa TwinkleTwinkle.bs2 9 Verifique que el sonido de las notas se parecea la canción “Twinkle Twinkle Little Star.” 9 Use la Terminal Debug para verificar que trabaja como se espera. ' ¿Que es un Microcontrolador? - TwinkleTwinkle.bs2 'Toca las primeras siete notas de la canción Twinkle Twinkle Little Star. '{$STAMP BS2} '{$PBASIC 2.5} Notes
DATA
"C","C","G","G","A","A","G"
Frequencies
DATA
Word 2093, Word 2093, Word 3136, Word 3136, Word 3520, Word 3520, Word 3136
Frequencia y Sonido · Página 261
Durations
DATA
Word 500, Word 500, Word 500, Word 500, Word 500, Word 500, Word 1000
index noteLetter noteFreq noteDuration
VAR VAR VAR VAR
Nib Byte Word Word
PAUSE 1000 DEBUG
"Note "----
Duration --------
Frequency", CR, ---------", CR
FOR index = 0 TO 6 READ Notes + index, noteLetter DEBUG " ", noteLetter READ Durations + (index * 2), Word noteDuration DEBUG " ", DEC4 noteDuration READ Frequencies + (index * 2), Word noteFreq DEBUG " ", DEC4 noteFreq, CR FREQOUT 9, noteDuration, noteFreq NEXT END
Su Turno – Agregando y Tocando Más Notas
Este programa tocó las primeras siete notas de Twinkle Twinkle Little Star. Las sílabas son: “Twin-kle twin-kle lit-tle star” La siguiente frase de la canción dice “How I wond-er what yor are” y sus notas son F, F, E, E, D, D, C. E igual que la primera frase, se sostine dos veces que las otras notas. Para agregar esta frase a la canción del programa TwinkleTwinkle.bs2, usted necesita expander apropiadamente cada directiva DATA. No olvide cambiar el bucle FOR...NEXT para que vaya de 0 a 13 en lugar de 0 a 6. 9 Modifique el programa TwinkleTwinkle.bs2 para que toque las dos primeras frases de la canción en lugar de solamente la primera frase.
ACTIVIDAD #4: MÚSICA CON MICROCONTROLADOR Las duraciones de las notas en una hoja de música no se graba en terminos de milisegundos. En lugar de eso se decriben como notas: entero, mitad, cuarto, octavos, diecisesavos, y treinta y dosavos. Como su nombre lo sugiere, media nota dura la mitad de un entero, Un cuarto de nota dura la cuarta parte de tiempo de lo que dura una nota entera. ¿Cuánto dura una nota entera? Depende de la pieza de música que se está tocando.
Página 262 · ¿Qué es un Microcontrolador?
Una pieza se puede tocar en un tempo que hace que una nota entera dure cuatro segundo, en otra pieza la nota entera dura dos segundos y otras pueden tener otra duración. Descansos son los tiempos entre notas que no se tocan tonos. La duración de los descansos tambien se miden en entero, mitad, cuarto, octavo, dieciseisavo y treinta y doseavos. Más de Musica con microcontrolador. Después de completar esta actividad, usted estará listo para aprender como escribir códigos musicales en PBASIC a partir de las hojas de música. Vea el tutorial Tocando música de partitura con la bocina piezo, y su primer video en www.parallax.com/go/WAM.
Un Sistema Mejorado para Almacenar y Retirar Música
Usted puede escribir programas que almacenen dos veces más música en su BASIC Stamp usando bytes en lugar de words en sus directivas DATA. Usted puede también modificar su programa para hacer fácil de leer las notas musicales usando una de las convenciones más comunes para las notas y su duración. Esta actuvidad empezará presentado como almacenar información musical en una forma que relacione los conceptos de notas, duración y descansos o silencios. Tambien se presentará el Tempo, y lo analizará en la siguiente actividad. Esta es una de las directivas DATA que almacena notas musicales y duraciones para el siguiente Programa Ejemplo. Cuando se toque se parecerá a la canción “Martinillo”. Solo se almacenarán los caracteres de las notas en la directiva Notes DATA porque las instrucciones LOOKUP y LOOKDOWN se usarán para acoplar letras con sus correspondientes frecuencias. Notes
DATA
Durations
DATA
WholeNote
CON
"C","D","E","C","C","D","E","C","E","F", "G","E","F","G","Q" 4, 2,
4, 4,
4, 4,
4, 2
4,
4,
4,
4,
4,
4,
2000
El primer número en la directiva Durations DATA le indica al programa cuanto debe durar la primera nota de la directiva Notes Data. La segunda duración es para la segunda nota, y así sucesivamente. Las duraciones no están en terminos de milisegundos. En lugar de eso son números mucho más pequeños que pueden almacenarse en bytes, entonces no
Frequencia y Sonido · Página 263
hay prefijo Word en la directiva DATA. Comparado con almacenar valores en terminos de milisegundos, estos números se relacionan más con la partitura. Esta es una lista de lo que significa cada duración. 1 nota entera 2 media nota 4 cuarto de nota 8 octavo de nota 16 dieciseisavo de nota 32 treintaydosavo de nota Después que se lee cada valor de la directiva Durations DATA, se divide entre el valor de WholeNote para obtener la Duration usada en la instrucción FREQOUT. La cantidad de tiempo que dura cada nota depende del tempo de la canción. Un tempo rápido significa que cada nota dura menos tiempo, mientras que un tempo lento significa que cada nota dura más tiempo. Como todas las duraciones de las notas son fracciones de una nota entera, usted puede usar la duración de la nota entera para fijar el tempo. ¿Qué significa “Q” en Notes DATA? “Q” se usa para “salir” y DO UNTIL...LOOP verifica “Q” cada vez en el bucle y lo repetirá hasta que lo encuentra. ¿Cómo toco un silencio? Usted puede insertar un silencio entre notas insertando una “p”. La sección “Su Turno” tiene las primeras pocas notas de la 5ª. Sinfonía de Beethoven que tiene un silencio. ¿Cómo toco notas bemol/sostenido? El programa NotesAndDurations.bs2 tiene valores en las tablas lookup para notas bemol/sostenido. Cuando usted usa con letra minúscula, usted toca la nota bemol. Por ejemplo, si usted desea tocar B-sostenido, use “b” en lugar de “B”. Recuerde que esta tiene la misma frecuencia que A-bemol.
Programa Ejemplo: NotesAndDurations.bs2
9 Meta y ejecute el programa NotesAndDurations.bs2 9 ¿Cómo se oye?
Página 264 · ¿Qué es un Microcontrolador?
' ¿Que es un Microcontrolador - NotesAndDurations.bs2 ' Toca las primeras notas de Martinillo. '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Program Running!" Notes
DATA
"C","D","E","C","C","D","E","C","E","F", "G","E","F","G","Q"
Durations
DATA
WholeNote
CON
2000
index offset
VAR VAR
Byte Nib
noteLetter noteFreq noteDuration
VAR VAR VAR
Byte Word Word
4, 2,
4, 4,
4, 4,
4, 2
4,
4,
4,
4,
4,
4,
DO UNTIL noteLetter = "Q" READ Notes + index, noteLetter LOOKDOWN noteLetter, [
LOOKUP offset,
"A", "D", "G",
"b", "e", "a",
"B", "E", "P",
"C", "F", "Q"
"d", "g", ], offset
[ 1760, 1865, 1976, 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 0, 0 ], noteFreq
READ Durations + index, noteDuration noteDuration = WholeNote / noteDuration FREQOUT 9, noteDuration, noteFreq index = index + 1 LOOP END
Funcionamiento de NotesAndDurations.bs2
Las directivas Notes y Durations DATA se analizaron antes del programa. Estas directivas combinadas con la constante WholeNote se usaron para almacenar todos los datos musicales usados por el programa.
Frequencia y Sonido · Página 265
Abajo se muestran las declaraciones para las cinco variables usadas en el programa. Incluso aunque ya no usa el bucle FOR...NEXT para accesar los datos, ahí todavía tiene que estar una variable (index) que mantiene el ajuste por el cual entra DATA que está siendo leida por Notes y Durations. La variable offset se usa con las instrucciones LOOKUP y LOOKDOWN para seleccionar un valor particular. La variable noteLetter almacena un carácter que accesa la instrucción READ. Las instrucciones LOOKUP u LOOPDOWN se usan para convertir este carácter en un valor de frecuencia. Este valor se almacena en la variable noteFreq y se usa como argumento Freq1 de la instrucció FREQOUT. La variable noteDuration se usa en la instrucción READ para recibir un valor de Durations DATA. Y también se usa para calcular el argumento Duration para la instrucción FREQOUT. index offset
VAR VAR
Byte Nib
noteLetter noteFreq noteDuration
VAR VAR VAR
Byte Word Word
El bucle principal se mantiene en ejecución hasta que la letra “Q” se lee de NotesDATA. DO UNTIL noteLetter = “Q”
Una instrucción READ obtiene un caracter de NotesDATA, y lo almacena en la variable noteLetter. Entonces, la variable noteLetter se usa en la instrucción LOOKUP para fijar el valor de la variable offset. Recuerde que offset almacena un 2 si se detecta “b”, un 2 si se detecta “B”, un 3 si se detecta “C” y así sucesivamente. Entonces este valor de offset se usa en una instrucción LOOKUP to para calcular cual deberá ser el valor de la variable noteFreq. Si offset es 1, noteFreq será 1865, si offset es 2, noteFreq será 1876, si offset es 3, noteFreq es 2093 y así sucesivamente. READ Notes + index, noteLetter LOOKDOWN noteLetter, [
LOOKUP offset,
"A", "D", "G",
"b", "e", "a",
"B", "E", "P",
"C", "d", "F", "g", "Q" ], offset
[ 1760, 1865, 1976, 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 0, 0 ], noteFreq
Página 266 · ¿Qué es un Microcontrolador?
La frecuencia de la nota se ha determinado, pero todavía tiene que calcularse la duración. La instrucción READ usa el valor de “index” para colocar un valor de Duration DATA a NoteDuration. READ Duration + index, noteDuration
Entonces, noteDuration es iguala a la constante WholeNote dividida entre noteDuration. Si noteDuration empieza en 4 de la instrucción READ, se convierte en 2000/4 = 500. Si noteDuration es 8, se convierte en 2000/8 = 250. noteDuration = WholeNote / noteDuration
Ahora que ya se han determinado los valores de noteDuration y noteFrequ, la instrucción FREQOUT toca la nota. FREQOUT 9, noteDuration, noteFreq
Cada vez que pasa por el bucle principal, el valor de “index” se incrementa por uno. Cuando el bucle principal regresa al principio, la primer acción que el programa hace es leer la siguiente nota , usando la variable “index”. index = index + 1 LOOP
Su Turno – Experimentando con Tempo y una Canción Diferente
La longitud de tiempo que cada nota pierde se relaciona con el tempo. Usted puede cambiar el tempo ajustando la constante WholeNote. Si usted la incrementa a 2250, el tempo decrecerá, y la canción se reproducirá más despacio. Si usted disminuye la constante a 1750, el tempo aumentará y la canción se reproducirá más rápido. 9 Guarde el programa NotesAndDurations.bs2 con el nombre NotesAndDurationsYourTurn.bs2 9 Modifique el tempo del programa NotesAndDurationsYourTurn.bs2 ajustando el valor de WholeNote. Pruebe valores de 1500, 1750, 2000 y 2250. 9 Ejecute el programa después de cada modificación, y elija cual se escucha mejor. Meter los datos musicales es mucho más fácil cuando todo lo que tiene que hacer es grabar notas y duraciones. Estas son las primeras ocho notas de la Quinta Sinfonía de Beethoven. Notes
DATA "G","G","G","e","P","F","F","F","D","Q"
Frequencia y Sonido · Página 267
Durations DATA WholeNote CON
8, 8, 2000
8,
2,
8,
8,
8,
8,
2
9 Guarde su programa modificado como Beethoven’s Fifth.bs2 9 Reemplace las directivas Notes y Durations DATA y la declaración de la constante WholeNote con el código de arriba. 9 Ejecuteel programa. ¿Le parece familiar? Agregando Características Musicales
Al Programa Ejemplo le acaba de introducir notas, duraciones y silencios. También usa la duración de una nota entera para determinar el tiempo. Estas son tres características adicionales que podemos agregar a un programa que toca música; • •
•
Tocar notas “punteadas” Determinar la duración de la nota entero a partir del tempo Tocar notas de más de una octava.
The termino “punteadas” se refiere a un punto usado en la partitura para indicar que una nota deberá tocarse 1 ½ veces más de su duración normal. Por ejemplo, una nota de un cuarto punteada deberá durar la duración de una nota de un cuarto más un octavo de nota. Una nota de un medio punteada dura una mitad mas un cuarto de duración. Usted puede agregar una tabla de datos que almacene notas punteadas s sin puntear. En este ejemplo, un cero significa una nota sin puntear, y un uno una nota punteada. Dots
DATA
0, 0,
0, 0,
0, 0,
0, 1,
0, 0
0,
1,
0,
0,
0,
0,
Los programas que reproducen música típicamente expresan el tempo de una canción en batidos por minuto. Esto es lo mismo que decir notas de un cuarto por minuto. BeatsPerMin
CON
200
La Figura 8-4 es una repetición de la Figura 8-3. Esta muestra las 6ta. Y 7ta. Octavas del teclado de un piano. Estas son dos octavas que suenan con claridad cuando las toca la bocinapiezo. Este es un ejemplo de la directiva DATA que usted usará en la sección Su Turno para tocar más de una octava usando la directiva NotesDATA. Octaves
DATA
6, 6,
7, 6,
6, 6
6,
6,
6,
6,
6,
6,
7,
6,
Página 268 · ¿Qué es un Microcontrolador?
Figura 8-4 Teclas del Piano más a la derecha y Sus Frecuencias.
Programa Ejemplo: MusicWithMoreFeatures.bs2
Este Programa Ejemlo toca las primeras notas de “For He’s a Jolly Good Fellow.” Todas las notas pertenecen a la misma (7ª.) octava, pero algunas de las notas están punteadas. En la sección Su Turno, usted intentará un ejemplo que usa notas se usa notas de más de una octava y notas punteadas. 9 Meta y corra el programa MusicWithMoreFeatures.bs2 9 Cuente las notas y vea si usted puede oir las notas punteadas (con 1 ½ duración)9 También escuche las notas de la 7ª. Octava. Trate de cambiar una de estas notas a la 6ª. Octava. El cambio en el sonido de la música es hermosamente drástico. ' ¿Que es un Microcontrolador - MusicWithMoreFeatures.bs2 ' Toca el comienzo de He's a Jolly Good Fellow. '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Program Running!"
Frequencia y Sonido 路 P谩gina 269
Notes
DATA
"C","E","E","E","D","E","F","E","E","D","D", "D","C","D","E","C","Q" 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 4, 2, 4, 4, 4, 4, 2, 2, 4, 2, 4, 4, 4, 4, 2, 2 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0
Octaves
DATA
Durations
DATA
Dots
DATA
BeatsPerMin
CON
320
index offset
VAR VAR
Byte Nib
noteLetter noteFreq noteDuration noteOctave noteDot
VAR VAR VAR VAR VAR
Byte Word Word Nib Bit
wholeNote VAR Word wholeNote = 60000 / BeatsPerMin * 4 DO UNTIL noteLetter = "Q" READ Notes + index, noteLetter LOOKDOWN noteLetter,
LOOKUP offset,
[ "C", "F", "b",
"d", "g", "B",
"D", "G", "P",
"e", "a", "Q"
"E", "A", ], offset
[ 4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902, 0, 0 ], noteFreq
READ Octaves + index, noteOctave noteOctave = 8 - noteOctave noteFreq = noteFreq / (DCD noteOctave) READ Durations + index, noteDuration noteDuration = WholeNote / noteDuration READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2 FREQOUT 9, noteDuration, noteFreq index = index + 1 LOOP END
Página 270 · ¿Qué es un Microcontrolador?
Funcionamiento de MusicWithMoreFeatures.bs2
Abajo están los datos musicales de la canción completa. Para cada nota en la directiva NotesData, le corresponde una entrada en Octaves, Durations, y la directiva Dost DATA. Por ejemplo, la primera nota es una nota C de la 7ª. Octava, es un cuarto de nota y no está punteada. Este es otro ejemplo, el segundo de la última nota (no incluye salida) es una nota E, de la 7ª. Octava. Es mitad de nota y no esta punteada. También hay una constante BeatPerMin que fija el tempo de la canción. Notes
DATA
Octaves
DATA
Durations
DATA
Dots
DATA
BeatsPerMin
CON
"C","E","E","E","D","E","F","E","E","D","D", "D","C","D","E","C","Q" 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 4, 2, 4, 4, 4, 4, 2, 2, 4, 2, 4, 4, 4, 4, 2, 2 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 320
En el Programa Ejemplo anterior, WholeNote era una constante. Este tiempo, es una variable que no retiene la duración de una nota completa en milisegundos. Después de calcular este valor, WholeNote se usará para determinar todas las duraciones de las otras notas, como se hizo en el programa anterior. Las variables index, offset, noteLetter, y noteDuration también se usaron en la misma manera como se usaron en el programa anterior. La variable noteFreq se maneja un poquito diferente ya que ahora tiene que ajustarse dependiendo de la octava en que se toca la nota. Se han agrefado las variables noteOctave y noteDot para manejar la octava y las características punteadas. wholeNote
VAR
Word
index offset
VAR VAR
Byte Nib
noteLetter noteFreq noteDuration noteOctave noteDot
VAR VAR VAR VAR VAR
Byte Word Word Nib Bit
Frequencia y Sonido · Página 271
La variable wholeNote se calcula usando BeatsPerMin. El tempo de la canción se define en batidos por minuto, y el programa tiene que dividir BeatsPerMin entre 60000 ms, y luego multiplicarse por 4. El resultado da el valor correcto de una nota completa. WholeNote = 60000/ BeatsPerMin * 4 Las Matemáticas se ejecutan de izquierda a derecha. En el cálculo de wholeNote = 60000/ beatsPerMin * 4, el BASIC Stamp primero calcula 60000/beatsPerMin. Luego el resultado lo multiplica por 4. Los parentesis se pueden usar para agrupar operaciones. Si usted desea dividir entre 4 beatsPerMin primero usted puede hacer esto: wholeNote = 60000/(beatsPerMin*4).
Todo esto es lo mismo como el programa anterior: DO UNTIL noteLetter = "Q" READ Notes + index, noteLetter LOOKDOWN noteLetter,
[ "C", "F", "b",
"d", "g", "B",
"D", "G", "P",
"e", "a", "Q"
"E", "A", ], offset
Ahora que las octavas están el el mix, ha cambiado la parte de el código que calculó la frecuencia de la nota. La Tabla de Valores de la instrucción LOOKUP contiene frecuencias de las notas desde la 8ª. Octava. Estos valores pueden dividirse entre 1 si usted desea tocar notas de la 8ª. Octava, Por 2 si usted desea tocar notas en la 7ª. Octava, por 4 si usted desea tocar notas en la 6ª. Octava, y por 8 si usted desea tocar notas en la 5ª. Octava. La divisió se efectua en seguida. Todo lo que hace la instrucción LOOKUP es colocar una nota de la 8ª. Octava en la variable noteFreq. LOOKUP offset,
[ 4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902, 0, 0 ], noteFreq
Esta es la forma en que la variable noteFreq se ajusta para la octava correcta. Primero, la instrucción READ dimensiona el valor almacenado de la octava en Octaves DATA. Este pudiera ser un valor entre 5 y 8.
Página 272 · ¿Qué es un Microcontrolador?
READ Octaves + index, noteOctave
Dependiendo de la octava, deseamos dividir noteFreq por 1, 2, 4, o 8. Esto significa que el objetivo es es realmente dividir por 20 = 1, 21 = 2, 22 = 4, or 23 = 8. La siguiente frase de abajo toma el valor de noteOctave, el cual puede ser un valor entre 5 y 8 y resta ese valor de 8. Si noteOctave fue 8, ahora es 0. Si noteOctave fue 7 ahora es 1. Si noteOctave fue 6, ahora es 2, y si noteOctave fue 5, ahora es 3. noteOctave = 8 – noteOctave
Ahora, noteOctava es un valor que puede usarse como un exponente de 2, ¿pero como elevamos a la potencia 2 en PBASIC? Una solución es usando el operador DCD. DCD 0 es 1, DCD1 es 2, DCD 2 es 4 y DCD 3 es 8. Al dividir noteFreq por DCDnoteOctava significa que usted está dividiendo por 1, 2, 4, y 8, el cual divide noteFreq bajandolo al valor correcto. El resultado final es que noteFreq se fija en la octava correcta. Usted usará la Terminal Debug en la sección Su Turno para poner más atención en su funcionamiento. NoteFreq = noteFreq / (DCD noteOctave) ¿Como puedo ser experto en usar el operador DCD? Manteniendose aprendiendo y practicando. Cada vez que usted vea una nueva: instrucción, operador, o palabra clave que se usa en un ejemplo consulte el Manual BASIC Stamp. Léalo y trate de usarlo en un programa de su propio diseño. Adquiera el hábito de de leer periódicamente el Manual BASIC Stamp y trate de reducir los Programas Ejemplo. Esta es la mejor forma de familiarizarse con las diferentes instrucciones y operadores y su funcionamiento. Haciendo estas actividades, usted desarrollara el hábito de siempre agregarlos a la lista de herramientas de programación que usted puede usar para resolver problemas.
Las primeras dos líneas del código para determinar la duración de la nota son casi iguales a las del código del Programa Ejemplo anterior. Ahora, sin embargo, una nota pudiera estar punteada y esto significa que la duración tendría que multiplicarse por 1.5. Se usa un instrucción READ para accesar valores en la EEPROM con la directiv Dots DATE. La frase IF...THEN se usa para multiplicar por 3 y dividir por 2 siempre y cuando el valor de la variable noteDot es 1. READ Durations + index, noteDuration noteDuration = WholeNote / noteDuration READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2
Frequencia y Sonido · Página 273
Matemática de Numeros Enteros El BASIC Stamp no procesa automáticamente un número como 1.5. Cuando hace matemáticas solamente trabaja con números enteros..., -5, -4, -3, -2, -1, 0, 1, 2, 3,... La mejor solución para multiplicar por 1.5 es multiplicar por 3/2. Primero multiplica por 3 y luego divide por 2. Hay algunas formas para programar el BASIC Stamp para que maneja valores fraccionales. Usted puede programar el BASIC Stamp que use enteros para calcular la parte fracciónal de un número. Esto se presenta en la Guia del Estudiante de Circuitos Básicos Analógicos y Digitales. Hay también dos operadores que hacen que los valores fraccionales sean faciles de trabajar, y estos son Multiplicación Alta y Multiplicación Middle. Estos se explican con detalla en la Guía del Estudiante de Sensores Aplicados y en el Manual de BASIC Stamp.
Lo restante de este programa ejemlo funciona de la misma forma que lo hizo en el Programa Ejemplo anterior: FREQOUT 9, noteDuration, noteFreq index = index + 1 LOOP END
Su Turno – Tocando una Canción con Más de Una Octava
El programa MusicWithMoreFeatures.bs2 usó silencios, pero se mantuvo en una octava. La canción “Take Me Out of the Ball Game” abajo mostrada toca la mayoría de las notas en la 6ª. Octava. Hay dos notas en la 7ª. Octava y esto hace una gran diferencia en sus sonidos. 9 Guarde una copia del programa MusicWithMoreFeaturesYourTurn.bs2 9 Modifique el programa reemplazando las cuatro directivas data y una declaración de constante con lo siguiente: Notes
DATA
Octaves
DATA
Durations
DATA
Dots
DATA
BeatsPerMin
CON
"C","C","A","G","E","G","D","P","C","C","A", "G","E","G","Q" 6, 7, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6 2, 4, 4, 4, 4, 2, 2, 4, 2, 4, 4, 4, 4, 2 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 240
9 Ejecute el programa y verifique que suene correctamente.
Página 274 · ¿Qué es un Microcontrolador?
Las dos notas de la 7ª. Octava son esenciales para hacer que la canción suene correctamente. Es interesante escuchar que sucede si estos 7 valores se cambian a 6. 9 Trate de cambiar los dos valores 7 en la directiva Octaves DATA, para que sean 6. 9 Recuerde que este cambio hará que “Take Me out to the Ball” suene feo. 9 Ejecute el programa y escuche el efecto de las octavas incorrectas de la canción. 9 Cambie la directiva Octaves DATA a su estado original. 9 Ejecute el programa otra vez y escuche para ver si el sonido suena otra vez correctamente.
ACTIVIDAD #5: TONOS TELEFÓNICOS CON RTTTL Los viejos teléfonos celulares usaban para tocar tonos telefonicos un bocina piezo. Los tonos se bajaban de la web a una computadora y se cargaban de la computadora al teléfono celular. En ese tiempo, en ese tiempo una de las formas más usadas de composición, grabación y traslado de tono eran cadenas de texto con caracteres que describen cada nota en la canción. Este es un ejemplo de cómo eran las primeras notas de la 5ª. Sinfonía de Beethoven. Beethoven5:d=8,o=7,b=125:g,g,g,2d#,p,f,f,f,2d
Este formato para almacnar datos nusicales se llama RTTTL {} que es Ringing Tone Text Transfer Language {} Lenguaje de Transferencia de Texto de Tonos Teléfonicos. La gran característica de los archivos RTTTL fue que eran ampliamente compartidos a traves de WWW. Alguno sitios tenían archivos RTTL disponibles para descargarlos libremente. Estos eran también programas de software libre que se podían usar para componer y emular archivos y después descargarlos en su teléfono celular. Las especificaciones de RTTTL todavía se publican en línea. El anexo C resume como se almacenan notas, duraciones, pausas, tempo y notas punteadas con archivos RTTTL. Esta actividad presenta algunas técnicas de programación con PBASIC que puede usar para reconocer diferentes elementos de texto. La habilidad para reconocer diferentes caracteres o grupos de caracteres tomar acciones basadas en lo que contienen esos caracteres es extraordinariamente útil. De hecho, es la clave para convertir formato RTTTL (como la Quinta de Beethoven arriba mostrada) en música. Al final de esta actividad, hay un Programa de Aplicación que usted puede usar para tocar tonos con formato RTTTL.
Frequencia y Sonido · Página 275
Seleccionando que Bloque de Código Ejecutarse en Función de Caso por Caso
La frase SELECT...CASE es probablemente la mejor herramienta de programación para reconocer caracteres o valores. Recuerde que esta es una de las herramientas usadas para convertir tonos de teléfonos en notas musicales. En general, SELECT...CASE se usa para: • • •
Seleccionar una variable o expresión. Evaluar la variable o expresión en función de caso por caso. Ejecutar diferentes bloques de código dependiendo en que caso es adecuado el valor de esa variable.
Here is the syntax for SELECT...CASE:
SELECT expression CASE condition(s) statement(s) { CASE ELSE statement(s) } ENDSELECT
Usted puede intentar los dos siguiente Programas Ejemplo para ver como funciona SELECT...CASE. El pograma SelectCaseWithValues.bs2 toma valores numéricos que usted mete en la Terminal Debug y le indica el tamaño mínimo de la variable que usted necesitará para mantener ese valor. El programa SelectCaseWithCharacters.bs2 le dice a usted en la Terminal Debug si usted metió una letra mayúscula, minúscula, un dígito o un signo de puntuación. Recuerde usar la ventana de Transmisión en la Terminal Debug para mandar los caracteres que usted escribe en el BASIC Stamp. La Figura 8-5 muestra la ventanas de Transmisión y Recepción. Windowpanes Transmit →
Receive →
Figura 8-5 Mandando Mensajes al BASIC Stamp Haga click en la ventana Transmitir (arriba) para meter el valor o carácter que usted desea transmitir a el BASIC Stamp..
Página 276 · ¿Qué es un Microcontrolador?
Programa Ejemplo: SelectCaseWithValues.bs2
9 9 9 9
Meta y ejecute el programa SelectCaseWithValues.bs2. En la Terminal Debu, asegurese que en la ventanita no esta marcada Echo Off. Haga click en la ventana Transmitir de la Terminal. Meta un valor entre 0 y 65535, y presione la tecla Enter.
¿Qué sucede si usted mete un número mayor que 65535? Si usted mete el númere 65536, el BASIC Stamp almacenará el número 0. Si usted mete el número 65537, el BASIC Stamp almacenará el número 1, y así sucesivamente. Cuando un número es demasiado grande para la variable en la que cabe, hay un desbordamiento (overflow). Use la Tabla 8-1 para verificar que el Programa Ejemplo hace las decisiones correctas respecto al tamaño de los números que introdujo en la Terminal Debug. Table 8-1: Variable Types and Values They Can Store Tipo de Variables
Bit
Rango de Valores
0a1
Nib
0 a 15
Byte
0 a 255
Word
0 a 65535
' ¿Que es un Microcontrolador? - SelectCaseWithValues.bs2 ' Meta un valor y vea el tamaño mínimo requerido de la variable para retenerlo. '{$STAMP BS2} '{$PBASIC 2.5} value PAUSE 1000
VAR
Word
DEBUG "Enter a value from", CR, "0 to 65535: " DO DEBUGIN DEC value SELECT value CASE 0, 1 DEBUG "Bit", CR PAUSE 100
Frequencia y Sonido · Página 277
CASE 2 TO 15 DEBUG "Nib (Nibble)", CR PAUSE 200 CASE 16 TO 255 DEBUG "Byte", CR PAUSE 300 CASE 256 TO 65535 DEBUG "Word", CR PAUSE 400 ENDSELECT DEBUG CR, "Meta otro valor: " LOOP
Funcionamiento del programa SelectCaseWithValues.bs2
Se declar una variable tamaño word para mantener los valores metidos en la Terminal Debug. value
VAR
Word
La instrucción DEBUGIN toma el número que usted metión y lo coloca en la variable value. DEBUGIN
DEC
value
La frase SELECT escoge la variable value como uno de los casos a evaluar. SELECT value
El primer caso es si la variable es igual a 1 o a 0. Si el valor es igual a uno esos números, se ejecutan las instrucciones DEBUG y PAUSE que le siguen. CASE 0, 1 DEBUG “BIT”, CR PAUSE 100
El segundo caso es cuando su valor es igual a cualquier número que va de 2 a15. Si es igual a uno de esos números, se ejecutan las instrucciones DEBUG y PAUSE debajo de ellas. CASE
2 to 15 DEBUG “NIB (Nibble)”, CR PAUSE 200
Página 278 · ¿Qué es un Microcontrolador?
Cuando se han hecho todos los casos, la palabra clave ENDSELECT se usa para completar la instrucción SELECT...CASE. ENDSELECT
Programa Ejemplo: SelectCaseWithCharacters.bs2
Este Programa Ejemplo evalua cada caracterque usted mete en la ventana Transmisión de la Terminal Debug. El programa puede reconocer caracteres mayúsculas y minúsculas, digitos y algunos signos de puntuación. Si usted mete un carácter que el programa no reconoce, le dirá que lo intente otra ez (meta un carácter diferente). 9 Meta y ejecute el programa SelectCaseWithCharacters.bs2. 9 Asegurese que no está marcada la ventanita Echo Off. 9 Haga click en la ventana Transmit de la Terminal Degug para colocar ahí el cursor. 9 Meta los caracteres en la ventana Transmit y observe los resultados. ' ¿Que es un Microcontrolador? - SelectCaseWithCharacters.bs2 ' Programa que puede identificar algunos caracteres: mayusc/minusc, digito, puntuacion. '{$STAMP BS2} '{$PBASIC 2.5} character PAUSE 1000
VAR
Byte
DEBUG "Meta un caracter: ", CR DO DEBUGIN character SELECT character CASE "A" TO "Z" DEBUG CR, "Mayusculas", CR CASE "a" TO "z" DEBUG CR, "Minusculas", CR CASE "0" TO "9" DEBUG CR, "Digito", CR CASE "!", "?", ".", "," DEBUG CR, "Puntuacion", CR CASE ELSE
Frequencia y Sonido · Página 279
DEBUG CR, "Caracter no conocido.", CR, "Pruebe otro diferente." ENDSELECT DEBUG CR, "Meta otro caracter", CR LOOP
Funcionamiento de SelectCaseWithCharacters.bs2.
Cuando lo comparamos con el programa SelectCaseWithValues.bs2, este Programa Ejemplo tiene unas pocas diferencias. Primero, el nombre de la variable value se cambió por character, y su tamaño cambió de word a byte. Esto se hace porque todos los caracteres en PBASIC son tamaño byte. La instrucción SELECT escoge la variabe character para la evaluación de caso por caso. SELECT
character
Las comillas se usan para decirle al Editor de BASIC Stamp que usted se está refiriendo a caracteres. Podemos tratar los siguientes grupos de caracteres y signos de puntuación de la misma forma como un rango de números, ya que el BASIC Stamp los reconoce por sus equivalentes numéricos en ASCII. {}. Vea la ayuda de BASIC Stamp Editor. SELECT character CASE "A" TO "Z" DEBUG CR, "Upper case", CR CASE "a" TO "z" DEBUG CR, "Lower case", CR CASE "0" TO "9" DEBUG CR, "Digit", CR CASE "!", "?", ".", "," DEBUG CR, "Punctuation", CR
También hay una instrucción diferente “CASE” que no se usó en el ejemplo anterior: CASE ELSE DEBUG CR, "Character not known.", CR, "Try a different one."
Esta instrucción CASE le indica al bloque de código SELECT que hacer si ninguno de los otros casos es verdadero. Usted puede usar este caso para trabajar metiendo un carácter por ejemplo % y $.
Página 280 · ¿Qué es un Microcontrolador?
Su Turno – Seleccionando Caracteres Especiales.
9 Modifique la frase SELECT...CASE en el programa SelectCaseWithCharacters.bs2 de tal forma que muestre “Carácter Especial” cuando usted meta uno de estos caracteres: @, #, %, %, &, (), _ , o +. Programa de Aplicación para Tocar Tonos de Teléfono RTTTL
Abajo está un archivo que contiene la informació musical usada en el siguiente Programa Ejemplo. Hay cinco directivas adiconales RTTTL_File_DATA que usted puede probar en la sección Su Turno. Este programa toca una canción llamada “Reveille” {} que es el primer toque de trompeta de la mañana tocada en campos militares. Quizá usted la ha escuchado en películas y shows de tv. RTTTL_File
DATA "Reveille:d=4,o=7,b=140:8g6,8c,16e,16c,8g6,8e,", "8c,16e,16c,8g6,8e,8c,16e,16c,8a6,8c,e,8c,8g6,", "8c,16e,16c,8g6,8e,8c,16e,16c,8g6,8e,8c,16e,", "16c,8g6,8e,c,p,8e,8e,8e,8e,g,8e,8c,8e,8c,8e,8c,", "e,8c,8e,8e,8e,8e,8e,g,8e,8c,8e,8c,8g6,8g6,c."
Programa Ejemplo: MicroMusicWithRtttl.bs2
Este Programa de Aplicación es muy largo, y es una buena idea descargar la última version de la página www.parallax.com/go/WAM. Al descargar el programa y abrirlo con el Editor BASIC Stamp usted ahorrará una cantidad significativa de tiempo. La alternativa, es naturalmente meterlo a mano y depurar cuatro página de código. 9 Con el Editor de BASIC Stamp abra el archivo del programa que descargó MicroMusicWithRtttl.bs2 o a mano meta cuidadosamente el ejemplo que está abajo. 9 Ejecute el programa, y verifique que reconoce la pieza Reveille bugle call. 9 Vaya a la sección Su Turno e intente algunas piezas más (con directivas RTTTL_File DATA) ' ¿Que es un Microcontrolador? - MicroMusicWithRtttl.bs2 ' Play Nokia RTTTL format ringtones using DATA. '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Programa ejecutandose!" ' -----[ Definiciones de E/S ]----------------------------------------------
Frequencia y Sonido · Página 281
SpeakerPin
PIN
9
' Bocinapiezo conecteda a P9.
' -----[ Variables ]------------------------------------------------------counter char index
VAR VAR VAR
Word Byte Word
' Contador de Propósito General. ' Variable almacena caracteres. ' Index para apuntar a los datos.
noteLetter noteFreq noteOctave
VAR VAR VAR
Byte Word Word
' Amacena caracter de la note . ' Almacena frecuencia de la nota. ' Almacena octava de la nota.
duration tempo
VAR VAR
Word Word
' Almacena duracion de la nota. ' Almacena tempo.
default_d default_o default_b
VAR VAR VAR
Byte Byte Word
' Almacena duración default . ' Almacena octava default. ' Almacena batidos/min default.
' -----[ EEPROM Data ]----------------------------------------------------RTTTL_File
DATA
"Reveille:d=4,o=7,b=140:8g6,8c,16e,16c,8g6,8e,", "8c,16e,16c,8g6,8e,8c,16e,16c,8a6,8c,e,8c,8g6,", "8c,16e,16c,8g6,8e,8c,16e,16c,8g6,8e,8c,16e,", "16c,8g6,8e,c,p,8e,8e,8e,8e,g,8e,8c,8e,8c,8e,8c,", "e,8c,8e,8e,8e,8e,8e,g,8e,8c,8e,8c,8g6,8g6,c."
Done
DATA
",q,"
Notes
DATA
Octave8
DATA
"p", "a", "#", "b", "c", "#", "d", "#", "e", "f", "#", "g", "#" Word 0, Word 3520, Word 3729, Word 3951, Word 4186, Word 4435, Word 4699, Word 4978, Word 5274, Word 5588, Word 5920, Word 6272, Word 6645
' -----[ Initialization ]-------------------------------------------------counter = 0
' Inicializa counter.
GOSUB GOSUB GOSUB GOSUB GOSUB GOSUB
' Primero encuentra '=' en archivo. ' Obtiene duration default duration. ' Encuentra siguiente '='. 'Obtien Octava default. ' Encuentra el último '='. ' Obtiene tempo default.
FindEquals ProcessDuration FindEquals ProcessOctave FindEquals GetTempo
' -----[ Código del Programa]------------------------------------------DO UNTIL char = "q"
'Está en bucle en 'q' en DATA.
Página 282 · ¿Qué es un Microcontrolador?
GOSUB GOSUB GOSUB GOSUB GOSUB LOOP
ProcessDuration ProcessNote CheckForDot ProcessOctave PlayNote
END
' ' ' ' ' '
Obtiene duración de la nota. Obtiene el valor del índice de la nota. Si es punteada, duracion es 3/2. Obtiene la octava. Obtiene la frecuencia de la siguiente nota,. Fin del bucle principal.
' Fin del programa.
' -----[ Subroutina Encuentra Caracteres iguales ]----------------------FindEquals:
' Va a caracteres en ' Busca Archivo RTTTL DO ' '='. Incremeta contador READ RTTTL_File + counter, char ' hasta que encuentra'=' , y luego counter = counter + 1 ' regresa. LOOP UNTIL char = "=" RETURN
' ' ' ' ' '
-----[ Subroutine - Read Tempo from RTTTL Header ]---------------------Cada caracter del teclado tiene un sólo número llamado valor ASCII . Los caracteres 0, 1, 2,...9 tienen valores ASCII de 48, 49, 50,...57. Usted puede convertir los caracteres que representam un dígito a a si valr restamdpñes 48 a la variable que almacena el dígito. Puede examinar esto comparando DEBUG DEC 49 y DEBUG 49.
GetTempo:
' Describe archivo RTTTL de Tempo. ' Convierte caracters a ' digitos restandoles 48
default_b = 0 DO READ RTTTL_File + counter, char IF char = ":" THEN default_b = default_b / 10 counter = counter + 1 EXIT ENDIF default_b = default_b + char - 48 counter = counter + 1 default_b = default_b * 10 LOOP UNTIL char = ":" RETURN
' ' ' ' ' ' ' ' ' ' ' ' '
de cada caracterASCII valor. Multiplica Iterativamente cada dígito por 10 y si hay otro dígito, entonces lo suma el dígito más reciente con uno de la columna. Por ejemplo, la cadena "120" es (1 X 10 X 10) + (2 X 10) + 0. The '1' primero se convierte, y luego se multiplica por 10. El '2' es convertido/agregado. 0 es convertido/agregado, hecho.
' -----[ Subroutine – Busca Octava ]-----------------------------------ProcessOctave: READ RTTTL_File + counter, char SELECT char CASE "5" TO "8" noteOctave = char - "0"
' ' ' ' ' '
Puede o no puede haber Octava incluida en una nota dada porque cualquier nota que se toca en la octava default no se specifica la octava. Si se usa un caracter
Frequencia y Sonido · Página 283
counter = counter + 1 CASE ELSE noteOctave = default_o ENDSELECT IF default_o = 0 THEN default_o = noteOctave ENDIF RETURN
' ' ' ' ' ' ' ' '
'5' '8' entonces se usa ésta, usa default_o. Los Characteres se convierten a dígitos restando '0', que es lo mismo que restar 48.La primera vez se llama esta subrutina default_o e 0. Si 0, entonces fija default_o.
' -----[ Subroutina - Encuentra Index de Notea ]----------------------------ProcessNote:
' Fija el valor de index value de lookup ' de la frecuencia de nota basada em READ RTTTL_File + counter, char ' el caracter de la nota. Si 'p', SELECT char ' el índice es 0. Si 'a' a 'g', CASE "p" ' lee los valores de los caracteres en index = 0 ' la Tabla DATA y su equivalente. counter = counter + 1 ' Graba el valor del índíce cuando CASE "a" TO "g" ' encuentra su equivalente. Si el siguiente FOR index = 1 TO 12 ' caracter es bemoñ (#), suma READ Notes + index, noteLetter ' 1 al valor del índice para IF noteLetter = char THEN EXIT ' incrementar el índice (y NEXT ' frecuencia) by 1 . counter = counter + 1 ' Igual que en otras subroutinas, READ RTTTL_File + counter, char ' incrementa el contador para SELECT char ' cada caracter que se procesa. CASE "#" index = index + 1 counter = counter + 1 ENDSELECT ENDSELECT RETURN
' -----[ Subroutina - Determina Duración de la Nota ProcessDuration:
]--------------------
' Checa para ver si hay caracters de la ' forma 1, 2, 4, 8, 16 o 32. READ RTTTL_File + counter, char ' Si hay, entonce los convierte de ' Caracteres ASCII a un valor SELECT char ' restandoles 48. En el CASE "1", "2", "3", "4", "8" ' caso de 16 o 32, los multiplica duration = char - 48 ' por 10 y suma al siguiente counter = counter + 1 ' digito o a la columna de unos. READ RTTTL_File + counter, char SELECT char CASE "6", "2" duration = duration * 10 + char - 48 counter = counter + 1 ENDSELECT CASE ELSE ' Si no usa duración, duration = default_d ' use default.
Página 284 · ¿Qué es un Microcontrolador?
ENDSELECT IF default_d <> 0 THEN duration = 60000/default_b/duration*3 ELSE default_d = duration ENDIF
' Si no define default_d ' (si default_d = 0), entonces ' fije default_d = a la duración 'con d=#.
RETURN ' -----[ Subroutine – Cheque Para '.' Indicando Duraci+on 1.5 CheckForDot: READ RTTTL_File + counter, char SELECT char CASE "." duration = duration * 3 / 2 counter = counter + 1 ENDSELECT
' ' ' ' ' '
]-----------
Cheque para indicación punteada multiplique duración por 3/2. Si hay punteada, multiplique por 3/2 e incremente contador, sino, no haga nada y regrese.
RETURN ' -----[ Subrutina - Encuentra Comma and Play Note/Duration ]----------------PlayNote:
' ' ' ' '
Encuentra la última comma en la note actual. Luego, manda la frecuencia de la nota de los datos, y la toca, o hay silencio si frecuencia = 0.
READ RTTTL_File + counter, char SELECT char CASE "," counter = counter + 1 READ Octave8 + (index * 2), Word noteFreq noteOctave = 8 - noteOctave noteFreq = noteFreq / (DCD noteOctave) IF noteFreq = 0 THEN PAUSE duration ELSE FREQOUT SpeakerPin, duration, noteFreq ENDIF ENDSELECT RETURN
Funcionamiento del programa de MusicWithRtttl.bs2
Este Programa Ejemplo es de uso divertido, y muestra la clase de código que usted será capáz de escribir con alguna práctica. Sin embargo, se incluyó en este texto más por diversión que por los conceptos de codificación que emplea. Si usted examina el código brevemente, usted podría observar que ya ha usado todas las instrucciones y operadores del programa ¡excepto uno!
Frequencia y Sonido · Página 285
Esta es una lista de los elementos en este programa que por ahora le deberían ser conocidos: • Comentarios que le ayudan en la explicación de su código • Declaraciones de Constantes y Variables. • Declaraciones DATA • Instrucciones READ • Bloques IF...ELSE...ENDIF • Bucles DO...LOOP con o sin WHILE y UNTIL • Subrutinas con GOSUB, etiquetas y RETURN • Bucles FOR...NEXT • Instrucciones LOOKUP y LOOKDOWN • Instrucciones FREQOUT y PAUSE • Instrucciones SELECT...CASE • EXIT es nuevo, pero este simplemente permite que el programa pueda “salir” de un bucle antes que termine, y frecuentementese usa con las frases IF...THEN. Su Turno – Canciones Diferentes
9 Trate de reemplazar la directiva RTTTL_File DATA en el programa MicroMusicWithRTTTL.bs2 con cada uno del los cinco archivos musicales de abajo. ¡Solamente una directiva RTTTL_File DATA a la vez! Asegurese de reemplazar, no añada, su nueva directiva RTTTL_File DATA.
9 Ejecute el programa MicroMusicWithRTTTL.bs2 para verificar cada archivo RTTTL. RTTTL_File
DATA
"TwinkleTwinkle:d=4,o=7,b=120:c,c,g,g,a,a,2g,f,", "f,e,e,d,d,2c,g,g,f,f,e,e,2d,g,g,f,f,e,e,2d,c,c,", "g,g,a,a,2g,f,f,e,e,d,d,1c"
RTTTL_File
DATA
"FrereJacques:d=4,o=7,b=125:c,d,e,c,c,d,e,c,e,f", ",2g,e,f,2g,8g,8a,8g,8f,e,c,8g,8a,8g,8f,e,c,c,g6", ",2c,c,g6,2c"
RTTTL_File
DATA
"Beethoven5:d=8,o=7,b=125:g,g,g,2d#,p,f,f,f,2d"
RTTTL_File
DATA
"ForHe'sAJollyGoodFellow:d=4,o=7,b=320:c,2e,e,e,", "d,e,2f.,2e,e,2d,d,d,c,d,2e.,2c,d,2e,e,e,d,e,2f,", "g,2a,a,g,g,g,2f,d,2c"
Página 286 · ¿Qué es un Microcontrolador?
RTTTL_File
DATA
"TakeMeOutToTheBallgame:d=4,o=7,b=225:2c6,c,a6,", "g6,e6,2g.6,2d6,p,2c6,c,a6,g6,e6,2g.6,g6,p,p,a6", ",g#6,a6,e6,f6,g6,a6,p,f6,2d6,p,2a6,a6,a6,b6,c,", "d,b6,a6,g6"
Descargando Archivos RTTTL. Hay archivos disponibles RTTTL para bajarse de varios sitios de WWW. Estos archivos son contribuciones de entusiastas de ring tones, muchos de ellos no son expertos musicales. Algunos tonos de teléfono son muy buenos, otros no se pueden reconocer. Si usted desea descargar y tocar algunos archivos RTTTL, asegurese de quitar los espacios entre caracteres, luego inserte el archivo de texto entre las comillas.
RESUMEN Este capítulo introdujo técnicas para hacer sonidos y tonos musicales con el BASIC Stamp y una bocina piezo eléctrica. La instrucción FREQOUT se puede usar para mandar a una bocina piezo eléctrica señales high/low para que hagan efectos de sonido y/o notas musicales. La instrucción FREQOUT tiene argumentos que controlan los pines de E/S a donde se manda la señal, la Duration del Tono y la Frecuencia del Tono (Freq1). Hay un argumento opcional Freq2 que puede utilizarse para tocar dos tonos al mismo tiempo. Los efectos de sonido pueden hacerse ajustando la frecuencia y duración de los tonos y las pausas entre ellos. El valor de la frecuencia también puede barrerse en un rango de valores para crear una variedad de efectos. Hacer notas musicales también depende de la frecuencia, duración y pausas. El valor del argumento “Duration” de la instrucción FREQOUT lo determina “tempo” de la canción y la duración de la nota (nota entera, media nota, un cuarto de nota, etc). El valor Freq1 de la nota lo determina la letra de la nota y la octava. Los descansos o silencios entre notas se usan para fijar la duración de la instrucción PAUSE. Tocar canciones simples usando el BASIC Stamp puede hacerse con una secuencia de instrucciones FREQOUT, pero hay formas mejores para almacenar y retirar los datos musicales. Las directivas “DATA” con su etiquetas opcionales “SYMBOL” se usaron para almacenar valores de bytes sin usar prefijos, y valores tamaño “word” usando prefijos “Word”. La instruccón READ se usó para retirar valores almacenados por las directivas DATA. En los ejemplos de este capítulo, el argumento “Location” de la instrucción DATA siempre usó la etiqueta de la directiva opcional “Symbol” para diferenciar los diferentes tipos de datos. Algunas de las etiquetas “Symbol” que se usaron fueron Notes, Durations, Dots, y Octaves (notas, duraciones, puntos y octavas).
Frequencia y Sonido · Página 287
Los datos musicales pueden almacenarse en formatos que tienden en si mismos para convertirse en una partitura. El estilo de los datos de la partitura puede convertirse en frecuencias usando las instrucciones LOOKUP y LOOKDOWN. También pueden realizarse las operaciones matemáticas en valores de variables para cambiar la octava de una nota dividiendo su frecuencia por una potencia de dos. Las operaciones matemáticas también son útiles para la duración de las notas conociendo el tempo o la duración de la nota entera. Se introdujo SELECT...CASE como una forma de evaluar una variable en función de caso por caso. SELECT...CASE es particularmente útil para examinar caracteres o números cuando hay diferentes elecciones lo que podría ser la variable y diferentes elecciones para fijar las acciones que necesitan tomarse en función del valor de la variable. Un programa que convierte cadenas de caracteres que describen los tonos musicales de los teléfonos celulares viejos (se llama RTTTL) se usó para introducir programas grandes que hacen uso de todas las técnicas de programación presentadas en este texto. SELECT...CASE juega un papel importante en este programa porque se usa para examinar caracteres seleccionados en un archivo RTTTL en función de caso-porcaso. Preguntas
1. ¿Que origina que un sonido suene con un timbre alto? 2. ¿Qué hace FREQOUT 15, 1000, 3000? ¿Qué provoca que un tono suene con un timbre bajo? 3. ¿Cómo puede usted modificar la instrucción FREQOUT de la pregunta 2 para que mande dos frecuencias al mismo tiempo? 4. Si usted golpea la tecla B6 de un piano, ¿Qué frecuencia emite? 5. ¿Cómo modifica usted una directiva DATA o una instrucción READ si desea almacenar y retirar valores “word”? 6. ¿Puede usted tener más de una directiva DATA? Si si puede, como puede usted indicarle a una instrucción READ que obtenga los datos de una o mas directiva DATA? 7. Si usted conoce la frecuencia de una nota en una octava, que tiene usted que hacer para que esa frecuencia toco en la octava mayor siguiente? 8. ¿Qué hace SELECT...CASE? Ejercicios
1. Modifique el tono “Alarm...” del programa ActionTones.bs2 para que la frecuencia del tono que toca aumente en 500 cada vez que el tono se repite.
Página 288 · ¿Qué es un Microcontrolador?
2. Explique como modifica el programa MusicWithMoreFeatures.bs2 para que muestre un mensaje de alerta en la Terminal Debug cada vez que se toca una nota punteada. Proyectos
1. Construya un Generador de Tonos controlado con botones push. Si se presiona un botón push, la bocina debe emitir un beep de 2 kHz durante un 1/5 de segundo. Si se presiona el segundo botón push la bocina debe emitir una beep de 3 kHz durante un 1/10 de segundo. Soluciones
Q1. Nuestro oido detecta cambios en la presión del aire como tonos. Un tono con timbre alto genera cambios más rápidos en la presión del aire, un tono con timbre bajo genera cambios lentos en la presión del aire. Q2. FRECOUT 15, 1000, 3000 manda una señal de 3000 Hz que sale del pin P15 durante un segundo (1000 ms). El efecto de cada númro es: 15 es el pin E/S 15; 1000 es la duración del tono en milisegundos, o un segundo; 3000 es la frecuencia del tono, en hertz, entonces manda un tono de 3000 Hz. Q3. Use el argumento opcional Freq2. Para tocar 3000 Hz y digamos 2000 Hz, simplemente agregamos la segunda frecuencia a la instrucción después de una coma: FREQOUT
15,
1000,
3000, 2000
Q4. 1975-5 Hz, vea la Figura 8-3. Q5. Use el modificador opcional Word antes de cada dato. Q6. Si. Cada directiva DATA puede tener un diferente parámetro opciona Symbol. Para especificar de que directiva DATA se obtienen los datos, incluya el parámetro Symbol despues de cada palabra clave READ. Por ejemplo: READ Notes, noteLetter. En este ejemplo, Notes es el parámetro Symbol. Q7. Para obtener una nota en la siguiente octava mayor, multiplique la frecuencia por dos. Q8. SELECT...CASE selecciona una variable o expresión la evaluación en función de caso por caso, y ejecuta diferentes bloques de código dependiendo en cual caso se adecúa el valor de la variable.
Frequencia y Sonido · Página 289
E1. Este problema puede resolverse ya sea manualmente incrementando el valor de cada tono por 500 o utilizando el bucle FOR...NEXT con un valor “STEP” (paso) de 500. Utilizing FOR...NEXT loop:
Manually increasing tone:
DEBUG "Increasing Alarm...",CR DEBUG "Increasing alarm...", CR PAUSE 100 PAUSE 100 FREQOUT 9, 500, 1500 FOR frequency = 1500 TO 3000 STEP 500 PAUSE 500 FREQOUT 9, 500, frequency FREQOUT 9, 500, 2000 PAUSE 500 PAUSE 500 NEXT FREQOUT 9, 500, 2500 PAUSE 500 FREQOUT 9, 500, 3000 PAUSE 500
E2. Modifique las líneas que identifican la nota punteada. READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2
Agregue una instrucción DEBUG al bucle IF...THEN. No olvide ENDIF. Add a DEBUG command to the IF...THEN. Don't forget the ENDIF. READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2 DEBUG "Nota Punteada!", CR ENDIF
P1. Use el circuito de bocina piezoeléctrica de la Figrua 8-2; y los circuitos del botón push de la Figura 4-26. ' ¿Que es unMicrocontrolador? - Ch8Prj01_PushButtonToneGenerator.bs2 ' P4 Presionado: 2 kHz beep for 1/5 second. 2 kHz = 2000 Hz. ' 1/5 s = 1000 / 5 ms = 200 ms ' P3 Presionado: 3 kHz beep for 1/10 second. 3 kHz = 3000 Hz. ' 1/10 s = 1000 / 10 ms = 100 ms '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Programa Ejecutandose!" DO IF (IN4 = 1) THEN FREQOUT 9, 200, 2000 ELSEIF (IN3 = 1) THEN
' 2000 Hz para 200 ms
Página 290 · ¿Qué es un Microcontrolador?
FREQOUT 9, 100, 3000 ENDIF LOOP
' 3000 Hz para 100 ms