I'm adapting a script where for each soundfile and textgrid in a folder I go through each syllable label, divide the label into three equal parts and then extract the pitch at the midpoint of each part and save the information about midpoints and corresponding pitches to a textfile, which I save in the same directory. When I run the script the generated text file only contains the header. Would you be able to identify the bug that's preventing me from accessing and/or saving the information I'm trying to extract? Below I've pasted the bit of the code where I'm calculating the midpoints and extracting pitch at those points.
# Write a row with column titles to the result file:
titleline$ = "Filename Syllable Midpoint1 Midpoint2 Midpoint3 Pitch1 Pitch2 Pitch3'newline$'"
fileappend "'resultfile$'" 'titleline$'
# Go through all the sound files, one by one:
for i from 1 to numberOfFiles
filename$ = Get string... ifile
# A sound file is opened from the listing:
Read from file: 'sound_directory$''filename$'
# Starting from here, you can add everything that should be
# repeated for every sound file that was opened:
soundname$ = selected$ ("Sound", 1)
To Pitch... Time_step Minimum_pitch Maximum_pitch
# Open a TextGrid by the same name:
gridfile$ = "'textGrid_directory$''soundname$''textGrid_file_extension$'"
if fileReadable (gridfile$)
Read from file... 'gridfile$'
# Find the tier number that has the label given in the form:
call GetTier 'tier$' tier
numberOfIntervals = Get number of intervals... tier
# Pass through all intervals in the selected tier:
for interval to numberOfIntervals
label$ = Get label of interval... tier interval
if label$ <> ""
# if the interval has an unempty label, get its start and end:
start = Get starting point... tier interval
end = Get end point... tier interval
dur = end - start
# divide interval into 3 segments
segdur = dur/3
midpoint1 = start + (segdur/2)
midpoint2 = start + segdur + (segdur/2)
midpoint3 = start + (segdur*2) + (segdur/2)
# get pitch at each midpoint
Move cursor to: midpoint1
pitch1 = Get pitch... midpoint1
Move cursor to: midpoint2
pitch1 = Get pitch... midpoint2
Move cursor to: midpoint3
pitch1 = Get pitch... midpoint3
# Save result to text file:
resultline$ = "'soundname$' 'label$' 'midpoint1' 'midpoint2' 'midpoint3' 'pitch1' 'pitch2' 'pitch3''newline$'"
fileappend "'resultfile$'" 'resultline$'
select TextGrid 'soundname$'
endif
endfor
# Remove the TextGrid object from the object list
select TextGrid 'soundname$'
Remove
endif
# Remove the temporary objects from the object list
select Sound 'soundname$'
plus Pitch 'soundname$'
Remove
select Strings list
endfor
Remove
Thank you for your advice! After a few hours of fighting with the code, I managed to make the script work. Since it's been a few days and no one has posted a full answer, I thought I'd post mine, for all it's worth.
The problem was that I wasn't selecting pitch as an object, while wanting to extract pitch. So first select pitch select Pitch 'soundname$'
and then get the pitch value at the specified time pitch1 = Get value at time... time_point Hertz linear
. Hope this helps other people.
For full disclosure, this script has been adapted from Mietta Lennes' Github website with Praat script templates (https://github.com/lennes).
# Write a row with column titles to the result file:
titleline$ = "Filename Syllable Midpoint1 Midpoint2 Midpoint3 Pitch1 Pitch2 Pitch3'newline$'"
fileappend "'resultfile$'" 'titleline$'
fileappend "'resultfile$'" "'numberOfFiles'"
# Go through all the sound files, one by one:
for ifile to numberOfFiles
filename$ = Get string... ifile
fileappend "'resultfile$'" 'sound_directory$''filename$'
# A sound file is opened from the listing:
Read from file... 'sound_directory$''filename$'
# Starting from here, you can add everything that should be
# repeated for every sound file that was opened:
soundname$ = selected$ ("Sound", 1)
To Pitch... time_step minimum_pitch maximum_pitch
# Open a TextGrid by the same name:
gridfile$ = "'textGrid_directory$''soundname$''textGrid_file_extension$'"
if fileReadable (gridfile$)
Read from file... 'gridfile$'
# Find the tier number that has the label given in the form:
call GetTier 'tier$' tier
numberOfIntervals = Get number of intervals... tier
# Pass through all intervals in the selected tier:
for interval to numberOfIntervals
label$ = Get label of interval... tier interval
if label$ <> ""
# if the interval has an unempty label, get its start and end:
start = Get starting point... tier interval
end = Get end point... tier interval
dur = end - start
# divide interval into 3 segments
segdur = dur/3
midpoint1 = start + (segdur/2)
midpoint2 = start + segdur + (segdur/2)
midpoint3 = start + (segdur*2) + (segdur/2)
# get pitch at each midpoint
select Pitch 'soundname$'
pitch1 = Get value at time... midpoint1 Hertz linear
pitch2 = Get value at time... midpoint2 Hertz linear
pitch3 = Get value at time... midpoint3 Hertz linear
# Save result to text file:
resultline$ = "'soundname$' 'label$' 'midpoint1' 'midpoint2' 'midpoint3' 'pitch1' 'pitch2' 'pitch3''newline$'"
fileappend "'resultfile$'" 'resultline$'
select TextGrid 'soundname$'
endif
endfor
# Remove the TextGrid object from the object list
select TextGrid 'soundname$'
Remove
endif
# Remove the temporary objects from the object list
select Sound 'soundname$'
plus Pitch 'soundname$'
Remove
select Strings list
endfor