summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2024-05-06 23:54:37 -0500
committersanine <sanine.not@pm.me>2024-05-06 23:54:37 -0500
commit5ce6a8f7b30b54b1d728c0571de799e99c79934c (patch)
tree37ee9fc5320f4dcae0502c451c0104fc110330a8 /src
parent3c5c5ef59088a96b7988652f2dfef3d8a771f464 (diff)
add nice vowel positionsmain
Diffstat (limited to 'src')
-rw-r--r--src/language.test.ts17
-rw-r--r--src/language.ts32
2 files changed, 48 insertions, 1 deletions
diff --git a/src/language.test.ts b/src/language.test.ts
index 62b03a2..3564363 100644
--- a/src/language.test.ts
+++ b/src/language.test.ts
@@ -130,7 +130,6 @@ test('all consonants can be selected', () => {
},
]);
-
expect(lang.pickConsonants(
[ lang.ConsonantPlace.Bilabial, lang.ConsonantPlace.Alveolar ],
[ lang.ConsonantManner.Plosive, lang.ConsonantManner.Tap ],
@@ -139,3 +138,19 @@ test('all consonants can be selected', () => {
'p', 'b', 'ⱱ̟', 't', 'd', 'ɾ̥', 'ɾ',
]);
});
+
+
+test('vowel positions work correctly', () => {
+ expect(
+ lang._vowelXY(lang.VowelHeight.Open, lang.VowelDepth.Back)
+ ).toEqual([0, 0]);
+ expect(
+ lang._vowelXY(lang.VowelHeight.NearOpen, lang.VowelDepth.Central)
+ ).toEqual([1.5, 1]);
+ expect(
+ lang._vowelXY(lang.VowelHeight.Close, lang.VowelDepth.Front)
+ ).toEqual([8, 6]);
+ expect(
+ lang._vowelXY(lang.VowelHeight.Close, lang.VowelDepth.Back)
+ ).toEqual([0, 6]);
+});
diff --git a/src/language.ts b/src/language.ts
index c0360b8..dd96b8d 100644
--- a/src/language.ts
+++ b/src/language.ts
@@ -20,6 +20,36 @@ export interface VowelFeatures {
nasal: boolean;
}
+
+// convert a vowel height/depth combo to an x/y position
+// (for use in creating nicely spaced vowel inventories)
+export function _vowelXY(
+ height: VowelHeight,
+ depth: VowelDepth
+): [number, number] {
+ const y = {
+ [VowelHeight.Open]: 0,
+ [VowelHeight.NearOpen]: 1,
+ [VowelHeight.OpenMid]: 2,
+ [VowelHeight.Mid]: 3,
+ [VowelHeight.CloseMid]: 4,
+ [VowelHeight.NearClose]: 5,
+ [VowelHeight.Close]: 6,
+ }[height];
+
+ const slope = {
+ [VowelDepth.Front]: 1,
+ [VowelDepth.Central]: 2,
+ [VowelDepth.Back]: 3,
+ }[depth];
+
+ if (slope === 3) { return [ 0, y ]; }
+
+ const x = (y + 2) / slope;
+ return [x, y];
+}
+
+
// convert a set of vowel features to an IPA representation
export function vowelFeaturesToIpa(features: VowelFeatures): string {
const ipa = () => {
@@ -141,6 +171,8 @@ export interface ConsonantFeatures {
}
+// convert a set of consonant features to IPA
+// returns the empty string if the proposed consonant does not exist
export function consonantFeaturesToIpa(features: ConsonantFeatures): string {
switch (features.place) {
case ConsonantPlace.Bilabial: