scripting en praat

Anuncio
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
Descargar