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