| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658 | // 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]
// Change the length of short vowels (?+vowel)
procedure ShortVowelLength
// "endelig" - Short initial vowel sounds too short
IF thisPh(isWordStart) THEN
	length 160
	RETURN
ENDIF
// "slutte" t/d + @- makes the u too long
IF next2PhW(@-) THEN
  IF nextPhW(t) OR nextPhW(d) THEN
	//length 100
	  LengthAdd -50
	  // Don't shorten it further if it comes after an "r" sound
	  // Exit the procedure
	  RETURN
  ENDIF
ENDIF
// "bygget" - consonant + [@-D] makes the vowel too long
IF next2PhW(@-) THEN
  IF next3PhW(t) OR next3PhW(d) OR next3PhW(D) THEN
	  LengthAdd -50
	  // Don't shorten it further if it comes after an "r" sound ("brygget")
	  // Exit the procedure
	  RETURN
  ENDIF
ENDIF
// "bygger" - consonant + [V] makes the vowel too long
IF nextPhW(isNotVowel) AND next2PhW(V) THEN
	  LengthAdd -50
	  // Don't shorten it further if it comes after an "r" sound ("brygger")
	  // Exit the procedure
	  RETURN
ENDIF
// "rigtigt", "fred", "frem", "centralen" - R makes the vowel too long
  IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
//     length 100
	LengthAdd -50
  ENDIF
// "ring", "ringe", "fængsel"
  IF nextPhW(N) THEN
//    length 100
	LengthAdd -10
  ENDIF
// "sigte" t/d + @- makes the vowel too long
  IF nextPhW(isNotVowel) AND next2PhW(t) OR next2PhW(d) THEN
	IF next3PhW(@-) THEN
//		length 100
		LengthAdd -50
    ENDIF	
  ENDIF
endprocedure
// Change the length of normal vowels (without ? in front of them)
procedure LongVowelLength
// "alene" - Short initial vowel sounds too short at length 140
IF thisPh(isWordStart) THEN
	length 160
	RETURN
ENDIF
// "forlade" - [D@-] makes the vowel too long
IF nextPhW(D) AND next2PhW(@-) THEN
	length 180
	RETURN
ENDIF
// PB long vowel followed by [@-] or [V](vowel+vowel) - "pigen" [p'i@-n]
  IF nextPhW(@-) OR nextPhW(V) THEN
	length 225
  ENDIF
// PB "enig", "enige", "evig", "stædig" - vowel+consolant+[i]
  IF nextPhW(isNotVowel) AND next2PhW(i) THEN
	length 225
  ENDIF
// "ræve", "dele", "mene", "røve", "møve"
IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(3) OR next3PhW(@-) THEN
	length 225
ENDIF
// "vilje", "nedladende" [n'eDl&D@-n@-], "delte" - short followed by 2 consonants
  IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
  // Don't make "møve" [m'Ww_!@-_!] short
    IF NOT next2PhW(_!) THEN
	  length 140
    ENDIF
  ENDIF
// "bryde", "bryder", "strålen", "henrivende" R makes the vowel too long
  IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
    IF next2PhW(@-) OR next2PhW(V) THEN
//      length 180
		LengthAdd -70
	ENDIF
  ENDIF
  // "syste", "sylte" t/d/D + @- makes the vowel too long
  // "international", - added [V] TEST
  IF nextPhW(isNotVowel) AND next2PhW(t) OR next2PhW(d) OR next2PhW(D) THEN
	IF next3PhW(@-) OR next3PhW(V) THEN
		length 110
    ENDIF	
  ENDIF
// "glimrende" [l/3] makes the following vowel too long
// LengthAdd doesn't work here. The length could be 225 or 140 - 30
  IF prevPhW(l/3) THEN
//	LengthAdd -30
	length 110
  ENDIF
// "længe" - short - 2 consonants => 1 consonant (ng => [N])
IF nextPhW(N) THEN
	length 140
ENDIF
endprocedure
// A bit longer than [@-]
phoneme @
  vowel starttype #@ endtype #@
  unstressed
  length 60
  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
  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
// Long vowel followed by consonant and @- "gide", "pile"
IF nextPhW(isNotVowel) AND next2PhW(@-) THEN
//	length 225
ENDIF
// "gider", vrider"
IF nextPhW(D) AND next2PhW(V) OR next2PhW(?V) THEN
	length 140
