diff options
Diffstat (limited to 'src/lib/sounds.ml')
-rw-r--r-- | src/lib/sounds.ml | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/src/lib/sounds.ml b/src/lib/sounds.ml new file mode 100644 index 0000000..ec1ddf2 --- /dev/null +++ b/src/lib/sounds.ml @@ -0,0 +1,142 @@ +module type T = sig + + type t + val muted : t -> t + + val a : [`Closed | `Opened] -> t + val e : [`Closed | `Opened] -> t + val eu : [`Closed | `Opened] -> t + + val o : [`Closed | `Opened] -> t + val schwa : unit -> t + val i : [`Closed | `Opened] -> t + + + val nasal: t -> t + + val none: t + + val p: t + val b: t + val t: t + val k: t + val f: t + val s: unit -> t + val ch: unit -> t + val z: unit -> t + + val n: unit -> t + + val r: unit -> t + val l: unit -> t + + val is_voyel : t -> bool + val is_nasal : t -> bool + +end + +module T = struct + type kind = + | None + | Voyel + + type t = + { repr : string + ; muted : bool + ; kind : kind + ; nasal : bool + } +end + +module Repr = struct + + let a = "a" + and a_nasal = "@" + + and o_nasal = "§" + +end + +module S = struct + + include T + + let is_voyel t = t.kind = Voyel + let is_nasal t = t.nasal + + let none = + { repr = "." + ; muted = false + ; kind = None + ; nasal = false } + + let nasal t = + match t.repr with + | "a" -> { t with repr = Repr.a_nasal ; nasal = true } + | "o" -> { t with repr = Repr.o_nasal ; nasal = true } + | _ -> t + + let muted f = + { none with + repr = "(" ^ f.repr ^ ")" + ; muted = true } + + let a _ = + { none with repr = Repr.a } + + let e = function + | `Closed -> { none with repr = "e" } + | `Opened -> { none with repr = "E" } + + let eu = function + | `Closed -> { none with repr = "2" } + | `Opened -> { none with repr = "9" } + + + let schwa () = + { none with repr = "°" } + + let o _ = + { none with repr = "o" } + + let i _ = + { none with repr = "i" } + + let p = + { none with repr = "p" } + + let b = + { none with repr = "b" } + + let t = + { none with repr = "t" } + + let k = + { none with repr = "k" } + + let f = + { none with repr = "f" } + + let s () = + { none with repr = "s" } + + let ch () = + { none with repr = "S" } + + let z () = + { none with repr = "z" } + + let n () = + { none with + repr = "n" + ; nasal = true } + + let l () = + { none with repr = "L" } + + let r () = + { none with repr = "R" } + +end + +include S |