El pasado mes vimos cómo reproducir archivos de audio y en esta ocasión nos centraremos en el modo utilizado por REALBasic para reproducir música MIDI, aprovechando para ello los recursos ofrecidos por la tecnología QuickTime de Mac OS y, más concretamente, de su librería de instrumentos musicales.

Si bien en la reproducción de archivos de sonido o música digitalizada la programación era mínima, ya que bastaba con indicar sencillamente el archivo de audio a reproducir, en este caso no se trata de una programación mucho más complicada o abundante sino que habrá que indicar el instrumento, duración/intensidad y nota o secuencia de notas a reproducir.

El programa que utilizaremos como ejemplo en este caso también nos será de utilidad para refrescar una de las sentencias condicionales que, como recordará, son de gran utilidad para ejecutar unas líneas de programa u otras en función del resultado obtenido tras realizar, por ejemplo, una comparación entre dos variables o una variable y un valor concreto.

Igualmente, la aplicación de ejemplo que utilizaremos en este capítulo también nos servirá para trabajar con nuevos controles de REALBasic: el temporizador, simbolizado con el icono de un reloj en la paleta de herramientas, y el rectángulo que nos servirá para iniciarnos en los controles gráficos.

Por lo que respecta a la programación propiamente dicha, también veremos nuevos métodos. Si en el primer capítulo del cursillo se habló de las matrices aplicadas a las variables, en este número veremos nuevamente este concepto aplicado a un objeto.

NotePlayer

Si el control utilizado para la reproducción de sonido era MoviePlayer, para el trabajo con instrumentos musicales debe utilizar este tipo de control. Si bien verá el icono del control al arrastrarlo sobre la ventana del programa que esté realizando, éste no se mostrará una vez que lo ejecute.

Al incorporar el control NotePlayer a su programa verá que la ventana de propiedades sólo permite variar los habituales parámetros de IDentificación:

Name: Nombre del control con el que nos referiremos desde el código del programa.

Index: Índice del control en el caso de que esté recogido en una matriz de control. Este aspecto se abordará posteriormente.

Super: Si procede, clase superior a la que pertenece.

Continuando en la ventana de propiedades, inmediatamente a continuación podrá ver y/o alterar la posición del control dentro de la ventana a la que se haya arrastrado. Tenga en cuenta que los números introducidos en los campos de posición son píxeles de desplazamiento relativos a la esquina superior izquierda de la ventana en el que está contenido, al igual que sucede con el resto de controles.

Por último encontrará la propiedad Instrumento, contenida en el apartado de Comportamiento (Behavior). El número introducido en este campo indicará el instrumento que utilizará el control NotePlayer para reproducir las notas que se indiquen mediante programación.

Como veremos, cualquiera de estos valores puede ser alterado desde programación.

Para ver un ejemplo rápido de cómo trabajar con NotePlayer, siga estos pasos:

1. Ejecute REALBasic y arrastre el control NotePlayer sobre la ventana por omisión del nuevo programa “Untitled”.

2. Haga doble clic sobre el icono del control. Aparecerá la ventana del Editor de Código.

3. Introduzca el siguiente código:

dim a as integer

For a = 1 to 127

Noteplayer1.playnote a,64

next

notePlayer1.playNote a,0

4. Ejecute el programa (asegúrese de que el ajuste de volumen de su Mac no esté excesivamente alto).

PlayNote. Este es el único método que se puede aplicar al control NotePlayer y para que realice su cometido hay que pasarle dos valores: el primero indica la altura tonal (nota) y el segundo la velocidad (que también podríamos definir como intensidad de pulsación o ataque).

Ahora bien, ¿en qué rango numérico podemos trabajar para ambos valores? Las notas están comprendidas entre los valores 0 y 127, siendo 60 el valor correspondiente al Do central. Tomando este dato como punto de partida, no le resultará muy difícil calcular los valores correspondientes al resto de las notas incrementando en 2 para subir un tono en la escala (por ejemplo, de Do a Re) y restando el mismo valor para bajar un tono en la escala. Para subir medio tono (Do a Do#) sólo hay que aumentar 1 y la misma proporción para bajar medio tono (por ejemplo, Si-Do o Fa#-Sol).

A continuación reproducimos una escala completa, con los correspondientes valores:

Nota Valor

Do 60

Do# 61

Re 62

Re# 63

Mi 64

Fa 65

Fa# 66

Nota Valor

Sol 67

Sol# 68

La 69

La# 70

Si 71

Do 72

Ahora bien, esta estructura puede resultar demasiado rígida al contemplar sólo incrementos o reducciones en saltos de tono o medio tono; pero no le permitirá calcular notas ligeramente desafinadas (por ejemplo, 60.5). En este caso, los valores de altura tonal están comprendidos entre 256 y 32767, debiendo emplear la siguiente fórmula para hallar su valor.

nota = (nota*256)

Por ejemplo, para el Do central ligeramente desafinado sería:

nota = (60.5 * 256)

El segundo parámetro que se pasa al método PlayNote (velocidad, duración o intensidad de la nota interpretada) admite valores comprendidos entre 0 y 127. Con el valor 0 es el que deberá utilizar para apagar la nota que se esté reproduciendo.

Timer

Al incorporar el control Timer (temporizador) en sus programas encontrará una forma sencilla que le permitirá ejecutar código en intervalos de tiempo que haya indicado, con independencia de la ejecución del resto de código asociado a los eventos de otros controles o del cuerpo principal del programa.

Al arrastrar este control a la ventana de aplicación encontrará en la ventana de propiedades, bajo el apartado de comportamiento (Behavior), los siguientes parámetros: Mode y Period. El primero indicará el comportamiento que tendrá el temporizador, mientras que el segundo servirá para indicar el intervalo de tiempo, en milisegundos, que transcurrirá entre cada una de las ejecuciones.

Mode.Este parámetro puede tener uno de los siguientes valores:

0. Este valor desactivará el temporizador y, por tanto, no se ejecutará el código contenido en el evento Action del control.

1. Con este valor indicará al temporizador que se ejecute el código contenido en el evento Action sólo una vez.

2. Si utiliza este valor en el parámetro Mode estará indicando la ejecución múltiple del código incluido en el evento Action del control.

En definitiva, podrá utilizar los temporizadores para incluir en dichos controles el código que desee ejecutar a intervalos regulares de tiempo.

Matrices de controles

En anteriores capítulos hemos obviado uno de los parámetros mostrados en la ventana de propiedades: Index. Siempre que hemos incluido un control u objeto en nuestros anteriores programas de ejemplo siempre hemos dejado este parámetro a 0.

Imaginemos que deseamos incluir en nuestro programa varios controles del mismo tipo y que, además, están orientados a cumplir una función común. Si tratamos cada uno de estos objetos de forma independiente estaremos consumiendo más memoria y también resultará en una programación más engorrosa; pero si duplicamos el control tantas