scripting en praat sesión n.3 el fin del principio José Joaquín ATRIA Universidad de Tokyo de Estudios Extranjeros jjatria@gmail.com www.pinguinorodriguez.cl ¿de dónde venimos? en la sesión pasada vimos: ● manipulación de objetos ● selección, creación, modificación ● queries numéricos y de texto ● buenas prácticas ¿a dónde vamos? hoy veremos cómo usar eso en praat: ● funciones numéricas y de texto ● procedures ● interacción fuera de praat ● con el usuario ● con la estructura de archivos parte 1 la caja de herramientas la caja de herramientas ● los scripts realizan tareas ● las herramientas facilitan tareas ● las herramientas son especializadas ● las herramientas de praat son las funciones ¿qué es una función? ● ● una función es un sub-programa que realiza una tarea compleja puede usarse como una instrucción simple ● acepta argumentos ● entrega resultados que por lo mismo pueden ser usados en la asignación de una variable ¿qué es una función? ● son una poderosa herramienta si un script es una serie de instrucciones simples que cumple una tarea compleja, una función es una manera de saltarnos pasos podemos realizar algunas tareas complejas sin tener que hacerlas nosotros mismos Create Sound from formula... sonido 1 0 1 44100 ...1/2*sin(2*pi*377*x)+randomGauss(0,0.1) ¿cómo se identifica una función? ● la manera más fácil de hacerlo es porque están seguidas de paréntesis sonidos = numberOfSelected (“Sound”) ¿qué características tienen? ● ● ● ● se invocan por nombre normalmente a la derecha de una asignación de variable (rvalue) reciben argumentos (que pueden ser el resultado de otras funciones) no siempre necesitan argumentos raiz = sqrt (2) tmp = round (raiz) printline 'tmp' = raiz = round (sqrt (2)) printline 'raiz' ¿qué características tienen? ● ● todas las funciones entregan un valor las funciones numéricas entregan valores numéricos, las de string valores de string ¡fíjense en el nombre de la función! los sospechosos de siempre a decir verdad, ya hemos visto algunas: ● selected (a$, b) ● selected$ (a$, b) ● numberOfSelected (a$) ● round (a) ● sqrt (a) algunas funciones útiles ● length (a$) entrega el largo en caracteres de un string a$ = "un string cualquiera" b$ = "otro string" largoA = length (a$) largoB = length (b$) if largoA > largoB printline "'a$'" es mas largo que "'b$'" else printline "'b$'" es mas largo que "'a$'" endif algunas funciones útiles ● left$ (a$, b); right$ (a$, b) entregan un string con los b caracteres de más a la izquierda o a la derecha de a$ for i to numeroDeVerbos terminacion$ = right$ (verbo'i'$, 2) tmp$ = verbo'i'$ if left$ (terminacion$, 1) = "a" printline 'tmp$' es de 1era conjugacion elsif left$ (terminacion$, 1) = "e" printline 'tmp$' es de 2da conjugacion elsif left$ (terminacion$, 1) = "i" printline 'tmp$' es de 3era conjugacion elsif right$ (terminacion$, 1) <> "r" printline 'tmp$' no es un verbo! endif endfor algunas funciones útiles ● mid$ (a$, b, c) entrega un string con los c caracteres desde el caracter número b en a$ vocales$ = "aeiou" largo = length (vocales$) a$ = "" for i to largo a$ = a$ + mid$ (vocales$, i, 1) if i < largo a$ = a$ + "-" endif endfor printline 'a$' el burro sabe mas que tu! algunas funciones útiles ● index (a$, b$) entrega el índice de la primera ocurrencia de b$ en a$. entrega 0 si es que b$ no está en a$ n = Get number of intervals... 1 for i to n vocales$ = "aeiou" etiqueta$ = Get label of interval... 1 i if index (vocales$, etiqueta$) > 0 printline Es vocal: 'etiqueta$' endif endfor index () tiene una función hermana que entrega el índice de la última ocurrencia de un string en otro: rindex () otras funciones útiles ● fixed$ (a, b) y percent$ (a, b) entregan un string con el valor de a, con b cifras después de la coma (en otras palabras, convierten valores numéricos en strings) ● date () da la fecha y hora actual otras funciones útiles ● extractNumber (a$, b$) busca un valor numérico en a$ que siga el contenido de b$ (en otras palabras, convierte strings en valores numéricos) ● extractWord$ (a$, b$) entrega un string con la palabra sin espacios en a$ que siga a b$ ● extractLine$ (a$, b$) entrega un string con lo que siga en a$ después de b$ hasta un newline$ otras funciones útiles ● hertzToSemitones (a) entrega un valor en semitonos correspondiente al valor de a en Hz (relativo a 100Hz) ● semitonesToHertz (a) realiza la operación inversa ● abs (a) entrega el valor absoluto de a (la magnitud sin signo) ¿y si no existe una función? si uno tiene que hacer algo para lo que no existen ni funciones ni botones, uno tiene que hacerlo uno mismo hay dos maneras de hacerlo: ● escribiendo procedures ● escribiendo scripts y luego usándolos con include o con execute ... pero esto se escapa a nuestro taller. pueden mirarlo ustedes mismos en el manual de praat ¿qué es un procedure? ● ● ● si uno tiene que hacer una tarea repetitiva en praat uno usa un script si uno tiene que hacer una tarea repetitiva en un script usa un procedure un procedure es como un script dentro de un script ¿cómo se escribe un procedure? ● se declara procedure NombreDelProcedure [variables] … endproc ● se invoca call NombreDelProcedure [valores] ejemplo 1 palabra$ = "uno" call Medir palabra$ = "dos" call Medir palabra$ = "tres" call Medir procedure Medir largo = length (palabra$) printline 'palabra$' tiene 'largo' caracteres endproc pero las funciones aceptan argumentos... ejemplo 1 ● ● ● palabra$ es una variable global, accesible desde todas partes del script Medir fue escrito del modo más simple que se puede, por lo que es exactamente lo mismo que copiar el código del script cada vez que se hace call aunque es cosa de estilo personal, yo prefiero marcarlos con mayúsculas ejemplo 2 palabra$ = "mi palabra no cambia" printline 'palabra$' call Medir uno call Medir dos call Medir tres printline 'palabra$' procedure Medir .palabra$ largo = length (.palabra$) printline '.palabra$' tiene 'largo' caracteres endproc pueden no ser verdaderas funciones (y no lo son) pero pueden ser usadas como una ejemplo 2 ● palabra$ sigue siendo global ● pero ahora Medir trabaja con .palabra$ ● .palabra$ es una variable local ● en praat, las variables locales son accesibles globalmente (.palabra$ es lo mismo que Medir.palabra$) ● sirven para controlar las variables a las que un procedure tiene acceso parte 2 rompiendo la burbuja interacción con el usuario tal y como existen herramientas para facilitar tareas dentro del script, las hay para facilitar la comunicación con el usuario principalmente son: ● echo y printline ● exit ● form interacción con el usuario ● echo TEXTO y printline TEXTO imprimen y añaden información a la pantalla info, respectivamente ● exit TEXTO termina la ejecución del script* e imprime un mensaje de error al usuario en caso de haberlo * lo que lo hace muy útil para interrumpir loops interacción con el usuario ● form … endform form permite presentarle al usuario un cuadro en donde establecer los parámetros del script form Título... natural enteroPositivo valorPorDefecto real numeroReal valorPorDefecto ... word stringSinEspacios valorPorDefecto text string valororDefecto choice selecionMultiple valorPorDefecto button Texto button Texto comment Un comentario explicativo etc... endform interacción con archivos ● en cuanto botones, comandos como ● Read from file... ● Open long sound file... ● Save as text file... están disponibles desde un script ● pero praat permite hacerle modificaciones más ambiciosas a la estructura de archivos interacción con archivos ● fileReadable (a$) entrega 1 si el archivo indicado por a$ existe y es legible (usa paths relativos) ● createDirectory (a$) crea el directorio especificado en a$ ● deleteFile (a$) borra el archivo a$ si es que existe interacción con archivos objeto$ = selected$ ("Sound") nombre$ = extractLine$ (objeto$, "Sound ") archivo$ = nombre$ + ".wav" archivoExiste = fileReadable (archivo$) if archivoExiste = 1 and reemplazar = 1 deleteFile (archivo$) # filedelete archivo$ elsif archivoExiste = 1 and reemplazar = 0 exit El archivo 'archivo$' ya existe endif Save as WAV file... archivo$ printline 'archivo$' ha sido guardado interacción con archivos ● a$ > b$ graba el contenido de a$ en el archivo indicado en b$ ● a$ >> b$ añade el contenido de a$ al archivo b$, y si este no existe lo crea ● a$ < b$ guarda el contenido de b$ en a$ ¡ojo! a$ > b$ no es lo mismo que a > b interacción con archivos ● fileappend a$ b$ añade el contenido de b$ a a$ ● filedelete b$ borra el archivo b$ si es que existe estas no son funciones: en el manual se las llama directivas interacción con archivos archivoconf$ = "config.ini" a = fileReadable (archivoconf$) if a config$ < archivoconf$ altura = extractNumber (config$, "Altura=") ancho = extractNumber (config$, "Ancho=") nombre$ = extractLine$ (config$, "Nombre=") else ejemplo$ = "Variable=valor'newline$'" ejemplo$ > config.ini exit 'archivoconf$' no existe'newline$' ...ejemplo ha sido creado'newline$' endif ¿notaron la tercera línea? las últimas funciones ● chooseReadFile$ (a$) ● chooseWriteFile$ (a$, b$) abren sendos menús de título a$ en el que respectivamente se pide un archivo para leer y uno con el nombre sugerido b$ para escribir ● chooseDirectory$ (a$) abre un menú para seleccionar un directorio en praat, / funciona como delimitador sin importar el sistema sobre el que se corra las últimas funciones archivo$ = "sound.wav" largo = length (archivo$) punto = index (archivo$, ".") archivo2$ = left$ (archivo$, punto-1) ...+ "2" ...+ right$ (archivo$, (largo-punto)+1) if !fileReadable (archivo$) archivo$ = chooseReadFile$ ...("Abrir sonido...") if archivo$ = "" exit endif endif Read from file... 'archivo$' Play guardar$ = chooseWriteFile$ ...("Guardar en...", archivo2$) if guardar$ != "" Save as WAV file... 'guardar$' endif tareas ● lean el manual de praat ● lean scripts de otras personas ● escriban scripts propios ● ● ● piensen en cómo se podría hacer una tarea con un script incluso si no lo usan si se les ocurre como, y resulta útil, háganlo si no se les ocurre cómo... ¡inténtenlo! en el peor de los casos van a entender mejor por qué no pueden hacerlo todavía otros recursos los scripts de ejemplo de esta y las demás sesiones (así como esta presentación y la solución de las tareas) estan disponibles en http://www.pinguinorodriguez.cl/tallerpraat.html la documentación de praat tiene muchísima información sobre funciones y otras herramientas: http://www.fon.hum.uva.nl/praat/manual/Formulas_4__Mathematical_functions.html http://www.fon.hum.uva.nl/praat/manual/Formulas_5__String_functions.html otros recursos también pueden suscribirse a la lista de correos de usuarios de praat, en donde a menudo aparecen dudas interesantes, y se tiene la oportunidad de devolverle a la comunidad http://uk.groups.yahoo.com/group/praat-users/ o enviar correos directamente a la lista a praat-users@eGroups.com