| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 | 
// Phonemes for Malayalam
// This inherits from ph_hindi
phoneme @
  vwl  starttype #@  endtype #@
  length 130
  FMT(vowel/@_low)
endphoneme
phoneme y  // epenthetic vowel
  vwl starttype #@ endtype #@
  unstressed
  ipa ɨ
  length 80
  FMT(vowel/u#_4, 120)
endphoneme
phoneme a
  vwl starttype #a endtype #a
  ipa ɐ
  length 130
  IF thisPh(isStressed) OR thisPh(isFirstVowel) OR thisPh(isWordEnd) THEN
    FMT(vowel/a#_4)
  ELSE
    ChangeIfUnstressed(@)
    IF nextPh(m) AND nextPh(isWordEnd) THEN
      ChangePhoneme(@)
    ENDIF
    FMT(vowel/a#_3)
  ENDIF
endphoneme
phoneme a#    // don't reduce to [@]
  vwl starttype #a endtype #a
  ChangePhoneme(a)
endphoneme
phoneme a:
  vwl lng starttype #a  endtype #a
  length 300
  FMT(vowel/a_5)
endphoneme
phoneme e
  vwl  starttype #e  endtype #e
  length 130
  FMT(vowel/e)
endphoneme
phoneme e:
  vwl lng starttype #e  endtype #e
  length 270
  FMT(vowel/e)
endphoneme
phoneme i
  vwl  starttype #i  endtype #i
  length 130
  FMT(vowel/i_6)
endphoneme
phoneme I
  vwl  starttype #i  endtype #i
  length 130
  FMT(vowel/ii)
endphoneme
phoneme i:
  vwl lng starttype #i  endtype #i
  length 270
  FMT(vowel/i)
endphoneme
phoneme o
  vwl  starttype #o  endtype #o
  length 130
  FMT(vowel/o)
endphoneme
phoneme o:
  vwl lng starttype #o  endtype #o
  length 300
  FMT(vowel/o)
endphoneme
phoneme u
  vwl  starttype #u  endtype #u
  length 110
  FMT(vowel/u)
endphoneme
phoneme u:
  vwl lng starttype #u  endtype #u
  length 280
  FMT(vowel/u)
endphoneme
phoneme aI
  vwl lng starttype #a endtype #i
  length 280
  FMT(vdiph/ai)
endphoneme
phoneme aU
  vwl lng starttype #a endtype #u
  length 270
  FMT(vdiph/aau_3)
endphoneme
// ?? This is standard [v].  Should be it [v] without the fricative noise?
phoneme v
  import_phoneme base1/v
endphoneme
phoneme r
  import_phoneme base1/**
endphoneme
phoneme R
  import_phoneme base1/R2
endphoneme
phoneme d2   // 'rr' sounds like English 'd'
  import_phoneme base1/d
endphoneme
// Aspirated voice stops, sound like aspirated unvoiced stops ?
phoneme b#
  vls blb stp prevoice
  lengthmod 2
  voicingswitch b
  Vowelin  f1=0  f2=1000 -50 -100  f3=-200 80
  Vowelout f1=0  f2=1000 -500 -350  f3=-300 80 rms=30
  
  IF PreVoicing THEN
    IF prevPhW(isVowel) THEN
      FMT(b/xb)
    ELSE
      FMT(voc/murmur1)
    ENDIF
  ENDIF
  IF nextPh(isPause2) THEN
    WAV(ustop/p_)
  ENDIF
  IF nextPh(l) THEN
    WAV(ustop/pl)
  ENDIF
  WAV(ustop/p_asp)
endphoneme
phoneme d#
  vls dnt stp prevoice
  lengthmod 2
  voicingswitch d
  Vowelin f1=0  f2=1500 -300 300  f3=-100 80  amp=16
  Vowelout f1=0 f2=1500 -300 250  f3=-100 80  rms=20
  IF PreVoicing THEN
    IF prevPhW(isVowel) THEN
      FMT(d/xd)
    ELSE
      FMT(voc/murmur1)
    ENDIF
  ENDIF
  IF nextPh(isPause2) THEN
    WAV(ustop/t_dnt, 35)
  ENDIF
  WAV(ustop/t_dnt, 50)
endphoneme
phoneme t.#
  vls rfx stp
  lengthmod 2
  ipa ʈU+02B0
  voicingswitch d.#
  Vowelin f1=0  f2=1800 -300 300  f3=-200 80
  Vowelout f1=0 f2=1800 -300 250  f3=-400 80  rms=20 colr=2
  
  IF nextPhW(t.#) THEN
    ChangePhoneme(t.)
  ENDIF
  WAV(ustop/th_rfx2, 80)
endphoneme
phoneme d.#
  vls rfx stp prevoice
  lengthmod 2
  ipa ʈU+02B0
  Vowelin f1=0  f2=1800 -300 300  f3=-200 80
  Vowelout f1=0 f2=1800 -300 250  f3=-400 80  rms=20 colr=2
  IF PreVoicing THEN
    IF prevPhW(isVowel) THEN
      FMT(d/xdr)
    ELSE
      FMT(voc/murmur1)
    ENDIF
  ENDIF
  voicingswitch d.#
  WAV(ustop/th_rfx2, 80)
endphoneme
phoneme J#
  vls pal afr sib pzd prevoice
  voicingswitch c#
  lengthmod 2
  Vowelin f1=0  f2=2700 400 600  f3=300 80 rate len=70
  IF PreVoicing THEN
    IF prevPhW(isVowel) THEN
      FMT(dzh/xdz_pzd)
    ELSE
      FMT(voc/murmur1)
    ENDIF
  ENDIF
  IF nextPh(isPause2) THEN
    WAV(ustop/ts_pzd)
  ENDIF
  WAV(ustop/ts_pzd)
endphoneme
phoneme g#
  vls vel stp prevoice
  lengthmod 2
  Vowelin f1=1  f2=1400 -100 100  f3=-150 80
  Vowelout f1=0 f2=2300 300 400  f3=-150 80  rms=20
  IF PreVoicing THEN
    IF prevPhW(isVowel) THEN
      FMT(g/xg)
    ELSE
      FMT(voc/murmur1)
    ENDIF
  ENDIF
  
  IF nextPh(isPause2) THEN
    WAV(ustop/k_asp, 40)
  ENDIF
  IF nextPhW(#e) OR nextPhW(#i) THEN
    WAV(ustop/k_asp_e, 40)
  ELIF nextPhW(#o) OR nextPhW(#u) THEN
    WAV(ustop/k_asp_a, 25)
  ELSE
    WAV(ustop/k_asp_a, 30)
  ENDIF
endphoneme
// suggested by Prasenjit Sen, but perhaps not needed?
// ml_rules changes [p], [t], [k] to [b], [d], [g] in non-initial
// positions
phoneme p
  import_phoneme consonants/p-
  voicingswitch b
  IF thisPh(isWordStart) THEN
      CALL base1/p
  ELIF thisPh(isWordEnd) AND NOT thisPh(isFirstVowel) THEN
      ChangePhoneme(b)
  ENDIF
endphoneme
phoneme t 
  import_phoneme base1/t[
  voicingswitch d
  IF thisPh(isWordStart) THEN
      CALL base1/t
  ELIF thisPh(isWordEnd) AND NOT thisPh(isFirstVowel) THEN
      ChangePhoneme(d)
  ENDIF
endphoneme
phoneme k
  import_phoneme consonants/k-
  voicingswitch g
  IF thisPh(isWordStart) THEN
      CALL base1/k
  ELIF thisPh(isWordEnd) AND NOT thisPh(isFirstVowel) THEN
      ChangePhoneme(g)
  ENDIF
endphoneme
 |