public static Rule Rule3e() { return(R.Rule(c => c .Id("p1c12r3e") .From(1100).To(1200) .Query(q => q .Scope("syllable") .Match(m => m.Phon("e").With("accent", "initial")) .After(a => a.Phon(p => !IPA.IsVowel(p)))) .Rules(r => r .Named("Ouverture de /e/ initial entravé") .Phono(px => new[] { "ɛ" })))); }
public static Rule Rule2g() { return(R.Rule(c => c .Id("p1c14r2g") .From(1450).To(1500) .Query(q => q .Scope("syllable") .Match(m => m.Phon("ø̃")) .After(a => a.Phon(p => !IPA.IsVowel(p)))) .Rules(r => r .Named("Ouverture de /ø̃/ en syllabe fermée") .Phono(px => new[] { "œ̃" })))); }
public static Rule Rule1c() { return(R.Rule(c => c .Id("p1c10r1c") .From(200).To(300) .Query(q => q .Before(b => b.Phon(p => IPA.IsVowel(p) && !IPA.IsPalatalVowel(p))) .Match(m => m.Phon("β")) .After(b => b.Phon(IPA.IsVelarVowel))) .Rules(r => r .Named("Vélarisation de /β/ entre voyelles vélaires") .Phono(px => new[] { "w" }) .Rewrite(_ => "w")))); }
public static Rule Rule1b() { return(R.Rule(c => c .Id("p1c10r1b") .From(200).To(300) .Query(q => q .Before(b => b.Phon(p => IPA.IsVowel(p) && !IPA.IsVelarVowel(p))) .Match(m => m.Phon("β")) .After(b => b.Phon(IPA.IsPalatalVowel))) .Rules(r => r .Named("Renforcement de /β/ entre voyelles palatales") .Phono(px => new[] { "v" }) .Rewrite(_ => "v")))); }
public static Rule Rule3a() { return(R.Rule(c => c .Id("p1c14r3a") .From(1550).To(1650) .Query(q => q .Match(m => m.Phon(IPA.IsNasalVowel)) .After(a => a.Seq( s => s.Phon(p => !IPA.IsVowel(p)), s => s.Phon(IPA.IsVowel)))) .Rules(r => r .Named("Dénasalisation de la voyelle en syllabe ouverte") .Phono(px => new[] { px[0].Replace("\u0303", "") })))); }
public static Rule Rule2i() { return(R.Rule(c => c .Id("p1c14r2i") .From(1200).To(1300) .Query(q => q .Match(m => m.Phon("õ")) .After(a => a.Seq( s => s.Phon(p => !IPA.IsVowel(p)), s => s.Phon(IPA.IsVowel)))) .Rules(r => r .Named("Ouverture de /õ/ en syllabe ouverte") .Phono(px => new[] { "ɔ̃" })))); }
/// <summary> /// Syncope des voyelles pré-toniques autres que /a/ en syllabe ouvert, /// non supportées par un groupe consonantique en précession /// [G. Zink, Phonétique historique du français, p. 41] /// @interaction [?] /// </summary> public static Rule Rule8() { return(R.Rule(c => c .From(400).To(600) .Query(q => q .Scope("syllable") .Match(m => m.Phon(p => IPA.IsVowel(p) && p[0] != 'a') .With("accent", "pre-tonic")) .Before(b => b.Seq(Q.Start, s2 => s2.Maybe(m => m.Phon(IPA.IsConsonant)))) .After(Q.End)) .Rules(r => r .Named("Syncope des voyelles pré-toniques autres que /a/ en syllable ouverte") .Phono(P.Erase).Rewrite(G.Erase)))); }
/// <summary> /// Centralisation des voyelles pré-toniques autres que /a/ en syllabe ouverte, /// précédées d'un groupe consonantique (explosif) /// [G. Zink, Phonétique historique du français, p. 41] /// @interaction [?] /// </summary> public static Rule Rule7() { return(R.Rule(c => c .From(400).To(600) .Query(q => q .Scope("syllable") .Match(m => m.Phon(p => IPA.IsVowel(p) && p[0] != 'a') .With("accent", "pre-tonic")) .Before(b => b.Seq(q1 => q1.Phon(IPA.IsConsonant), q2 => q2.Phon(IPA.IsConsonant))) .After(Q.End)) .Rules(r => r .Named("Centralisation des voyelles pré-toniques autres que /a/ en syllable ouverte, précédées d'un groupe consonantique") .Phono(_ => new[] { "ə" }).Rewrite(G.Erase)))); }
public static Rule Rule1b() { return(R.Rule(c => c .Id("p1c7r1b") .Group("") .From(1600).To(1700) .Query(q => q .Before(b => b.Phon(p => !IPA.IsVowel(p))) .Match(m => m.Phon("œ")) .After(Q.End)) .Rules(r => r .Named("Effacement de /œ/ après consonne") .Phono(P.Erase)))); }
public static Rule Rule3b() { return(R.Rule(c => c .Id("p1c14r3b") .From(1550).To(1650) .Query(q => q .Scope("syllable") .Match(m => m.Seq( s => s.Phon(IPA.IsNasalVowel), s => s.Phon(IPA.IsNasalConsonant))) .After(a => a.Seq( s => s.Maybe(m => m.Phon(p => !IPA.IsVowel(p))), Q.End))) .Rules(r => r .Named("Amuïssement de la consonne nasale en syllabe fermée") .Phono(px => new[] { px[0] })))); }
public static Rule Rule1e() { return(R.Rule(c => c .Id("p1c10r1e") .From(0).To(100) .Query( q => q .Before(b => b.Phon(p => IPA.IsVowel(p) && !IPA.IsVelarVowel(p))) .Match(m => m.Phon("w")) .After(b => b.Phon(IPA.IsPalatalVowel)), q => q .Before(b => b.Phon(IPA.IsPalatalVowel)) .Match(m => m.Phon("w")) .After(a => a.Phon(p => IPA.IsVowel(p) && !IPA.IsVelarVowel(p)))) .Rules(r => r .Named("Renforcement de /w/ intervocalique avec entourage palatal") .Phono(px => new[] { "β" }) .Rewrite(_ => "b")))); }
public static Rule Rule2d() { return(R.Rule(c => c .Id("p1c10r2d") .From(350).To(400) .Query( q => q .Before(b => b.Phon(p => IPA.IsVowel(p) && !IPA.IsVelarVowel(p))) .Match(m => m.Phon("ɸ")) .After(b => b.Phon(IPA.IsPalatalVowel)), q => q .Before(b => b.Phon(IPA.IsPalatalVowel)) .Match(m => m.Phon("ɸ")) .After(a => a.Phon(p => IPA.IsVowel(p) && !IPA.IsVelarVowel(p)))) .Rules(r => r .Named("Sonorisation de /ɸ/ intervocalique avec entourage palatal") .Phono(_ => new[] { "β" }) .Rewrite(_ => "b")))); }
public IEnumerable <Interval <string> > GetSyllables(string[] phonemicWord) { var start = 0; var syllablePhonemes = new List <string>(); var lastPosition = SyllabicPosition.CODA; string current = null; for (int i = 0; i < phonemicWord.Length; i++) { current = phonemicWord[i]; if (i == 0) { if (IPA.IsVowel(current)) { syllablePhonemes.Add(current); lastPosition = SyllabicPosition.NUCLEUS; } else { syllablePhonemes.Add(current); lastPosition = SyllabicPosition.ONSET; } } else { var last = phonemicWord[i - 1]; var next = i < phonemicWord.Length - 1 ? phonemicWord[i + 1] : null; if (next == null) { // Last phoneme of the word if (IPA.IsVowel(current) && IPA.IsVowel(last)) { yield return(new Interval <string>(start, syllablePhonemes.Count, IPA.IsLong(current) ? "long" : "short")); start += syllablePhonemes.Count; syllablePhonemes.Clear(); } syllablePhonemes.Add(current); yield return(new Interval <string>(start, syllablePhonemes.Count, !IPA.IsVowel(current) || IPA.IsLong(current) ? "long" : "short")); } else if (IPA.IsVowel(current)) { if (IPA.IsVowel(last)) { yield return(new Interval <string>(start, syllablePhonemes.Count, IPA.IsLong(last) ? "long" : "short")); start += syllablePhonemes.Count; syllablePhonemes.Clear(); } syllablePhonemes.Add(current); lastPosition = SyllabicPosition.NUCLEUS; } else { if (IPA.IsVowel(last)) { if (IPA.IsVowel(next)) { yield return(new Interval <string>(start, syllablePhonemes.Count, IPA.IsLong(last) ? "long" : "short")); start += syllablePhonemes.Count; syllablePhonemes.Clear(); syllablePhonemes.Add(current); lastPosition = SyllabicPosition.ONSET; } else if (IsOnsetCluster(current, next)) { yield return(new Interval <string>(start, syllablePhonemes.Count, IPA.IsLong(last) ? "long" : "short")); start += syllablePhonemes.Count; syllablePhonemes.Clear(); syllablePhonemes.Add(current); lastPosition = SyllabicPosition.ONSET; } else { syllablePhonemes.Add(current); lastPosition = SyllabicPosition.CODA; } } else { if (IPA.IsVowel(next)) { if (lastPosition == SyllabicPosition.CODA) { yield return(new Interval <string>(start, syllablePhonemes.Count, "long")); start += syllablePhonemes.Count; syllablePhonemes.Clear(); } syllablePhonemes.Add(current); lastPosition = SyllabicPosition.ONSET; } else { if (current == Phonemes.s) { syllablePhonemes.Add(current); lastPosition = SyllabicPosition.CODA; } else { yield return(new Interval <string>(start, syllablePhonemes.Count, "long")); start += syllablePhonemes.Count; syllablePhonemes.Clear(); syllablePhonemes.Add(current); lastPosition = SyllabicPosition.ONSET; } } } } } } }
public bool IsOnsetCluster(string fst, string snd) { return((!IPA.IsVowel(fst) && !IPA.IsGlide(fst) && IPA.IsGlide(snd)) || ((IPA.IsOcclusive(fst) || IPA.IsFricative(fst)) && IPA.IsLiquide(snd))); }