Sei sulla pagina 1di 9

Msica por computadora

Ernesto Romero y Hernani Villaseor


Centro Multimedia 2012
Sesin 3
3.3 Funciones, Arreglos
Funciones
Las funciones en SC se encasillan entre llaves { } !na funci"n en SC re#resenta una acci"n$
#or e%em#lo &acer sonar un sonido o e%ecutar una rutina Las funciones #or s' mismas no
tra(a%an$ necesitan de un mensa%e #ara sa(er )ue &acer
La si*uiente funci"n es una onda sinoidal$ )ue mediante el mensa%e #lay sonar+ cuando
evaluemos la l'nea de c"di*o ,recuerden encender el servidor con s(oot-
{SinOsc.ar (440, 0, 0.5)}.play
Las funciones tam(i.n tra(a%an del mismo modo )ue en la forma tradicional matem+tica f,/-
0or e%em#lo si )ueremos &acer la funci"n f,/-1/2 #odemos escri(irla as'3
f={|x| x**2}
Los caracteres 4 4 indican )ue / es el ar*umento )ue reci(ir+ el valor al )ue )ueramos a#licar
la funci"n
0ara dar un valor a / lo &acemos con el m.todo o mensa%e value,- La si*uiente l'nea da el
valor 2 a / #idiendo as' 22
f.value(2)
5l evaluar la funci"n o(tenemos$ #or su#uesto$ el n6mero 7 en la #ost 8indo8
0odemos usar mas de un ar*umento en la funci"n 0or e%em#lo #ara una suma de cuadrados3
f={|a, b| (a**2)(b**2)}
f.value(!,4)
1
El resultado de(e ser 29
: #ara la &i#otenusa de un tri+n*ulo rect+n*ulo Recordemos el teorema de 0it+*oras
a" b" = c"
f={|a, b| ((a**2)(b**2)).s#r$}
f.value(!,4) %% el resul$a&' es 5
Se #uede usar una funci"n dentro de otra o#eraci"n3
(0*f.value(!,4) %% el resul$a&' es 50
!na funci"n solo arro%a el resultado de lo 6ltimo )ue ten*a escrito dentro de ella En el si*uiente
e%em#lo solo o(tendremos el resultado de la suma a ; ( y no el de la multi#licaci"n a < (
f={|a, b| a*b) ab}
f.value(2,!) %% el resul$a&' es 5
!na misma funci"n #uede e%ecutarse cual)uier cantidad de veces con el mensa%e do
5.&'{*+'la ,un&'*.p's$ln}
El resultado en la #ost es3
&ola mundo
&ola mundo
&ola mundo
&ola mundo
&ola mundo
9
0ara el si*uiente e%em#lo utili=aremos el mensa%e rrand
Si enviamos el mensa%e rrand a un n6mero a y a*re*amos un n6mero b como ar*umento
#odemos o(tener un valor aleatorio dentro del ran*o entre a y b
a.rran&(b)
5s' si a1>00 y b1900 o(tendremos un n6mero aleatorio entre >00 y 900
!00.rran&(500)
Con este m.todo rrand #odemos$ #or e%em#lo$ #roducir varias ondas senoidales
2
(0.&'{{SinOsc.ar(!00.rran&(500), 0, 0.()}.play}
?otar )ue &ay una funci"n dentro de otra y #or eso usamos llaves anidadas {{}} @am(i.n
estamos escri(iendo 01 en el ar*umento am# del Sin:sc #ara (a%ar el volumen de cada onda$
de esta forma al sumarse el volumen de cada una de las 10 ondas tenemos un volumen total
de 1
Su#erCollider tiene definida la funci"n de iteraci"n de la suma autom+ticamente !na iteraci"n
es una o#eraci"n )ue se reali=a so(re el resultado de la misma o#eraci"n las veces )ue se
desee Si #artimos del 0$ y la o#eraci"n es sumar 1 al resultado$ o(tenemos una secuencia de
n6meros enteros3
0 ( = (
( ( = 2
2 ( = !
! ( = 4
0ara ver esto sim#lemente &ay )ue declarar la si*uiente l'nea3
10do{ 4 i 4 i#ostln }
En la #ost se im#rime3
0
1
2
>
7
9
A
B
C
D
10
El 10 no fu. un valor de i El 10 se im#rime #or )ue la funci"n se reali=" 10 veces
Lo )ue est+ sucediendo a)ui es )ue el ar*umento i esta siendo iterado con la o#eraci"n ; 1
Con esta iteraci"n$ y el mensa%e do $ #odemos &acer funciones como la si*uiente$ donde al
n6mero 70 se le va sumando la iteraci"n del ar*umento i dando como resultado los n6meros
del 70 al 7D ,del 70 al 7D &ay 10 n6meros-
>
(0.&'{ | i | (40 i).p's$ln}
En la #ost se im#rime3
70
71
72
7>
77
79
7A
7B
7C
7D
10
El 10 no fu. un valor de ,70 ; i- El 10 se im#rime #or )ue la funci"n se reali=" 10 veces
M+s a6n$ si usamos la suma 70 ; i como ar*umento #ara una onda sinusoidal Sin:sc
#odemos escuc&ar lo si*uiente3
(0.&'{ | i | {-ulse.ar( 40 i )}.play}
Arreglos
Los arre*los o arrays son #arte del len*ua%e de #ro*ramaci"n en *eneral Los arre*los son
con%untos ordenados En SC los arre*los se encasillan entre corc&etes E F Sirven #ara contener
o(%etos o valores de los cuales #odemos &acer uso de diversas formas
E%em#lo de un arre*lo en SC con n6meros
.(, 2, !, 4, 5/
E%em#lo de un arre*lo con n6meros y strings
.(, 0na&a1, !, 0al2'1/
E/isten *ran cantidad de mensa%es )ue se #ueden enviar a un arre*lo 5 continuaci"n
enlistamos al*unos3
.0, (, 2, !, 4/.reverse %% p'ne el arre2l' en reversa3 .4,
!, 2, (, 0/
7
.0, (, 2, !, 4/.scra,ble %% &es'r&ena alea$'ria,en$e el
arre2l'3 .2, (, 4, 0, !/
.0, (, 2, !, 4/.pl'$ %% crea una 2r4fica en 25
.0, (, 2, !, 4/.scra,ble.pl'$ %% Se pue&en aplicar ,ensa6es
c'nsecu$iv's
.0, (, 2, !, 4/.,irr'r %% crea un espe6' &el arre2l'3 .0, (, 2,
!, 4, !, 2, (, 0/
.0, (, 2, !, 4/.su, %% su,a l's ele,en$'s &el arre2l' 3
0(2!4=(0
.0, (, 2, !, 4/.pyra,i& %% crea una es$ruc$ura pira,i&al c'n l's
ele,en$'s &el arre2l'3 . 0, 0, (, 0, (, 2, 0, (, 2, !, 0, (, 2,
!, 4 /
La forma #iramidal se #erci(e m+s facilmente si la reescri(imos as'3
E 0$
0$ 1$
0$ 1$ 2$
0$ 1$ 2$ >$
0$ 1$ 2$ >$ 7 F
@am(i.n #odemos a#licar o#eraciones a arre*los3
.0, (, 2, !, 4/ (0 %% Su,a (0 a ca&a ele,en$'3 .(0, ((, (2,
(!, (4/
.0, (, 2, !, 4/ * (0 %% 7ul$iplica p'r (0 ca&a ele,en$'3 .0,
(0, 20, !0, 40/
Se #ueden &acer tam(i.n o#eraciones entre arre*los La corres#ondencia en estos casos es
de uno a uno Si se tienen dos arre*los a y b y se a#lica una suma entre ellos el #rimer
elemento de a se sumar+ al #rimer elemento de b$ el se*undo con el se*undo y as'
sucesivamente
.0, (, 2, !, 4/ .5, 8, 9, :, ;/ %% el resul$a&' es .5, 9,
;, ((, (!/
9
Si los arre*los tienen diferente cantidad de elementos la o#eraci"n se a#licar+ uno a uno
tam(i.n$ #ero cuando el arre*lo m+s corto se a*ote comen=ar+ desde el #rinci#io de nuevo
&asta )ue los elementos del arre*lo m+s lar*o se terminen En el si*uiente e%em#lo el arre*lo a
tiene B elementos mientras )ue el arre*lo b tiene solo 9
a=.0, (, 2, !, 4, 5, 8/
b=.5, 8, 9, :, ;/
a b %% el resul$a&' es .5, 9, ;, ((, (!, (0, (2/
Las sumas se reali=an as'3
.05, (8, 29, !:, 4;, 55, 88/
!n ata%o #ara crear un arre*lo de n6meros consecutivos es as'3
((..(0) %% crea el array .(, 2, !, 4, 5, 8, 9, :, ;, (0/
5rray es el o(%eto de SC #ara &acer arre*los con estructuras es#ec'ficas sin tener )ue escri(ir
cada uno de sus elementos E/isten una *ran cantidad de mensa%es #ara crear diferentes
arre*los con el o(%eto 5rray Garemos solamente tres e%em#los de mensa%es$ #ero
recomendamos estudiar todos los )ue vienen en el arc&ivo de ayuda de 5rray y de los o(%etos
de )uien &ereda
5rrayseries,tamao$ comien=o$ #aso-
Crea una serie ar'metica de valores$ se definen tres ar*umentos )ue son3 tamao$ comien=o y
#aso @amao indica la cantidad de o(%etos o valores )ue contendr+ el arre*lo$ comien=o nos
dice a #artir de )ue valor iniciar y #aso es el la cantidad de valores intermedios entre cada
o(%eto ,e* al valor se le suma el #aso #ara o(tener el si*uiente valor-
E%em#lo de un 5rray usando el m.todo series
%% se crea un <rray &e 5 val'res #ue c',ien=a en 2 y cuy' val'r
subsecuen$e ira en au,en$' p'r val'res &e 4
<rray.series(5, 2, 4) %% el resul$a&' es .2, 8, (0, (4, (:/
5rray*eom,tamao$ comien=o$ crecimiento-
Crea una serie *eom.trica de valores$ se definen tres ar*umentos )ue son3 tamao$ comien=o
y crecimiento @amao indica la cantidad de o(%etos o valores )ue contendr+ el arre*lo$
comien=o nos dice a #artir de )ue valor iniciar y crecimiento es el factor de crecimiento entre
cada o(%eto ,e* el valor se multi#lica #or el factor de crecimiento #ara o(tener el si*uiente
valor-
A
E%em#lo de un 5rray usando el m.todo *eom
%% se crea un <rray &e 5 val'res #ue c',ien=a en 2 y cuy' fac$'r
&e creci,ien$' es &e 4
<rray.2e',(5, 2, 4) %% el resul$a&' es .2, :, !2, (2:, 5(2/

5rrayrand,tamao$ m'nimo$ m+/imo-
Crea un arre*lo de valores aleatorios$ se definen tres ar*umentos )ue son3 tamao$ m'nimo y
m+/imo @amao indica la cantidad de o(%etos o valores )ue contendr+ el arre*lo$ m'nimo y
m+/imo nos indican el l'mite inferior y el l'mite su#erior del ran*o de n6meros entre los )ue se
#uede ele*ir Se #ueden re#etir elecciones indefinidamente ,En caso de fraude- H ?o leer
E%em#lo de un 5rray usando el m.todo rand
%% se crea un <rray &e 5 val'res alea$'ri's en$re 0 y (0
<rray.ran&(5, 0, (0) %% el resul$a&' pue&e ser .0,5,:,8,:/
?otar )ue se eli*i" el n6mero C dos veces
Los elementos de un arre*lo tienen una #osici"n )ue se indica #or medio de un n6mero
llamado 'ndice$ El 'ndice 0 corres#onde al #rimer elemento del arre*lo$ el 'ndice 1 corres#onde
al se*undo elemento$ el 'ndice 2 al tercero y as' sucesivamente
0odemos #edir un elemento es#ec'fico de un arre*lo #or medio del 'ndice 0ara &acer esto
escri(imos corc&etes E F con el 'ndice deseado des#u.s del arre*lo
x = .!4, 5(, 4!0, >2/ %% &efini,'s el arre2l' x
x.0/ %% pe&i,'s el ele,en$' en el ?n&ice 0 (e.2. el pri,er
ele,en$' = !4)
x.(/ %% pe&i,'s el ele,en$' en el ?n&ice ( (e.2. el se2un&'
ele,en$' = 5()
x.!/ %% pe&i,'s el ele,en$' en el ?n&ice 0 (e.2. el cuar$'
ele,en$' = >2)
Iunciones mas arre*los
0odemos %untar funciones con arre*los #ara o(tener ideas estructuradas
E%em#lo3
Creamos el arre*lo a con 7 elementos3
B
a=.28(.8, !2;.8, !;2, 52!.2/
0odemos #edir sus elementos #or 'ndice3
a.0/ %% el pri,er ele,en$' &e a es 28(.8
a.(/ %% el se2un&' ele,en$' &e a es !2;.8
a.2/ %% el $ercer ele,en$' &e a es !;2
a.!/ %% el cuar$' ele,en$' &e a es 52!.2
Creamos una funci"n )ue itere 7 veces la suma ;1 arro%ando los valores 0$ 1$ 2$ >
4.&'{ | i | i.p's$ln }
En la #ost a#arece esto3
0
1
2
>
7
El 7 no fu. un valor de i El 7 se im#rime #or )ue la funci"n se reali=" 7 veces
Juntamos la funci"n con el arre*lo a usando i como 'ndice
4.&'{ | i | a.i/.p's$ln } %% n's i,pri,e un' p'r un' l's
ele,en$'s &e a en 'r&en
2A1A
>2DA
>D2
92>2
7
El 7 no es #arte del arre*lo a El 7 se im#rime #or )ue la funci"n se reali=" 7 veces
Iinalmente #odemos &acer al*o interesante3 !semos los elementos de a como ar*umentos de
frecuencia #ara 7 Sin:sc
4.&'{ | i | {SinOsc.ar(a.i/, 0, 0.25)}.play }
La l'nea de c"di*o anterior #roduce lo mismo )ue las si*uientes l'neas$ #ero es m+s concisa y
ele*ante
C
(
{SinOsc.ar(28(.8, 0, 0.25)}.play)
{SinOsc.ar(!2;.8, 0, 0.25)}.play)
{SinOsc.ar(!;2, 0, 0.25)}.play)
{SinOsc.ar(52!.2, 0, 0.25)}.play)
)
%% ================================
%% -il@n
%% ================================
%% SuperA'lli&er n's +ace la $area &e crear la funci@n
sinus'i&al
{SinOsc.ar((00)}.pl'$
%% -er' n's'$r's $ene,'s ya las +erra,ien$as para +acerla
((2pi%(00)*(0..(00)).sin.pl'$
Esta o(ra est+ su%eta a la licencia 5ttri(utionK?onCommercialKS&are5liLe >0 !n#orted de
C r e a t i v e C o mmo n s 0 a r a v e r u n a c o # i a d e e s t a l i c e n c i a $ v i s i t e
&tt#3MMcreativecommonsor*MlicensesM(yKncKsaM>0M o envie una carta a Creative Commons$ 777
Castro Street$ Suite D00$ Mountain Vie8$ California$ D7071$ !S5
D

Potrebbero piacerti anche