From 1ba97f613c25926f4007fda9e38131fbb8961173 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Wed, 8 Sep 2021 18:06:55 +0200 Subject: Update tengwar --- src/lib/repr/default.ml | 1 + src/lib/repr/default.mli | 2 +- src/lib/repr/tengwar.ml | 270 ++++++++++++++++++++++++++++++++++------------- src/lib/repr/tengwar.mli | 1 + 4 files changed, 200 insertions(+), 74 deletions(-) create mode 100644 src/lib/repr/tengwar.mli (limited to 'src/lib/repr') diff --git a/src/lib/repr/default.ml b/src/lib/repr/default.ml index 2688411..22a023f 100644 --- a/src/lib/repr/default.ml +++ b/src/lib/repr/default.ml @@ -51,6 +51,7 @@ and r = "R" and semi_voyel_w = "w" and semi_voyel_y = "j" +and semi_voyel_u = "8" let muted : t -> t diff --git a/src/lib/repr/default.mli b/src/lib/repr/default.mli index 27a84bb..26c7d73 100644 --- a/src/lib/repr/default.mli +++ b/src/lib/repr/default.mli @@ -1 +1 @@ -include Sounds.Sig.REPR with type t = String.t +include Sounds.Sig.REPR diff --git a/src/lib/repr/tengwar.ml b/src/lib/repr/tengwar.ml index 4d9ad5e..4fc224b 100644 --- a/src/lib/repr/tengwar.ml +++ b/src/lib/repr/tengwar.ml @@ -13,10 +13,12 @@ type category = type voyel = { opened : bool + ; position : [`Above | `Below ] ; app : (position -> string) } type consonant = { position : position + ; muted: string option ; repr : string ; primary : bool ; category : category } @@ -28,29 +30,19 @@ and t = | Consonant of consonant | Voyel of voyel | Nasal of nasal + | Repr of string + | Nothing -let none = "" +let none = Nothing -let a = - { opened = true - ; app = function - | Pos1 -> "#" - | Pos2 -> "E" - | Pos3 -> "D" - | Pos4 -> "C" } - -and a_nasal = Nasal - (fun f -> match f with - | Consonant c -> begin match c.primary, c.position, c.category with - | true, Pos1, _ -> "{#" - | true, _, _ -> "[E" - | false, _, I -> "5#" - | false, _, II -> "t#" - | false, _, III -> "g#" - end - | _ -> "`pC" - - ) +let a = Voyel + { opened = true + ; position = `Above + ; app = function + | Pos1 -> "#" + | Pos2 -> "E" + | Pos3 -> "D" + | Pos4 -> "C" } let app_e = function | Pos1 -> "$" @@ -64,20 +56,68 @@ and app_eu = function | Pos3 -> "Þ" | Pos4 -> "ß" -let e_opened = { opened = true ; app = app_e } -and e_closed = { opened = false ; app = app_e } -and schwa = "°" +let e_opened = Voyel { opened = true ; position = `Above ; app = app_e } +and e_closed = Voyel { opened = false; position = `Above ; app = app_e } +and schwa = Voyel + { opened = true + ; position = `Below + ; app = function + | Pos1 -> "È" + | Pos2 -> "É" + | Pos3 -> "Ê" + | Pos4 -> "Ë" } + +and eu_opened = Voyel { opened = true ; position = `Above ; app = app_eu } +and eu_closed = Voyel { opened = false ; position = `Above ; app = app_eu } + +and o = Voyel + { opened = true + ; position = `Above + ; app = function + | Pos1 -> "^" + | Pos2 -> "Y" + | Pos3 -> "H" + | Pos4 -> "N" } + +and i = Voyel + { opened = true + ; position = `Above + ; app = function + | Pos1 -> "%" + | Pos2 -> "T" + | Pos3 -> "G" + | Pos4 -> "B" } + +and y = Voyel + { opened = true + ; position = `Above + ; app = function + | Pos1 -> "Ø" + | Pos2 -> "Ù" + | Pos3 -> "Ú" + | Pos4 -> "Û" } + +and u = Voyel + { opened = true + ; position = `Above + ; app = function + | Pos1 -> "&" + | Pos2 -> "U" + | Pos3 -> "J" + | Pos4 -> "M" } -and eu_opened = { opened = true ; app = app_eu } -and eu_closed = { opened = false ; app = app_eu } +and a_nasal = Nasal + (fun f -> match f with + | Consonant c -> begin match c.primary, c.position, c.category with + | true, Pos1, _ -> "{#" + | true, _, _ -> "[E" + | false, _, I -> "5#" + | false, _, II -> "t#" + | false, _, III -> "g#" + end + | _ -> "5#" -and o = - { opened = true - ; app = function - | Pos1 -> "^" - | Pos2 -> "Y" - | Pos3 -> "H" - | Pos4 -> "N" } + ) and o_nasal = Nasal (fun f -> match f with @@ -88,17 +128,9 @@ and o_nasal = Nasal | false, _, II -> "t^" | false, _, III -> "g^" end - | _ -> "`pN" + | _ -> "5^" ) -and i = - { opened = true - ; app = function - | Pos1 -> "%" - | Pos2 -> "T" - | Pos3 -> "G" - | Pos4 -> "B" } - and i_nasal = Nasal (fun f -> match f with | Consonant c -> begin match c.primary, c.position, c.category with @@ -108,16 +140,7 @@ and i_nasal = Nasal | false, _, II -> "t$" | false, _, III -> "g$" end - | _ -> "`pV" - ) - -and y = - { opened = true - ; app = function - | Pos1 -> "Ø" - | Pos2 -> "Ù" - | Pos3 -> "Ú" - | Pos4 -> "Û" } + | _ -> "5$") and y_nasal = Nasal (fun f -> match f with @@ -128,144 +151,245 @@ and y_nasal = Nasal | false, _, II -> "tØ" | false, _, III -> "gØ" end - | _ -> "`pÛ" - - ) - -and u = - { opened = true - ; app = function - | Pos1 -> "&" - | Pos2 -> "U" - | Pos3 -> "J" - | Pos4 -> "M" } + | _ -> "5Ø") and p = Consonant { position = Pos2 + ; muted = Some "y" ; category = II ; primary = true ; repr = "q" } + and b = Consonant { position = Pos1 + ; muted = Some "y" ; category = II ; primary = true ; repr = "w" } and t = Consonant { position = Pos2 + ; muted = Some "6" ; category = I ; primary = true ; repr = "1" } + and d = Consonant { position = Pos1 + ; muted = Some "6" ; category = I ; primary = true ; repr = "2" } and k = Consonant { position = Pos3 + ; muted = Some "h" ; category = III ; primary = true ; repr = "a" } + and g = Consonant { position = Pos1 + ; muted = Some "h" ; category = III ; primary = true ; repr = "s" } and f = Consonant { position = Pos3 + ; muted = None ; category = II ; primary = true ; repr = "e" } and v = Consonant { position = Pos1 + ; muted = None ; category = II ; primary = true ; repr = "r" } and ch = Consonant { position = Pos1 + ; muted = None ; category = III ; primary = true ; repr = "d" } + and j = Consonant { position = Pos1 + ; muted = None ; category = III ; primary = true ; repr = "f" } and s = Consonant - { position = Pos3 + { position = Pos4 + ; muted = Some "i" ; category = I ; primary = true ; repr = "3" } and z = Consonant { position = Pos1 + ; muted = None ; category = I ; primary = true ; repr = "4" } and m = Consonant { position = Pos1 + ; muted = None ; category = II ; primary = true ; repr = "t" } and n = Consonant { position = Pos1 + ; muted = None ; category = I ; primary = true ; repr = "5" } and gn = Consonant { position = Pos1 + ; muted = None ; category = III ; primary = false ; repr = "b" } and l = Consonant { position = Pos1 + ; muted = None ; category = II ; primary = false ; repr = "j" } and r = Consonant { position = Pos2 + ; muted = None ; category = I ; primary = false ; repr = "7" } and semi_voyel_w = Consonant { position = Pos3 + ; muted = None ; category = II ; primary = false ; repr = "." } and semi_voyel_y = Consonant { position = Pos1 + ; muted = None ; category = II ; primary = false ; repr = "l" } + +and semi_voyel_u = Consonant + { position = Pos2 + ; muted = None + ; category = II + ; primary = false + ; repr = "]" } + +let diphtongue + : t -> t -> t + = fun t1 t2 -> match t1, t2 with (* + | Consonant _, Voyel _ when t1 = semi_voyel_y && t2 = schwa -> + Consonant + { position = Pos1 + ; muted = None + ; category = II + ; primary = false + ; repr = "m"} + *) + | Consonant c, Voyel v -> + Repr(c.repr ^ (v.app c.position)) + | Consonant c, Nasal n -> + Repr(c.repr ^ (n none)) + | _ -> + print_endline "Ignoring diphtongue"; + none let muted : t -> t = fun t -> - Printf.sprintf "(%s)" t - -let diphtongue - : t -> t -> t - = fun t1 t2 -> - Printf.sprintf "[%s%s]" t1 t2 + match t with + | Consonant c -> + begin match c.muted with + | None -> t + | Some s -> Consonant {c with repr = s} + end + | _ -> t + + +and portant = + { position = Pos4 + ; muted = None + ; category = III + ; primary = false + ; repr = "`" } let fold : t list -> string = fun elems -> let buff = Buffer.create 16 in - List.iter elems - ~f:(fun f -> Buffer.add_string buff f); + + let rec _fold + = fun init -> function + | [] -> + begin match init with + | None + | Some Nothing + -> () + | Some Voyel ( {position = `Above; _ } as v) -> + Buffer.add_string buff ("`" ^ (v.app portant.position)) + | Some Voyel ( {position = `Below; _ } as v) -> + Buffer.add_string buff (v.app Pos1) + | Some Nasal n -> + Buffer.add_string buff ("`" ^ (n (Consonant portant))) + | Some Repr r -> + Buffer.add_string buff r + | Some Consonant c -> + Buffer.add_string buff (c.repr) + end + | hd::tl -> + match init, hd with + | Some Nothing, _ -> _fold (Some hd) tl + | _, Nothing -> _fold init tl + | Some Voyel ({position = `Above; _} as v), Consonant c -> + Buffer.add_string buff (c.repr ^ (v.app c.position)); + _fold None tl + | Some Voyel ({position = `Below; _} as v), Consonant c -> + Buffer.add_string buff ((v.app Pos1)^ c.repr); + _fold None tl + | Some Nasal n, Consonant c -> + Buffer.add_string buff (c.repr ^ (n hd)); + _fold None tl + | Some Voyel v, _ -> + Buffer.add_string buff ("`" ^ (v.app portant.position)); + _fold (Some hd) tl + | Some Nasal n, _ -> + Buffer.add_string buff ("`" ^ (n (Consonant portant))); + _fold (Some hd) tl + | Some Repr r, _ -> + Buffer.add_string buff r; + _fold (Some hd) tl + | Some Consonant c, _ -> + Buffer.add_string buff c.repr; + _fold (Some hd) tl + + | None, Consonant c -> + Buffer.add_string buff c.repr; + _fold None tl + | None, Repr r -> + Buffer.add_string buff r; + _fold None tl + | None, Voyel _ + | None, Nasal _ -> _fold (Some hd) tl + + in + _fold None elems; Buffer.contents buff - *) diff --git a/src/lib/repr/tengwar.mli b/src/lib/repr/tengwar.mli new file mode 100644 index 0000000..8204341 --- /dev/null +++ b/src/lib/repr/tengwar.mli @@ -0,0 +1 @@ +include Sounds.Sig.REPR -- cgit v1.2.3