1. TEMA 9 1/16
Xil嘆fon
s dif鱈cil de creure que l'炭s de la tecnologia per
enregistrar i reproduir m炭sica nom辿s es remunta a
1878, quan Edison va patentar el fon嘆graf. Hem
arribat molt lluny per descomptat, amb
sintetitzadors de m炭sica, CD, mostreig i la remescla,
tel竪fons que reprodueixen m炭sica, i fins i tot a llarga
distncia per Internet. En aquest tema, podrs
prendre part en aquesta tradici坦 mitjan巽ant la
creaci坦 d'una aplicaci坦 que registra reproduix
m炭sica de xil嘆fon.
El que construirs
Amb l'aplicaci坦 que es mostra a la Figura 9-1
(originalment creada per Liz Looney l'equip de App
Inventor), pot:
Tocar huit notes diferents en tocar botons de colors
a la pantalla.
Premeu un bot坦 de Reproducci坦 per reproduir les
notes que ha tocat abans.
Premeu un bot坦 de Reinici perqu竪 l'aplicaci坦 oblidar
el que assenyala que ha jugat anteriorment perqu竪
pugui escriure una nova can巽坦.
El que aprendrs
Aquest tutorial cobreix els seg端ents conceptes:
L'炭s d'un component de so nom辿s per tocar diferents arxius d'udio.
Utilitzaci坦 del component del rellotge per mesurar i fer complir les demores
entre les accions.
Decidir quan crear un procediment.
Creaci坦 d'un procediment que es crida a si mateix.
s avan巽at de les llistes, incloent l'addici坦 d'elements, l'acc辿s a elles, i
esborrar la llista.
Figura 9-1. El xil嘆fon,
aplicaci坦 d'interf鱈cie d'usuari
2. TEMA 9 2/16
Introducci坦
Connectar-se a la pgina web de App Inventor i comen巽ar un nou projecte. El nom
de "Xilofon", i tamb辿 s'estableix el t鱈tol de la pantalla de "Xil嘆fon". Obriu l'Editor de
blocs i connectar al seu tel竪fon o emulador.
Disseny dels components
Aquesta aplicaci坦 t辿 13 components diferents (8 dels quals componen el teclat), que
s'enumeren a la Taula 9-1. Com que hi ha tants, que seria bastant avorrit per crear
tots ells abans de comen巽ar a escriure el nostre programa, aix鱈 que anem a analitzar
l'aplicaci坦 en les seves parts funcionals i construir en forma seq端encial per anar i
venir entre el dissenyador i els blocs editor, com ho vam fer en el tema 5.
Taula 9-1. Tots els components de l'aplicaci坦 Xil嘆fon
Component Paleta Nom assignat Objectiu
Button Basic Button1 Reproduir tecla C min炭scula.
Button Basic Button2 Reproduir tecla D.
Button Basic Button3 Reproduir tecla E.
Button Basic Button4 Reproduir tecla F.
Button Basic Button5 Reproduir tecla G.
Button Basic Button6 Reproduir tecla A.
Button Basic Button7 Reproduir tecla B.
Button Basic Button8 Reproduir tecla C maj炭scula.
Sound Media Sound1 Reproduir les notes.
Button Basic PlayButton Reproduir la can巽坦.
Button Basic ResetButton Restablir la mem嘆ria de can巽ons.
Horizontal
Screen
Horizontal
Col揃loqui els botons Play i Reset un al costat de l'altre.
Arrangement
Arrangement
Arrangement1
Clock Basic Clock1 Porteu un registre dels retards entre les notes.
Creaci坦 del teclat
La nostra interf鱈cie d'usuari inclou un teclat de vuit notes per a una pentat嘆nica (de
set notes)de escala major que va des de C min炭scula a C maj炭scula. Crearem
aquest teclat musical en aquesta secci坦.
3. TEMA 9 3/16
La creaci坦 dels botons de la primera nota
Comenceu per crear les dues primeres tecles del xil嘆fon, que anem a aplicar com
botons.
1. A la categoria Bsica, arrossegueu un bot坦 a la pantalla. Deixi el seu nom com
Button1. Volem que sigui una barra magenta llarga, com una clau en un
xil嘆fon, aix鱈 que estableixi les seves propietats aix鱈:
a) Canvi de la seva propietat BackgroundColor a Magenta.
b) Canviar la propietat Text en "C".
c) Configuraci坦 de la seva propietat Width a "Fill parent" pel que va tot el
cam鱈 a trav辿s de la pantalla.
d) Configuraci坦 de la seva propietat Height a 40 p鱈xels.
2. Repetiu el procediment per a un segon bot坦, denominat Button2, situant per
sota de Button1. Utilitzeu els mateixos valors de les propietats Ample i
Al巽ada, per嘆 establir la seva propietat BackgroundColor a Roig i la seva
propietat Text en "D".
(M辿s tard, repetirem el pas 2 per als altres sis botons de nota.)
La vista en el Dissenyador de components s'hauria d'assemblar Figura 9-2.
Figura 9-2. Col揃locaci坦 de botons per crear un teclat
La pantalla del tel竪fon ha de ser similar, tot i que no hi haur cap espai buit entre els
dos botons de colors.
Afegir el component de so
No podem tenir un xil嘆fon sense sons, aix鱈 que cal crear un component de so,
deixant el seu nom com Sound1. Canvieu la propietat MinimumInterval del seu valor
predeterminat de 500 mil揃lisegons a 0. Aix嘆 ens permet reproduir el so amb la
freq端竪ncia que vulgueu, en lloc d'haver d'esperar mig segon (500 milisegons) entre
tocs. No estableixi la seva propietat Source, ho configurarem en l'editor de blocs.
Carregueu els arxius de so 1.wav i 2.wav de la carpeta Recursos 9 del tema 9 . Al
contrari que en els temes anteriors, on estava b辿 per canviar els noms dels arxius
de Media, 辿s important utilitzar aquests noms exactes per raons que aviat es faran
evidents. Pots carregar els restants sis arxius de so ara.
4. TEMA 9 4/16
Connexi坦 dels sons als botons
El comportament que necessitem en el programa 辿s per a un arxiu de so per
reproduir quan el corresponent bot坦 辿s premut. En concret, si es fa clic a Button1,
ens agradaria reproduir 1.wav, si es fa clic a Button2, ens agradaria reproduir 2.wav,
i aix鱈 successivament. Podem configurar aix嘆 en l'Editor de blocs, com es mostra a la
Figura 9-3 de la seg端ent manera:
1. Des de la pestanya My Blocs i el calaix Button1, arrossegament el bloc
Button1.Click.
2. Del calaix Sound1, arrossegueu i establiu el bloc Sound1.Source, col揃locant-lo en
el bloc Button1.Click.
3. Tecleja "text" per crear un bloc de text. (Aix嘆 辿s m辿s rpid que anar a la fitxa
integrada i despr辿s al calaix de text, tot i que podria funcionar tamb辿.) Establir el
valor de text a "1.wav" i el col揃loca-lo en el bloc Sound1.Source.
4. Afegir un bloc Sound1.Play.
Figura 9-3. Reproduir un so quan es prem un bot坦
Podr鱈em fer el mateix per Button2, com es mostra a la Figura 9-4 (nom辿s canviar el
valor de text), per嘆 el codi seria terriblement repetitiu.
Figura 9-4. L'addici坦 de m辿s sons
Un codi repetitiu 辿s un bon senyal que s'ha de crear un procediment, que ja ho ha
fet en el joc del tema 3 i el tema 5. En concret, crearem un procediment que pren un
nombre com a argument, estableix el Source de Sound1 a l'arxiu corresponent, i es
reprodueix el so. Aquest 辿s un altre exemple de refactoritzaci坦 de millora de la
implementaci坦 d'un programa sense canviar el seu comportament, un concepte
introdu誰t al tema 3. Podem utilitzar el calaix del bloc de text join(una versi坦
alternativa de make text) per combinar el nombre (per exemple, 1) i el text ".wav"
per crear el nom de fitxer adequat (per exemple, "1.wav").
5. TEMA 9 5/16
Aquests s坦n els passos per crear el procediment que necessitem:
1. Sota la fitxa integrada, aneu al calaix Definition i arrossegueu el bloc de
procediment.
2. Tornar al calaix Definition i arrossegueu un bloc de nom "arg" al socket to
procedure.
3. Feu clic a l'extrem dret "nom" i establir el nom de "number".
4. Feu clic a procediment i establir el nom de "PlayNote".
5. Arrossegueu el bloc de Sound1.Source Button1.Click a PlayNote a la dreta de
la paraula "do". El bloc Sound1.Play es mour amb ella.
6. Arrossegueu el bloc 1.wav en el pot d'escombraries.
7. Del calaix del text, arrossegueu el bloc join en el s嘆col Sound1.Source.
8. Escriu "number" i es mouen al s嘆col esquerra del bloc join (si no est ja all).
9. Des del calaix de text, arrossegueu el bloc de text en el s嘆col dreta del bloc
join.
10.Canvieu el valor de text a ".wav". (Recordeu que no heu d'escriure les
cometes).
11.A la pestanya My Blocks, aneu al My Definitions i arrossegueu un bloc call
PlayNote en el cos buit de Button1.Click.
12.Escriviu "1" i el poseu-lo al s嘆cul del "number".
Ara, quan es fa clic en Button1, el procediment PlayNote s'anomena, amb el seu
argument de nombre que t辿 el valor 1. S'ha d'establir Sound1.Source a "1.wav" i
reproduir el so.
Creeu un bloc Button2.Click similar amb una crida a PlayNote amb un argument de
2. (Podeu copiar el bloc PlayNote existent i avan巽ar en el cos de Button2. Feu clic, de
manera que assegureu-vos de canviar l'argument.) El programa ha de ser similar a
la Figura 9-5.
Figura 9-5. Creaci坦 d'un procediment per executar una nota
6. TEMA 9 6/16
Android per carregar els sons
Si vas provar l'anterior PlayNote, pots haver estat decebut per no escoltar el so que
s'esperava o en experimentar un retard inesperat. Aix嘆 辿s perqu竪 Android necessita
carregar sons en temps d'execuci坦, el que porta el seu temps, abans que puguin ser
reprodu誰ts. Aquest problema no va sorgir abans, perqu竪 els noms d'arxiu col揃locats
en propietat Source d'un component de so en el Dissenyador es carreguen
automticament en iniciar el programa. Com que no s'estableix Sound1.Source fins
que el programa s'ha iniciat, el proc辿s d'inicialitzaci坦 no es realitza. Hem de carregar
expl鱈citament els sons quan el programa s'inicia, com es mostra a la Figura 9-6.
Figura 9-6. Carregant sons quan l'aplicaci坦 s'inicia
Posa a prova la teva app. Ara b辿, si reinicia l'aplicaci坦 fent clic a " Connect
to Device..." a l'Editor de blocs, les notes han de reproduir-se sense
demora. (Si no es sent res, assegureu-vos que el volum dels Media al
tel竪fon no est en silenci.)
L'aplicaci坦 de les notes restants
Ara que ja tenim els dos primers botons i notes executades i en funcionament, afegir
els restants sis notes per tornar al Dissenyador i carregar els arxius de so
3.wav, 4.wav, 5.wav, 6.wav, 7.wav i 8.wav. A continuaci坦, crear sis nous botons,
seguint els mateixos passos com ho va fer abans, per嘆 l'establiment del seu text i
les seves propietats BackgroundColor de la seg端ent manera:
Bot坦3 (E, Rosa)
Bot坦4 (F, Taronja)
Bot坦5 (G, Groc)
Bot坦6 (A, Verd)
Bot坦7 (B, Cyan)
Bot坦8 (C, Blau)
Tamb辿 pots voler canviar la propietat de Button8, TextColor, a Blanc com es mostra
a la Figura 9-7, pel que 辿s m辿s llegible.
7. TEMA 9 7/16
Figura 9-7. Posar els botons restants i sons en el Dissenyador de components
De nou a l'Editor de blocs, feu clic a Crea blocs per a cada un dels nous botons amb
trucades apropiades a PlayNote. De la mateixa manera, afegir cada arxiu de so nou
per Screen.Initialize, com es mostra a la Figura 9-8.
Posa a prova la teva app. Ara ha de tenir tots els botons, i cada un
toca una nota diferent quan es fa clic.
Figura 9-8. Programaci坦 dels esdeveniments del bot坦 clic per correspondre a totes les tecles del teclat
8. TEMA 9 8/16
Enregistrament i reproducci坦 de notes
La reproducci坦 de notes amb botons 辿s divertit, per嘆 ser capa巽 de gravar i reproduir
can巽ons 辿s encara millor. Per dur a terme la reproducci坦, haurem de mantenir un
registre de les notes tocades. A m辿s de recordar les tonades (arxius de so) que es
van reproduint, tamb辿 ha de registrar la quantitat de temps entre les notes, o no
serem capa巽os de distingir entre dues notes tocades en successi坦 rpida i dues
reprodu誰des amb un silenci de 10 segons entre ells.
La nostra aplicaci坦 mantindr dues llistes, cadascuna de les quals tindr una entrada
per a cada nota que s'ha tocat:
Notes, que contindr els noms dels arxius de so en l'ordre en qu竪 van ser
reprodu誰ts.
Els temps que es registren els punts en el temps en qu竪 les notes van ser
reprodu誰des.
Nota. Abans de continuar, 辿s possible que vulgueu revisar llistes, que cobrim en el
tema 8.
Podem obtenir la informaci坦 de temps a partir d'un component del rellotge, que
tamb辿 s'utilitzar per cronometrar correctament les notes per a la reproducci坦.
Afegir els components
Al dissenyador, haurs d'afegir un component Rellotge i els botons Play i Reset, que
posarem en un HorizontalArrangement:
1. Arrossegueu un component del rellotge. Apareixer en la secci坦 "components
no visibles". Desmarqueu la propietat TimerEnabled perqu竪 no volem que el
seu temporitzador s'apagui fins que nosaltres li diguem que durant la
reproducci坦.
2. Anar a la categoria disposici坦 de la pantalla i arrossegueu un component
HorizontalArrangement sota el bot坦 existent. Indiqueu la propietat Width a
"Fill parent".
3. A la categoria Bsica, arrossegueu un bot坦. Canviar el nom PlayButton i
estableixi la seva propietat Text en "Play".
4. Arrossegueu un altre bot坦, col揃locant-lo a la dreta de PlayButton. Canvieu el
nom del nou bot坦 per ResetButton i estableixi la seva propietat Text en
"Reset". La vista de disseny ha de ser similar a la Figura 9-9.
9. TEMA 9 9/16
Figura 9-9. Afegir components per a la gravaci坦 i reproducci坦 de sons
Gravaci坦 de notes i horaris
Ara hem d'afegir el comportament correcte a l'Editor de blocs. Haurem de mantenir
una llista de les notes i els temps i afegir a la llista cada vegada que l'usuari prem un
bot坦.
1. Crea una nova variable anant a la pestanya Built-In i arrossegant un bloc def
variable al calaix Definition.
2. Feu clic a "variable" i canviar a "notes".
3. Obriu el calaix Lists i arrossegueu un bloc make a list, col揃locant en el s嘆cul
de def notes.
Aix嘆 defineix una nova variable anomenada "notes" a una llista buida. Repetiu els
passos per l'altra variable, que li doneu el nom de "times". Aquests nous blocs ha de
ser similar a la Figura 9-10.
Figura 9-10. Establiment de les variables per gravar notes
10. TEMA 9 10/16
Com funcionen els blocs
Cada vegada que es toca una nota, hem de salvar tant el nom de l'arxiu de so (per
les notes de la llista) i l'instant en el moment en qu竪 es va tocar (als temps de la
llista). Per registrar l'instant de temps, utilitzarem el bloc Clock1.Now, que retorna
l'instant actual al temps (per exemple, 12 de mar巽 de 2011, 08:33:14 AM), amb una
precisi坦 de mil揃lisegons. Aquests valors, obtinguts a trav辿s dels blocs Sound1.Source
i Clock1.Now, s'ha d'afegir a les llistes de notes i times, respectivament, com es
mostra en la figura 9-11.
Figura 9-11. Afegint els sons que es reprodueixen a la llista
Per exemple, si toques "Row, Row, Row Your Boat" [C C C D E], les llistes que acaben
de tenir cinc entrades, que poden ser:
Notes: 1.wav, 1.wav, 1.wav, 2.wav, 3.wav
Temps [dates omeses]: 12:00:01, 12:00:02, 12:00:03, 12:00:03.5 12:00:04,
Quan l'usuari prem el bot坦 Reset, volem que les dues llistes tornen al seu estat
original i buits. At竪s que l'usuari no veur cap canvi, 辿s bo afegir un bloc
Sound1.Vibrate petit, pel que sap que el clic de les tecles es va registrar. La figura 9-
12 mostra els blocs per aquest comportament.
Figura 9-12. Proporcionar informaci坦 quan l'usuari reinicia l'aplicaci坦
11. TEMA 9 11/16
Reproducci坦 de notes
Com experiment, primer anem a buscar la manera de posar en prctica la
reproducci坦 de la nota sense haver de preocupar-se pel temps. Podr鱈em fer aix嘆
mitjan巽ant la creaci坦 d'aquests blocs, com es mostra a la Figura 9-13:
Una variable count per fer un seguiment del que fem.
Un nou procediment, PlayBackNote, que reprodueix aquesta nota i passa a la
seg端ent.
Codi a executar quan es prem PlayButton que fica el count a 1 i crida
PlayBackNote llevat que no hi haja notes guardades.
Com funcionen els blocs
Aquesta pot ser la primera vegada que heu vist un procediment de fer una crida a si
mateix. Encara que a primera vista aix嘆 pot semblar fals, 辿s en realitat un concepte
important en programaci坦 de gran abast, la crida recursiva.
Per tenir una millor idea de com funciona la recursivitat, anem pas a pas el que
succeeix quan un usuari toca tres notes (1.wav, 3.wav i 6.wav) i despr辿s prem el
bot坦 Play. En primer lloc, PlayButton.Click comen巽a a funcionar. Com que la longitud
de les notes de la llista 辿s 3, que 辿s m辿s gran que 0, el recompte s'estableix en 1, i
PlayBackNote es cridat:
1. La primera vegada que PlayBackNote es crida, count = 1
a) Sound1.Source s'estableix en el primer element de notes, que 辿s 1.wav.
b) Sound1.Play es cridat, reproduint aquesta nota.
c) Ja que count (1) < la longitud de les notes (3), count s'incrementa a 2.
PlayBackNote es crida de nou.
12. TEMA 9 12/16
Figura 9-13. Reproducci坦 de les notes gravades
2. La segona vegada que PlayBackNote es crida, count = 2:
a) Sound1.Source s'estableix en el segon element de notes, que 辿s 3.wav.
b) Sound1.Play es crida, reproduint aquesta nota.
c) Ja que count (2) < la longitud de les notes (3), count s'incrementa a 3.
PlayBackNote es crida de nou.
3. La tercera vegada que PlayBackNote es crida, count = 3:
a) Sound1.Source s'estableix en el tercer element de notes, que 辿s 6.wav.
b) Sound1.Play es crida, reproduint aquesta nota.
c) Ja que count (3) no 辿s menor que la longitud de les notes (3), no passa res
m辿s, i es completa la reproducci坦.
Nota. Encara que la recursi坦 辿s efica巽, tamb辿 pot ser perill坦s. Com experiment
mental, pregunteu-vos qu竪 hauria passat si el programador haguera oblidat inserir
als blocs en PlayBackNote que incrementara el comptador.
Si b辿 la recursi坦 辿s correcta, no 辿s un problema diferent amb l'anterior exemple:
gaireb辿 no passa temps entre una crida a Sound1.Play i la seg端ent, de manera que
cada nota es veu interromput per la nota seg端ent, a excepci坦 de l'炭ltima. Cap nota
(excepte l'炭ltim) se li permet completar abans que el Source de Sound1 es canvia i
es torna a cridar Sound1.Play. Per obtenir el comportament correcte, hem d'aplicar
un retard entre les cridades a PlayBackNote.
13. TEMA 9 13/16
Reproducci坦 de Notes amb retards adequats
Anem a aplicar la demora d'ajustar el temporitzador en el rellotge per la quantitat de
temps entre la nota actual i la seg端ent nota. Per exemple, si la nota seg端ent es
reprodueix 3.000 mil揃lisegons (3 segons) despr辿s de la nota actual, establirem
Clock1.TimerInterval a 3.000, despr辿s de les quals PlayBackNote hauria de ser cridat
de nou. Feu els canvis que es mostren a la Figura 9-14 per al cos del bloc if en
PlayBackNote, i crear i omplir el controlador d'esdeveniments Clock1.Timer, que diu
el que ha de passar quan el temporitzador s'apaga.
Figura 9-14. Afegir els retards entre les notes
14. TEMA 9 14/16
Com funcionen els blocs
Suposem el seg端ent contingut de les dues llistes:
Notes: 1.wav, 3.wav, 6.wav
Temps: 12:00:00, 12:00:01, 12:00:04
Com mostra la Figura 9-14, PlayButton.Click estableix count a 1 i crida a
PlayBackNote.
1. La primera vegada que PlayBackNote es cridat, count = 1:
a) Sound1.Source s'estableix en el primer element de notes, que 辿s "1.wav".
b) Sound1.Play es crida, reproduint aquesta nota.
c) Ja que count (1) < la durada de les notes (3),
Clock1.TimerInterval s'estableix en la quantitat de temps entre el primer
(00:00:00) i el segon element en els temps (00:00:01): 1 segon.
count s'incrementa a 2.
Clock1.Timer est activat i comen巽a el compte enrere.
Nom辿s passa durant 1 segon, en el qual Clock1.Timer s'acabi el temps,
desactivar temporalment el temporitzador i cridant PlayBackNote.
2. La segona vegada que PlayBackNote es crida, count3 = 2:
a) Sound1.Source s'estableix en el primer element de notes, que 辿s "1.wav".
b) Sound1.Play es crida, reproduint aquesta nota.
c) Ja que count (2) < la durada de les notes (3),
Clock1.TimerInterval s'estableix en la quantitat de temps entre la segona
(00:00:01) i el tercer element en els temps (00:00:04): 3 segons.
count s'incrementa a 3.
Clock1.Timer est activat i comen巽a el compte enrere.
Nom辿s passa durant 3 segon, en el qual Clock1.Timer s'acabi el temps,
desactivar temporalment el temporitzador i cridant PlayBackNote.
3. El PlayBackNote tercera vegada que es diu, compte = 3:
a) Sound1.Source s'estableix en el tercer element de notes, que 辿s "6.wav".
b) Sound1.Play es crida, reproduint aquesta nota.
c) Ja que count (3) < la durada de les notes (3),no passa res m辿s.
La reproducci坦 s'ha completat.
15. TEMA 9 15/16
Variacions
Aquests s坦n alguns dels escenaris alternatius per explorar:
Actualment, no hi ha res que impedeixi que un usuari faci clic ResetButton
durant la reproducci坦, el que far que el programa es bloquegi. (Es pot saber
per qu竪?). Modificar PlayButton.Click pel que desactiva ResetButton. Per
tornar a activar quan la can巽坦 estigui completa, canviar el bloc if en
PlayButton.Click en un bloc ifelse, i tornar a habilitar ResetButton en la part
"else".
De la mateixa manera, l'usuari pot fer clic en l'actualitat PlayButton mentre
una can巽坦 est reproduint-se. (Pots imaginar el que passar si ho fa?) Que
sigui inhabilitat PlayButton.Clic PlayButton desactiva i canvia el seu text a
"reproduint ..." Es pot tornar a activar i restablir el text en un bloc de ifelse,
com es descriu en el punt anterior.
Afegiu un bot坦 amb el nom d'una can巽坦, com "Per a Elisa". Si l'usuari fa clic,
omplir les llistes notes i times amb els valors corresponents, estableixi count a
1, i cridar a PlayBackNote. Per establir el moment adequat, trobareu el bloc
CLOCK1.MakeInstantFromMillis 炭til.
Si l'usuari prem una nota, va i fa una mica m辿s, i torna a apar竪ixer hores m辿s
tard i prem una nota addicional, les notes seran part de la mateixa can巽坦, que
probablement no 辿s el que l'usuari tenia previst. Millorar el programa de
gravaci坦 de parada (1) despr辿s d'un interval de temps raonable, com ara un
minut, o (2) posar un l鱈mit a la quantitat de temps utilitzat per
Clock1.TimerInterval usant el bloc mxim del calaix Math.
Indicar visualment quina nota est reproduint-se en canviar l'aparen巽a del
bot坦 - per exemple, mitjan巽ant el canvi del seu text, BackgroundColor, o
ForegroundColor.
16. TEMA 9 16/16
Resum
Aquestes s坦n algunes de les idees que hem cobert en aquest tutorial:
Pot reproduir diferents arxius d'udio d'un component de so nom辿s canviant
la seva propietat Source. Aix嘆 ens ha perm竪s tenir un component de so en
lloc de huit. Nom辿s heu de carregar els sons en la inicialitzaci坦 per evitar
demores (Figura 9-6).
Les llistes poden oferir un programa amb la mem嘆ria, amb un registre
d'accions de l'usuari emmagatzemades a la llista i despr辿s recuperat i
reprocessat. Utilitzem aquesta funci坦 per gravar i reproduir una can巽坦.
El component del rellotge pot ser utilitzat per determinar l'hora actual. Restar
dos valors de temps ens d坦na la quantitat de temps entre dos esdeveniments.
La propietat del rellotge TimerInterval es pot establir dins del programa, com
ara la manera com s'estableix la durada de temps entre les arrencades de
dues notes.
No nom辿s 辿s possible, de vegades desitjable per a un procediment el fer-se
una crida a si mateixa. Aquesta crida recursiva 辿s una t竪cnica de gran abast.
En escriure un procediment recursiu, assegureu-vos que hi ha un cas de
refer竪ncia en qu竪 el procediment acaba, en lloc de cridar a si mateix, o el
programa es repetir infinitament.