* A Quick Look at Praat Scripting [#ncd89e32]
- This page is intended as a brief but somewhat "unorthodox" introduction to Praat scripting.
-- The primary target readers are ones who have some (partial) knowledge about programming/script language (e.g., C, perl, awk, python, VBA), and thus know, say, what ''array/if (conditional)/for (iteration, loop)'' mean. If you new to programming, see other sources((Highly recommended: Ingmar Steiner (2006-2007) '''Automatic Speech Data Processing with Praat'''. Lecture Notes. (PDF file is available at: http://www.coli.uni-saarland.de/~steiner/praat/lecturenotes.pdf .) )).
-- The contents are fragmentary. For unknown commands, consult ''Help'' in Praat first. It provides you valuable information.

''Table of Contents''

** Hello world [#xbb42d70]
+ Choose ''New Praat script'' from the ''Praat menu'' to open the ScriptEditor window.
+ Type:
 echo Hello world
+ Choose ''Run'' from the ''Run menu'' (or type C-r) to execute.

- '''Cf.''' [[Scripting 3.1. Hello world>http://www.fon.hum.uva.nl/praat/manual/Scripting_3_1__Hello_world.html]] (official site)

** Language Specification Worth Mentioning [#b3a53f90]

*** General [#k6026e40]

//- No declaration is required to use a variable.

- Output to the Info Window: ''echo'', ''printline'', and ''print''
--The three scripts below work in the same way (''clearinfo'' clears the Info window):
 echo Hello world
 printline Hello world
 print Hello world'newline$'
-- The two scripts below, however, do not work in the same way.
 echo This is the first sentence.
 echo This is the second sentence.
 printline This is the first sentence.
 printline This is the second sentence.
- Comments
-- "''#''" and "'';''" are comment characters. Praat ignores the comment characters and after them, to the end of the line.
-- Use ";" instead of "#", if you want to write a comment after a statement in the same line.
 n = 0 
 if n = 0 ;conditional
     printline Hello world
 # An error occurs if ";" is replaced with "#".
--- Some commands, however, cannot be followed by a comment in the same line. For example,
 n = 0 
 if n = 0 ;conditional
     printline Hello world  ; This sentence is also displayed on the Info window.
// # Hello world script in Praat
// echo Hello world   ; This sentence is also displayed on the Info window.

- Variable Types
-- numerics and strings
--- Variables (either numeric or string) must begin with lower cases.
--- String variables must end with ''$''.
 str$ = "foo"
 num = 3
 ### statements below causes an error. ###
 #Str$ = "foo"  ; it begins with Upper case.
 #Num = 3
 #str = "foo"   ; it lacks $, though it has a string.
-- Arrays are also available.
--- The indices are enclosed with ''"["'' and ''"]"''
--- Like scalars, arrays must begin with lower cases.
--- Similarly, arrays which store strings must have ''$'' before ''"["''
 str$[1] = "foo"
 str$[2] = "bar"
 str$[3] = "hoge"
 str$[4] = "piyo"
 num[1] = 3
 num[2] = 34
 num[3] = 22
 num[4] = 98
 ### statements below causes an error. ###
 #str[1] = "foo"   ; it lacks $, though it has a string.
 #Num[4] = 98      ; it begins with Upper case.
-- Unfortunately, hashes (or associative arrays) are not available.

- Variable Substitution
-- Variables are substituted when put between single quotes.
 fruit$ = "apple(s)"
 count = 3
 echo I bought 'count' 'fruit$'.
--- ''NOTE1:'' No double quotations are required to literals in ''print'' (and ''printline'' and ''echo''). Compare
 fruit$ = "apple(s)"
 count = 3
 echo "I bought" 'count' 'fruit$' "."
--- ''NOTE2:'' If the index in an array is also a variable, a dummy variable is required.
 str$[1]= "apple"
 str$[2]= "orange"
 str$[3]= "melon"
 for i from 1 to 3
     hop$ = str$[i]   ;; a dummy variable
     printline 'i''tab$''hop$'

- Operators
-- Comparison Operators
--- The "equal" operator is "="((In fact, "==" can also be used as an equal operator.)), identical with the assignment operator.
 num = 3
 str$ = "hoge"
 if num = 3
     printline 'num'
 if str$ = "hoge"
     printline 'str$'

-- Strings
--- Basically, operators used for numerics are also applicable to strings. 
--- Interestingly, not only string "addition" (i.e., concatenation), but also string "subtraction" (i.e., truncation) is possible, using "+" and "-".
 str1$ = "abc"
 str2$ = "def"
 str3$ = "c"
 str4$ = str1$ + str2$
 str5$ = str1$ - str3$
 printline 'str4$'
 printline 'str5$'
--- result:
-- autoincrement/autodecrement operators (e.g., i++, i--) are not available.

- Conditional statements
-- ''if(-elsif)(-else)-endif''
--- ''NOTE:'' ''elsif'' (or ''elif''), rather than ''elseif'' and ''else if''.

- Loops
-- ''for i (from m) to n-endfor'', ''while-endwhile'', ''repeat-until'' 
--- ''from m'' in ''for'' can be omitted when m = 1.
--- It is not possible to decrement the loop counter in ''for''-loop. Use ''while-endwhile'', instead.
 n = 10
 while n >= 1
     printline 'n'
     n = n-1
--- There seems to be no statement which escapes from the loop (''break'' in C, or ''last'' in perl). Instead, you can substitute the loop counter (or something) with a value which does not satisfy the loop condition, for example.
 max = 10
 for i to max
     if i = 5
         i = max+1      ; escape from the loop
         printline 'i'

- ''goto'' is %%not%% available. (modified July 17, 2012)
- ''goto'' is %%not%% available. &color(red){(modified July 17, 2012)};
 # the "goto" command in Praat scripts
 for i to 10
     if i mod 2 = 0
         goto next
     printline 'i'
     label next

- Subroutines: ''procedure-endproc''

- Regular expressions are available in some string functions:
-- ''index_regex(str$,regex$)''
-- ''rindex_regex(str$,regex$)''
-- ''replace_regex$(str$,regex$,substr$,n)''
--- ''NOTE:'' Functions which return strings (not numerics) require ''$''.
 str$ = "abcdefg"
 regex$ = "b[^e]*"
 if index_regex(str$,regex$) <> 0
     printline match
     printline not match

- Generally, index numbers start at 1 (not 0).
-- Check, for example, the value of the following string functions:
--- ''mid$(str$,index,len)''
 str$ = "abcdefg"
 len = length(str$)
 for i from 1 to len
     hop$ = mid$(str$,i,1)
     printline 'i''tab$''hop$'
--- ''index(str$,substr$)''
 str$ = "abcdefg"
 substr$ = "bcd"
 n = index(str$,substr$)
 printline 'n'

- File IO
-- ''text$ <'' '''filename''' (read the contents of '''filename''')
 file$ = "d:\foo.txt"
 text$ < 'file$'
 print 'text$'
-- ''text$ >'' '''filename''' (make a new file and write the contents of text$)
-- ''text$ >>'' '''filename''' (add the contents of text$ to '''filename''')
 file$ = "d:\bar.txt"
 text$ = "praat scripting is fun." + "'newline$'"
 text$ > 'file$'
 #text$ >> 'file$'
-- ''NOTE:'' Consider the use of ''Object'', rather than "''<''" or "''>''". Very often, Object manipulation is easier and more straightforward. For Object, see below.
//, especially when it contains multiple lines .

*** Particular to Praat (1): Object Manipulation [#e34387b5]
RIGHT:&color(red){Those who conquer object manipulation techniques conquer Praat scripting. (The present author)};

*** Particular to Praat (2): form-endform [#z692053a]
- ''form'' and ''endform''

//- ''system''
// # Windows
// system dir > hoge.txt && start notepad.exe hoge.txt
//- ''nocheck'' '''command'''
//-- equivalent to ''on error resume next'' in some scripts
//- ''exit'' ('''message''')  and ''pause'' ('''message''') 

** Functions of ScriptEditor [#m4b8a142]
- History
- Run a script

** Other ways to execute a script [#c753a9f4]

- praatcon.exe (in Windows)
- sendpraat.exe
-- scripts can be executed by using sendpraat.exe or praatcon.exe.
-- You may use option -a in praatcon.exe if you handle Unicode. (cf. [[Re: [praat-users] Bug in latest praatcon version (by Paul Boersma)>http://uk.groups.yahoo.com/group/praat-users/message/4950]]

Front page   Edit Diff Backup Upload Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes