// PB General rules for vowels:
// Short vowels
// ACC: Short "pille" [p?el@-], "andre" [AndRV]
// AC[V]: Short "piler" [p?ilV] - verbs, not nouns, which is a problem
// A[N]: Short "bange" [b?AN@-]
// Long vowels
// A + @- OR V: Long "ae" "aer" [&:@-]
// AC + @- OR V: Long "pile" [pi:l@-]
// AC[i]: Long "smidig" [smi:Di]

//         Vowel length changed by eSpeak
// Between two voiced consonants
// After [l/3]
// Before [l/3]
// After an "r" sound
// Before [N]
// Before voiced consonant + [i]

//        PROCEDURES

// Change the length of SHORT vowels (?+vowel)
procedure ShortVowelLength
// "endelig", "ånder", "ynde" - Short initial vowel sounds too short TEST
	IF thisPh(isWordStart) AND nextPhW(n) THEN
		IF next2PhW(@-) OR next2PhW(V) THEN
			IF next2PhW(isWordEnd) THEN // NOT "ondeste"
				length 170
				RETURN
			ENDIF
		ENDIF
	ENDIF

// "blod" "slutte", "løn" l/3 makes the vowel too long
// NOT "mel'oner"
	IF prevPhW(l/3) AND thisPh(isFirstVowel) THEN
		IF thisPh(isStressed)  THEN
			length 100
			IF nextPhW(N) THEN // [N] makes it even longer - "længden"
				LengthAdd -20
			ENDIF
		// Don't shorten it further if it comes after an "r" sound
		// Exit the procedure		
			RETURN
		ENDIF
		// "transplantation" - the second a - between 2 voiced consonants
		IF nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
			length 100
			RETURN
		ENDIF
	ENDIF
	
// "bygge", "bygget", "byggede" - consonant + [@-] makes the vowel too long
	IF NOT thisPh(?V) THEN // NOT "fjollet"
		IF prevPhW(isVoiced) AND nextPhW(isVoiced) THEN
			IF next2PhW(@-) THEN //AND next3PhW(D) THEN
				IF thisPh(isFirstVowel) THEN // NOT "cellof'anet"
					length 100
					RETURN
				ENDIF
			ENDIF
		ENDIF
	ENDIF

// "byttet", "lyttet", "flyttet"
	IF prevPhW(isVoiced) AND prevPhW(isNotVowel) THEN
		IF nextPhW(isNotVowel) AND next2PhW(@-) AND next3PhW(D) THEN
			length 100
		ENDIF
	ENDIF
	
// "firmaet", "politiet - 140 sounds too short
	IF nextPhW(@-) AND next2PhW(D) AND next2PhW(isWordEnd) THEN
		length 180
	ENDIF
	
// "forsøgte" stressed second vowel too long TEST
	IF thisPh(isMaxStress) AND thisPh(isSecondVowel) THEN
		IF nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN // NOT "papirer"
			// 2 voiced consonants seem to add further length ([gd] in "forsøgte")		
			IF next2PhW(isVoiced) AND next2PhW(isNotVowel) THEN // NOT "moral"
				length 110
				RETURN
			ENDIF
		ENDIF
	ENDIF
	
// "bygge", "forbandelse", "lynlås", "centralen" vowel between 2 voiced consonants - too long
	IF prevPhW(isVoiced) AND nextPhW(isVoiced) THEN // voiced
		IF prevPhW(isNotVowel) AND nextPhW(isNotVowel) THEN // consonants
			IF NOT nextPhW(isWordEnd) THEN // NOT "smil"
				IF NOT next2PhW(j) AND NOT prevPhW(R) THEN // NOT "vilje", "krympe"
					IF NOT nextPhW(r) AND NOT nextPhW(3-) THEN // NOT "moderne" - vowel + r/3-
						IF thisPh(isStressed) THEN // NOT [W] in "f'indelønnen"
							IF thisPh(isFirstVowel) THEN
//								IF NOT nextPhW(@-) THEN // NOT "væbne"
								IF NOT nextPhW(isNotVowel) AND NOT next2PhW(isNotVowel) THEN // NOT "væbne"
									length 110 
									RETURN
								ENDIF
							ENDIF
						ENDIF
					ENDIF
				ENDIF
				IF prevPhW(R) THEN // "krympe" R makes the vowel longer than other voiced consonants
					// NOT [o] in "rod'eo", NOT [æ] in "trængte"
					IF thisPh(isMaxStress) AND NOT nextPhW(N) THEN 
						length 90
						RETURN
					ENDIF
					// "trængte" - [N] after the vowel makes it even longer
					IF thisPh(isMaxStress) AND nextPhW(N) THEN
						length 75
						RETURN
					ENDIF
				ENDIF
			ENDIF
		ENDIF
	ENDIF

// "buske"	- only sg/sk? TEST
	IF prevPhW(isNotVowel) AND nextPhW(s) AND next2PhW(isNotVowel) AND next3PhW(@-) THEN
		length 100
	ENDIF
	
// "projektet"
	IF prevPhW(S) AND nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
		length 100
	ENDIF
	
// "rigtigt", "fred", "frem", "frikvarter" - R makes the vowel too long
	IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
		IF nextPhW(isNotVowel) THEN // NOT "krigen"
			IF thisPh(isFirstVowel) THEN // NOT the a in "moral"
				length 110
				RETURN
			ENDIF
		ENDIF
		
		// R makes the vowel too long
		IF thisPh(isWordEnd) THEN // "maleri"
			length 120
			RETURN
		ENDIF
		
		// "forbrydelse" between 2 voiced consonants
		IF nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
			length 110
			RETURN
		ENDIF
	ENDIF
	
// "ring", "ringe", "fængsel", "spinkel", "vindspejl", "enke"
	IF nextPhW(N) THEN
			length 100
	ENDIF
	
// "sigte", "henter" t/d + @-/V makes the vowel too long
// ?? is this just between 2 voiced consonants ??
// ?? does [h] act as a voiced consonant ??
	IF nextPhW(isNotVowel) AND next2PhW(t) OR next2PhW(d) THEN
		IF next3PhW(@-) OR next3PhW(V) OR next3PhW(?V) THEN
			IF thisPh(isFirstVowel) THEN // NOT [i] in "forsp'ildte"
				length 110
				RETURN
			ENDIF
		ENDIF	
	ENDIF
	
// "himlen", "pøblen" l/3 makes the vowel too long
	IF nextPhW(isNotVowel) AND next2PhW(l/3) AND next3PhW(@-) OR next3PhW(V) THEN
		length 110
	ENDIF
	
// "filmen"	vowel + l/3 makes the vowel too long
// Probably due to 2 voiced consonants (lm) - Change the condition?
	IF nextPhW(l/3) AND next3PhW(@-) THEN
		IF NOT next2PhW(j) THEN // NOT "vilje"
			IF next2PhW(isVoiced) THEN // NOT [e] in "folkevogn"
				length 100
			ENDIF
		ENDIF
	ENDIF
	
//"musikken", "piggen", "trafikken" consonant + [@-] makes the vowel too long
//  Probably wrong. Only k and g? Only [i]?
// Could this be due to an English word like "physique" [fIz'i:k]?
	IF nextPhW(k) OR nextPhW(g)AND next2PhW(@-) THEN
		IF thisPh(?i) THEN
			length 100
			RETURN
		ENDIF
	ENDIF

// "rodeo", lianen" abnormal stress sounds too short	
	IF thisPh(isMaxStress) AND NOT thisPh(isFirstVowel) THEN
		IF NOT nextPhW(k) AND NOT nextPhW(g) THEN // NOT "ant'ikt" - Like "physique" above?
			IF NOT nextPhW(N) AND NOT next2PhW(isNotVowel) THEN // NOT "omkr'ing", "eks'empel"
				IF NOT nextPhW(isVoiced) AND NOT next2PhW(isVoiced) THEN // NOT "bestemme" TEST
					length 170
				ENDIF
			ENDIF
		ENDIF
	ENDIF
endprocedure

//--------------------------------------------------------------------

// Change the length of NORMAL vowels (without ? in front of them)
procedure LongVowelLength
// "guldmine" [ul/3] makes the vowel extremely short
	IF prevVowel(l/3) AND prev2PhW(u) THEN
		length 350
		RETURN
	ENDIF
	
// "guldur" [ul/3] makes the vowel extremely short
	IF prev2PhW(u) AND prevPhW(l/3) THEN
		IF NOT thisPh(isWordEnd) THEN // NOT "umulig"
			IF NOT nextPhW(t) AND NOT nextPhW(d) THEN // NOT "umuligt"
				IF NOT nextPhW(s) AND NOT nextPhW(S) THEN // NOT Drakulas, spekulationer ???
					length 325
					RETURN
				ENDIF
			ENDIF
		ENDIF
	ENDIF
	
// "dage", "dagevis", fødselsdage" STRANGE BEHAVIOUR - too short at 240
	IF prevPhW(d) AND nextPhW(@-) THEN
		IF NOT next2PhW(D) THEN
			length 350
			RETURN
		ENDIF
	ENDIF
	
// "tjeneste" TEST
	IF prevPhW(tS) AND nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
		length 180
		RETURN
	ENDIF	
	
// "havet", "lavet"	
	IF nextPhW(isVoiced) AND next2PhW(@-) AND next3PhW(D) THEN
		length 180
		RETURN
	ENDIF

// "videre"	
	IF prevPhW(isVoiced) AND nextPhW(isVoiced) THEN // voiced
		IF prevPhW(isNotVowel) AND nextPhW(isNotVowel) THEN // consonants
			IF NOT prevPhW(R) AND NOT prevPhW(r) AND NOT prevPhW(3-) THEN
				length 180
				RETURN
			ELSE // [A] in "begravelse" - "r" adds extra length
				length 120
				RETURN
			ENDIF
		ENDIF
	ENDIF
	
// "alene" - Short initial vowel sounds too short at length 140
	IF thisPh(isWordStart) THEN
		length 160
		// "år? [O] - The word is only 1 vowel: make it long
		IF thisPh(isWordEnd) THEN
			length 180
		ENDIF
	// "ønske" The vowel should have been made short becauce of 3 x consonant.
	// Take care of it here
		IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) AND next3PhW(isNotVowel) THEN
			length 140
		ENDIF
	// "ære"
		IF nextPhW(V) AND nextPhW(isFinalVowel) THEN
			length 240
		ENDIF
	// "øge", "øgede"
	IF nextPhW(isNotVowel) AND next2PhW(@-) THEN
		length 225
	ENDIF
//		RETURN
	ENDIF
	
// "døre" vowel + vowel: long
	IF nextPhW(@-) OR nextPhW(?V) THEN
		length 225
	ENDIF

// "pæne" vowel + consonant + [@-]: long
	IF nextPhW(isNotVowel) AND next2PhW(@-) THEN
		IF thisPh(isFirstVowel) THEN
			IF prevPhW(isVoiced) AND nextPhW(isVoiced) THEN // "vide"
				length 180
			ELSE // "pæne"
				length 225
			ENDIF
		RETURN
		ENDIF
		// Stressed second syllable in words with initial be- and for-
		IF NOT thisPh(isSecondVowel) AND thisPh(isMaxStress) THEN // "beb'ude", "form'ode"
			length 140
			RETURN
		ENDIF
	ENDIF
	
// "vildrede"
	IF nextPhW(D) AND next2PhW(@-) THEN
		IF NOT thisPh(isMaxStress) THEN
			length 225
			RETURN
		ENDIF
	ENDIF

// "guderne", "møde"		
	IF nextPhW(isNotVowel) AND next2PhW(?V) OR next2PhW(V) OR next2PhW(@-) THEN
		length 225
	ENDIF
		
// "mødes", "vred", "møve", "mene", "dele" - vowel too long between 2 voiced consonants
	IF prevPhW(isVoiced) AND nextPhW(isVoiced) THEN
			IF prevPhW(isNotVowel) AND nextPhW(isNotVowel) THEN
				IF NOT prevPhW(R) AND NOT prevPhW(r) AND NOT prevPhW(3-) AND NOT prevPhW(l/3) THEN
					IF NOT next2PhW(isVoiced) THEN // NOT "bælte", "bomben"
						length 180 // mødes, dele
						RETURN
					ENDIF
					IF next2PhW(isNotVowel) THEN // bælte, svælge
						length 120
					ENDIF
				ELIF NOT prevPhW(l/3) AND thisPh(isMaxStress) THEN 
					IF NOT prevPhW(R) AND NOT prevPhW(r) AND NOT prevPhW(3-) THEN
						length 120 // "vred", "vrede"
						RETURN
					ENDIF
				ENDIF
				IF prevPhW(R) AND prevPhW(isWordStart) THEN // "råderet"
					length 180
					RETURN
				ENDIF
			ENDIF
	ENDIF
	
// "huske" - hACC@- vowel too long
// 2 consonants - should have been short in da_rules
// 140 too long because of [h]??
	IF prevPhW(h) AND nextPhW(isNotVowel) AND next2PhW(isNotVowel) AND next3PhW(@-) THEN
		length 110
		RETURN
	ENDIF
	
// PB long vowel followed by [@-] or [V](vowel+vowel) - "pigen" [p'i@-n]
	IF nextPhW(@-) OR nextPhW(V) THEN
		IF thisPh(isFirstVowel) THEN // NOT "best'yrelse", "geb'yrer"
			length 225
		ENDIF
	ENDIF

	// "lydig"
	IF prevPhW(l/3) AND nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
			length 180
			RETURN
	ENDIF
	
// PB "enig", "enige", "evig", "stædig" - vowel+consolant+[i]
	IF nextPhW(isNotVowel) AND next2PhW(i) THEN
		length 225
		RETURN
	ENDIF
	
// "føden"
	IF nextPhW(D) AND next2PhW(@-) AND next3PhW(n) THEN
		IF thisPh(isFirstVowel) THEN
			length 180
		ENDIF
	ENDIF

// l/3 + vowel makes the vowel too long
	IF prevPhW(l/3) AND nextPhW(isNotVowel) THEN
   // "klub", "klud", "slut"
   // The vowel should have been short but we fix it here 
		IF NOT next2PhW(@-) AND NOT next2PhW(V) AND NOT next2PhW(?V) THEN // NOT "slæde"
			length 100
		ELSE
	// "slæde", "lader", "forlader"
			length 160
		ENDIF
	ENDIF
	
// l/3 + vowel + voiced consonant makes the vowel too long
		IF prevPhW(l/3) AND nextPhW(isVoiced) AND nextPhW(isNotVowel) THEN
			length 130
		ENDIF

// "fryser", "rige"		
		IF prevPhW(r) OR prevPhW(R) OR prevPhW(3-) THEN
			length 130
			IF nextPhW(@-) THEN // "rige" [@-] seems to cancel the "r" effect
				length 240
			ENDIF
		ENDIF
					
// "længe" - short - 2 consonants => 1 consonant (ng => [N])
// Don't use isNasal here!
	IF nextPhW(N) THEN
		IF NOT prevPhW(R) AND NOT prevPhW(r) AND NOT prevPhW(3-) THEN
			length 140
		ENDIF
	ENDIF
	
// "buskene", "krøbling" The vowel should have been made short becauce og 2 x consonant.
// Take care of it here
	IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
		IF NOT nextPhW(l/3) THEN
			IF NOT nextPhW(r) AND NOT prevPhW(R) AND NOT prevPhW(3-) THEN // NOT "Maria"
				length 110
			ENDIF
		ENDIF
	ENDIF
endprocedure
//----------------------------------------------------------------------

//                 PHONEMES

// A bit longer than [@-]
phoneme @
  vowel starttype #@ endtype #@
  unstressed
  length 60
  IfNextVowelAppend(_!)
  FMT(vowel/@_3)
endphoneme

phoneme @-   //  very short schwa
  vowel starttype #@  endtype #@
  unstressed nonsyllabic
  ipa ə
  IF nextPhW(*) OR nextPhW(r) THEN
    ipa NULL   // @-* is used to make 'r'
  ENDIF
  length 50
// "femten", "manden" - only a short "n" sound
  IF nextPhW(n) THEN
	length 15
  ENDIF
IF prevPhW(isNotVowel) AND thisPh(isWordEnd) THEN
	length 15
ENDIF
// "lige" [li@-]
IF prevPhW(i) AND thisPh(isWordEnd) THEN
	length 15
ENDIF
  IF nextPhW(isVowel) THEN
	ChangePhoneme(@)
  ENDIF
  FMT(vowel/@-)
endphoneme

