sábado, 27 de febrero de 2016

Resolvamos el problema que dejamos y sigamos mostrando programación basica


En la entrada anterior quedamos que una vez que se activara un ciclo este el programa se quedaría estancado en ese ciclo y nada de lo que se haya abajo se va a poder sonar ¿como podríamos hacer que un ritmo se mantenga sin que afecte a toda la composición? dejar que los ritmos clave solo suenen por muy cortos periodos de tiempo puede parecer una solución pero en una composición musical esto es muy difícil de hacer y más cuando hay muchos elementos involucrados

¿Y que tal si dejamos que Sonic Pi piense eso por nosotros y lo haga de manera automática?  Esto se puede hacer gracias a un gran elemento llamado thred(hilos). Retomemos el problema anterior.

Teníamos estos 2 ciclos pero solo uno de ellos iba a poder sonar debido a que al estar atrapado en un ciclo eterno esto no vería la forma de como salir, como agujeros negros en el programa, ¿como 2 ciclos podrían sonar al mismo tiempo? Aquí es cuando los thread vienen al rescate

Primero se envuelve el primer ciclo con un bloque de thread entonces cuando Sonic Pi corre el programa el final del bloque queda exactamente al mismo tiempo que el siguiente estamento antes del siguiente bloque do/end
Y si en lugar de 2 ciclos fuesen 3 ciclos algo como esto

Bueno ahora tenemos el mismo problema que la vez pasada, el primer ciclo sonara al mismo tiempo que el segundo ciclo que esta haciendo dúo con el thread, sin embargo el tercer ciclo nunca se va oír, así que bueno, solo agregamos otro in_thread. 

Listo

De hecho, el Botón Run también es un thread



Para sus sorpresa cada vez que oprimimos el botón de Run, lo único que haces es crear un nuevo thread para que el código arranque. Esto se puede notar si dejas un ciclo andando y oprimes varias veces el botón Run y te percataras que salen varios sonidos a la vez,

Recapitulemos todo lo que  hemos aprendido y es que los threads son de por si el bloque más importante para tu musica. Otro de los importantes trabajos que estos tienen es insolar las configuraciones actuales, esto quiere decir que todas las configuraciones de use_synh  se quedaran dentro del thread.

Sin embargo si se declara un use_synh fuera del thread este se ve afectado por el cambio de tono del sintetizador, Cada vez que un tread se crea ellos reciben inherentemente los ajustes que se le  hayan hecho a los padres pero no comparten ninguna característica de vuelta.

Funciones


 Uy como que toda esa explicación fue muy densa, pero vale, ahora vamos a pasar con lo que considero uno de los aspectos más fundamentales a la hora de programar. Cuando uno ya a escrito ya muchas lineas de código uno busca una manera de como darles una organización y estructúralas de tal forma que sean fácil de recordar o de trabajar con ellas. Es en eso donde entran las Funciones ya que ellas nos dan la habilidad de nombrar varias lineas de código en un nombre que podremos aprovechar para llamar cuando consideremos necesario, por ejemplo veamos como definimos una función:

 Y aquí tenemos nuestra función definida llamada foo, encerrada dentro de su propio bloque como pueden apreciar y esa palabra mágica llamada define, no necesariamente se tiene que llamar foo, nuestra función puede llegar a tener cualquier nombre que nosotros queramos.

Llamando a una Función

Una vez definida nuestra función podremos llamarla simplemente escribiendo su nombre.



 Ahora podremos usar a foo dentro de bloques de iteraciones o en cualquier parte como si se tratase de play o sample . Esto nos viene cayendo genial ya que ahora podremos tener un ritmo que nos guste, convertirlo en una función y siempre que queramos y no requerirá más de una linea de código para llamarla.

Funciones con parámetros
Ahora de seguro a de estar interesado en saber si se pueden pasar de valores máximos y mínimos a aleatorios, descuida a las funciones se les pueden enseñar a aceptar argumentos veamos 

No se muy interesante de lejos pero nos sirve para ilustrar nuestro punto, si son observadores se percataran que acabamos de crear nuestra propia versión de play llamada my_player y esta a sido parametrisada(no me estoy inventando esta palabra)

 
"Parametrizado"

¿Que es un Parámetro? un parámetro es lo que se necesita para poder hacer arrancar después del do para definir el bloque do/end rodeado por una vertical que parece un poste o un palo y separado por comas. Puedes usar la palabra que quieras para nombrar el parámetro. 
La magia  ocurre dentro del bloque define do/end. Verán en este ejemplo solo se jugo un poco con la nota n. Puedes considerar los parámetros como tipo promesa en el que este cuando le toque su parte de código correr este sera reemplazado por el valor actual(como los prestamos de un banco). Y eso fue exactamente lo que ocurrió cuando my_player se le asigno 80 por lo que play n paso a ser play 80 y así también con my_player 90, pero mejor veamos un ejemplo más interesante.
  

¡Oh pero que tenemos aquí!, se usa repeats como si fuese un numero dentro de la sentencia repeats.times.do al mismo tiempo se usa root como si fuera una, parecido al caso anterior de my_player. Básicamente chord_playes necesita 2 valores, la nota musical y el tiempo. Así podremos escribir algo muy expresivo y fácil de leer con solo pasar gran parte de la lógica a una funcion

 Condicionales



En programación las condicionales vendrían siendo ese tipo de sentencias donde se nos da a tomar una decisión pero esa decisión va ir condicionada por los valores que se presenten en el momento osease si Victor llega con un saco de 100 naranjas hago jugo de naranja pero si viene con menos de 100 naranjas le disparo solo comeremos naranjas, algo así. 

Ahora eso tiene mucho sentido en programación pero en la composición musical como lo metemos, bueno Sonic pi tiene una serie de funciones que prácticamente te devuelve un valor aleatorio dentro de un rango con esa clase de comandos podemos hacer obras maestras como la que tenemos a continuación

Así pues, las condicionales se pueden usar aprovechando la característica de este comando y dejar a la suerte que sonido sera el que saldrá a continuación.
Como lanzar una moneda, si es cara se oirán los tambores y si es sello se va oír el platillo para eso se utiliza la función one_in, que devolverá un valor que este dentro de un rango es decir one_in(6) devolverá con verdadera probabilidad un valor del 1 al 6, aquí especificamos que sea una probabilidad de 1 o 2 y se usa el resultado que salga para decidir si se oyen los tambores o los platillos 
Dentro de un loop por que de lo contrario solo se ejecutaría una vez


 Aquí podemos apreciar como la sentencia If envuelve lo que vendría siendo la primera decisión junto con else y este envuelve la segunda decisión hasta llegar a end justo como los bloques do/end.

Aveces solo queremos que una linea de código se ejecute de manera opcional por lo que solo necesitaremos de un if simple, una ilustración para entendernos mejor


 Esto va hacer sonar acordes con la posibilidad de que la nota sea distinta dentro de distintos rangos de posibilidades.

No hay comentarios:

Publicar un comentario