//====================================================
//  French
//====================================================
// Updated 2010-02-25 Michel Such  <michel.such@free.fr>

phoneme #l  virtual
// Used for l and l/
endphoneme

phoneme #r  virtual
// Used for r and r/2
endphoneme

phoneme : //  Lengthen previous vowel by "length"
  virtual
  length 40      // shorter than for fr-ca
endphoneme


procedure vowelstart_r
  NextVowelStarts
    VowelStart(vwl_fr/r@)
    VowelStart(vwl_fr/ra, -30)
    VowelStart(vwl_fr/re)
    VowelStart(vwl_fr/ri)
    VowelStart(vwl_fr/ro)
    VowelStart(vwl_fr/ru)
  EndSwitch
endprocedure


phoneme r
  liquid rhotic uvl
  starttype #r  endtype #r
  lengthmod 7

  IF nextPh(isNotVowel) THEN
    ChangePhoneme(r/2)
  ENDIF

  IF nextPh(isStressed) THEN
    length 45
  ENDIF

  VowelEnding(vwl_fr/xr)
  CALL vowelstart_r

  IF prevPh(isPause) OR prevPhW(r/2) THEN
    FMT(vwl_fr/_r)
  ELIF prevPhW(p) OR prevPhW(k) THEN
    length 50
    FMT(vwl_fr/tr)
  ELIF prevPhW(t) THEN
    length 45
    FMT(vwl_fr/tr) addWav(r3/rx,30)
  ELIF prevPhW(f) OR prevPhW(g) OR prevPhW(v) THEN
    length 40
  ENDIF

  IF thisPh(isWordStart) THEN
    IF prevPh(isVowel) OR prevPh(isPause) OR prevPh(#l) OR prevPh(r/2) THEN
      FMT(vwl_fr/_r)
    ENDIF
    FMT(vwl_fr/_r2) addWav(r3/rx, 15)
  ENDIF

  FMT(vwl_fr/r) addWav(r3/rx,25)
endphoneme


phoneme r2	// silent unless followed by vowel
  liquid rhotic uvl
  starttype #r  endtype #r
  lengthmod 7
  Vowelin  f1=0  f2=1600 -300 300  f3=-200 80
  Vowelout f1=2  f2=1600 -300 300  f3=-300 80

  IF nextPh(isNotVowel) THEN
    ChangePhoneme(NULL)
  ENDIF

  VowelEnding(vwl_fr/xr)
  CALL vowelstart_r
  FMT(vwl_fr/r)
endphoneme



phoneme r/2   // variant of [r] when not preceding a vowel
  liquid rhotic uvl
  starttype #r  endtype #r
  Vowelout f1=2  f2=1600 -300 300  f3=-300 100 len=50
  lengthmod 2

  PrevVowelEndings
    VowelEnding(vwl_fr/r_@)
    VowelEnding(vwl_fr/r_a)
    VowelEnding(vwl_fr/r_e)
    VowelEnding(vwl_fr/r_i)
    VowelEnding(vwl_fr/r_o)
    VowelEnding(vwl_fr/r_u)
  EndSwitch

  IF prevPh(t) OR prevPh(p) OR prevPh(k) OR prevPh(d) THEN
    FMT(vwl_fr/trr)
  ENDIF

  IF thisPh(isWordEnd) THEN
    FMT(vwl_fr/r_) addWav(r3/rx, 20)
  ENDIF

  IF prevPh(isVowel) THEN
    length 80
    FMT(vwl_fr/r_) addWav(r3/rx, 20)
  ENDIF

  FMT(vwl_fr/r_)
endphoneme


phoneme l
  liquid
  lengthmod 7

  IF nextPh(isNotVowel) THEN
    ChangePhoneme(l/)
  ENDIF

  NextVowelStarts
    VowelStart(l/l@)
    VowelStart(l/la, -10)
    VowelStart(l/le, -15)
    VowelStart(l/li, -15)
    VowelStart(l/lo, -10)
    VowelStart(l/lu, -20)
  EndSwitch

  IF prevPh(#@) THEN
    VowelEnding(l/xl, -50)
  ELIF prevPh(isVowel) THEN
    VowelEnding(l/xl, -40)
  ENDIF

  IF prevPh(isPause) OR thisPh(isWordStart) THEN
    VowelEnding(NULL)
    FMT(l/_l)
  ENDIF
  IF prevPh(r/2) THEN
    FMT(l/_l)
  ENDIF

  IF prevPh(t) THEN
    FMT(l/tl)
  ENDIF

  IF prevPh(l/) THEN
    FMT(l/l_long)    // double l, make it longer
  ENDIF

  FMT(l/l)
endphoneme


phoneme l/    // used for [l] when not before a vowel
  liquid
  lengthmod 7

  IF nextPh(isVowel) THEN
    ChangePhoneme(l)
  ENDIF

  PrevVowelEndings
    VowelEnding(l/l_@)
    VowelEnding(l/l_a)
    VowelEnding(l/l_e)
    VowelEnding(l/l_i)
    VowelEnding(l/l_o)
    VowelEnding(l/l_u, -20)
  EndSwitch

  IF prevPh(i) THEN
    FMT(l/l_)
  ENDIF
  FMT(l/_l)
endphoneme


// Vowels
//=======
phoneme @
  vowel starttype #@  endtype #@
  length 170
  FMT(vowel/@_hgh)
endphoneme


phoneme @2
  vowel starttype #@  endtype #@
  length 160
  FMT(vowel/@_fr)
endphoneme


phoneme a
  vowel  starttype #a  endtype #a
  length 170

  IF prevPh(l) THEN
    VowelStart(l/la, -15)
  ENDIF

  IF prevPhW(u) THEN
    length 140
    FMT(vowel/a_5)
  ENDIF

  FMT(vowel/a_6)
endphoneme


phoneme e
  vowel starttype #e  endtype #e
  length 170

  IF nextPh(l/) THEN
    VowelEnding(l/xl, -20)
  ENDIF
  IF nextPh(isVowel) THEN
    length 200
  ENDIF

  FMT(vowel/e_8)
endphoneme


phoneme E
  vowel starttype #e  endtype #e
  length 170

  FMT(vowel/e_mid)
endphoneme


phoneme E2 // Between e and E
  vowel starttype #e  endtype #e
  length 170

  FMT(vowel/e_9)
endphoneme


phoneme i
  vowel starttype #i  endtype #i
  length 160

  IfNextVowelAppend(;)

  FMT(vowel/i_2)
endphoneme


phoneme i- // shorter
  vowel starttype #i  endtype #i
  length 110

  FMT(vowel/i_2)
endphoneme


phoneme i: // longer than i
  vowel  starttype #i  endtype #i
  length 240

  IfNextVowelAppend(;)

  FMT(vowel/i_3)
endphoneme


phoneme o
  vowel starttype #o  endtype #o
  length 170

  ChangeIfUnstressed(o2)

  IF nextPh(r/2) THEN
    VowelEnding(vwl_fr/r_o)
    FMT(vowel/o_mid2)
  ENDIF

  FMT(vowel/o_8)
endphoneme


phoneme o2
  vowel starttype #o  endtype #o
  length 170

  IF nextPh(r/2) THEN
    VowelEnding(vwl_fr/r_o)
    FMT(vowel/o_mid2)
  ENDIF
  IF nextPh(l/) THEN
    VowelEnding(l/l_o)
    FMT(vowel/o_mid2)
  ENDIF

  FMT(vowel/o)
endphoneme


phoneme O
  vowel starttype #o  endtype #o
  length 170

  ChangeIfUnstressed(o2)

  FMT(vowel/o_mid2)
endphoneme


phoneme O2	// Like O but no reduceto
  vowel starttype #o  endtype #o
  length 170
  FMT(vowel/o_mid2)
endphoneme


phoneme o3 // almost like english oU
  vowel  starttype #@  endtype #u
  length 220
  FMT(vdiph/@u_3)
endphoneme


phoneme u
  vowel starttype #u  endtype #u
  length 170

  IF nextPh(i) THEN
    Length 50
  ENDIF
  IF nextPhW(a) THEN
    length 110
  ENDIF

  FMT(vowel/u_bck2)
endphoneme


phoneme u: // slitely longer than u
  vowel starttype #u endtype #u
  length 240
  FMT(vowel/u_bck2)
endphoneme


phoneme y
  vowel starttype #u  endtype #u
  length 170

  IF nextPh(l/) THEN
    VowelEnding(l/l_y, -30)
  ENDIF
  IF prevPh(#r) THEN
    VowelStart(vwl_fr/ry)
  ENDIF
  IF nextPh(r/2) THEN
    VowelEnding(vwl_fr/r_y)
  ENDIF
  IF nextPh(E~) THEN
    Length 120
  ENDIF

  FMT(vowel/y_2)
endphoneme


phoneme Y
  vowel starttype #@  endtype #@
  length 170

  ChangeIfUnstressed(W)

  IF prevPh(l) THEN
    VowelStart(l/l@, -20)
  ENDIF

  IF nextPh(l/) THEN
    VowelEnding(l/l_@, -20)
  ENDIF

  FMT(vowel/y#)
endphoneme


phoneme W
  vowel starttype #@  endtype #@
  length 180

  IF prevPh(l) THEN
    VowelStart(l/l@, -20)
  ENDIF

  IF nextPh(l/) THEN
    VowelEnding(l/l_@, -20)
  ENDIF

  FMT(vowel/@)
endphoneme


phoneme w^i
  vowel starttype #u  endtype #i
  length 240

  IF prevPh(l) THEN
    VowelStart(l/lu, -20)
  ENDIF
  IF prevPh(#r) THEN
    VowelStart(vwl_fr/ry)
  ENDIF

  FMT(vdiph/yi_fr)
endphoneme


phoneme A~
  vowel  starttype #a  endtype #a
  length 190
  IF nextPh(r/2) THEN
    VowelEnding(vwl_fr/r_an)
  ENDIF
  IF prevPh(#r) THEN
    VowelStart(vwl_fr/raa, -10)
  ENDIF

  FMT(vnasal/aa_n4)
endphoneme


phoneme E~  // same as W~ for fr-fr
  vowel  starttype #e  endtype #e
  length 190

  IF nextPh(n2) THEN
    FMT(vowel/e_mid)
  ENDIF
  FMT(vnasal/W_n)
endphoneme


phoneme O~
  vowel  starttype #o  endtype #o
  length 190
  FMT(vnasal/o_n2)
endphoneme


phoneme W~
  vowel  starttype #@  endtype #@
  length 190
  FMT(vnasal/W_n)
endphoneme



// These vowels map to others in fr-fr, but are distinct in fr-ca

phoneme I  // same as [i]
  import_phoneme fr/i
endphoneme

phoneme U  // same as [u]
  import_phoneme fr/u
endphoneme

phoneme y"  // same as [y]
  import_phoneme fr/y
endphoneme

phoneme E:  // slightly longer than [E]
  import_phoneme E
endphoneme

phoneme A   // same as [a]
  import_phoneme a
endphoneme




// CONSONANTS
//===========
// uses the consonants in file "phonemes", unless overridden here

phoneme b
  vcd blb stop
  voicingswitch p
  lengthmod 5
  Vowelout f1=2  f2=1000 -500 -300  f3=-300 80 brk

  IF KlattSynth THEN
    CALL base/b
    RETURN
  ENDIF

  IF PreVoicing THEN
   FMT(b/xb)
  ENDIF

  IF nextPh(isPause2) OR nextPh(#l) THEN
    FMT(b/b_) addWav(x/b_)
  ENDIF

  FMT(b/b) addWav(x/b, 70)
endphoneme


phoneme d
  vcd alv stop
  voicingswitch t
  lengthmod 5
  Vowelin f1=0  f2=1700 -300 300  f3=-100 80 amp=20
  Vowelout f1=0 f2=1700 -300 300  f3=-100 80

  IF PreVoicing THEN
    FMT(d/xd)
  ENDIF

  IF nextPh(isPause2) OR nextPh(isPause) THEN
    FMT(d/d_)  addWav(x/d_, 50)
//  ELIF nextPh(#r) THEN
//    FMT(d/dr) addWav(x/d, 50)
  ELIF prevPh(isPause) THEN
    FMT(d/d) addWav(x/d, 50)
  ENDIF

  FMT(d/d) addWav(x/d, 40)
endphoneme


phoneme g
  vcd vel stop
  voicingswitch k
  lengthmod 5
  Vowelin f1=2  f2=2300 200 300  f3=-300 80
  Vowelout f1=2  f2=2300 250 300  f3=-300 80 brk

  IF PreVoicing THEN
    FMT(g/xg)
  ENDIF

  IF nextPh(isPause2) THEN
    FMT(g/g_) addWav(x/g_)
  ENDIF

  FMT(g/g) addWav(x/g, 20)
endphoneme


phoneme k
  vls vel stop
  voicingswitch g
  lengthmod 2
  Vowelin f1=0  f2=2300 200 400  f3=-100 80
  Vowelout f1=0 f2=2300 300 400  f3=-100 80  rms=20

  IF nextPh(isPause2) THEN
    WAV(ustop/k_)
  ELIF nextPh(#r) THEN
    length 50
    WAV(ustop/kr, 40)
  ELIF nextPh(#i) OR nextPh(;) THEN
    WAV(ustop/ki, 45)
  ELIF nextPh(#l) THEN
    WAV(ustop/kl, 45)
  ENDIF

  WAV(ustop/k, 40)
endphoneme



phoneme n2
  vcd alv nasal
  IF nextPh(isNotVowel) THEN
    ChangePhoneme(NULL)
  ENDIF
  ChangePhoneme(n)
endphoneme


phoneme p
  vls blb stop
  voicingswitch b
  lengthmod 2
  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_, 70)
  ELIF nextPh(@-) THEN
    WAV(ustop/p_unasp, 60)
  ELIF nextPh(#l) THEN
    WAV(ustop/pl, 30)
  ELIF nextPh(#r) THEN
    length 50
    WAV(ustop/pr, 30)
  ENDIF
  WAV(ustop/p_unasp_, 90)
endphoneme


phoneme p2 // silent unless followed by vowel
  vls blb stop
  lengthmod 2
  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(isNotVowel) THEN
    ChangePhoneme(NULL)
  ENDIF

  WAV(ustop/p, 45)
endphoneme


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(isPause) THEN
    WAV(ufric/s_, 45)
  ELIF nextPh(p) OR nextPh(t) OR nextPh(k) THEN
    WAV(ufric/s!, 45)
  ENDIF
  WAV(ufric/s, 45)
endphoneme


phoneme S
  vls pla frc sibilant
  voicingswitch Z
  lengthmod 3
  Vowelin  f1=0  f2=1900 100 300  f3=-100 80
  Vowelout f1=0  f2=1900 100 300  f3=-100 80

  IF nextPh(isPause) THEN
    WAV(ufric/sh_, 45)
  ENDIF
  WAV(ufric/sh, 45)
endphoneme



phoneme t
  vls alv stop
  voicingswitch d
  lengthmod 2
  Vowelin f1=0  f2=1600 -300 300  f3=-100 80
  Vowelout f1=0 f2=1600 -300 250  f3=-100 80  brk

  IF nextPh(isPause2) THEN
    WAV(ustop/t_, 40)
  ELIF nextPh(r/2) THEN
    WAV(ustop/t_short, 50)
  ENDIF
  WAV(ustop/t_short, 40)

endphoneme


phoneme t2      // silent unless followed by vowel
  vls alv stop
  Vowelin f1=0  f2=1600 -300 300  f3=-100 80
  Vowelout f1=0 f2=1600 -300 250  f3=-100 80  rms=20
  lengthmod 2

  IF nextPh(isNotVowel) THEN
    ChangePhoneme(NULL)
  ENDIF

  WAV(ustop/t_short, 30)
endphoneme


phoneme t3      // silent unless followed by vowel or pause
  vls alv stop
  lengthmod 2
  IF nextPh(isPause) THEN
    ChangePhoneme(t)
  ELIF nextPh(isNotVowel) THEN
    ChangePhoneme(NULL)
  ELSE
    ChangePhoneme(t2)
  ENDIF
endphoneme


phoneme v
  vcd lbd frc
  voicingswitch f
  lengthmod 6
  Vowelin  f1=0  f2=1000 -300 -200  f3=-300 100
  Vowelout f1=0  f2=1000 -500 -300  f3=-300 60  len=50

  IF KlattSynth THEN
    CALL base/v
    RETURN
  ENDIF

  IF nextPh(isPause2) THEN
    FMT(voc/v_) addWav(vocw/v)
  ENDIF
  IF thisPh(isWordStart) AND nextPhW(isLiquid) THEN
    Length 70
  ENDIF
  FMT(voc/v) addWav(vocw/v, 75)
endphoneme


phoneme z
  vcd alv frc sibilant
  voicingswitch s
  lengthmod 6
  Vowelout f1=0  f2=1700 -300 300  f3=-100 60  len=50

  IF nextPh(isPause2) OR nextPh(isPause) THEN
    FMT(voc/z_) addWav(ufric/s_, 45)
  ENDIF
  FMT(voc/z) addWav(ufric/s_, 45)
endphoneme


phoneme z2      // silent unless followed by vowel
  vcd alv frc sibilant
  IF nextPh(isVowel) THEN
    ChangePhoneme(z)
  ELSE
    ChangePhoneme(NULL)
  ENDIF
endphoneme


phoneme z3      // "six" and "dix". [s] before pause, [z] before vowel, else []
  vcd alv frc sibilant
  IF nextPh(isPause) THEN
    ChangePhoneme(s)
  ELIF nextPh(isVowel) THEN
    ChangePhoneme(z)
  ELSE
    ChangePhoneme(NULL)
  ENDIF
endphoneme


