Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
# fibonacci.py
def fib(i): #Definicion de la funcion
a = 0
b = 1
c = 0
while c < i:
print c, #Mostramos el resultado por pantalla
a = b
b = c
c = a+b
try:
while True: #Iniciamos un loop infinito
GPIO.output(GPIO_TRIGGER,True) #Enviamos un pulso de ultrasonidos
time.sleep(0.00001) #Una pequeñña pausa
GPIO.output(GPIO_TRIGGER,False) #Apagamos el pulso
start = time.time() #Guarda el tiempo actual mediante time.time()
while GPIO.input(GPIO_ECHO)==0: #Mientras el sensor no reciba señal...
start = time.time() #Mantenemos el tiempo actual mediante time.time()
while GPIO.input(GPIO_ECHO)==1: #Si el sensor recibe señal...
stop = time.time() #Guarda el tiempo actual mediante time.time() en otra variable
elapsed = stop-start #Obtenemos el tiempo transcurrido entre envío y recepción
distance = (elapsed * 34300)/2 #Distancia es igual a tiempo por velocidad partido por 2 D = (T x V)/2
print distance #Devolvemos la distancia (en centímetros) por pantalla
time.sleep(1) #Pequeña pausa para no saturar el procesador de la Raspberry
except KeyboardInterrupt: #Si el usuario pulsa CONTROL+C...
print "quit" #Avisamos del cierre al usuario
GPIO.cleanup() #Limpiamos los pines GPIO y salimos
SONIC PI
• Sonic Pi es un editor de música a través de la
programación en el cual se podran ver
condicionantes, asignaciones, bucles y otras
estructuras de datos que nos permitirán
realizar nuestras propias creaciones.
Comenzar
Comencemos, copia el siguiente código en un
buffer vacío:
live_loop :flibble do
sample :bd_haus, rate: 1
sleep 0.5
end
Ok, eso fue fácil. Añadamos algo a la mezcla.
Encima de sample :bd_haus añade la línea
sample :ambi_choir, rate: 0.3.
Amplitud
El sobre ADSR no sólo controla la duración, también te permite control fino
de la amplitud del sonido. Todos los sonidos audibles comienzan y terminan
en silencio, conteniendo partes no-silentes en medio. Los sobres permiten
deslizar y mantener la amplitud de las partes no-silente. Es como darle
instrucciones a alguien sobre cómo subir y bajar el volumen del amplificador
de una guitarra. Por ejemplo, puedes pedirle a alguien “comienza en silencio,
lentamente llega a máximo volumen, manténlo por un momento y
rápidamente vuelve a silencio”. Sonic Pi te permite controlar exactamente
esta conducta con los sobres.
Puedes utilizar varios operadores al mismo tiempo. Por ejemplo para un ataque corto
y un release largo, prueba:
play 60, attack: 0.7, release: 4
También puedes invertirlo, prueba ahora con un ataque largo y un release corto:
play 60, attack: 4, release: 0.7
Finalmente, puedes poner el ataque y release cortos, para obtener sonidos cortos.
play 60, attack: 0.5, release: 0.5
Fase de Sostenimiento
Adicionalmente a especificar los tiempos de ataque y release, también puedes especificar el tiempo de
sostenimiento para controlar la fase de sostenimiento. Este es el tiempo en el cual el sonido es
mantenido a máxima amplitud entre las fases de ataque y release.
El sostenimiento es útil para importantes sonidos a los que desees darles máxima presencia a la mezcla
antes de entrar a la fase de release. Claro, es totalmente válido usar ambos operandos, attack: y release:
opts a 0 y dejar el sostenimiento sin aparecimiento gradual ni desvanecimiento. Sin embargo, ten en
cuenta que un release de 0 puede producir clicks en el audio y es aconsejable usar un valor muy
pequeño como 0.2.
Fase de Decaimiento
Para un nivel extra de control, también puedes especificar el tiempo de decaimiento. Esta es la fase del
sobre que está entre el ataque el ataque y el sostenimiento, especifica el tiempo donde la amplitud
bajará desde el nivel de ataque al de desvanecimiento attack_level: decay_level: (a menos que
especiques que será sujetado al nivel de sostenimiento sustain_level:). De hecho, el decay: operando es
0 y tanto el ataque como el sostenimiento tienen valor 1, así que deberás especificarlos para que el
tiempo de decaimiento tenga efecto.
play 60, attack: 0.1, attack_level: 1, decay: 0.2, sustain_level: 0.4, sustain: 1, release: 0.5
Nivel de Decaimiento
Un último truco es que aunque el decay_level: opt está predeterminado a ser el
mismo valor que el sustain_level: puedes ser explícito y asignarles diferentes valores
para un completo control del sobre. Esto permite crear sobres como el siguiente:
play 60, attack: 0.1, attack_level: 1, decay: 0.2, decay_level: 0.3, sustain: 1,
sustain_level: 0.4, release: 0.5
Sobres ADSR
Para resumir, los sobres ADSR de Sonic Pi tienen las siguientes fases:
ataque - tiempo desde amplitude 0 hasta el attack_level,
decaimiento - tiempo para mover la amplitud desde attack_level a decay_level,
sostenimiento - tiempo para mover la amplitud desde decay_level a sustain_level,
release - tiempo para mover la amplitud desde sustain_level a 0
play 60, attack: 0.5, attack_level: 1, decay: 1, sustain_level: 0.4, sustain: 2, release: 0.5
Sample
Otra gran manera de desarrollar tu música es
usando sonidos pre-grabados. En la gran tradición
de la “música concreta”, llamamos a estos sonidos
pre-grabados “sampleos”.
Así que si tomas un micrófono afuera y grabas el
sonido de la lluvia golpeando la tela, ya creaste un
sampleo.
Sonic Pi te deja hacer muchas y divertidas cosas con
los sampleos. No sólo viene con cerca de 90
sampleos de libre dominio para que ser utilizados,
sino que te deja manipular los tuyos. Veamos…
Disparando sampleos
Ejecutar pitidos es sólo el principio. Algo que sí es divertido es disparar sampleos pre-
grabados. Inténtalo:
sample :ambi_lunar_land
Sonic Pi incluye muchos sampleos para que uses. Utiliza el comando play para
dispararlos. Para tocar múltiples sampleos y notas, simplemente escríbelos uno detrás
del otro:
play 36
play 48
sample :ambi_lunar_land
sample :ambi_drone
Si quieres espacearlos en el tiempo, usa el comando sleep:
sample :ambi_lunar_land
sleep 1
play 48
sleep 0.5
play 36
sample :ambi_drone
sleep 1
play 36
¿Notas que Sonic Pi no espera a finalizar un
sonido para comenzar el siguiente? El comando
sleep sólo describe la separación de los sonidos
disparados. Esto te permite hacer capas de
sonidos fácilmente, creando interesantes
efectos de capas superpuestas. Más tarde
miraremos cómo controlar la duración de los
sonidos con los sobres.
Amplificando los sampleos
Puedes cambiar la amplitud de los sampleos exactamente de la misma
forma que utilizamos para los sintetizadores:
sample :ambi_lunar_land, amp: 0.5
Paneando sampleos
sleep 0.5
end
Debes notar que los if están compuestos de tres partes:
La pregunta a hacer La primera elección de código a correr (si la respuesta es
‘si’) La segunda elección de código a correr (si la respuesta es ‘no’)
Típico de lenguajes de programación, la noción de ‘sí’ está representada por
el término true y la noción de ‘no’, por false. Así que debemos encontrar una
pregunta que nos dé una respuesta true o false que es exactamente lo que
hace one_in .
¿notas que la primera opción está envuelta entre el if y el else y que la
segunda opción está envuelta entre el else y el end?. Igual que con los
bloques do/end puedes poner múltiples líneas de código en cualquiera de
esos lugares. Por ejemplo:
loop do
if one_in(2)
sample :drum_heavy_kick
sleep 0.5
else
sample :drum_cymbal_closed
sleep 0.25
end
end
Esta vez estaremos pausando por un tiempo distinto dependiendo de cuál
elección hagamos.
Condicional simple “if”
Algunas veces querrás ejecutar sólo una línea de
código. Esto es posible al colocar if y después la
pregunta al final. Por ejemplo:
use_synth :dsaw
loop do
play 50, amp: 0.3, release: 2
play 53, amp: 0.3, release: 2 if one_in(2)
play 57, amp: 0.3, release: 2 if one_in(3)
play 60, amp: 0.3, release: 2 if one_in(4)
sleep 1.5
end
Eso tocará acordes de diferentes números con una
probabilidad diferente para cada nota .
Hilos
Así que hiciste una gran línea de bajo y un gran
pulso. ¿cómo los tocas al mismo tiempo? Una
manera de hacerlo es coserlos juntos
manualmente - toca bajo, después un poco de
batería y así… Sin embargo, cada vez se vuelve
más complicado mantener el timing,
especialmente Si’coses’ más y más elementos.
¿qué tal si Sonic Pi pudiese coser todo
automáticamente para tí? Bueno, puede y lo
hace con algo especial llamado thread.
Bucles infinitos
Para mantener este ejemplo sencillo, vas a tener que imaginar que es
un gran pulso y bajo:
loop do
sample :drum_heavy_kick
sleep 1
end
loop do
use_synth :fm
play 40, release: 0.2
sleep 0.5
end
Como vimos anteriormente, bucles son como ‘hoyos negros’ para el
programa, una vez entras a uno, sólo puedes salir de él con el botón
‘stop’. Así que para tocar ambos bucles al mismo tiempo, debemos
indicarle a Sonic Pi que queremos comenzar algo al mismo tiempo que
el resto del código, aquí es cuando los hilos vienen al rescate.
Hilos al rescate
in_thread do
loop do
sample :drum_heavy_kick
sleep 1
end
end
loop do
use_synth :fm
play 40, release: 0.2
sleep 0.5
end
Al envolver el primer bucle de bloque do/end con in_thread le
decimos a Sonic Pi que corra los contenidos del bloque
do/end exactamente al mismo tiempo que el siguiente bloque
do/end (que es nuestro segundo bucle) ¿Inténtalo y
escucharás ambos, el bajo y la batería conectados!
in_thread do
loop do
sample :drum_heavy_kick
sleep 1
end
end
in_thread do
loop do
use_synth :fm
play 40, release: 0.2
sleep 0.5
end
end
loop do
use_synth :zawa
play 52, release: 2.5, phase: 2, amp: 0.5
sleep 2
end
Ejecutar como hilos
Puede sorprenderte que cuando aprietas el botón de Correr (Run), de hecho estás
creando un nuevo hilo para que corra el código. Esta es la razón por la que al apretar
el botón múltiples veces, suenan las capas de sonido una encima de la otra, ya que las
corridas son de hecho hilos cosidos automáticamente para sonar.
Ámbito
En cuanto más aprendas Sonic Pi, apreciarás que los hilos son los bloques de
construcción más importantes para tú música. Uno de los trabajos más importantes
que realiza es aislar la noción de seteos actuales respecto a otros hilos. ¿qué significa
eso? Bien, cuando cambias sintetizadores por medio de use_synth realmente estás
cambiando el sintetizdor en el hilo actual, ya que ningún otro hilo cambiarás su
sintetizador. Veamos esto en acción:
play 50
sleep 1
in_thread do
use_synth :tb303
play 50
end
sleep 1
play 50
¿Notaste que el sonido de en medio era diferente a los otros? el use_synth solamente
afectó el hilo en el que se encontraba, no así el hilo externo principal.
Herencia
Cuando creas un nuevo hilo con in_thread, este
automáticamente hereda la configuración del hilo actual.
Veamos:
use_synth :tb303
play 50
sleep 1
in_thread do
play 55
end
¿Notaste que la segunda nota es tocada por el
sintetizador :tb303 aunque era de un hilo separado?
Cualquier seteo modificado con las funciones use_* se
comportará de igual manera.
Cuando se crean hilos, ellos heredan todos los seteos de
su padre, pero no los comparten a su vez.
Funciones
Cuando comiences a escribir mucho código,
desearás encontrar una manera de organizar y
estructurar todo para hacerlo más entendible.
Las funciones permiten hacer exactamente eso,
permitiéndonos darle nombre a muchas partes
de nuestro código. Veamos:
Definiendo Funciones
define :foo do
play 50
sleep 1
play 55
sleep 2
end
Aquí definimos una nueva función llamada foo. Lo
hacemos con nuestro viejo amigo el bloque de do/end y
la palabra mágica define seguidos del nombre que
queremos darle a nuestra función. No necesitábamos
llamarla foo, podríamos haberla llamado cualquier cosa
que quisiésemos, tales como bar, baz o idealmente algo
significativo para tí como main_section o lead_riff.
Recuerda anteponer dos puntos : al nombre de la función
que defines.
Llamando las Funciones
Una vez hemos definido nuestra función, podemos llamarla
simplemente escribiendo su nombre:
define :foo do
play 50
sleep 1
play 55
sleep 0.5
end
foo
sleep 1
2.times do
foo
end
Incluso podemos usar foo dentro de bloques de iteración o cualquier
lugar donde hayamos escrito play o sample. Esto nos da una fantástica
manera de expresar y crear nuevas palabras significativas a usar en
nuestras composiciones.
Las funciones permanecen en memoria
Hasta ahora, cada vez que presionamos el botón de
Ejecutar, Sonic Pi ha comenzado de cero. Sólo
conoce lo que está en el buffer actual. No puedes
referenciar código en otro buffer o hilo. sin
embargo, las funciones cambian eso. Cuando
defines una función, Sonic Pi recuerda. Probemos
borrando todo el código en tu buffer y
reemplazandolo por:
foo
Presiona el botón de Ejecutar y escucha. ¿Dónde se
fue el código?¿cómo supo Sonic Pi qué tocar? Sonic
Pi recordó tu función, inclusive cuando la borraste
del buffer. Esta conducta sólo funciona con las
funciones creadas con define (y defonce).
Funciones parametrizadas
Quizás te interese saber que al igual que podías pasar valores mínimos y máximos con
rrand, también puedes enseñar a tus funciones a aceptar argumentos. Miremos:
define :my_player do |n|
play n
end
my_player 80
sleep 0.5
my_player 90
Esto no es tan excitante, pero ilustra el punto. Creamos nuestra propia versión de play
llamada my_player y la cual está parametrizada.
Lo mágico sucede dentro del bloque do/end del define . Puedes usar nombres de
parámetros como si fueran valores reales. En este ejemplo estoy tocando la nota n.
Puedes considerar los parámetros como una especie de promesa de que cuando el
código se ejecute, ellos serán reemplazados por los valores. Esto lo haces al pasar un
parámetro a la función, cuando la llamas. Yo lo hago con my_player 80 para tocar la
nota 80. Dentro de la definición de la función n se reemplaza con 80, así play n se
convierte en play 80. Cuando la llamo otra vez con my_player 90, n es reemplazada
por 90, así que play n se convierte en play 90.
Veamos un ejemplo más interesante: