summaryrefslogtreecommitdiff
path: root/src/lib/sounds
diff options
context:
space:
mode:
authorSébastien Dailly <sebastien@chimrod.com>2021-08-28 20:01:54 +0200
committerSébastien Dailly <sebastien@chimrod.com>2021-08-28 20:01:54 +0200
commit3b8c136ebdba7f4b5b4d6baad08d0a75c3b2dc86 (patch)
tree62341b36574a0ded0d4fe38ea9ec16036f27dfd4 /src/lib/sounds
parent26faec7a69051f639b50c8e8741f0823c6be52a2 (diff)
Update
Diffstat (limited to 'src/lib/sounds')
-rw-r--r--src/lib/sounds/sounds.ml172
1 files changed, 113 insertions, 59 deletions
diff --git a/src/lib/sounds/sounds.ml b/src/lib/sounds/sounds.ml
index 6126dd4..6c3cad9 100644
--- a/src/lib/sounds/sounds.ml
+++ b/src/lib/sounds/sounds.ml
@@ -10,13 +10,13 @@ module type T = sig
val o : [`Closed | `Opened] -> t
val schwa : unit -> t
val i : t
- val u : t
- val u' : t
+ val voyel_u : t
+ val voyel_y : t
(** Create a diphtongue from a semi-voyel and a voyel *)
val diphtongue: t -> t -> t
- val nasal: t -> t
+ val nasal: t -> t option
val none: t
@@ -27,33 +27,24 @@ module type T = sig
val k: t
val g: t
val f: t
- val s: unit -> t
- val sz: unit -> t
- val ch: unit -> t
- val z: unit -> t
+ val v: t
+ val s: t
+ val sz: t
+ val ch: t
+ val z: t
val n: t
val m: t
- val r: unit -> t
- val l: unit -> t
+ val r: t
+ val l: t
val semi_voyel_w: t
+ val semi_voyel_y: t
val is_voyel : t -> bool
val is_nasal : t -> bool
- type code =
- | None
- | SZ
- | Voyel_A
- | Voyel_I
- | Voyel_O
- | SemiVoyel_W
- | Diphtonge of code * code
-
- val code : t -> code
-
end
module T = struct
@@ -65,15 +56,19 @@ module T = struct
| None
| SZ
| Voyel_A
+ | Voyel_E
| Voyel_I
| Voyel_O
+ | Voyel_U (* OU like in Ouvrir *)
+ | Voyel_Y (* U like in Unique *)
| SemiVoyel_W
- | Diphtonge of code * code
+ | SemiVoyel_Y
+ | Diphtonge of t * t
- type t =
+ and t =
{ code : code
; repr : string
- ; muted : bool
+ ; mutable_: bool (* Can the sound be muted ? *)
; kind : kind
; nasal : bool
}
@@ -82,6 +77,8 @@ end
module Repr = struct
+ type t = string
+
let a = "a"
and a_nasal = "@"
@@ -90,8 +87,10 @@ module Repr = struct
and i = "i"
and i_nasal = "5"
- and u = "y"
- and u' = "u"
+ and y = "y"
+ and y_nasal = "1"
+
+ and u = "u"
and p = "p"
and b = "b"
@@ -102,6 +101,7 @@ module Repr = struct
and g = "g"
and f = "f"
+ and v = "v"
and ch = "S"
@@ -114,7 +114,8 @@ module Repr = struct
and l = "L"
and r = "R"
- and w = "w"
+ and semi_voyel_w = "w"
+ and semi_voyel_y = "j"
end
module S = struct
@@ -127,7 +128,7 @@ module S = struct
let none =
{ repr = ""
- ; muted = false
+ ; mutable_ = true
; kind = None
; nasal = false
; code = None }
@@ -139,18 +140,17 @@ module S = struct
let diphtongue v1 v2 =
{ voyel with
repr = (v1.repr) ^ (v2.repr)
- ; code = Diphtonge (v1.code, v2.code)
+ ; code = Diphtonge (v1, v2)
}
-
let code t = t.code
let a =
{ voyel with repr = Repr.a ; code = Voyel_A }
let e = function
- | `Closed -> { voyel with repr = "e" }
- | `Opened -> { voyel with repr = "E" }
+ | `Closed -> { voyel with repr = "e" ; code = Voyel_E }
+ | `Opened -> { voyel with repr = "E" ; code = Voyel_E }
let eu = function
| `Closed -> { voyel with repr = "2" }
@@ -166,17 +166,17 @@ module S = struct
let i =
{ voyel with repr = Repr.i ; code = Voyel_I }
- let u =
- { voyel with repr = Repr.u }
+ let voyel_y =
+ { voyel with repr = Repr.y ; code = Voyel_Y }
- let u' =
- { voyel with repr = Repr.u' }
+ let voyel_u =
+ { voyel with repr = Repr.u ; code = Voyel_U }
let p =
- { none with repr = Repr.p }
+ { none with repr = Repr.p ; mutable_ = false }
let b =
- { none with repr = Repr.b }
+ { none with repr = Repr.b ; mutable_ = false }
let t =
{ none with repr = Repr.t }
@@ -185,7 +185,7 @@ module S = struct
{ none with repr = Repr.d }
let k =
- { none with repr = Repr.k }
+ { none with repr = Repr.k ; mutable_ = false }
let g =
{ none with repr = Repr.g }
@@ -193,16 +193,21 @@ module S = struct
let f =
{ none with repr = Repr.f }
- let s () =
+ let v =
+ { none with repr = Repr.v }
+
+ let s =
{ none with repr = Repr.s }
- let sz () =
- { (s()) with code = SZ }
+ let sz =
+ { s with code = SZ }
- let ch () =
- { none with repr = Repr.ch }
+ let ch =
+ { none with
+ repr = Repr.ch
+ ; mutable_ = false }
- let z () =
+ let z =
{ none with repr = Repr.z }
let n =
@@ -211,33 +216,82 @@ module S = struct
let m =
{ none with repr = Repr.m ; nasal = true }
- let l () =
+ let l =
{ none with repr = Repr.l }
- let r () =
+ let r =
{ none with repr = Repr.r }
let semi_voyel_w =
{ none with
- repr = Repr.w
+ repr = Repr.semi_voyel_w
; code = SemiVoyel_W}
+ let semi_voyel_y =
+ { none with
+ repr = Repr.semi_voyel_y
+ ; code = SemiVoyel_Y}
+
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 }
- | Voyel_I -> { t with repr = Repr.i_nasal ; nasal = true }
- | Diphtonge (SemiVoyel_W, Voyel_A) ->
- diphtongue
- semi_voyel_w
- { t with repr = Repr.i_nasal ; nasal = true }
- | _ -> t
+ | Voyel_A -> Some { t with repr = Repr.a_nasal ; nasal = true }
+ | Voyel_O -> Some { t with repr = Repr.o_nasal ; nasal = true }
+ | Voyel_I -> Some { t with repr = Repr.i_nasal ; nasal = true }
+ | Voyel_Y -> Some { t with repr = Repr.y_nasal ; nasal = true }
+ | Diphtonge (s1, s2) ->
+ begin match s1.code, s2.code with
+ | (SemiVoyel_W, Voyel_I) ->
+ (* The only case we could have the nasalisation of such diphtongue, is
+ the case O I, N -> wich is transformed into O, I N *)
+ Some (
+ diphtongue
+ semi_voyel_w
+ { t with repr = Repr.i_nasal ; nasal = true } )
+ | (SemiVoyel_W, Voyel_A) ->
+ (* The only case we could have the nasalisation of such diphtongue, is
+ the case O I, N -> wich is transformed into O, I N *)
+ Some (
+ diphtongue
+ semi_voyel_w
+ { t with repr = Repr.i_nasal ; nasal = true } )
+ | (Voyel_I, Voyel_E) ->
+ (* The only case we could have the nasalisation of such diphtongue, is
+ the case O I, N -> wich is transformed into O, I N *)
+ Some (
+ diphtongue
+ i
+ { t with repr = Repr.i_nasal ; nasal = true } )
+ | _ -> None
+ end
+ | _ -> None
let muted f =
- { none with
- repr = "(" ^ f.repr ^ ")"
- ; muted = true }
-
+ match f.mutable_ with
+ | false -> f
+ | true ->
+ { none with
+ repr = "(" ^ f.repr ^ ")" }
+
+ let rec repr
+ : t -> Repr.t
+ = fun letter ->
+ match letter.code, letter.nasal with
+ | None, _ -> ""
+ | SZ, _ -> ""
+ | Voyel_A, false -> Repr.a
+ | Voyel_A, true -> Repr.a_nasal
+ | Voyel_E, _ -> ""
+ | Voyel_I, false -> Repr.i
+ | Voyel_I, true -> Repr.i_nasal
+ | Voyel_O, true -> Repr.o_nasal
+ | Voyel_O, false -> Repr.o
+ | Voyel_U, _ -> Repr.u
+ | Voyel_Y, false -> Repr.y
+ | Voyel_Y, true -> Repr.y_nasal
+ | SemiVoyel_W, _ -> Repr.semi_voyel_w
+ | SemiVoyel_Y, _ -> Repr.semi_voyel_y
+ | Diphtonge (l1, l2), _ ->
+ (repr l1) ^ (repr l2)
end
include S