summaryrefslogtreecommitdiff
path: root/src/lib/sounds
diff options
context:
space:
mode:
authorSébastien Dailly <sebastien@chimrod.com>2021-08-27 14:37:24 +0200
committerSébastien Dailly <sebastien@chimrod.com>2021-08-27 14:37:24 +0200
commitc8b49eed4cf92e7d2dd01dce779ef84ccae733eb (patch)
tree753547fc766a616e9c47aa78b32f047e73e7a7ef /src/lib/sounds
parent65d5990607e9542aa847ec7cb684afd3ffdedb8f (diff)
Splitted modifiers in own library
Diffstat (limited to 'src/lib/sounds')
-rw-r--r--src/lib/sounds/dune6
-rw-r--r--src/lib/sounds/sounds.ml208
2 files changed, 214 insertions, 0 deletions
diff --git a/src/lib/sounds/dune b/src/lib/sounds/dune
new file mode 100644
index 0000000..56c6909
--- /dev/null
+++ b/src/lib/sounds/dune
@@ -0,0 +1,6 @@
+(library
+ (name
+ sounds
+ )
+
+ )
diff --git a/src/lib/sounds/sounds.ml b/src/lib/sounds/sounds.ml
new file mode 100644
index 0000000..a2035b7
--- /dev/null
+++ b/src/lib/sounds/sounds.ml
@@ -0,0 +1,208 @@
+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 u : t
+
+
+ val nasal: t -> t
+
+ val none: t
+
+ val p: t
+ val b: t
+ val t: t
+ val d: t
+ val k: t
+ val f: t
+ val s: unit -> t
+ val sz: unit -> t
+ val ch: unit -> t
+ val z: unit -> t
+
+ val n: t
+ val m: t
+
+ val r: unit -> t
+ val l: unit -> t
+
+ val semi_voyel_w: t
+
+ val is_voyel : t -> bool
+ val is_nasal : t -> bool
+
+ type code =
+ | None
+ | SZ
+ | Voyel_A
+ | Voyel_O
+
+ val code : t -> code
+
+end
+
+module T = struct
+ type kind =
+ | None
+ | Voyel
+
+ type code =
+ | None
+ | SZ
+ | Voyel_A
+ | Voyel_O
+
+ type t =
+ { code : code
+ ; repr : string
+ ; muted : bool
+ ; kind : kind
+ ; nasal : bool
+ }
+
+end
+
+module Repr = struct
+
+ let a = "a"
+ and a_nasal = "@"
+
+ and o = "o"
+ and o_nasal = "§"
+
+ and i = "i"
+ and u = "y"
+
+ and p = "p"
+ and b = "b"
+ and t = "t"
+ and d = "d"
+
+ and k = "k"
+ and g = "g"
+
+ and f = "f"
+
+ and ch = "S"
+
+ and s = "s"
+ and z = "z"
+
+ and m = "m"
+ and n = "n"
+
+ and l = "L"
+ and r = "R"
+
+ and w = "w"
+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
+ ; code = None }
+
+ let voyel =
+ { none with kind = Voyel }
+
+ let code t = t.code
+
+ let nasal t =
+ match t.code with
+ | Voyel_A -> { t with repr = Repr.a_nasal ; nasal = true }
+ | Voyel_O -> { t with repr = Repr.o_nasal ; nasal = true }
+ | _ -> t
+
+ let muted f =
+ { none with
+ repr = "(" ^ f.repr ^ ")"
+ ; muted = true }
+
+ let a _ =
+ { voyel with repr = Repr.a ; code = Voyel_A }
+
+ let e = function
+ | `Closed -> { voyel with repr = "e" }
+ | `Opened -> { voyel with repr = "E" }
+
+ let eu = function
+ | `Closed -> { voyel with repr = "2" }
+ | `Opened -> { voyel with repr = "9" }
+
+
+ let schwa () =
+ { voyel with repr = "°" }
+
+ let o _ =
+ { voyel with repr = Repr.o ; code = Voyel_O }
+
+ let i _ =
+ { voyel with repr = Repr.i }
+
+ let u =
+ { voyel with repr = Repr.u }
+
+ let p =
+ { none with repr = Repr.p }
+
+ let b =
+ { none with repr = Repr.b }
+
+ let t =
+ { none with repr = Repr.t }
+
+ let d =
+ { none with repr = Repr.d }
+
+ let k =
+ { none with repr = Repr.k }
+
+ let f =
+ { none with repr = Repr.f }
+
+ let s () =
+ { none with repr = Repr.s }
+
+ let sz () =
+ { (s()) with code = SZ }
+
+ let ch () =
+ { none with repr = Repr.ch }
+
+ let z () =
+ { none with repr = Repr.z }
+
+ let n =
+ { none with repr = Repr.n ; nasal = true }
+
+ let m =
+ { none with repr = Repr.m ; nasal = true }
+
+ let l () =
+ { none with repr = Repr.l }
+
+ let r () =
+ { none with repr = Repr.r }
+
+ let semi_voyel_w =
+ { none with repr = Repr.w }
+end
+
+include S