ENDIF
//"skider" short
IF nextPhW(D) AND next2PhW(V) THEN
    length 140
ENDIF
//"skideren" long
IF nextPhW(D) AND next2PhW(V) AND next3PhW(V) THEN
    length 225
ENDIF
CALL LongVowelLength
  FMT(vowel/i_4)
endphoneme
// PB short i
// sviret vs. svirret
phoneme ?i
  vowel starttype #i endtype #i
  length 140
  CALL ShortVowelLength
  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
  CALL ShortVowelLength
  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 æ
  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 ?&
  vowel starttype #e endtype #e
   length 140
   FMT(vowel/ee_2)
endphoneme
// Added for the æ in "dræbt"
phoneme &#
  vowel starttype  #e endtype #e
    length 140
	ipa a
	CALL LongVowelLength
//	CALL ShortVowelLength
	FMT(vowel/&)
endphoneme
// PB short &#
// "revl" vs. "tremme"
phoneme ?&#
  vowel starttype  #e endtype #e
    length 140
	CALL ShortVowelLength
		FMT(vowel/&)
endphoneme
phoneme A // PB changed to a_8
  vowel starttype #a endtype #a
  length 140 
CALL LongVowelLength
// "fare" [f'A:A]
IF nextPhW(A) THEN
	length 225
ENDIF
  FMT(vowel/a_8)
endphoneme
// PB short A
// "krabbe" vs. "drabelig"
phoneme ?A
  vowel starttype #a endtype #a
  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
CALL LongVowelLength
  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 
// "bore", "borer" [boV] o + V
IF nextPhW(V) OR nextPhW(@-) THEN
	length 225
ENDIF
// "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
  FMT(vowel/o_2)
endphoneme
phoneme O
  vowel starttype #o endtype #o
  length 140
  ipa ɒ // changed from ɔ - Den Danske Ordbog: ɒ
// "sove", "sover" - consonant + @ or V: long
IF next2PhW(@-) OR next2PhW(V) THEN
	length 225
ENDIF
// PB "gået" - ThisPh + V or @-
IF nextPhW(V) OR nextPhW(@-) THEN
	length 225
ENDIF
// "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
  length 140
  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
  FMT(vowel/V_4)
endphoneme
phoneme 0
  vowel starttype #o endtype #o
  length 140 
  ipa ɔ
  FMT(vowel/oo_2)
endphoneme
// Short 0 "sukker"
phoneme ?0
  vowel starttype #o endtype #o
  length 140
  ipa ɔ
  FMT(vowel/oo_2)
endphoneme
phoneme y
  vowel starttype #i endtype #i
  length 140
// PB long vowel followed by consonant and certain vowels
// "gyde", "gyder"
IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(V) THEN
	// not "gebyret" TEST
	IF NOT nextPhW(3-) AND NOT nextPhW(R) AND NOT nextPhW(r) THEN
		length 225
	ENDIF
ENDIF
// "syge" [sy@-] vowel + vowel: extra length, but NOT "fyret" [fyVD]
IF nextPhW(@-) OR nextPhW(3) AND NOT next2PhW(D) THEN
	length 225
ENDIF
// "tyve"
IF nextPhW(w) AND next2PhW(@-) THEN
	length 225
ENDIF
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
  FMT(vowel/yy)
endphoneme
phoneme W
  vowel starttype #@ endtype #@
  length 140 
// "røveri" but NOT "surfer" [sWfV] TEST
IF next2PhW(V) OR next2PhW(?V) AND NOT next2PhW(isFinalVowel) THEN
	length 140
ENDIF
// "børnebog" - short
IF nextPhW(r) AND next2PhW(n) AND next3PhW(@-) THEN
	length 140
ENDIF
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 //225
// PB long vowel followed by consonant and certain vowels
IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(@) OR next2PhW(3) OR next2PhW(V) OR next2PhW(?V) THEN
	length 225
ENDIF
  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(-)
ENDIF
  ChangePhoneme(l/3)
//  CALL base/l
endphoneme
phoneme l/3    // Replacement for [l/]
  liquid
  lengthmod 7
  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
  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@)
      VowelStart(j/ja)
      VowelStart(j/je,-35)
      VowelStart(j/ji)
      VowelStart(j/jo,-65) // "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
 |