0

I'm new to praat scripting so bear with me: I have a for loop set up and I want to extract data from three tiers. My first two tiers work beautifully but I'm having trouble with the third tier.

So in the third tier, at a given point in the loop, there could either be 1 or 2 elements, (My linguistics researcher is having me write this; I don't have a full understanding of what exactly I'm extracting) and I don't know how to check how many elements there are. Is there a function I can use that allows me to get the number of elements at a given interval? My line of thought at the moment is get the number of elements in the third tier at that point in the loop. If there is only one, get that one, assign it to the correct variable name, and move on. If there are two, grab both.

Dan
  • 11
  • 3

1 Answers1

0

I can think of two ways to do this, "manually" and by extracting parts of the TextGrid.

Let's imagine (for clarity) that you want to count the number of points that fall within a given interval. There are some differences between this and counting intervals that fall within intervals, but baby steps.

Manually

What I mean by manually is that you can get the index of the "first" point within your interval (the first point after the beginning of the interval), and the index of the "last" point, and then just subtracting (beware of fencepost errors!). If the first is 3 and the last is 8, you know there are 6 points in your interval.

Let's assume we have this:

textgrid = selected("TextGrid")
main_tier = 1 ; The tier with the main interval
sub_tier  = 2 ; The tier with the elements you want to count
interval  = 3 ; The interval in the main tier

start = Get start point: main_tier, interval
end   = Get end point:   main_tier, interval

Then we can do this:

first = Get high index from time: sub_tier, start
last  = Get low index from time:  sub_tier, end

total = last - first + 1
appendInfoLine: "There are ", total, " points within interval ", interval

(Or you could use the "Count points in range..." command in the tgutils CPrAN plugin).

If you were counting intervals, you'd have to change that slightly:

first = Get high interval at time: sub_tier, start
last  = Get low interval at time:  sub_tier, end

Or, if you wanted to count only those intervals that fall entirely within your main interval

first = Get high interval at time: sub_tier, start
last_edge = Get interval edge from time: sub_tier, end
last = last_edge + 1

Extracting parts

An entirely different approach would be to use the "Extract part..." command for TextGrids. You can extract the part of the TextGrid that falls within your time window, and then work with that part only. Counting the number of intervals in that part would then simply be a matter of counting the total number of intervals in that new TextGrid.

Of course, this does not check whether your the intervals that are considered to be within are entirely within.

A simple example:

Extract part: start, end, "yes"
# And then you just count the intervals
intervals = Get number of intervals: sub_tier
# or points
points    = Get number of points:    sub_tier

If you want to do this repeatedly (eg. for each of the intervals in your main tier), the tgutils plugin mentioned above has a script to "explode" TextGrids. Although the name might be a bit unnerving, this just separates a TextGrid into interval-sized chunks using the intervals in a given tier (by calling the same command mentioned above). As an example, if you "explode" a TextGrid using an interval tier with 5 intervals, you'd get as a result 5 smaller TextGrids, corresponding to each of the original intervals.

The script can preserve the time stamps of the resulting TextGrids, to make it easier to refer back to the original. And if run with a TextGrid and a Sound selected, it will "explode" the Sound as well, so you can work on the combination of both objects as well.

(Full disclosure: I wrote that plugin).

jja
  • 2,058
  • 14
  • 27
  • Hi, I know this is an old post, but would you mind telling me what "Get interval edge at time" does? Thanks! – Lisa Jul 06 '19 at 23:45