// ToDo: change [@] to [a#] if adjacent to [r] or [R]
phoneme 3
  vowel starttype #a endtype #a
  unstressed
  length 40
  FMT(vowel/a#_3)
endphoneme

// PB sort of schwa [ɐ] (0250+032F)
// "spurgt" [sp'o3-d] – ipa [spˈoɐ̯d]
phoneme 3-    // used for 'r' after a vowel (to create a diphthong)
  liquid
  lengthmod 7
  ipa ɐ̯
    FMT(r/a_)
endphoneme

phoneme i
  vowel starttype #i endtype #i
  length 140
CALL LongVowelLength
  FMT(vowel/i_4)
endphoneme

// PB short i
// sviret vs. svirret
phoneme ?i
  vowel starttype #i endtype #i
  length 140
  CALL ShortVowelLength
// Don't link with the next vowel with [;] - vowel too short
//  IfNextVowelAppend(;)
  FMT(vowel/i_4)
endphoneme

// PB English i - Tim
phoneme I
  vowel  starttype #i  endtype #i
  length 130
  IfNextVowelAppend(;)
  FMT(vowel/ii_2)
endphoneme

phoneme e
  vowel starttype #e endtype #e
  length 140 
  CALL LongVowelLength
  FMT(vowel/e)
endphoneme

// PB short e
// "skille" vs. "skele", "pille" vs. "pile"
phoneme ?e
  vowel starttype #e endtype #e
  length 140
  CALL ShortVowelLength
  FMT(vowel/e)
endphoneme

phoneme E
  vowel starttype #e endtype #e
  length 140 
// no link with next vowel
IF thisPh(isWordEnd) THEN
  IfNextVowelAppend(_!)
ENDIF
// "ære", "kærester", "ærefrygt" - vowel + vowel
IF nextPhW(V) THEN
	length 225
ENDIF
// "dræber" TEST shortened by -70 in procedure because of the "r" sound
IF prevPhW(R) OR prevPhW(r) OR prevPhW(3-) AND next2PhW(V) THEN
	length 225
ENDIF
  CALL LongVowelLength
// "værelse"  [v'E3-Vls@_!]
IF nextPhW(3-) AND next2PhW(V) THEN
	length 100
ENDIF
  FMT(vowel/e_mid2)
endphoneme

// PB short E
// "læsse" vs. "læse"
phoneme ?E
  vowel starttype #e endtype #e
  ipa ε
  length 140
  CALL ShortVowelLength
  FMT(vowel/e_mid2)
endphoneme

phoneme &
  vowel starttype #e endtype #e
  ipa a
  length 140
// "same", "sale", "bade" - consonant + @-: long
// but NOT "hinanden"
IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(@) THEN
  IF NOT next3PhW(n) THEN
 	length 225
  ENDIF
ENDIF
// ThisPh + V or @-
// "ae", "aer" vowel + vowel: extra length
IF nextPhW(@-) OR nextPhW(V) THEN
	length 260
ENDIF
CALL LongVowelLength
  FMT(vowel/ee_2)
endphoneme

// Short &
// e.g. the last a in "staldkarl"
// "sale" vs. "sal"
phoneme ?&
ipa a
  vowel starttype #e endtype #e
   length 140
   CALL ShortVowelLength
   FMT(vowel/ee_2)
endphoneme

// Added for the æ in "dræbt"
phoneme &#
  vowel starttype  #e endtype #e
    length 140
	ipa a
	CALL LongVowelLength
	FMT(vowel/&)
endphoneme

// PB short &#
// "revl" vs. "tremme"
phoneme ?&#
  vowel starttype  #e endtype #e
  ipa ?a
  length 140
  CALL ShortVowelLength
  FMT(vowel/&)
endphoneme

phoneme A // PB changed to a_8
  vowel starttype #a endtype #a
  ipa ɑ
  length 140 
CALL LongVowelLength
// "fare" [f'A:A]
IF nextPhW(A) THEN
	length 225
ENDIF
  FMT(vowel/a_8)
endphoneme

// Short A
// "krabbe" vs. "drabelig"
phoneme ?A
  vowel starttype #a endtype #a
  ipa ?ɑ
  length 140
CALL ShortVowelLength
  FMT(vowel/a_8)
endphoneme

phoneme u
  vowel starttype #u endtype #u
  length 140 
// "suge", "uge", "bluse", "julegave"
IF nextPhW(@-) OR nextPhW(V) OR next2PhW(@-) OR next2PhW(V)THEN
	length 225
ENDIF
IF NOT thisPh(isWordStart) THEN // NOT "undøvendig"
	CALL LongVowelLength
ENDIF
  FMT(vowel/u_bck)
endphoneme

// Short u
// "tude" vs. "tuden" - [tuD3] [t?uD@n]
phoneme ?u
  vowel starttype #u endtype #u
  length 140
  CALL ShortVowelLength
  FMT(vowel/u_bck)
endphoneme

phoneme o
  vowel starttype #o endtype #o
  length 140 
// "kone", "koner" o + consonant + V or @-
IF next2PhW(V) OR next2PhW(@-) THEN
	length 225
ENDIF
CALL LongVowelLength
  FMT(vowel/o_2)
endphoneme

// PB Short o
// "patron" vs. "kone"
phoneme ?o
  vowel starttype #o endtype #o
  length 140
  CALL ShortVowelLength   
  FMT(vowel/o_2)
endphoneme

phoneme O
  vowel starttype #o endtype #o
  length 140
  ipa ɒ // changed from ɔ - Den Danske Ordbog: ɒ
// "såre", "sårede"  [s'O:?OD@-]
IF nextPhW(O) OR nextPhW(?O) THEN
	length 225
ENDIF
CALL LongVowelLength
  FMT(vowel/o_5)
endphoneme

// Short O
// "toget" vs. "tåget"
phoneme ?O
  vowel starttype #o endtype #o
   ipa ɒ // changed from ɔ - Den Danske Ordbog: ɒ
  length 140
  CALL ShortVowelLength 
  FMT(vowel/o_5)
endphoneme

phoneme V
  vowel starttype #@ endtype #@
  length 140
CALL LongVowelLength
  FMT(vowel/V_4)
endphoneme

// PB Short V
// "forstår" vs. "kåre"
phoneme ?V
  vowel starttype #@ endtype #@
  length 140
  CALL ShortVowelLength
  FMT(vowel/V_4)
endphoneme

phoneme 0
  vowel starttype #o endtype #o
  length 140 
  ipa ɔ
  CALL LongVowelLength
  FMT(vowel/oo_2)
endphoneme

// Short 0 "sukker", "provst"
phoneme ?0
  vowel starttype #o endtype #o
  length 140
  ipa ɔ
  CALL ShortVowelLength
  FMT(vowel/oo_2)
endphoneme

phoneme y
  vowel starttype #i endtype #i
  length 140
  CALL LongVowelLength
  FMT(vowel/y)
endphoneme

// PB Short y
// "kylling" vs. "kyle", "krybbe" vs. "krybe"
phoneme ?y
  vowel starttype #i endtype #i
  length 140
  CALL ShortVowelLength
  FMT(vowel/y)
endphoneme

phoneme Y
  vowel starttype #i endtype #i
  length 140
	IF nextPhW(V) OR nextPhW(@-) THEN
		length 225
	ENDIF
  CALL LongVowelLength
  FMT(vowel/yy)
endphoneme

phoneme W
  vowel starttype #@ endtype #@
  length 140 
  CALL LongVowelLength
  FMT(vowel/oe)
endphoneme

// Short W
// "prøv" vs. "prøve"
phoneme ?W
  vowel starttype #@ endtype #@
  length 140
  CALL ShortVowelLength
  FMT(vowel/oe)
endphoneme

// Added for the ø in "røv", "røg", "øje" instead of [V3]
phoneme W#
  vowel starttype #@ endtype #@
  length 140
CALL LongVowelLength
  FMT(vowel/V)
endphoneme

// Short W#
// "rømme"
phoneme ?W#
  vowel starttype #@ endtype #@
  length 140
  CALL ShortVowelLength
  FMT(vowel/V)
endphoneme

phoneme aI
  vowel starttype #a endtype #i
  length 300
IF NOT next2Ph(3) AND NOT next2Ph(V) AND NOT next2Ph(@-) AND nextPhW(isNotVowel) THEN
   glstop
   length 225
ENDIF
// "dreje" [dR'aI@-_!]
IF nextPhW(3) OR nextPhW(V) OR nextPhW(@) OR nextPhW(@-) THEN
	length 280
ENDIF
// PB "drej" vs. "dreje"
IF thisPh(isWordEnd) THEN
	length 140
ENDIF
// "lejde" [l'aId@-_!], "lejder" [l'aIdV_!]
IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(V) THEN
	length 190
ENDIF
  FMT(vdiph/ai)
endphoneme


// CONSONANTS

// PB added l/3
phoneme l
  liquid
  lengthmod 7
// [ll] => [-l] - avoid double l
IF nextPhW(l) THEN
//    ChangePhoneme(NULL)
ENDIF
  ChangePhoneme(l/3)
//  CALL base/l
endphoneme

phoneme l/3    // Replacement for [l/]
  liquid
  lengthmod 7
  length 80
  FMT(l/l_)
endphoneme

phoneme v        // approximant, not fricative
  import_phoneme base/v#
  voicingswitch f
endphoneme

// PB Actually a kind of schwa = [ɐ]? - "byder" [bˈyðɐʌ]
phoneme r    // used for 'r' after a vowel (to create a diphthong)
  liquid
  lengthmod 7
  ipa ɐ̯
  IF nextPhW(isVowel) AND NOT nextPhW(?V) AND NOT nextPhW(V) AND NOT nextPhW(@-) THEN
    ChangePhoneme(R)
  ENDIF
	// "generer" [Sen'e:Vr], "mysterier" - delete the r
  IF prevPhW(V) OR prevPhW(?V) AND thisPh(isWordEnd) THEN
		ChangePhoneme(_!)
  ENDIF
  // "plamagers" [pl&m'&SVrs] - delete the r
  IF prevPhW(V) OR prevPhW(?V) AND nextPhW(s) AND nextPhW(isWordEnd) THEN
		ChangePhoneme(NULL)
  ENDIF
   // "plamagerne" [pl&m'&SVrn@-] - delete the r
  IF prevPhW(V) OR prevPhW(?V) AND nextPhW(n) AND next2PhW(@-) THEN
		ChangePhoneme(NULL)
  ENDIF
	// "kreaturer"  [kR,?E?&t'ur?V] - delete the r
	// Previous vowel stressed by $alt rule
  IF nextPhW(V) OR nextPhW(?V) AND nextPh(isWordEnd) THEN
	IF prevPhW(isMaxStress) THEN
		ChangePhoneme(NULL)
	ENDIF
  ENDIF
  FMT(r/a_)
endphoneme

phoneme R
  lengthmod 6
  liquid
  ipa ʁ
  FMT(r/aa)
endphoneme

// don't weaken consonants at end of word or before a stop

phoneme s
  vls alv frc sibilant
  voicingswitch z
  lengthmod 3
  Vowelin  f1=0  f2=1700 -300 300  f3=-100 80
  Vowelout f1=0  f2=1700 -300 250  f3=-100 80  rms=20

  IF nextPh(p) OR nextPh(t) OR nextPh(k) THEN
    WAV(ufric/s!)
  ENDIF
  WAV(ufric/s)
endphoneme

phoneme p
  vls blb stop
  voicingswitch b
  lengthmod 7
  Vowelin  f1=0  f2=1000 -50 -100  f3=-200 80 amp=11
  Vowelout f1=0  f2=1000 -500 -350  f3=-300 80 rms=22

  IF nextPh(isPause2) THEN
    WAV(ustop/p_unasp)
  ELIF nextPh(r) THEN
    WAV(ustop/pr, 70)
  ELIF nextPh(R) OR nextPh(R2) THEN
    WAV(ustop/pr)
  ELIF nextPh(@-) THEN
    WAV(ustop/p_unasp)
  ELIF nextPh(l) THEN
    WAV(ustop/pl)
  ENDIF
  WAV(ustop/p)
endphoneme

phoneme t
  vls alv stop
  voicingswitch d
  lengthmod 7
  Vowelin f1=0  f2=1700 -300 300  f3=-100 80
  Vowelout f1=0 f2=1700 -300 250  f3=-100 80  rms=20

  IF nextPh(r) OR nextPh(R) OR nextPh(R2) THEN
    WAV(ustop/tr)
  ENDIF
// "respekt"  [REsp'Egd]
  IF thisPh(isWordEnd) THEN
//	ChangePhoneme(d)
  ENDIF
  WAV(ustop/t, 90)
endphoneme

phoneme j
  liquid palatal
  lengthmod 7
// no link with next vowel
IF thisPh(isWordEnd) THEN
  IfNextVowelAppend(_!)
ENDIF
  IF nextPhW(isVowel) THEN
    NextVowelStarts
      VowelStart(j/j@) // jøderne
      VowelStart(j/ja)
      VowelStart(j/je)
      VowelStart(j/ji)
      VowelStart(j/jo) // "kjole"
      VowelStart(j/ju)
    EndSwitch
Vowelout len=70
    VowelEnding(j/xj, -30)

    IF prevPh(isPause) THEN
      FMT(j/_j)
    ENDIF
  ELSE
    // no vowel follows
    Vowelout len=70
    FMT(j/j_)
  ENDIF
endphoneme
