1 /* praat_KlattGrid_init.cpp
2  *
3  * Copyright (C) 2009-2021 David Weenink
4  *
5  * This code is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or (at
8  * your option) any later version.
9  *
10  * This code is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this work. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 /*
20 	djmw 20090420
21 */
22 
23 #include "IntensityTierEditor.h"
24 #include "KlattGridEditors.h"
25 #include "KlattTable.h"
26 
27 #include "praat_TimeFunction.h"
28 
29 /******************* KlattGrid  *********************************/
30 
31 #define KlattGrid_4formants_addCommonField(formantType) \
32 	OPTIONMENU_ENUM (kKlattGridFormantType, formantType, U"Formant type", kKlattGridFormantType::DEFAULT)
33 
34 #define KlattGrid_6formants_addCommonField(formantType) \
35 	OPTIONMENU_ENUM (kKlattGridFormantType, formantType, U"Formant type", kKlattGridFormantType::DEFAULT)
36 
37 
38 #define KlattGrid_PhonationGridPlayOptions_addCommonFields(useVoicing,useFlutter,useDoublePulsing,useCollisionPhase,useSpectralTilt,flowFunctionType,useFlowDerivative,useAspiration,useBreathiness) \
39 	BOOLEAN (useVoicing, U"Voicing", true) \
40 	BOOLEAN (useFlutter, U"Flutter", true) \
41 	BOOLEAN (useDoublePulsing, U"Double pulsing", true) \
42 	BOOLEAN (useCollisionPhase, U"Collision phase", true) \
43 	BOOLEAN (useSpectralTilt, U"Spectral tilt", true) \
44 	OPTIONMENU (flowFunctionType, U"Flow function", 1) \
45 		OPTION (U"Powers in tiers") \
46 		OPTION (U"t^2-t^3") \
47 		OPTION (U"t^3-t^4") \
48 	BOOLEAN (useFlowDerivative, U"Flow derivative", true) \
49 	BOOLEAN (useAspiration, U"Aspiration", true) \
50 	BOOLEAN (useBreathiness, U"Breathiness", true)
51 
KlattGrid_PhonationGridPlayOptions(KlattGrid me,int useVoicing,int useFlutter,int useDoublePulsing,int useCollisionPhase,int useSpectralTilt,int flowFunctionType,int useFlowDerivative,int useAspiration,int useBreathiness)52 static void KlattGrid_PhonationGridPlayOptions (KlattGrid me, int useVoicing, int useFlutter, int useDoublePulsing,
53 	int useCollisionPhase, int useSpectralTilt, int flowFunctionType, int useFlowDerivative, int useAspiration, int useBreathiness)
54 {
55 	PhonationGridPlayOptions pp = my phonation -> options.get();
56 	pp -> voicing = useVoicing;
57 	pp -> flutter = useFlutter;
58 	pp -> doublePulsing = useDoublePulsing;
59 	pp -> collisionPhase = useCollisionPhase;
60 	pp -> spectralTilt = useSpectralTilt;
61 	pp -> flowFunction = flowFunctionType;
62 	pp -> flowDerivative = useFlowDerivative;
63 	pp -> aspiration = useAspiration;
64 	pp -> breathiness = useBreathiness;
65 }
66 
67 #define KlattGrid_formantSelection_vocalTract_commonFields(filterModel,fromOralFormant,toOralFormant,fromNasalFormant,toNasalFormant,fromNasalAntiFormant,toNasalAntiFormant) \
68 	OPTIONMENU_ENUM (kKlattGridFilterModel, filterModel, U"Filter model", kKlattGridFilterModel::DEFAULT) \
69 	INTEGER (fromOralFormant, U"left Oral formant range", U"1") \
70 	INTEGER (toOralFormant, U"right Oral formant range", U"5") \
71 	INTEGER (fromNasalFormant, U"left Nasal formant range", U"1") \
72 	INTEGER (toNasalFormant, U"right Nasal formant range", U"1") \
73 	INTEGER (fromNasalAntiFormant, U"left Nasal antiformant range", U"1") \
74 	INTEGER (toNasalAntiFormant, U"right Nasal antiformant range", U"1")
75 
KlattGrid_formantSelection_vocalTract(KlattGrid me,kKlattGridFilterModel filterModel,integer fromOralFormant,integer toOralFormant,integer fromNasalFormant,integer toNasalFormant,integer fromNasalAntiFormant,integer toNasalAntiFormant)76 static void KlattGrid_formantSelection_vocalTract (KlattGrid me, kKlattGridFilterModel filterModel, integer fromOralFormant,
77 	integer toOralFormant, integer fromNasalFormant, integer toNasalFormant, integer fromNasalAntiFormant, integer toNasalAntiFormant)
78 {
79 	VocalTractGridPlayOptions pv = my vocalTract -> options.get();
80 	pv -> filterModel = filterModel;
81 	pv -> startOralFormant = fromOralFormant;
82 	pv -> endOralFormant  = toOralFormant;
83 	pv -> startNasalFormant = fromNasalFormant;
84 	pv -> endNasalFormant = toNasalFormant;
85 	pv -> startNasalAntiFormant = fromNasalAntiFormant;
86 	pv -> endNasalAntiFormant = toNasalAntiFormant;
87 }
88 
89 #define KlattGrid_formantSelection_coupling_commonFields(fromTrachealFormant,toTrachealFormant,fromTrachealAntiFormant,toTrachealAntiFormant,fromDeltaFormant,toDeltaFormant,fromDeltaBandwidth,toDeltaBandwidth) \
90 	INTEGER (fromTrachealFormant, U"left Tracheal formant range", U"1") \
91 	INTEGER (toTrachealFormant, U"right Tracheal formant range", U"1") \
92 	INTEGER (fromTrachealAntiFormant, U"left Tracheal antiformant range", U"1") \
93 	INTEGER (toTrachealAntiFormant, U"right Tracheal antiformant range", U"1") \
94 	INTEGER (fromDeltaFormant, U"left Delta formant range", U"1") \
95 	INTEGER (toDeltaFormant, U"right Delta formant range", U"1") \
96 	INTEGER (fromDeltaBandwidth, U"left Delta bandwidth range", U"1") \
97 	INTEGER (toDeltaBandwidth, U"right Delta bandwidth range", U"1")
98 
KlattGrid_formantSelection_coupling(KlattGrid me,integer fromTrachealFormant,integer toTrachealFormant,integer fromTrachealAntiFormant,integer toTrachealAntiFormant,integer fromDeltaFormant,integer toDeltaFormant,integer fromDeltaBandwidth,integer toDeltaBandwidth)99 static void KlattGrid_formantSelection_coupling (KlattGrid me, integer fromTrachealFormant, integer toTrachealFormant,
100 	integer fromTrachealAntiFormant, integer toTrachealAntiFormant, integer fromDeltaFormant, integer toDeltaFormant,
101 	integer fromDeltaBandwidth, integer toDeltaBandwidth)
102 {
103 	CouplingGridPlayOptions pc = my coupling -> options.get();
104 	pc -> startTrachealFormant = fromTrachealFormant;
105 	pc -> endTrachealFormant = toTrachealFormant;
106 	pc -> startTrachealAntiFormant = fromTrachealAntiFormant;
107 	pc -> endTrachealAntiFormant = toTrachealAntiFormant;
108 	pc -> startDeltaFormant = fromDeltaFormant;
109 	pc -> endDeltaFormant = toDeltaFormant;
110 	pc -> startDeltaBandwidth = fromDeltaBandwidth;
111 	pc -> endDeltaFormant = toDeltaBandwidth;
112 }
113 
114 #define KlattGrid_formantSelection_frication_commonFields(fromFricationFormant,toFricationFormant,useFricationBypass) \
115 	INTEGER (fromFricationFormant, U"left Frication formant range", U"1") \
116 	INTEGER (toFricationFormant, U"right Frication formant range", U"6") \
117 	BOOLEAN (useFricationBypass, U"Frication bypass", true)
118 
KlattGrid_formantSelection_frication(KlattGrid me,integer fromFricationFormant,integer toFricationFormant,int useFricationBypass)119 static void KlattGrid_formantSelection_frication (KlattGrid me, integer fromFricationFormant, integer toFricationFormant, int useFricationBypass) {
120 	FricationGridPlayOptions pf = my frication -> options.get();
121 	pf -> startFricationFormant = fromFricationFormant;
122 	pf -> endFricationFormant = toFricationFormant;
123 	pf -> bypass = useFricationBypass;
124 }
125 
DIRECT(CREATE_ONE__KlattGrid_createExample)126 DIRECT (CREATE_ONE__KlattGrid_createExample) {
127 	CREATE_ONE
128 		autoKlattGrid result = KlattGrid_createExample();
129 	CREATE_ONE_END (U"example")
130 }
131 
132 FORM (CREATE_ONE__KlattGrid_createFromVowel, U"Create KlattGrid from vowel", U"Create KlattGrid from vowel...") {
133 	WORD (name, U"Name", U"a")
134 	POSITIVE (duration, U"Duration (s)", U"0.4")
135 	POSITIVE (f0start, U"Pitch (Hz)", U"125.0")
136 	REAL (f1, U"F1 (Hz)", U"800.0")
137 	POSITIVE (b1, U"B1 (Hz)", U"50.0")
138 	REAL (f2, U"F2 (Hz)", U"1200.0")
139 	POSITIVE (b2, U"B2 (Hz)", U"50.0")
140 	REAL (f3, U"F3 (Hz)", U"2300.0")
141 	POSITIVE (b3, U"B3 (Hz)", U"100.0")
142 	REAL (f4, U"F4 (Hz)", U"2800.0")
143 	POSITIVE (bandWidthFraction, U"Bandwidth fraction", U"0.05")
144 	REAL (formantFrequencyInterval, U"Formant frequency interval (Hz)", U"1000.0")
145 	OK
146 DO
147 	CREATE_ONE
148 		autoKlattGrid result = KlattGrid_createFromVowel (duration, f0start, f1, b1, f2, b2, f3, b3, f4, bandWidthFraction, formantFrequencyInterval);
149 	CREATE_ONE_END (name)
150 }
151 
152 FORM (CREATE_ONE__KlattGrid_create, U"Create KlattGrid", U"Create KlattGrid...") {
153 	WORD (name, U"Name", U"kg")
154 	REAL (fromTime, U"Start time (s)", U"0.0")
155 	REAL (toTime, U"End time (s)", U"1.0")
156 	INTEGER (numberOfOralFormants, U"Number of oral formants", U"6")
157 	INTEGER (numberOfNasalFormants, U"Number of nasal formants", U"1")
158 	INTEGER (numberOfNasalAntiFormants, U"Number of nasal antiformants", U"1")
159 	INTEGER (numberOfFricationFormants, U"Number of frication formants", U"6")
160 	LABEL (U"Coupling between source and filter")
161 	INTEGER (numberOfTrachealFormants, U"Number of tracheal formants", U"1")
162 	INTEGER (numberOfTrachealAntiFormants, U"Number of tracheal antiformants", U"1")
163 	INTEGER (numberOfDeltaFormants, U"Number of delta formants", U"1")
164 	OK
165 DO
166 	Melder_require (fromTime < toTime,
167 		U"The start time must lie before the end time.");
168 	Melder_require (numberOfOralFormants >= 0 && numberOfNasalFormants >= 0 && numberOfNasalAntiFormants >= 0
169 		&& numberOfTrachealFormants >= 0 && numberOfTrachealAntiFormants >= 0
170 		&& numberOfFricationFormants >= 0 && numberOfDeltaFormants >= 0,
171 		U"No number of formants should be negative.");
172 	CREATE_ONE
173 		autoKlattGrid result = KlattGrid_create (fromTime, toTime, numberOfOralFormants, numberOfNasalFormants, numberOfNasalAntiFormants, numberOfTrachealFormants, numberOfTrachealAntiFormants, numberOfFricationFormants, numberOfDeltaFormants);
174 	CREATE_ONE_END (name)
175 }
176 
177 #define KlattGrid_INSTALL_TIER_EDITOR(Name)  \
178 DIRECT (EDITOR_ONE_KlattGrid_edit##Name##Tier) { \
179 	EDITOR_ONE (a,KlattGrid) \
180 		autoKlattGrid_##Name##TierEditor editor = KlattGrid_##Name##TierEditor_create (ID_AND_FULL_NAME, me); \
181 	EDITOR_ONE_END \
182 }
183 
184 KlattGrid_INSTALL_TIER_EDITOR (Pitch)
KlattGrid_INSTALL_TIER_EDITOR(VoicingAmplitude)185 KlattGrid_INSTALL_TIER_EDITOR (VoicingAmplitude)
186 KlattGrid_INSTALL_TIER_EDITOR (Flutter)
187 KlattGrid_INSTALL_TIER_EDITOR (Power1)
188 KlattGrid_INSTALL_TIER_EDITOR (Power2)
189 KlattGrid_INSTALL_TIER_EDITOR (OpenPhase)
190 KlattGrid_INSTALL_TIER_EDITOR (CollisionPhase)
191 KlattGrid_INSTALL_TIER_EDITOR (DoublePulsing)
192 KlattGrid_INSTALL_TIER_EDITOR (AspirationAmplitude)
193 KlattGrid_INSTALL_TIER_EDITOR (BreathinessAmplitude)
194 KlattGrid_INSTALL_TIER_EDITOR (SpectralTilt)
195 
196 KlattGrid_INSTALL_TIER_EDITOR (FricationBypass)
197 KlattGrid_INSTALL_TIER_EDITOR (FricationAmplitude)
198 
199 #undef KlattGrid_INSTALL_TIER_EDITOR
200 
201 #define KlattGRID_EDIT_FORMANTGRID(Name,formantType)  \
202 DIRECT (EDITOR_ONE_KlattGrid_edit##Name##FormantGrid) { \
203 	EDITOR_ONE (a,KlattGrid) \
204 		conststring32 id_and_name = Melder_cat (ID, U". ", KlattGrid_getFormantName (formantType), U" grid"); \
205 		autoKlattGrid_FormantGridEditor editor = KlattGrid_FormantGridEditor_create (id_and_name, me, formantType); \
206 	EDITOR_ONE_END \
207 }
208 
209 KlattGRID_EDIT_FORMANTGRID (Oral, kKlattGridFormantType::ORAL)
210 KlattGRID_EDIT_FORMANTGRID (Nasal, kKlattGridFormantType::NASAL)
211 KlattGRID_EDIT_FORMANTGRID (Tracheal, kKlattGridFormantType::TRACHEAL)
212 KlattGRID_EDIT_FORMANTGRID (NasalAnti, kKlattGridFormantType::NASAL_ANTI)
213 KlattGRID_EDIT_FORMANTGRID (TrachealAnti, kKlattGridFormantType::TRACHEALANTI)
214 KlattGRID_EDIT_FORMANTGRID (Delta, kKlattGridFormantType::DELTA)
215 KlattGRID_EDIT_FORMANTGRID (Frication, kKlattGridFormantType::FRICATION)
216 
217 #undef KlattGRID_EDIT_FORMANTGRID
218 
219 #define KlattGrid_EDIT_FORMANT_AMPLITUDE_TIER(Name,name,formantType)  \
220 FORM (EDITOR_ONE_KlattGrid_edit##Name##FormantAmplitudeTier, U"KlattGrid: View & Edit " #name " formant amplitude tier", nullptr) { \
221 	NATURAL (formantNumber, U"Formant number", U"1") \
222 	OK \
223 DO \
224 	EDITOR_ONE (a,KlattGrid) \
225 		OrderedOf<structIntensityTier>* amp = KlattGrid_getAddressOfAmplitudes (me, formantType); \
226 		if (! amp) Melder_throw (U"Unknown formant type"); \
227 		if (formantNumber > amp->size) Melder_throw (U"Formant number does not exist."); \
228 		conststring32 id_and_name = Melder_cat (ID, U". ", KlattGrid_getFormantName (formantType), U" amplitude tier"); \
229 		autoKlattGrid_DecibelTierEditor editor = KlattGrid_DecibelTierEditor_create (id_and_name, me, amp->at [formantNumber]); \
230 	EDITOR_ONE_END \
231 }
232 
233 KlattGrid_EDIT_FORMANT_AMPLITUDE_TIER (Oral, oral, kKlattGridFormantType::ORAL)
234 KlattGrid_EDIT_FORMANT_AMPLITUDE_TIER (Nasal, nasal, kKlattGridFormantType::NASAL)
235 KlattGrid_EDIT_FORMANT_AMPLITUDE_TIER (Tracheal, tracheal, kKlattGridFormantType::TRACHEAL)
236 KlattGrid_EDIT_FORMANT_AMPLITUDE_TIER (Frication, frication, kKlattGridFormantType::FRICATION)
237 
238 #undef KlattGrid_EDIT_FORMANT_AMPLITUDE_TIER
239 
240 #define KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE(Name,name,unit,default,requireCondition,requireMessage,newname,tiertype)  \
241 FORM (QUERY_ONE_FOR_REAL__KlattGrid_get##Name##AtTime, U"KlattGrid: Get " #name " at time", nullptr) { \
242 	REAL (time, U"Time", U"0.5") \
243 	OK \
244 DO \
245 	QUERY_ONE_FOR_REAL (KlattGrid) \
246 		const double result = KlattGrid_get##Name##AtTime (me, time); \
247 	QUERY_ONE_FOR_REAL_END (unit) \
248 } \
249 FORM (MODIFY_KlattGrid_add##Name##Point, U"KlattGrid: Add " #name " point", nullptr) { \
250 	REAL (time, U"Time (s)", U"0.5") \
251 	REAL (value, U"Value" unit, default) \
252 	OK \
253 DO \
254 	Melder_require (requireCondition, requireMessage); \
255 	MODIFY_EACH (KlattGrid); \
256 		KlattGrid_add##Name##Point (me, time, value); \
257 	MODIFY_EACH_END \
258 } \
259 FORM (MODIFY_KlattGrid_remove##Name##Points, U"Remove " #name " points", nullptr) { \
260 	REAL (fromTime, U"From time (s)", U"0.3") \
261 	REAL (toTime, U"To time (s)", U"0.7") \
262 	OK \
263 DO \
264 	MODIFY_EACH (KlattGrid); \
265 		KlattGrid_remove##Name##Points (me, fromTime, toTime); \
266 	MODIFY_EACH_END \
267 } \
268 DIRECT (CONVERT_EACH_TO_ONE__KlattGrid_extract##Name##Tier) { \
269 	CONVERT_EACH_TO_ONE (KlattGrid) \
270 		autoDaata result = KlattGrid_extract##Name##Tier (me); \
271 	CONVERT_EACH_TO_ONE_END (newname) \
272 } \
273 DIRECT (MODIFY_KlattGrid_replace##Name##Tier) { \
274 	MODIFY_FIRST_OF_ONE_AND_ONE (KlattGrid, tiertype); \
275 		KlattGrid_replace##Name##Tier (me, you); \
276 	MODIFY_FIRST_OF_ONE_AND_ONE_END \
277 }
278 
279 // 55 DO_KlattGrid... functions
280 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Pitch, pitch, U" (Hz)", (U"100.0"),
281         (value >= 0.0), (U"Pitch should be greater equal zero."), U"f0", PitchTier)
282 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (VoicingAmplitude, voicing amplitude, U" (dB SPL)", U"90.0",
283         (1), U"", U"voicing", IntensityTier)
284 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Flutter, flutter, U" (0..1)", (U"0.0"),
285         (value >= 0.0 && value <= 1.0), (U"Flutter should be in [0,1]."), U"flutter", RealTier)
286 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Power1, power1, U"", U"3",
287         (value > 0.0), U"Power1 needs to be positive.", U"power1", RealTier)
288 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Power2, power2, U"", U"4",
289         (value > 0.0), U"Power2 needs to be positive.", U"power2", RealTier)
290 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (OpenPhase, open phase, U"", U"0.7",
291         (value >= 0.0 && value <= 1.0), U"Open phase should be greater than zero and smaller equal one.", U"openPhase", RealTier)
292 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (CollisionPhase, collision phase, U"", U"0.03",
293         (value >= 0.0 && value < 1.0), U"Collision phase should be greater equal zero and smaller than one.", U"collisionPhase", RealTier)
294 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (DoublePulsing, double pulsing, U" (0..1)", U"0.0",
295         (value >= 0.0 && value <= 1.0), U"Double pulsing should be greater equal zero and smaller equal one.", U"doublePulsing", RealTier)
296 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (SpectralTilt, spectral tilt, U" (dB)", U"0.0",
297         (value >= 0.0), U"Spectral tilt should be greater equal zero.", U"spectralTilt", IntensityTier)
298 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (AspirationAmplitude, aspiration amplitude, U" (dB SPL)", U"0.0",
299         (true), U"", U"aspiration", IntensityTier)
300 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (BreathinessAmplitude, breathiness amplitude, U" (dB SPL)", U"30.0",
301         (true), U"", U"breathiness", IntensityTier)
302 
303 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (FricationAmplitude, frication amplitude, U" (dB SPL)", U"30.0",
304         (true), U"", U"frication", IntensityTier)
305 KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (FricationBypass, frication bypass, U" (dB)", U"30.0",
306         (true), U"", U"bypass", IntensityTier)
307 
308 #undef KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE
309 
310 #define KlattGrid_FORMULA_FORMANT_FBA_VALUE(Name,namef,ForBs,forbs,textfield,formantType,label)  \
311 FORM (MODIFY_KlattGrid_formula##Name##Formant##ForBs, U"KlattGrid: Formula (" #namef "ormant " #forbs ")", U"Formant: Formula (" #forbs ")...") { \
312 	LABEL (U"row is formant number, col is point number:\nfor row from 1 to nrow do for col from 1 to ncol do " #ForBs " (row, col) :=") \
313 	FORMULA (formula, U"Formula", textfield) \
314 	OK \
315 DO \
316 	MODIFY_EACH (KlattGrid); \
317 		KlattGrid_formula_##forbs (me, formantType, formula, interpreter); \
318 	MODIFY_EACH_END \
319 }
320 
321 #define KlattGrid_ADD_FBA_VALUE(Name,namef,Form,FBA,fba,formantType,default,unit,requireCondition,requireMessage)  \
322 FORM (MODIFY_KlattGrid_add##Name##Formant##FBA##Point, U"KlattGrid: Add " #namef "ormant " #fba " point", nullptr) { \
323 	NATURAL (formantNumber, U"Formant number", U"1") \
324 	REAL (time, U"Time (s)", U"0.5") \
325 	REAL (value, U"Value " #unit, default) \
326 	OK \
327 DO \
328 	Melder_require (requireCondition, requireMessage); \
329 	MODIFY_EACH (KlattGrid); \
330 		KlattGrid_add##Form##Point (me, formantType, formantNumber, time, value); \
331 	MODIFY_EACH_END \
332 }
333 
334 #define KlattGrid_REMOVE_FBA_VALUE(Name,namef,Form,FBA,fba,formantType)  \
335 FORM (MODIFY_KlattGrid_remove##Name##Formant##FBA##Points, U"KlattGrid: Remove " #namef "ormant " #fba " points", nullptr) { \
336 	NATURAL (formantNumber, U"Formant number", U"1") \
337 	REAL (fromTime, U"From time (s)", U"0.3")\
338 	REAL (toTime, U"To time (s)", U"0.7") \
339 	OK \
340 DO \
341 	MODIFY_EACH (KlattGrid); \
342 		KlattGrid_remove##Form##Points (me, formantType, formantNumber, fromTime, toTime); \
343 	MODIFY_EACH_END \
344 }
345 
346 #define KlattGrid_ADD_FORMANT(Name,namef,formantType)  \
347 FORM (MODIFY_KlattGrid_add##Name##Formant, U"KlattGrid: Add " #namef "ormant", nullptr) { \
348 	INTEGER (position, U"Position", U"0 (= at end)") \
349 	OK \
350 DO \
351 	MODIFY_EACH (KlattGrid); \
352 		KlattGrid_addFormant (me, formantType, position); \
353 	MODIFY_EACH_END \
354 }
355 
356 #define KlattGrid_REMOVE_FORMANT(Name,namef,formantType)  \
357 FORM (MODIFY_KlattGrid_remove##Name##Formant, U"KlattGrid: Remove " #namef "ormant", nullptr) { \
358 	INTEGER (position, U"Position", U"0 (= do nothing)") \
359 	OK \
360 DO \
361 	MODIFY_EACH (KlattGrid); \
362 		KlattGrid_removeFormant (me, formantType, position); \
363 	MODIFY_EACH_END \
364 }
365 
366 #define KlattGrid_ADD_FORMANT_FREQUENCYANDBANDWIDTHTIERS(Name,namef,formantType)  \
367 FORM (MODIFY_KlattGrid_add##Name##FormantFrequencyAndBandwidthTiers, U"KlattGrid: Add " #namef "ormant", nullptr) { \
368 	INTEGER (position, U"Position", U"0 (= at end)") \
369 	OK \
370 DO \
371 	MODIFY_EACH (KlattGrid); \
372 		KlattGrid_addFormantFrequencyAndBandwidthTiers (me, formantType, position); \
373 	MODIFY_EACH_END \
374 }
375 
376 #define KlattGrid_REMOVE_FORMANT_FREQUENCYANDBANDWIDTHTIERS(Name,namef,formantType)  \
377 FORM (MODIFY_KlattGrid_remove##Name##FormantFrequencyAndBandwidthTiers, U"KlattGrid: Remove " #namef "ormant", nullptr) { \
378 	INTEGER (position, U"Position", U"0 (= at end)") \
379 	OK \
380 DO \
381 	MODIFY_EACH (KlattGrid); \
382 		KlattGrid_removeFormantFrequencyAndBandwidthTiers (me, formantType, position); \
383 	MODIFY_EACH_END \
384 }
385 
386 #define KlattGrid_ADD_FORMANT_AMPLITUDETIER(Name,namef,formantType)  \
387 FORM (MODIFY_KlattGrid_add##Name##FormantAmplitudeTier, U"KlattGrid: Add " #namef "ormant amplitude tier", nullptr) { \
388 	INTEGER (position, U"Position", U"0 (= at end)") \
389 	OK \
390 DO \
391 	MODIFY_EACH (KlattGrid); \
392 		KlattGrid_addFormantAmplitudeTier (me, formantType, position); \
393 	MODIFY_EACH_END \
394 }
395 
396 #define KlattGrid_REMOVE_FORMANT_AMPLITUDETIER(Name,namef,formantType)  \
397 FORM (MODIFY_KlattGrid_remove##Name##FormantAmplitudeTier, U"KlattGrid: Remove " #namef "ormant amplitude tier", nullptr) { \
398 	INTEGER (position, U"Position", U"0 (= at end)") \
399 	OK \
400 DO \
401 	MODIFY_EACH (KlattGrid); \
402 		KlattGrid_removeFormant (me, formantType, position); \
403 	MODIFY_EACH_END \
404 }
405 
406 
407 #define KlattGrid_FORMULA_ADD_REMOVE_FBA(Name,namef,formantType)  \
408 KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Frequencies, frequencies, U"if row = 2 then self + 200 else self fi", formantType, U" ") \
409 KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Bandwidths, bandwidths, U"self / 10 ; 10% of frequency", formantType, U"Warning: self is formant frequency.") \
410 KlattGrid_ADD_FBA_VALUE (Name, namef, Formant, Frequency, frequency, formantType, U"500.0", (Hz), (value>0), U"Frequency should be greater than zero.") \
411 KlattGrid_ADD_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType, U"50.0", (Hz), (value>0), U"Bandwidth should be greater than zero.") \
412 KlattGrid_ADD_FBA_VALUE (Name, namef, Amplitude, Amplitude, amplitude, formantType, U"0.0", (dB), (isdefined(value)), U"Amplitude should be defined.") \
413 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Formant, Frequency, frequency, formantType) \
414 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType) \
415 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Amplitude, Amplitude, amplitude, formantType) \
416 KlattGrid_ADD_FORMANT (Name, namef, formantType) \
417 KlattGrid_ADD_FORMANT_FREQUENCYANDBANDWIDTHTIERS (Name, namef, formantType) \
418 KlattGrid_REMOVE_FORMANT_FREQUENCYANDBANDWIDTHTIERS (Name, namef, formantType) \
419 KlattGrid_REMOVE_FORMANT_AMPLITUDETIER (Name, namef, formantType) \
420 KlattGrid_REMOVE_FORMANT (Name, namef, formantType) \
421 KlattGrid_ADD_FORMANT_AMPLITUDETIER (Name, namef, formantType)
422 
423 
424 #define KlattGrid_FORMULA_ADD_REMOVE_FB(Name,namef,formantType)  \
425 KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Frequencies, frequencies, U"if row = 2 then self + 200 else self fi",formantType, U" ") \
426 KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Bandwidths, bandwidths, U"self / 10 ; 10% of frequency",formantType, U"Warning: self is formant frequency.") \
427 KlattGrid_ADD_FBA_VALUE (Name, namef, Formant,Frequency, frequency, formantType, U"500.0", (Hz), (value>0), U"Frequency should be greater than zero.") \
428 KlattGrid_ADD_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType,  U"50.0", (Hz), (value>0), U"Bandwidth should be greater than zero.") \
429 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Formant, Frequency, frequency, formantType) \
430 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType) \
431 KlattGrid_ADD_FORMANT(Name,namef,formantType) \
432 KlattGrid_ADD_FORMANT_FREQUENCYANDBANDWIDTHTIERS (Name, namef, formantType) \
433 KlattGrid_REMOVE_FORMANT_FREQUENCYANDBANDWIDTHTIERS (Name, namef, formantType) \
434 KlattGrid_REMOVE_FORMANT (Name, namef, formantType)
435 
436 #define KlattGrid_FORMULA_ADD_REMOVE_FB_DELTA(Name,namef,formantType)  \
437 KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Frequencies, frequencies, U"if row = 2 then self + 200 else self fi",formantType, U" ") \
438 KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Bandwidths, bandwidths, U"self / 10 ; 10% of frequency",formantType, U"Warning: self is formant frequency.") \
439 KlattGrid_ADD_FBA_VALUE (Name, namef, Formant,Frequency, frequency, formantType, U"-100.0", (Hz), (isdefined(value)), U"Frequency should be defined.") \
440 KlattGrid_ADD_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType,  U"-50.0", (Hz), (isdefined(value)), U"Bandwidth should be defined.") \
441 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Formant, Frequency, frequency, formantType) \
442 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType) \
443 KlattGrid_ADD_FORMANT_FREQUENCYANDBANDWIDTHTIERS (Name, namef, formantType) \
444 KlattGrid_REMOVE_FORMANT_FREQUENCYANDBANDWIDTHTIERS (Name, namef, formantType) \
445 KlattGrid_ADD_FORMANT (Name, namef, formantType) \
446 KlattGrid_REMOVE_FORMANT (Name, namef, formantType)
447 
448 KlattGrid_FORMULA_ADD_REMOVE_FBA (Oral, oral f, kKlattGridFormantType::ORAL)
449 KlattGrid_FORMULA_ADD_REMOVE_FBA (Nasal, nasal f, kKlattGridFormantType::NASAL)
450 KlattGrid_FORMULA_ADD_REMOVE_FB (NasalAnti, nasal antif, kKlattGridFormantType::NASAL_ANTI)
451 KlattGrid_FORMULA_ADD_REMOVE_FB_DELTA (Delta, delta f, kKlattGridFormantType::DELTA)
452 KlattGrid_FORMULA_ADD_REMOVE_FBA (Tracheal, tracheal f, kKlattGridFormantType::TRACHEAL)
453 KlattGrid_FORMULA_ADD_REMOVE_FB (TrachealAnti, tracheal antif, kKlattGridFormantType::TRACHEALANTI)
454 KlattGrid_FORMULA_ADD_REMOVE_FBA (Frication, frication f, kKlattGridFormantType::FRICATION)
455 
456 #undef KlattGrid_FORMULA_ADD_REMOVE_FB
457 #undef KlattGrid_FORMULA_ADD_REMOVE
458 #undef KlattGrid_ADD_FORMANT_AND_BANDWDTH_TIER
459 #undef KlattGrid_REMOVE_FBA_VALUE
460 #undef KlattGrid_ADD_FBA_VALUE
461 #undef KlattGrid_FORMULA_FORMANT_FB_VALUE
462 
463 DIRECT (CONVERT_EACH_TO_ONE__KlattGrid_extractPointProcess_glottalClosures) {
464 	CONVERT_EACH_TO_ONE (KlattGrid)
465 		autoPointProcess result = KlattGrid_extractPointProcess_glottalClosures (me);
466 	CONVERT_EACH_TO_ONE_END (my name.get())
467 }
468 
469 FORM (MODIFY_KlattGrid_formula_frequencies, U"KlattGrid: Formula (frequencies)", U"Formant: Formula (frequencies)...") {
470 	KlattGrid_6formants_addCommonField (formantType)
471 	LABEL (U"row is formant number, col is point number: for row from 1 to nrow do for col from 1 to ncol do F (row, col) :=")
472 	FORMULA (formula, U"Formula", U"if row = 2 then self + 200 else self fi")
473 	OK
474 DO
475 	MODIFY_EACH (KlattGrid)
476 		KlattGrid_formula_frequencies (me, formantType, formula, interpreter);
477 	MODIFY_EACH_END
478 }
479 
480 FORM (MODIFY_KlattGrid_formula_bandwidths, U"KlattGrid: Formula (bandwidths)", U"Formant: Formula (bandwidths)...") {
481 	KlattGrid_6formants_addCommonField (formantType)
482 	LABEL (U"row is formant number, col is point number: for row from 1 to nrow do for col from 1 to ncol do F (row, col) :=")
483 	FORMULA (formula, U"Formula", U"if row = 2 then self + 200 else self fi")
484 	OK
485 DO
486 	MODIFY_EACH (KlattGrid)
487 		KlattGrid_formula_bandwidths (me, formantType, formula, interpreter);
488 	MODIFY_EACH_END
489 }
490 
491 #define KlattGrid_FORMANT_GET_FB_VALUE(Name,name,ForB,forb,FormB,formantType)  \
492 FORM (QUERY_ONE_FOR_REAL__KlattGrid_get##Name##Formant##ForB##AtTime, U"KlattGrid: Get " #name " " #forb " at time", nullptr) { \
493 	NATURAL (formantNumber, U"Formant number", U"1") \
494 	REAL (time, U"Time (s)", U"0.5") \
495 	OK \
496 DO \
497 	QUERY_ONE_FOR_REAL (KlattGrid); \
498 		const double result = KlattGrid_get##FormB##AtTime (me, formantType, formantNumber, time); \
499 	QUERY_ONE_FOR_REAL_END (U" Hz"); \
500 }
501 
502 #define KlattGrid_FORMANT_GET_A_VALUE(Name,name,formantType)  \
503 FORM (QUERY_ONE_FOR_REAL__KlattGrid_get##Name##FormantAmplitudeAtTime, U"KlattGrid: Get " #name " formant amplitude at time", nullptr) { \
504 	NATURAL (formantNumber, U"Formant number", U"1") \
505 	REAL (time, U"Time (s)", U"0.5") \
506 	OK \
507 DO \
508 	QUERY_ONE_FOR_REAL (KlattGrid); \
509 		const double result = KlattGrid_getAmplitudeAtTime (me, formantType, formantNumber, time); \
510 	QUERY_ONE_FOR_REAL_END (U" dB"); \
511 }
512 
513 #define KlattGrid_FORMANT_GET_FB_VALUES(Name,name,formantType) \
514 KlattGrid_FORMANT_GET_FB_VALUE (Name, name, Frequency, frequency, Formant, formantType) \
515 KlattGrid_FORMANT_GET_FB_VALUE (Name, name, Bandwidth, bandwidth, Bandwidth, formantType)
516 
KlattGrid_FORMANT_GET_FB_VALUES(Oral,oral,kKlattGridFormantType::ORAL)517 KlattGrid_FORMANT_GET_FB_VALUES (Oral, oral, kKlattGridFormantType::ORAL)
518 KlattGrid_FORMANT_GET_A_VALUE (Oral, oral, kKlattGridFormantType::ORAL)
519 KlattGrid_FORMANT_GET_FB_VALUES (Nasal, nasal, kKlattGridFormantType::NASAL)
520 KlattGrid_FORMANT_GET_A_VALUE (Nasal, nasal, kKlattGridFormantType::NASAL)
521 KlattGrid_FORMANT_GET_FB_VALUES (NasalAnti, nasal anti, kKlattGridFormantType::NASAL_ANTI)
522 KlattGrid_FORMANT_GET_FB_VALUES (Tracheal, tracheal f, kKlattGridFormantType::TRACHEAL)
523 KlattGrid_FORMANT_GET_A_VALUE (Tracheal, tracheal f, kKlattGridFormantType::TRACHEAL)
524 KlattGrid_FORMANT_GET_FB_VALUES (Delta, delta f, kKlattGridFormantType::DELTA)
525 KlattGrid_FORMANT_GET_FB_VALUES (TrachealAnti, tracheal antif, kKlattGridFormantType::TRACHEALANTI)
526 KlattGrid_FORMANT_GET_FB_VALUES (Frication, frication, kKlattGridFormantType::FRICATION)
527 KlattGrid_FORMANT_GET_A_VALUE (Frication, frication, kKlattGridFormantType::FRICATION)
528 
529 #undef KlattGrid_FORMANT_GET_FB_VALUES
530 #undef KlattGrid_FORMANT_GET_A_VALUE
531 
532 #define KlattGrid_EXTRACT_FORMANT_GRID(Name,gridType)  \
533 DIRECT (CONVERT_EACH_TO_ONE__KlattGrid_extract##Name##FormantGrid) { \
534 	CONVERT_EACH_TO_ONE (KlattGrid) \
535 		autoFormantGrid result = KlattGrid_extractFormantGrid (me, gridType); \
536 	CONVERT_EACH_TO_ONE_END (KlattGrid_getFormantName (gridType)) \
537 }
538 
539 #define KlattGrid_EXTRACT_FORMANT_AMPLITUDE(Name,name,formantType)  \
540 FORM (CONVERT_EACH_TO_ONE__KlattGrid_extract##Name##FormantAmplitudeTier, U"KlattGrid: Extract " #name " formant amplitude tier", nullptr) { \
541 	NATURAL (formantNumber, U"Formant number", U"1") \
542 	OK \
543 DO \
544 	CONVERT_EACH_TO_ONE (KlattGrid) \
545 		autoIntensityTier result = KlattGrid_extractAmplitudeTier (me, formantType, formantNumber); \
546 	CONVERT_EACH_TO_ONE_END (KlattGrid_getFormantName (formantType)) \
547 }
548 
549 KlattGrid_EXTRACT_FORMANT_GRID (Oral, kKlattGridFormantType::ORAL)
550 KlattGrid_EXTRACT_FORMANT_AMPLITUDE (Oral, oral, kKlattGridFormantType::ORAL)
551 KlattGrid_EXTRACT_FORMANT_GRID (Nasal, kKlattGridFormantType::NASAL)
552 KlattGrid_EXTRACT_FORMANT_AMPLITUDE (Nasal, nasal, kKlattGridFormantType::NASAL)
553 KlattGrid_EXTRACT_FORMANT_GRID (Frication, kKlattGridFormantType::FRICATION)
554 KlattGrid_EXTRACT_FORMANT_AMPLITUDE (Frication, frication, kKlattGridFormantType::FRICATION)
555 KlattGrid_EXTRACT_FORMANT_GRID (Tracheal, kKlattGridFormantType::TRACHEAL)
556 KlattGrid_EXTRACT_FORMANT_AMPLITUDE (Tracheal, tracheal, kKlattGridFormantType::TRACHEAL)
557 KlattGrid_EXTRACT_FORMANT_GRID (NasalAnti, kKlattGridFormantType::NASAL_ANTI)
558 KlattGrid_EXTRACT_FORMANT_GRID (TrachealAnti, kKlattGridFormantType::TRACHEALANTI)
559 KlattGrid_EXTRACT_FORMANT_GRID (Delta, kKlattGridFormantType::DELTA)
560 
561 #undef KlattGrid_EXTRACT_FORMANTGRID
562 
563 #define KlattGrid_REPLACE_FORMANT_GRID(Name,formantType)  \
564 DIRECT (MODIFY_KlattGrid_replace##Name##FormantGrid) { \
565 	MODIFY_FIRST_OF_ONE_AND_ONE (KlattGrid, FormantGrid); \
566 		KlattGrid_replaceFormantGrid (me, formantType, you); \
567 	MODIFY_FIRST_OF_ONE_AND_ONE_END \
568 }
569 
570 #define KlattGrid_REPLACE_FORMANT_AMPLITUDE(Name,name,formantType)  \
571 FORM (MODIFY_KlattGrid_replace##Name##FormantAmplitudeTier, U"KlattGrid: Replace " #name " formant amplitude tier", nullptr) { \
572 	NATURAL (formantNumber, U"Formant number", U"1") \
573 	OK \
574 DO \
575 	MODIFY_FIRST_OF_ONE_AND_ONE (KlattGrid, IntensityTier); \
576 		KlattGrid_replaceAmplitudeTier (me, formantType, formantNumber, you); \
577 	MODIFY_FIRST_OF_ONE_AND_ONE_END \
578 }
579 
580 KlattGrid_REPLACE_FORMANT_GRID (Oral, kKlattGridFormantType::ORAL)
581 KlattGrid_REPLACE_FORMANT_AMPLITUDE (Oral, oral, kKlattGridFormantType::ORAL)
582 KlattGrid_REPLACE_FORMANT_GRID (Nasal, kKlattGridFormantType::NASAL)
583 KlattGrid_REPLACE_FORMANT_AMPLITUDE (Nasal, nasal, kKlattGridFormantType::NASAL)
584 KlattGrid_REPLACE_FORMANT_GRID (NasalAnti, kKlattGridFormantType::NASAL_ANTI)
585 KlattGrid_REPLACE_FORMANT_GRID (Tracheal, kKlattGridFormantType::TRACHEAL)
586 KlattGrid_REPLACE_FORMANT_AMPLITUDE (Tracheal, tracheal, kKlattGridFormantType::TRACHEAL)
587 KlattGrid_REPLACE_FORMANT_GRID (TrachealAnti, kKlattGridFormantType::TRACHEALANTI)
588 KlattGrid_REPLACE_FORMANT_GRID (Delta, kKlattGridFormantType::DELTA)
589 KlattGrid_REPLACE_FORMANT_GRID (Frication, kKlattGridFormantType::FRICATION)
590 KlattGrid_REPLACE_FORMANT_AMPLITUDE (Frication, frication, kKlattGridFormantType::FRICATION)
591 
592 #undef KlattGrid_REPLACE_FORMANT_AMPLITUDE
593 #undef KlattGrid_REPLACE_FORMANTGRID
594 
595 #define KlattGrid_FORMANT_GET_ADD_REMOVE(Name,name,unit,default,requireCondition,requireMessage)  \
596 FORM (QUERY_ONE_FOR_REAL__KlattGrid_get##Name##AtTime, U"KlattGrid: Get " #name " at time", nullptr) { \
597 	KlattGrid_6formants_addCommonField (formantType) \
598 	NATURAL (formantNumber, U"Formant number", U"1") \
599 	REAL (time, U"Time (s)", U"0.5") \
600 	OK \
601 DO \
602 	QUERY_ONE_FOR_REAL (KlattGrid); \
603 		const double result = KlattGrid_get##Name##AtTime (me, formantType, formantNumber, time); \
604 	QUERY_ONE_FOR_REAL_END (U" Hz"); \
605 } \
606 FORM (QUERY_ONE_FOR_REAL__KlattGrid_getDelta##Name##AtTime, U"KlattGrid: Get delta " #name " at time", nullptr) { \
607 	NATURAL (formantNumber, U"Formant number", U"1") \
608 	REAL (time, U"Time (s)", U"0.5") \
609 	OK \
610 DO \
611 	QUERY_ONE_FOR_REAL (KlattGrid); \
612 		const double result = KlattGrid_getDelta##Name##AtTime (me, formantNumber, time); \
613 	QUERY_ONE_FOR_REAL_END (U" Hz"); \
614 } \
615 FORM (MODIFY_KlattGrid_add##Name##Point, U"KlattGrid: Add " #name " point", nullptr) { \
616 	KlattGrid_6formants_addCommonField (formantType) \
617 	NATURAL (formantNumber, U"Formant number", U"1") \
618 	REAL (time, U"Time (s)", U"0.5") \
619 	REAL (value, U"Value" unit, default) \
620 	OK \
621 DO \
622 	Melder_require (requireCondition, requireMessage); \
623 	MODIFY_EACH (KlattGrid) \
624 		KlattGrid_add##Name##Point (me, formantType, formantNumber, time, value); \
625 	MODIFY_EACH_END \
626 } \
627 FORM (MODIFY_KlattGrid_addDelta##Name##Point, U"KlattGrid: Add delta " #name " point", nullptr) { \
628 	NATURAL (formantNumber, U"Formant number", U"1") \
629 	REAL (time, U"Time (s)", U"0.5") \
630 	REAL (value, U"Value" unit, default) \
631 	OK \
632 DO \
633 	Melder_require (requireCondition, requireMessage); \
634 	MODIFY_EACH (KlattGrid) \
635 		KlattGrid_addDelta##Name##Point (me, formantNumber, time, value); \
636 	MODIFY_EACH_END \
637 } \
638 FORM (MODIFY_KlattGrid_remove##Name##Points, U"Remove " #name " points", nullptr) { \
639 	KlattGrid_6formants_addCommonField (formantType) \
640 	NATURAL (formantNumber, U"Formant number", U"1") \
641 	REAL (fromTime, U"From time (s)", U"0.3")\
642 	REAL (toTime, U"To time (s)", U"0.7") \
643 	OK \
644 DO \
645 	MODIFY_EACH (KlattGrid) \
646 		KlattGrid_remove##Name##Points (me, formantType, formantNumber, fromTime, toTime); \
647 	MODIFY_EACH_END \
648 } \
649 FORM (MODIFY_KlattGrid_removeDelta##Name##Points, U"Remove delta " #name " points", nullptr) { \
650 	NATURAL (formantNumber, U"Formant number", U"1") \
651 	REAL (fromTime, U"From time (s)", U"0.3")\
652 	REAL (toTime, U"To time (s)", U"0.7") \
653 	OK \
654 DO \
655 	MODIFY_EACH (KlattGrid) \
656 		KlattGrid_removeDelta##Name##Points (me, formantNumber, fromTime, toTime); \
657 	MODIFY_EACH_END \
658 }
659 
660 KlattGrid_FORMANT_GET_ADD_REMOVE (Formant, formant, U" (Hz)", U"500.0", (value > 0), U"Frequency should be greater than zero.")
661 KlattGrid_FORMANT_GET_ADD_REMOVE (Bandwidth, bandwidth, U" (Hz)", U"50.0", (value > 0), U"Bandwidth should be greater than zero.")
662 
663 #undef KlattGrid_FORMANT_GET_ADD_REMOVE
664 
665 FORM (MODIFY_KlattGrid_addFormantAndBandwidthTier, U"", nullptr) {
666 	OPTIONMENU_ENUM (kKlattGridFormantType, formantType, U"Formant type", kKlattGridFormantType::DEFAULT)
667 	INTEGER (position, U"Position", U"0 (= at end)")
668 	OK
669 DO
670 	MODIFY_EACH (KlattGrid)
671 		KlattGrid_addFormantFrequencyAndBandwidthTiers (me, formantType, position);
672 	MODIFY_EACH_END
673 }
674 
675 FORM (CONVERT_EACH_TO_ONE__KlattGrid_extractFormantGrid, U"KlattGrid: Extract formant grid", nullptr) {
676 	KlattGrid_6formants_addCommonField (formantType)
677 	OK
678 DO
679 	CONVERT_EACH_TO_ONE (KlattGrid)
680 		autoFormantGrid result = KlattGrid_extractFormantGrid (me, formantType);
681 	CONVERT_EACH_TO_ONE_END (KlattGrid_getFormantName (formantType))
682 }
683 
684 FORM (MODIFY_KlattGrid_replaceFormantGrid, U"KlattGrid: Replace formant grid", nullptr) {
685 	KlattGrid_6formants_addCommonField (formantType)
686 	OK
687 DO
688 	MODIFY_FIRST_OF_ONE_AND_ONE (KlattGrid, FormantGrid)
689 		KlattGrid_replaceFormantGrid (me, formantType, you);
690 	MODIFY_FIRST_OF_ONE_AND_ONE_END
691 }
692 
693 FORM (QUERY_ONE_FOR_REAL__KlattGrid_getAmplitudeAtTime, U"KlattGrid: Get amplitude at time", nullptr) {
694 	KlattGrid_4formants_addCommonField (formantType)
695 	NATURAL (formantNumber, U"Formant number", U"1")
696 	REAL (time, U"Time (s)", U"0.5")
697 	OK
698 DO
699 	QUERY_ONE_FOR_REAL (KlattGrid)
700 		double result = KlattGrid_getAmplitudeAtTime (me, formantType, formantNumber, time);
701 	QUERY_ONE_FOR_REAL_END ( U"dB")
702 }
703 
704 FORM (MODIFY_KlattGrid_addAmplitudePoint, U"KlattGrid: Add amplitude point", nullptr) {
705 	KlattGrid_4formants_addCommonField (formantType)
706 	NATURAL (formantNumber, U"Formant number", U"1")
707 	REAL (time, U"Time (s)", U"0.5")
708 	REAL (value_hz, U"Value (Hz)", U"80.0")
709 	OK
710 DO
711 	MODIFY_EACH (KlattGrid)
712 		KlattGrid_addAmplitudePoint (me, formantType, formantNumber, time, value_hz);
713 	MODIFY_EACH_END
714 }
715 
716 FORM (MODIFY_KlattGrid_removeAmplitudePoints, U"Remove amplitude points", nullptr) {
717 	KlattGrid_4formants_addCommonField (formantType)
718 	NATURAL (formantNumber, U"Formant number", U"1")
719 	REAL (fromTime, U"From time (s)", U"0.3")
720 	REAL (toTime, U"To time (s)", U"0.7")
721 	OK
722 DO
723 	MODIFY_EACH (KlattGrid);
724 		KlattGrid_removeAmplitudePoints (me, formantType, formantNumber, fromTime, toTime);
725 	MODIFY_EACH_END
726 }
727 
728 FORM (CONVERT_EACH_TO_ONE__KlattGrid_extractAmplitudeTier, U"", nullptr) {
729 	KlattGrid_4formants_addCommonField (formantType)
730 	NATURAL (formantNumber, U"Formant number", U"1")
731 	OK
732 DO
733 	CONVERT_EACH_TO_ONE (KlattGrid)
734 		autoIntensityTier result = KlattGrid_extractAmplitudeTier (me, formantType, formantNumber);
735 	CONVERT_EACH_TO_ONE_END (KlattGrid_getFormantName (formantType))
736 }
737 
738 FORM (MODIFY_KlattGrid_replaceAmplitudeTier, U"KlattGrid: Replace amplitude tier", nullptr) {
739 	KlattGrid_4formants_addCommonField (formantType)
740 	NATURAL (formantNumber, U"Formant number", U"1")
741 	OK
742 DO
743 	MODIFY_FIRST_OF_ONE_AND_ONE (KlattGrid, IntensityTier)
744 		KlattGrid_replaceAmplitudeTier (me, formantType, formantNumber, you);
745 	MODIFY_FIRST_OF_ONE_AND_ONE_END
746 }
747 
748 FORM (CONVERT_EACH_TO_ONE__KlattGrid_to_Sound_special, U"KlattGrid: To Sound (special)", U"KlattGrid: To Sound (special)...") {
749 	REAL (fromTime, U"left Time range (s)", U"0")
750 	REAL (toTime, U"right Time range (s)", U"0")
751 	POSITIVE (samplingFrequency, U"Sampling frequency (Hz)", U"44100.0")
752 	BOOLEAN (scalePeak, U"Scale peak", true)
753 	KlattGrid_PhonationGridPlayOptions_addCommonFields (useVoicing, useFlutter, useDoublePulsing, useCollisionPhase, useSpectralTilt, flowFunctionType, useFlowDerivative, useAspiration, useBreathiness)
754 	KlattGrid_formantSelection_vocalTract_commonFields (filtersStructure, fromOralFormant, toOralFormant, fromNasalFormant, toNasalFormant, fromNasalAntiFormant, toNasalAntiFormant)
755 	KlattGrid_formantSelection_coupling_commonFields (fromTrachealFormant, toTrachealFormant, fromTrachealAntiFormant, toTrachealAntiFormant, fromDeltaFormant, toDeltaFormant, fromDeltaBandwidth, toDeltaBandwidth)
756 	KlattGrid_formantSelection_frication_commonFields(fromFricationFormant,toFricationFormant,useFricationBypass)
757 	OK
758 DO
759 	CONVERT_EACH_TO_ONE (KlattGrid)
760 		KlattGrid_setDefaultPlayOptions (me);
761 		KlattGridPlayOptions pk = my options.get();
762 		pk -> scalePeak = scalePeak;
763 		pk -> xmin = fromTime;
764 		pk -> xmax = toTime;
765 		pk -> samplingFrequency = samplingFrequency;
766 		pk -> scalePeak = scalePeak;
767 		KlattGrid_PhonationGridPlayOptions (me, useVoicing, useFlutter, useDoublePulsing, useCollisionPhase, useSpectralTilt, flowFunctionType, useFlowDerivative, useAspiration, useBreathiness);
768 		KlattGrid_formantSelection_vocalTract (me, filtersStructure, fromOralFormant, toOralFormant, fromNasalFormant, toNasalFormant, fromNasalAntiFormant, toNasalAntiFormant);
769 		KlattGrid_formantSelection_coupling (me, fromTrachealFormant, toTrachealFormant, fromTrachealAntiFormant, toTrachealAntiFormant, fromDeltaFormant, toDeltaFormant, fromDeltaBandwidth, toDeltaBandwidth);
770 		KlattGrid_formantSelection_frication (me, fromFricationFormant, toFricationFormant, useFricationBypass);
771 		autoSound result = KlattGrid_to_Sound (me);
772 	CONVERT_EACH_TO_ONE_END (my name.get())
773 }
774 
DIRECT(CONVERT_EACH_TO_ONE__KlattGrid_to_Sound)775 DIRECT (CONVERT_EACH_TO_ONE__KlattGrid_to_Sound) {
776 	CONVERT_EACH_TO_ONE (KlattGrid)
777 		KlattGrid_setDefaultPlayOptions (me);
778 		autoSound result = KlattGrid_to_Sound (me);
779 	CONVERT_EACH_TO_ONE_END (my name.get())
780 }
781 
782 FORM (PLAY_KlattGrid_playSpecial, U"KlattGrid: Play special", U"KlattGrid: Play special...") {
783 	REAL (fromTime, U"left Time range (s)", U"0")
784 	REAL (toTime, U"right Time range (s)", U"0")
785 	BOOLEAN (scalePeak, U"Scale peak", true)
786 	KlattGrid_PhonationGridPlayOptions_addCommonFields (useVoicing, useFlutter, useDoublePulsing, useCollisionPhase, useSpectralTilt, flowFunctionType, useFlowDerivative, useAspiration, useBreathiness)
787 	KlattGrid_formantSelection_vocalTract_commonFields (filtersStructure, fromOralFormant, toOralFormant, fromNasalFormant, toNasalFormant, fromNasalAntiFormant, toNasalAntiFormant);
788 	KlattGrid_formantSelection_coupling_commonFields (fromTrachealFormant, toTrachealFormant, fromTrachealAntiFormant, toTrachealAntiFormant, fromDeltaFormant, toDeltaFormant, fromDeltaBandwidth, toDeltaBandwidth)
789 	KlattGrid_formantSelection_frication_commonFields(fromFricationFormant,toFricationFormant,useFricationBypass)
790 	OK
791 DO
792 	PLAY_EACH (KlattGrid)
793 		KlattGrid_setDefaultPlayOptions (me);
794 		KlattGridPlayOptions pk = my options.get();
795 		pk -> scalePeak = scalePeak;
796 		pk -> xmin = fromTime;
797 		pk -> xmax = toTime;
798 		pk -> scalePeak = scalePeak;
799 		KlattGrid_PhonationGridPlayOptions (me, useVoicing, useFlutter, useDoublePulsing, useCollisionPhase, useSpectralTilt, flowFunctionType, useFlowDerivative, useAspiration, useBreathiness);
800 		KlattGrid_formantSelection_vocalTract (me, filtersStructure, fromOralFormant, toOralFormant, fromNasalFormant, toNasalFormant, fromNasalAntiFormant, toNasalAntiFormant);
801 		KlattGrid_formantSelection_coupling (me, fromTrachealFormant, toTrachealFormant, fromTrachealAntiFormant, toTrachealAntiFormant, fromDeltaFormant, toDeltaFormant, fromDeltaBandwidth, toDeltaBandwidth);
802 		KlattGrid_formantSelection_frication (me, fromFricationFormant, toFricationFormant, useFricationBypass);
803 		KlattGrid_playSpecial (me);
804 	PLAY_EACH_END
805 }
806 
807 FORM (CONVERT_EACH_TO_ONE__KlattGrid_to_Sound_phonation, U"KlattGrid: To Sound (phonation)", U"KlattGrid: To Sound (phonation)...") {
808 	POSITIVE (samplingFrequency, U"Sampling frequency (Hz)", U"44100.0")
809 	KlattGrid_PhonationGridPlayOptions_addCommonFields (useVoicing, useFlutter, useDoublePulsing, useCollisionPhase, useSpectralTilt, flowFunctionType, useFlowDerivative, useAspiration, useBreathiness)
810 	OK
811 DO
812 	CONVERT_EACH_TO_ONE (KlattGrid)
813 		KlattGrid_PhonationGridPlayOptions (me, useVoicing, useFlutter, useDoublePulsing, useCollisionPhase, useSpectralTilt, flowFunctionType, useFlowDerivative, useAspiration, useBreathiness);
814 		my options -> samplingFrequency = samplingFrequency;
815 		autoSound result = KlattGrid_to_Sound_phonation (me);
816 	CONVERT_EACH_TO_ONE_END (my name.get(), U"_phonation")
817 }
818 
DIRECT(HELP__KlattGrid_help)819 DIRECT (HELP__KlattGrid_help)  {
820 	HELP (U"KlattGrid")
821 }
822 
DIRECT(PLAY_KlattGrid_play)823 DIRECT (PLAY_KlattGrid_play) {
824 	PLAY_EACH (KlattGrid)
825 		KlattGrid_play (me);
826 	PLAY_EACH_END
827 }
828 
829 FORM (GRAPHICS_EACH__KlattGrid_draw, U"KlattGrid: Draw", nullptr) {
830 	RADIO_ENUM (kKlattGridFilterModel, filterModel, U"Synthesis filter model", kKlattGridFilterModel::DEFAULT)
831 	OK
832 DO
833 	GRAPHICS_EACH (KlattGrid)
834 		KlattGrid_draw (me, GRAPHICS, filterModel);
835 	GRAPHICS_EACH_END
836 }
837 
838 FORM (GRAPHICS_EACH__KlattGrid_drawVocalTract, U"KlattGrid: Draw vocal tract", nullptr) {
839 	RADIO_ENUM (kKlattGridFilterModel, filterModel, U"Synthesis filter model", kKlattGridFilterModel::DEFAULT)
840 	BOOLEAN (includeTrachealFormants, U"Include tracheal formants", true);
841 	OK
842 DO
843 	GRAPHICS_EACH (KlattGrid)
844 		KlattGrid_drawVocalTract (me, GRAPHICS, filterModel, includeTrachealFormants);
845 	GRAPHICS_EACH_END
846 }
847 
DIRECT(GRAPHICS_EACH__KlattGrid_drawPhonation)848 DIRECT (GRAPHICS_EACH__KlattGrid_drawPhonation) {
849 	GRAPHICS_EACH (KlattGrid)
850 		PhonationGrid_draw (my phonation.get(), GRAPHICS);
851 	GRAPHICS_EACH_END
852 }
853 
DIRECT(GRAPHICS_EACH__KlattGrid_drawFrication)854 DIRECT (GRAPHICS_EACH__KlattGrid_drawFrication) {
855 	GRAPHICS_EACH (KlattGrid)
856 		FricationGrid_draw (my frication.get(), GRAPHICS);
857 	GRAPHICS_EACH_END
858 }
859 
860 FORM (CONVERT_EACH_TO_ONE__KlattGrid_to_oralFormantGrid_openPhases, U"KlattGrid: Extract oral formant grid (open phases)", U"KlattGrid: Extract oral formant grid (open phases)...") {
861 	REAL (fadeFraction, U"Fade fraction (0..0.5)", U"0.1")
862 	OK
863 DO
864 	Melder_require (fadeFraction < 0.5, U"The fade fraction should be less than 0.5.");
865 	CONVERT_EACH_TO_ONE (KlattGrid)
866 		autoFormantGrid result = KlattGrid_to_oralFormantGrid_openPhases (me, fadeFraction);
867 	CONVERT_EACH_TO_ONE_END (U"corrected")
868 }
869 
870 FORM (CONVERT_ONE_AND_ONE_TO_ONE__Sound_KlattGrid_filterByVocalTract, U"Sound & KlattGrid: Filter by vocal tract", U"Sound & KlattGrid: Filter by vocal tract...") {
871 	RADIO_ENUM (kKlattGridFilterModel, filterModel, U"Vocal tract filter model", kKlattGridFilterModel::DEFAULT)
872 	OK
873 DO
874 	CONVERT_ONE_AND_ONE_TO_ONE (Sound, KlattGrid)
875 		autoSound result = Sound_KlattGrid_filterByVocalTract (me, you, filterModel);
876 	CONVERT_ONE_AND_ONE_TO_ONE_END (my name.get(), U"_", your name.get())
877 }
878 
879 void praat_KlattGrid_init ();
praat_KlattGrid_init()880 void praat_KlattGrid_init () {
881 
882 	Thing_recognizeClassesByName (classKlattGrid, nullptr);
883 
884 	structKlattGrid_OpenPhaseTierArea       :: f_preferences();
885 	structKlattGrid_CollisionPhaseTierArea  :: f_preferences();
886 	structKlattGrid_Power1TierArea          :: f_preferences();
887 	structKlattGrid_Power2TierArea          :: f_preferences();
888 	structKlattGrid_DoublePulsingTierArea   :: f_preferences();
889 	structKlattGrid_PitchTierArea           :: f_preferences();
890 	structKlattGrid_FlutterTierArea         :: f_preferences();
891 	structKlattGrid_IntensityTierArea       :: f_preferences();
892 	structKlattGrid_DecibelTierArea         :: f_preferences();
893 	structKlattGrid_SpectralTiltTierArea    :: f_preferences();
894 	structKlattGrid_FricationBypassTierArea :: f_preferences();
895 
896 	praat_addMenuCommand (U"Objects", U"New", U"Acoustic synthesis (Klatt)", nullptr, 0, nullptr);
897 	praat_addMenuCommand (U"Objects", U"New", U"KlattGrid help", nullptr, praat_DEPTH_1 | praat_NO_API,
898 			HELP__KlattGrid_help);
899 	praat_addMenuCommand (U"Objects", U"New", U"-- the synthesizer grid --", nullptr, 1, nullptr);
900 	praat_addMenuCommand (U"Objects", U"New", U"Create KlattGrid...", nullptr, 1,
901 			CREATE_ONE__KlattGrid_create);
902 	praat_addMenuCommand (U"Objects", U"New", U"Create KlattGrid from vowel...", nullptr, 1,
903 			CREATE_ONE__KlattGrid_createFromVowel);
904 	praat_addMenuCommand (U"Objects", U"New", U"Create KlattGrid example", nullptr, praat_DEPTH_1 + praat_HIDDEN,
905 			CREATE_ONE__KlattGrid_createExample);
906 
907 	/*
908 	Edit oral/nasal/tracheal/frication/delta formant grid
909 	Edit nasal/tracheal antiformant grid
910 	Get oral/nasal/tracheal/frication/delta formant at time...
911 	Get nasal/tracheal antiformant at time...
912 	Get oral/nasal/tracheal/frication/delta formant bandwidth at time...
913 	Get nasal/tracheal antiformant bandwidth at time...
914 	Get oral/nasal/tracheal/frication formant amplitude at time...
915 	Formula (oral/nasal/tracheal/frication/delta formant frequencies)...
916 	Formula (nasal/tracheal antiformant frequencies)...
917 	Formula (oral/nasal/tracheal/frication/delta formant bandwidths)...
918 	Formula (nasal/tracheal antiformant bandwidths)...
919 	Add oral/nasal/tracheal/frication/delta formant point...
920 	Add nasal/tracheal antiformant point...
921 	Add oral/nasal/tracheal/frication/delta formant bandwidth point...
922 	Add nasal/tracheal antiformant bandwidth point...
923 	Add oral/nasal/tracheal/frication formant amplitude point...
924 	Remove oral/nasal/tracheal/frication/delta formant points...
925 	Remove nasal/tracheal antiformant points...
926 	Remove oral/nasal/tracheal/frication/delta bandwidth points...
927 	Remove nasal/tracheal antiformant bandwidth points...
928 	Remove oral/nasal/tracheal/frication formant amplitude points...
929 	Extract oral/nasal/tracheal/frication/delta formant grid
930 	Extract nasal/tracheal antiformant grid
931 	Replace oral/nasal/tracheal/frication/delta formant grid
932 	Replace nasal/tracheal antiformant grid
933 	Add oral/nasal/tracheal/frication/delta formant and bandwidth tier
934 	Add nasal/tracheal antiformant and bandwidth tier
935 	*/
936 	praat_addAction1 (classKlattGrid, 0, U"KlattGrid help", nullptr, 0,
937 			HELP__KlattGrid_help);
938 	praat_addAction1 (classKlattGrid, 0, U"Edit phonation -", nullptr, 0, nullptr);
939 	praat_addAction1 (classKlattGrid, 0, U"Edit pitch tier", nullptr, 1,
940 			EDITOR_ONE_KlattGrid_editPitchTier);
941 	praat_addAction1 (classKlattGrid, 0, U"Edit voicing amplitude tier", nullptr, 1,
942 			EDITOR_ONE_KlattGrid_editVoicingAmplitudeTier);
943 	praat_addAction1 (classKlattGrid, 0, U"Edit flutter tier", nullptr, 1,
944 			EDITOR_ONE_KlattGrid_editFlutterTier);
945 	praat_addAction1 (classKlattGrid, 0, U"Edit power1 tier", nullptr, 1,
946 			EDITOR_ONE_KlattGrid_editPower1Tier);
947 	praat_addAction1 (classKlattGrid, 0, U"Edit power2 tier", nullptr, 1,
948 			EDITOR_ONE_KlattGrid_editPower2Tier);
949 	praat_addAction1 (classKlattGrid, 0, U"Edit open phase tier", nullptr, 1,
950 			EDITOR_ONE_KlattGrid_editOpenPhaseTier);
951 	praat_addAction1 (classKlattGrid, 0, U"Edit collision phase tier", nullptr, 1,
952 			EDITOR_ONE_KlattGrid_editCollisionPhaseTier);
953 	praat_addAction1 (classKlattGrid, 0, U"Edit double pulsing tier", nullptr, 1,
954 			EDITOR_ONE_KlattGrid_editDoublePulsingTier);
955 	praat_addAction1 (classKlattGrid, 0, U"Edit spectral tilt tier", nullptr, 1,
956 			EDITOR_ONE_KlattGrid_editSpectralTiltTier);
957 	praat_addAction1 (classKlattGrid, 0, U"Edit aspiration amplitude tier", nullptr, 1,
958 			EDITOR_ONE_KlattGrid_editAspirationAmplitudeTier);
959 	praat_addAction1 (classKlattGrid, 0, U"Edit breathiness amplitude tier", nullptr, 1,
960 			EDITOR_ONE_KlattGrid_editBreathinessAmplitudeTier);
961 
962 	praat_addAction1 (classKlattGrid, 0, U"Edit filters -", nullptr, 0, nullptr);
963 	praat_addAction1 (classKlattGrid, 0, U"Edit oral formant grid", nullptr, 1,
964 			EDITOR_ONE_KlattGrid_editOralFormantGrid);
965 	praat_addAction1 (classKlattGrid, 0, U"Edit nasal formant grid", nullptr, 1,
966 			EDITOR_ONE_KlattGrid_editNasalFormantGrid);
967 	praat_addAction1 (classKlattGrid, 0, U"Edit nasal antiformant grid", nullptr, 1,
968 			EDITOR_ONE_KlattGrid_editNasalAntiFormantGrid);
969 	praat_addAction1 (classKlattGrid, 0, U"Edit oral formant amplitude tier...", nullptr, 1,
970 			EDITOR_ONE_KlattGrid_editOralFormantAmplitudeTier);
971 	praat_addAction1 (classKlattGrid, 0, U"Edit nasal formant amplitude tier...", nullptr, 1,
972 			EDITOR_ONE_KlattGrid_editNasalFormantAmplitudeTier);
973 	praat_addAction1 (classKlattGrid, 0, U"-- edit delta formant grid --", nullptr, 1, nullptr);
974 	praat_addAction1 (classKlattGrid, 0, U"Edit delta formant grid", nullptr, 1,
975 			EDITOR_ONE_KlattGrid_editDeltaFormantGrid);
976 	praat_addAction1 (classKlattGrid, 0, U"Edit tracheal formant grid", nullptr, 1,
977 			EDITOR_ONE_KlattGrid_editTrachealFormantGrid);
978 	praat_addAction1 (classKlattGrid, 0, U"Edit tracheal antiformant grid", nullptr, 1,
979 			EDITOR_ONE_KlattGrid_editTrachealAntiFormantGrid);
980 	praat_addAction1 (classKlattGrid, 0, U"Edit tracheal formant amplitude tier...", nullptr, 1,
981 			EDITOR_ONE_KlattGrid_editTrachealFormantAmplitudeTier);
982 	praat_addAction1 (classKlattGrid, 0, U"-- edit frication tiers --", nullptr, 1, nullptr);
983 	praat_addAction1 (classKlattGrid, 1, U"Edit frication amplitude tier", nullptr, 1,
984 			EDITOR_ONE_KlattGrid_editFricationAmplitudeTier);
985 	praat_addAction1 (classKlattGrid, 0, U"Edit frication formant grid", nullptr, 1,
986 			EDITOR_ONE_KlattGrid_editFricationFormantGrid);
987 	praat_addAction1 (classKlattGrid, 0, U"Edit frication formant amplitude tier...", nullptr, 1,
988 			EDITOR_ONE_KlattGrid_editFricationFormantAmplitudeTier);
989 	praat_addAction1 (classKlattGrid, 0, U"Edit frication bypass tier", nullptr, 1,
990 			EDITOR_ONE_KlattGrid_editFricationBypassTier);
991 	praat_addAction1 (classKlattGrid, 1, U"Edit frication amplitude tier", nullptr, 1,
992 			EDITOR_ONE_KlattGrid_editFricationAmplitudeTier);
993 
994 	praat_addAction1 (classKlattGrid, 0, U"Play", nullptr, 0,
995 			PLAY_KlattGrid_play);
996 	praat_addAction1 (classKlattGrid, 0, U"Play special...", nullptr, 0,
997 			PLAY_KlattGrid_playSpecial);
998 	praat_addAction1 (classKlattGrid, 0, U"To Sound", nullptr, 0,
999 			CONVERT_EACH_TO_ONE__KlattGrid_to_Sound);
1000 	praat_addAction1 (classKlattGrid, 0, U"To Sound (special)...", nullptr, 0,
1001 			CONVERT_EACH_TO_ONE__KlattGrid_to_Sound_special);
1002 	praat_addAction1 (classKlattGrid, 0, U"To Sound (phonation)...", nullptr, 0,
1003 			CONVERT_EACH_TO_ONE__KlattGrid_to_Sound_phonation);
1004 
1005 	praat_addAction1 (classKlattGrid, 0, U"Draw -", nullptr, 0, nullptr);
1006 	praat_addAction1 (classKlattGrid, 0, U"Draw synthesizer...", nullptr, 1,
1007 			GRAPHICS_EACH__KlattGrid_draw);
1008 	praat_addAction1 (classKlattGrid, 0, U"Draw vocal tract...", nullptr, 1,
1009 			GRAPHICS_EACH__KlattGrid_drawVocalTract);
1010 	praat_addAction1 (classKlattGrid, 0, U"Draw phonation", nullptr, 1,
1011 			GRAPHICS_EACH__KlattGrid_drawPhonation);
1012 	praat_addAction1 (classKlattGrid, 0, U"Draw frication", nullptr, 1,
1013 			GRAPHICS_EACH__KlattGrid_drawFrication);
1014 
1015 	praat_addAction1 (classKlattGrid, 0, U"Query phonation -", nullptr, 0, nullptr);
1016 	praat_addAction1 (classKlattGrid, 1, U"Get pitch at time...", nullptr, 1,
1017 			QUERY_ONE_FOR_REAL__KlattGrid_getPitchAtTime);
1018 	praat_addAction1 (classKlattGrid, 1, U"Get voicing amplitude at time...", nullptr, 1,
1019 			QUERY_ONE_FOR_REAL__KlattGrid_getVoicingAmplitudeAtTime);
1020 	praat_addAction1 (classKlattGrid, 1, U"Get flutter at time...", nullptr, 1,
1021 			QUERY_ONE_FOR_REAL__KlattGrid_getFlutterAtTime);
1022 	praat_addAction1 (classKlattGrid, 1, U"Get power1 at time...", nullptr, 1,
1023 			QUERY_ONE_FOR_REAL__KlattGrid_getPower1AtTime);
1024 	praat_addAction1 (classKlattGrid, 1, U"Get power2 at time...", nullptr, 1,
1025 			QUERY_ONE_FOR_REAL__KlattGrid_getPower2AtTime);
1026 	praat_addAction1 (classKlattGrid, 1, U"Get open phase at time...", nullptr, 1,
1027 			QUERY_ONE_FOR_REAL__KlattGrid_getOpenPhaseAtTime);
1028 	praat_addAction1 (classKlattGrid, 1, U"Get collision phase at time...", nullptr, 1,
1029 			QUERY_ONE_FOR_REAL__KlattGrid_getCollisionPhaseAtTime);
1030 	praat_addAction1 (classKlattGrid, 1, U"Get double pulsing at time...", nullptr, 1,
1031 			QUERY_ONE_FOR_REAL__KlattGrid_getDoublePulsingAtTime);
1032 	praat_addAction1 (classKlattGrid, 1, U"Get spectral tilt at time...", nullptr, 1,
1033 			QUERY_ONE_FOR_REAL__KlattGrid_getSpectralTiltAtTime);
1034 	praat_addAction1 (classKlattGrid, 1, U"Get aspiration amplitude at time...", nullptr, 1,
1035 			QUERY_ONE_FOR_REAL__KlattGrid_getAspirationAmplitudeAtTime);
1036 	praat_addAction1 (classKlattGrid, 1, U"Get breathiness amplitude at time...", nullptr, 1,
1037 			QUERY_ONE_FOR_REAL__KlattGrid_getBreathinessAmplitudeAtTime);
1038 
1039 	praat_addAction1 (classKlattGrid, 0, U"Query filters -", nullptr, 0, nullptr);
1040 	praat_addAction1 (classKlattGrid, 1, U"Get formant at time...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1041 			QUERY_ONE_FOR_REAL__KlattGrid_getFormantAtTime);
1042 	praat_addAction1 (classKlattGrid, 1, U"Get bandwidth at time...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1043 			QUERY_ONE_FOR_REAL__KlattGrid_getBandwidthAtTime);
1044 	praat_addAction1 (classKlattGrid, 1, U"Get amplitude at time...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1045 			QUERY_ONE_FOR_REAL__KlattGrid_getAmplitudeAtTime);
1046 	praat_addAction1 (classKlattGrid, 1, U"Get delta formant at time...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1047 			QUERY_ONE_FOR_REAL__KlattGrid_getDeltaFormantAtTime);
1048 	praat_addAction1 (classKlattGrid, 1, U"Get delta bandwidth at time...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1049 			QUERY_ONE_FOR_REAL__KlattGrid_getDeltaBandwidthAtTime);
1050 
1051 #define KlattGRID_GET_FORMANT_FB_VALUES_ACTION(Name, formantname) \
1052 	praat_addAction1 (classKlattGrid, 1, U"Get " #formantname " frequency at time...", nullptr, 1, \
1053 			QUERY_ONE_FOR_REAL__KlattGrid_get##Name##FormantFrequencyAtTime); \
1054 	praat_addAction1 (classKlattGrid, 1, U"Get " #formantname " bandwidth at time...", nullptr, 1, \
1055 			QUERY_ONE_FOR_REAL__KlattGrid_get##Name##FormantBandwidthAtTime);
1056 
1057 #define KlattGRID_GET_FORMANT_A_VALUES_ACTION(Name,formantname) \
1058 	praat_addAction1 (classKlattGrid, 1, U"Get " #formantname " amplitude at time...", nullptr, 1, \
1059 			QUERY_ONE_FOR_REAL__KlattGrid_get##Name##FormantAmplitudeAtTime); \
1060 
1061 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (Oral, oral formant)
1062 	KlattGRID_GET_FORMANT_A_VALUES_ACTION (Oral, oral formant)
1063 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (Nasal, nasal formant)
1064 	KlattGRID_GET_FORMANT_A_VALUES_ACTION (Nasal, nasal formant)
1065 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (NasalAnti, nasal antiformant)
1066 
1067 	praat_addAction1 (classKlattGrid, 1, U"-- query delta characteristics", nullptr, 1, nullptr);
1068 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (Delta, delta formant)
1069 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (Tracheal, tracheal formant)
1070 	KlattGRID_GET_FORMANT_A_VALUES_ACTION (Tracheal, tracheal formant)
1071 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (TrachealAnti, tracheal antiformant)
1072 	praat_addAction1 (classKlattGrid, 1, U"-- query frication characteristics", nullptr, 1, nullptr);
1073 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (Frication, frication formant)
1074 	KlattGRID_GET_FORMANT_A_VALUES_ACTION (Frication, frication formant)
1075 
1076 #undef KlattGRID_GET_FORMANT_A_VALUES_ACTION
1077 #undef KlattGRID_GET_FORMANT_A_VALUES_ACTION
1078 
1079 	praat_addAction1 (classKlattGrid, 1, U"Get frication bypass at time...", nullptr, 1,
1080 			QUERY_ONE_FOR_REAL__KlattGrid_getFricationBypassAtTime);
1081 	praat_addAction1 (classKlattGrid, 1, U"Get frication amplitude at time...", nullptr, 1,
1082 			QUERY_ONE_FOR_REAL__KlattGrid_getFricationAmplitudeAtTime);
1083 
1084 	praat_addAction1 (classKlattGrid, 0, U"Modify phonation -", nullptr, 0, nullptr);
1085 	praat_addAction1 (classKlattGrid, 0, U"Add pitch point...", nullptr, 1,
1086 			MODIFY_KlattGrid_addPitchPoint);
1087 	praat_addAction1 (classKlattGrid, 0, U"Add voicing amplitude point...", nullptr, 1,
1088 			MODIFY_KlattGrid_addVoicingAmplitudePoint);
1089 	praat_addAction1 (classKlattGrid, 0, U"Add flutter point...", nullptr, 1,
1090 			MODIFY_KlattGrid_addFlutterPoint);
1091 	praat_addAction1 (classKlattGrid, 0, U"Add power1 point...", nullptr, 1,
1092 			MODIFY_KlattGrid_addPower1Point);
1093 	praat_addAction1 (classKlattGrid, 0, U"Add power2 point...", nullptr, 1,
1094 			MODIFY_KlattGrid_addPower2Point);
1095 	praat_addAction1 (classKlattGrid, 0, U"Add open phase point...", nullptr, 1,
1096 			MODIFY_KlattGrid_addOpenPhasePoint);
1097 	praat_addAction1 (classKlattGrid, 0, U"Add collision phase point...", nullptr, 1,
1098 			MODIFY_KlattGrid_addCollisionPhasePoint);
1099 	praat_addAction1 (classKlattGrid, 0, U"Add double pulsing point...", nullptr, 1,
1100 			MODIFY_KlattGrid_addDoublePulsingPoint);
1101 	praat_addAction1 (classKlattGrid, 0, U"Add spectral tilt point...", nullptr, 1,
1102 			MODIFY_KlattGrid_addSpectralTiltPoint);
1103 	praat_addAction1 (classKlattGrid, 0, U"Add aspiration amplitude point...", nullptr, 1,
1104 			MODIFY_KlattGrid_addAspirationAmplitudePoint);
1105 	praat_addAction1 (classKlattGrid, 0, U"Add breathiness amplitude point...", nullptr, 1,
1106 			MODIFY_KlattGrid_addBreathinessAmplitudePoint);
1107 
1108 #define KlattGrid_REMOVE_POINTS_ACTION(Name,name)  \
1109 	praat_addAction1 (classKlattGrid, 0, U"Remove " #name " points between...", nullptr, praat_DEPTH_1+praat_HIDDEN, \
1110 			MODIFY_KlattGrid_remove##Name##Points); \
1111 	praat_addAction1 (classKlattGrid, 0, U"Remove " #name " points...", nullptr, 1, \
1112 			MODIFY_KlattGrid_remove##Name##Points);
1113 
1114 	KlattGrid_REMOVE_POINTS_ACTION (Pitch, pitch)
1115 	KlattGrid_REMOVE_POINTS_ACTION (VoicingAmplitude, voicing amplitude)
1116 	KlattGrid_REMOVE_POINTS_ACTION (Flutter, flutter)
1117 	KlattGrid_REMOVE_POINTS_ACTION (Power1, power1)
1118 	KlattGrid_REMOVE_POINTS_ACTION (Power2, power2)
1119 	KlattGrid_REMOVE_POINTS_ACTION (OpenPhase, open phase)
1120 	KlattGrid_REMOVE_POINTS_ACTION (CollisionPhase, collision phase)
1121 	KlattGrid_REMOVE_POINTS_ACTION (DoublePulsing, double pulsing)
1122 	KlattGrid_REMOVE_POINTS_ACTION (SpectralTilt, spectral tilt)
1123 	KlattGrid_REMOVE_POINTS_ACTION (AspirationAmplitude, aspiration amplitude)
1124 	KlattGrid_REMOVE_POINTS_ACTION (BreathinessAmplitude, breathiness amplitude)
1125 
1126 	praat_addAction1 (classKlattGrid, 0, U"Modify vocal tract -", nullptr, 0, nullptr);
1127 
1128 #define KlattGrid_MODIFY_ACTIONS_FBA(Name,formantname)  \
1129 	praat_addAction1 (classKlattGrid, 0, U"Formula (" #formantname " frequencies)...", nullptr, 1, \
1130 			MODIFY_KlattGrid_formula##Name##FormantFrequencies); \
1131 	praat_addAction1 (classKlattGrid, 0, U"Formula (" #formantname " bandwidths)...", nullptr, 1, \
1132 			MODIFY_KlattGrid_formula##Name##FormantBandwidths); \
1133 	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " frequency point...", nullptr, 1, \
1134 			MODIFY_KlattGrid_add##Name##FormantFrequencyPoint); \
1135 	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " bandwidth point...", nullptr, 1, \
1136 			MODIFY_KlattGrid_add##Name##FormantBandwidthPoint); \
1137 	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " amplitude point...", nullptr, 1, \
1138 			MODIFY_KlattGrid_add##Name##FormantAmplitudePoint); \
1139 	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " frequency points...", nullptr, 1, \
1140 			MODIFY_KlattGrid_remove##Name##FormantFrequencyPoints); \
1141 	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " bandwidth points...", nullptr, 1, \
1142 			MODIFY_KlattGrid_remove##Name##FormantBandwidthPoints); \
1143 	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " amplitude points...", nullptr, 1, \
1144 			MODIFY_KlattGrid_remove##Name##FormantAmplitudePoints); \
1145 	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " frequency and bandwidth tiers...", nullptr, 1, \
1146 			MODIFY_KlattGrid_add##Name##FormantFrequencyAndBandwidthTiers); \
1147 	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " frequency and bandwidth tiers...", nullptr, 1, \
1148 			MODIFY_KlattGrid_remove##Name##FormantFrequencyAndBandwidthTiers); \
1149 	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " amplitude tier...", nullptr, 1, \
1150 			MODIFY_KlattGrid_add##Name##FormantAmplitudeTier); \
1151 	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " amplitude tier...", nullptr, 1, \
1152 			MODIFY_KlattGrid_remove##Name##FormantAmplitudeTier); \
1153 	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname "...", nullptr, praat_DEPTH_1 + praat_HIDDEN, \
1154 			MODIFY_KlattGrid_add##Name##Formant); \
1155 	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname "...", nullptr, praat_DEPTH_1 + praat_HIDDEN, \
1156 			MODIFY_KlattGrid_remove##Name##Formant);
1157 
1158 #define KlattGrid_MODIFY_ACTIONS_FB(Name,formantname)  \
1159 	praat_addAction1 (classKlattGrid, 0, U"Formula (" #formantname " frequencies)...", nullptr, 1, \
1160 			MODIFY_KlattGrid_formula##Name##FormantFrequencies); \
1161 	praat_addAction1 (classKlattGrid, 0, U"Formula (" #formantname " bandwidths)...", nullptr, 1, \
1162 			MODIFY_KlattGrid_formula##Name##FormantBandwidths); \
1163 	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " frequency point...", nullptr, 1, \
1164 			MODIFY_KlattGrid_add##Name##FormantFrequencyPoint); \
1165 	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " bandwidth point...", nullptr, 1, \
1166 			MODIFY_KlattGrid_add##Name##FormantBandwidthPoint); \
1167 	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " frequency points...", nullptr, 1, \
1168 			MODIFY_KlattGrid_remove##Name##FormantFrequencyPoints); \
1169 	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " bandwidth points...", nullptr, 1, \
1170 			MODIFY_KlattGrid_remove##Name##FormantBandwidthPoints); \
1171 	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " frequency and bandwidth tiers...", nullptr, 1, \
1172 			MODIFY_KlattGrid_add##Name##FormantFrequencyAndBandwidthTiers); \
1173 	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " frequency and bandwidth tiers...", nullptr, 1, \
1174 			MODIFY_KlattGrid_remove##Name##FormantFrequencyAndBandwidthTiers); \
1175 	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname "...", nullptr, praat_DEPTH_1 + praat_HIDDEN, \
1176 			MODIFY_KlattGrid_add##Name##Formant); \
1177 	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname "...", nullptr, praat_DEPTH_1 + praat_HIDDEN, \
1178 			MODIFY_KlattGrid_remove##Name##Formant);
1179 
1180 	KlattGrid_MODIFY_ACTIONS_FBA (Oral, oral formant)
1181 	praat_addAction1 (classKlattGrid, 0, U"-- oral modify separator --", nullptr, 1, nullptr);
1182 	KlattGrid_MODIFY_ACTIONS_FBA (Nasal, nasal formant)
1183 	praat_addAction1 (classKlattGrid, 0, U"-- nasal modify separator --", nullptr, 1, nullptr);
1184 	KlattGrid_MODIFY_ACTIONS_FB (NasalAnti, nasal antiformant)
1185 
1186 	praat_addAction1 (classKlattGrid, 0, U"Formula (frequencies)...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1187 			MODIFY_KlattGrid_formula_frequencies);
1188 	praat_addAction1 (classKlattGrid, 0, U"Formula (bandwidths)...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1189 			MODIFY_KlattGrid_formula_bandwidths);
1190 	praat_addAction1 (classKlattGrid, 0, U"Add formant point...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1191 			MODIFY_KlattGrid_addFormantPoint);
1192 	praat_addAction1 (classKlattGrid, 0, U"Add bandwidth point...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1193 			MODIFY_KlattGrid_addBandwidthPoint);
1194 	praat_addAction1 (classKlattGrid, 0, U"Add amplitude point...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1195 			MODIFY_KlattGrid_addAmplitudePoint);
1196 	praat_addAction1 (classKlattGrid, 0, U"Remove formant points between...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1197 			MODIFY_KlattGrid_removeFormantPoints);
1198 	praat_addAction1 (classKlattGrid, 0, U"Remove bandwidth points between...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1199 			MODIFY_KlattGrid_removeBandwidthPoints);
1200 	praat_addAction1 (classKlattGrid, 0, U"Remove amplitude points between...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1201 			MODIFY_KlattGrid_removeAmplitudePoints);
1202 	praat_addAction1 (classKlattGrid, 0, U"Modify coupling - ", nullptr, 0, nullptr);
1203 	KlattGrid_MODIFY_ACTIONS_FB (Delta, delta formant)
1204 	praat_addAction1 (classKlattGrid, 0, U"-- delta modify separator --", nullptr, 1, nullptr);
1205 	KlattGrid_MODIFY_ACTIONS_FBA (Tracheal, tracheal formant)
1206 	praat_addAction1 (classKlattGrid, 0, U"-- nasal modify separator --", nullptr, 1, nullptr);
1207 	KlattGrid_MODIFY_ACTIONS_FB (TrachealAnti, tracheal antiformant)
1208 
1209 	praat_addAction1 (classKlattGrid, 0, U"Add delta formant point...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1210 			MODIFY_KlattGrid_addDeltaFormantPoint);
1211 	praat_addAction1 (classKlattGrid, 0, U"Add delta bandwidth point...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1212 			MODIFY_KlattGrid_addDeltaBandwidthPoint);
1213 	praat_addAction1 (classKlattGrid, 0, U"Remove delta formant points between...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1214 			MODIFY_KlattGrid_removeDeltaFormantPoints);
1215 	praat_addAction1 (classKlattGrid, 0, U"Remove delta bandwidth points between...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1216 			MODIFY_KlattGrid_removeDeltaBandwidthPoints);
1217 
1218 	praat_addAction1 (classKlattGrid, 0, U"Modify frication -", nullptr, 0, nullptr);
1219 	KlattGrid_MODIFY_ACTIONS_FBA (Frication, frication formant)
1220 	praat_addAction1 (classKlattGrid, 0, U"-- frication modify separator --", nullptr, 1, nullptr);
1221 
1222 	praat_addAction1 (classKlattGrid, 0, U"Add frication bypass point...", nullptr, 1,
1223 			MODIFY_KlattGrid_addFricationBypassPoint);
1224 	praat_addAction1 (classKlattGrid, 0, U"Add frication amplitude point...", nullptr, 1,
1225 			MODIFY_KlattGrid_addFricationAmplitudePoint);
1226 	KlattGrid_REMOVE_POINTS_ACTION (FricationBypass, frication bypass)
1227 	KlattGrid_REMOVE_POINTS_ACTION (FricationAmplitude, frication amplitude)
1228 	praat_addAction1 (classKlattGrid, 0, U"Add formant and bandwidth tier...", nullptr, praat_DEPTH_1 + praat_HIDDEN,
1229 			MODIFY_KlattGrid_addFormantAndBandwidthTier);
1230 
1231 #undef KlattGrid_REMOVE_POINTS_ACTION
1232 #undef KlattGrid_MODIFY_ACTION_FB
1233 #undef KlattGrid_MODIFY_ACTION_FBA
1234 
1235 	praat_addAction1 (classKlattGrid, 0, U"Extract phonation -", nullptr, 0, nullptr);
1236 	praat_addAction1 (classKlattGrid, 0, U"Extract pitch tier", nullptr, 1,
1237 			CONVERT_EACH_TO_ONE__KlattGrid_extractPitchTier);
1238 	praat_addAction1 (classKlattGrid, 0, U"Extract voicing amplitude tier", nullptr, 1,
1239 			CONVERT_EACH_TO_ONE__KlattGrid_extractVoicingAmplitudeTier);
1240 	praat_addAction1 (classKlattGrid, 0, U"Extract flutter tier", nullptr, 1,
1241 			CONVERT_EACH_TO_ONE__KlattGrid_extractFlutterTier);
1242 	praat_addAction1 (classKlattGrid, 0, U"Extract power1 tier", nullptr, 1,
1243 			CONVERT_EACH_TO_ONE__KlattGrid_extractPower1Tier);
1244 	praat_addAction1 (classKlattGrid, 0, U"Extract power2 tier", nullptr, 1,
1245 			CONVERT_EACH_TO_ONE__KlattGrid_extractPower2Tier);
1246 	praat_addAction1 (classKlattGrid, 0, U"Extract open phase tier", nullptr, 1,
1247 			CONVERT_EACH_TO_ONE__KlattGrid_extractOpenPhaseTier);
1248 	praat_addAction1 (classKlattGrid, 0, U"Extract collision phase tier", nullptr, 1,
1249 			CONVERT_EACH_TO_ONE__KlattGrid_extractCollisionPhaseTier);
1250 	praat_addAction1 (classKlattGrid, 0, U"Extract double pulsing tier", nullptr, 1,
1251 			CONVERT_EACH_TO_ONE__KlattGrid_extractDoublePulsingTier);
1252 	praat_addAction1 (classKlattGrid, 0, U"Extract spectral tilt tier", nullptr, 1,
1253 			CONVERT_EACH_TO_ONE__KlattGrid_extractSpectralTiltTier);
1254 	praat_addAction1 (classKlattGrid, 0, U"Extract aspiration amplitude tier", nullptr, 1,
1255 			CONVERT_EACH_TO_ONE__KlattGrid_extractAspirationAmplitudeTier);
1256 	praat_addAction1 (classKlattGrid, 0, U"Extract breathiness amplitude tier", nullptr, 1,
1257 			CONVERT_EACH_TO_ONE__KlattGrid_extractBreathinessAmplitudeTier);
1258 	praat_addAction1 (classKlattGrid, 0, U"-- extract glottal events--", nullptr, 1, nullptr);
1259 	praat_addAction1 (classKlattGrid, 0, U"Extract PointProcess (glottal closures)", nullptr, 1,
1260 			CONVERT_EACH_TO_ONE__KlattGrid_extractPointProcess_glottalClosures);
1261 
1262 #define KlattGRID_EXTRACT_FORMANT_GRID_ACTION(Name,namef)  \
1263 	praat_addAction1 (classKlattGrid, 0, U"Extract " #namef "ormant grid", nullptr, 1, \
1264 			CONVERT_EACH_TO_ONE__KlattGrid_extract##Name##FormantGrid);
1265 #define KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION(Name,name)  \
1266 	praat_addAction1 (classKlattGrid, 0, U"Extract " #name " formant amplitude tier...", nullptr, 1, \
1267 			CONVERT_EACH_TO_ONE__KlattGrid_extract##Name##FormantAmplitudeTier);
1268 
1269 	praat_addAction1 (classKlattGrid, 0, U"Extract filters -", nullptr, 0, nullptr);
1270 	praat_addAction1 (classKlattGrid, 0, U"Extract formant grid...", nullptr, praat_DEPTH_1 + praat_HIDDEN + praat_NO_API,
1271 			CONVERT_EACH_TO_ONE__KlattGrid_extractFormantGrid); // deprecated
1272 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (Oral, oral f)
1273 	praat_addAction1 (classKlattGrid, 0, U"Extract amplitude tier...", nullptr, praat_DEPTH_1 + praat_HIDDEN + praat_NO_API,
1274 			CONVERT_EACH_TO_ONE__KlattGrid_extractAmplitudeTier); // deprecated
1275 	praat_addAction1 (classKlattGrid, 0, U"Extract formant grid (open phases)...", nullptr, praat_HIDDEN + praat_DEPTH_1,
1276 			CONVERT_EACH_TO_ONE__KlattGrid_to_oralFormantGrid_openPhases);
1277 	praat_addAction1 (classKlattGrid, 0, U"Extract oral formant grid (open phases)...", nullptr, 1,
1278 			CONVERT_EACH_TO_ONE__KlattGrid_to_oralFormantGrid_openPhases);
1279 	KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION (Oral, oral)
1280 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (Nasal, nasal f)
1281 	KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION (Nasal, nasal)
1282 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (NasalAnti, nasal antif)
1283 
1284 	praat_addAction1 (classKlattGrid, 0, U"-- extract delta characteristics", nullptr, 1, nullptr);
1285 	praat_addAction1 (classKlattGrid, 0, U"Extract delta formant grid", nullptr, 1,
1286 			CONVERT_EACH_TO_ONE__KlattGrid_extractDeltaFormantGrid);
1287 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (Tracheal, tracheal f)
1288 	KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION (Tracheal, tracheal)
1289 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (TrachealAnti, tracheal antif)
1290 	praat_addAction1 (classKlattGrid, 0, U"-- extract frication characteristics", nullptr, 1, nullptr);
1291 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (Frication, frication f)
1292 	KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION (Frication, frication)
1293 	praat_addAction1 (classKlattGrid, 0, U"Extract frication bypass tier", nullptr, 1,
1294 			CONVERT_EACH_TO_ONE__KlattGrid_extractFricationBypassTier);
1295 	praat_addAction1 (classKlattGrid, 0, U"Extract frication amplitude tier", nullptr, 1,
1296 			CONVERT_EACH_TO_ONE__KlattGrid_extractFricationAmplitudeTier);
1297 
1298 #undef KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION
1299 #undef KlattGRID_EXTRACT_FORMANT_GRID_ACTION
1300 
1301 	praat_addAction2 (classKlattGrid, 1, classPitchTier, 1, U"Replace pitch tier", nullptr, 1,
1302 			MODIFY_KlattGrid_replacePitchTier);
1303 	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace flutter tier", nullptr, 1,
1304 			MODIFY_KlattGrid_replaceFlutterTier);
1305 	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace power1 tier", nullptr, 1,
1306 			MODIFY_KlattGrid_replacePower1Tier);
1307 	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace power2 tier", nullptr, 1,
1308 			MODIFY_KlattGrid_replacePower2Tier);
1309 	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace open phase tier", nullptr, 1,
1310 			MODIFY_KlattGrid_replaceOpenPhaseTier);
1311 	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace collision phase tier", nullptr, 1,
1312 			MODIFY_KlattGrid_replaceCollisionPhaseTier);
1313 	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace double pulsing tier", nullptr, 1,
1314 			MODIFY_KlattGrid_replaceDoublePulsingTier);
1315 
1316 	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"-- replace formant amplitudes --", nullptr, 1, nullptr);
1317 
1318 #define KlattGrid_REPLACE_FORMANTGRID_ACTION(Name,namef)  \
1319 	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, U"Replace " #namef "ormant grid", nullptr, 1, \
1320 			MODIFY_KlattGrid_replace##Name##FormantGrid);
1321 #define KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION(Name,namef)  \
1322 	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace " #namef "ormant amplitude tier...", nullptr, 1, \
1323 			MODIFY_KlattGrid_replace##Name##FormantAmplitudeTier);
1324 
1325 	KlattGrid_REPLACE_FORMANTGRID_ACTION (Oral, oral f)
1326 	KlattGrid_REPLACE_FORMANTGRID_ACTION (Nasal, nasal f)
1327 	KlattGrid_REPLACE_FORMANTGRID_ACTION (NasalAnti, nasal antif)
1328 	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, U"-- replace coupling --", nullptr, 1, nullptr);
1329 	KlattGrid_REPLACE_FORMANTGRID_ACTION (Tracheal, tracheal f)
1330 	KlattGrid_REPLACE_FORMANTGRID_ACTION (TrachealAnti, tracheal antif)
1331 	KlattGrid_REPLACE_FORMANTGRID_ACTION (Delta, delta f)
1332 	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, U"-- replace frication --", nullptr, 1, nullptr);
1333 	KlattGrid_REPLACE_FORMANTGRID_ACTION (Frication, frication f)
1334 	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, U"Replace formant grid...", nullptr, praat_HIDDEN + praat_DEPTH_1,
1335 			MODIFY_KlattGrid_replaceFormantGrid);
1336 	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace voicing amplitude tier", nullptr, 1,
1337 			MODIFY_KlattGrid_replaceVoicingAmplitudeTier);
1338 	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace spectral tilt tier", nullptr, 1,
1339 			MODIFY_KlattGrid_replaceSpectralTiltTier);
1340 	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace aspiration amplitude tier", nullptr, 1,
1341 			MODIFY_KlattGrid_replaceAspirationAmplitudeTier);
1342 	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace breathiness amplitude tier", nullptr, 1,
1343 			MODIFY_KlattGrid_replaceBreathinessAmplitudeTier);
1344 	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace amplitude tier...", nullptr, praat_HIDDEN + praat_DEPTH_1,
1345 			MODIFY_KlattGrid_replaceAmplitudeTier);
1346 	KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION (Oral, oral f)
1347 	KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION (Nasal, nasal f)
1348 	KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION (Tracheal, tracheal f)
1349 	KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION (Frication, frication f)
1350 	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace frication amplitude tier", nullptr, 1,
1351 			MODIFY_KlattGrid_replaceFricationAmplitudeTier);
1352 	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace frication bypass tier", nullptr, 1,
1353 			MODIFY_KlattGrid_replaceFricationBypassTier);
1354 
1355 #undef KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION
1356 #undef KlattGrid_REPLACE_FORMANTGRID_ACTION
1357 
1358 	praat_addAction2 (classKlattGrid, 1, classSound, 1, U"Filter by vocal tract...", nullptr, 1,
1359 			CONVERT_ONE_AND_ONE_TO_ONE__Sound_KlattGrid_filterByVocalTract);
1360 
1361 	INCLUDE_MANPAGES (manual_KlattGrid)
1362 }
1363 
1364 /* End of file praat_KlattGrid_init.cpp 1290*/
1365