際際滷

際際滷Share a Scribd company logo
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
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坦.
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.
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").
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
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.
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
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.
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
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坦
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.
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.
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
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.
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.
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.

More Related Content

T9 xilofon

  • 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.