phonetics 1.8.0 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '05877cd48ad83d92a29dbcf60a5bd73373c7ecf974387487d37b719e4df0db4d'
4
- data.tar.gz: d400d6249ac9204e920e8bc617b00b21009a4d15aeb719e589a100482114a927
3
+ metadata.gz: c81fa9abec7c3cdd12bf84e2cd01a7dba6c8f5b66068c0dde27b23f7d3c137f6
4
+ data.tar.gz: 3d337a57a1eccadeb84a58ddd2e7cb0f9ea43b6ae505189376d4b97d457f5f71
5
5
  SHA512:
6
- metadata.gz: 7bfd7f82c7f579e377f8d7669480c7cf4d73cf1c1b1259db1e19d4bbb9c8573480a7825ca51df6e4f600feba67ecfee10a2f9b66a49a9f33e888f94b04be9528
7
- data.tar.gz: 3ddc3f72fbec2a0f833512b1d84c6d05d30c90db63e48ceb7f44c19cd7df43205517079b4cda113e9d80fe1a1c27586771eaf575c423beec2fa46a55a504cfd0
6
+ metadata.gz: 657e10eb57cef58a84080445215362b4cf3906aa7ac556535ff869d621ba8f76707a03a5430bfa31909874f0fb937ee10b64cb9218544eeba3824ba17069fb3d
7
+ data.tar.gz: f3cbf639f3b915f4fd5832dc66a9b0c0254058ad1d4b12a6ac86b15e35cc41c9bfdd6162526a3c3c7f7bd26a6c9e4b270eceb4a918fd866c17b6c2828c07acce
data/Dockerfile ADDED
@@ -0,0 +1,15 @@
1
+ FROM ruby:latest
2
+
3
+ RUN apt update
4
+ RUN apt install -y valgrind
5
+
6
+ RUN mkdir /app
7
+ WORKDIR /app
8
+
9
+ COPY Gemfile /app/Gemfile
10
+ COPY Gemfile.lock /app/Gemfile.lock
11
+ COPY phonetics.gemspec /app/phonetics.gemspec
12
+ COPY VERSION /app/VERSION
13
+
14
+ RUN bundle
15
+ RUN apt install -y vim
data/Gemfile CHANGED
@@ -2,5 +2,7 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
 
5
+ # gem 'ruby-prof-flamegraph', path: '/www/ruby-prof-flamegraph'
6
+
5
7
  # Specify your gem's dependencies in phonetics.gemspec
6
8
  gemspec
data/Makefile ADDED
@@ -0,0 +1,6 @@
1
+
2
+ docker-image:
3
+ docker build -t phonetics:latest .
4
+
5
+ docker: docker-image
6
+ exec docker run -it -v $$(pwd):/app phonetics:latest bash
data/README.md CHANGED
@@ -1,7 +1,42 @@
1
1
  # Phonetics
2
2
 
3
- The edit distance (Levenshtein) implementation is 99%+ written by Dmitry Mozzherin in the Damerau-Levenshtein gem.
3
+ This library currently provides two utilities for anyone working with the International Phonetic Alphabet:
4
+ * An index of vowels and consonants with their linguistic features
5
+ * A phonetic implementation of the Levenshtein distance calculation
4
6
 
7
+ ## Exploring vowels and consonants
8
+
9
+ Vowels are sounds with unimpeded airflow. We categorize them by the resonant frequencies they make in our vocal tract. When a person changes their tongue position or the rounding of their lips they change the way the sound reverberates in their skull.
10
+
11
+ The primary classification for vowels is the frequency of their lowest two resonant frequencies (called 'formants'). When we plot these on an x/y axis we get a vowel chart like this:
12
+
13
+ ![IPA vowel chart with 'b' words](_site/vowel_chart_b_words.jpg)
14
+
15
+
16
+ ## Phonetic Levenshtein Distance
17
+ Using a typical 'edit distance' algorithm, we can calculate how many
18
+ orthographic changes are needed to transform one string into another.
19
+ ```
20
+ require 'damerau-levenshtein'
21
+ Levenshtein.distance('coorslight', 'budlight')
22
+ => 5
23
+ ```
24
+
25
+ The `phonetics` gem provides a (very fast) implementation of an edit distance
26
+ algorithm that uses phonetic feature sets (for consonants) and precise formant
27
+ measurements (for vowels) as weights. It's a modified version of [Using
28
+ Phonologically Weighted Levenshtein Distances for the Prediction of Microscopic
29
+ Intelligibility](https://hal.archives-ouvertes.fr/hal-01474904/document) by
30
+ Lionel Fontan, Isabelle Ferrané, Jérôme Farinas, Julien Pinquier, Xavier
31
+ Aumont, 2016
32
+
33
+ With this, the input strings must be valid IPA notation and the output is a phonetic-weighted distance:
34
+
35
+ ```
36
+ require 'phonetics'
37
+ Phonetics::Levenshtein.distance('kuɹzlɑɪt', 'bədlɑɪt')
38
+ => 1.388384
39
+ ```
5
40
 
6
41
  ## Contributing
7
42
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.8.0
1
+ 1.9.0
Binary file
@@ -1,4 +1,5 @@
1
1
  #include <stdbool.h>
2
+ #include <stdint.h>
2
3
  #include "ruby.h"
3
4
  #include "ruby/encoding.h"
4
5
  #include "ruby/re.h"
@@ -14,7 +15,7 @@ VALUE Binding = Qnil;
14
15
 
15
16
  void Init_c_levenshtein();
16
17
 
17
- void set_initial(double *d, int *string1, int string1_phoneme_count, int *string1_phoneme_sizes, int *string2, int string2_phoneme_count, int *string2_phoneme_sizes, bool verbose);
18
+ void set_initial(double *d, int string1_phoneme_count, int64_t *string1_phonemes, int string2_phoneme_count, int64_t *string2_phonemes, bool verbose);
18
19
  void print_matrix(double *d, int *string1, int string1_phoneme_count, int *string1_phoneme_sizes, int *string2, int string2_phoneme_count, int *string2_phoneme_sizes, bool verbose);
19
20
  VALUE method_internal_phonetic_distance(VALUE self, VALUE _string1, VALUE _string2, VALUE _verbose);
20
21
 
@@ -26,14 +27,8 @@ void Init_c_levenshtein() {
26
27
  }
27
28
 
28
29
  VALUE method_internal_phonetic_distance(VALUE self, VALUE _string1, VALUE _string2, VALUE _verbose){
29
- if (!RB_TYPE_P(_string1, T_STRING)) {
30
- rb_raise(rb_eArgError, "must pass string as first argument");
31
- }
32
- if (!RB_TYPE_P(_string2, T_STRING)) {
33
- rb_raise(rb_eArgError, "must pass string as second argument");
34
- }
35
-
36
30
  bool verbose = _verbose;
31
+
37
32
  int string1_length = (int) RSTRING_LEN(_string1);
38
33
  int string2_length = (int) RSTRING_LEN(_string2);
39
34
 
@@ -54,9 +49,13 @@ VALUE method_internal_phonetic_distance(VALUE self, VALUE _string1, VALUE _strin
54
49
  insert, replace,
55
50
  cost;
56
51
  int i, j; // Frequently overwritten loop vars
57
- int string1_offset = 0;
58
- int string2_offset = 0;
59
52
 
53
+ if (!RB_TYPE_P(_string1, T_STRING)) {
54
+ rb_raise(rb_eArgError, "must pass string as first argument");
55
+ }
56
+ if (!RB_TYPE_P(_string2, T_STRING)) {
57
+ rb_raise(rb_eArgError, "must pass string as second argument");
58
+ }
60
59
  for (i = 0; i < string1_length; i++) {
61
60
  string1[i] = (RSTRING_PTR(_string1)[i] & 0xff);
62
61
  }
@@ -65,18 +64,38 @@ VALUE method_internal_phonetic_distance(VALUE self, VALUE _string1, VALUE _strin
65
64
  }
66
65
 
67
66
  find_phonemes(string1, string1_length, &string1_phoneme_count, string1_phoneme_sizes);
67
+ int64_t string1_phonemes[string1_phoneme_count];
68
+
68
69
  find_phonemes(string2, string2_length, &string2_phoneme_count, string2_phoneme_sizes);
70
+ int64_t string2_phonemes[string2_phoneme_count];
69
71
 
70
72
  // Guard clauses for empty strings
71
73
  if (string1_phoneme_count == 0 && string2_phoneme_count == 0)
72
74
  return DBL2NUM(0.0);
73
75
 
76
+ // Collect between 1 and 8 bytes of a phoneme into a single 64-bit word so we can compare two
77
+ // phonemes using just one instruction.
78
+ // These 64-bit words are how we implement the lookup table in phonetic_cost
79
+ int idx = 0;
80
+ for (i = 0; i < string1_phoneme_count; i++) {
81
+ for (j = 0; j < string1_phoneme_sizes[j]; j++) {
82
+ string1_phonemes[i] = (int) ( string1_phonemes[i] << 8 | string1[idx] );
83
+ idx++;
84
+ }
85
+ }
86
+ for (i = 0; i < string2_phoneme_count; i++) {
87
+ for (j = 0; j < string2_phoneme_sizes[j]; j++) {
88
+ string2_phonemes[i] = (int) ( string2_phonemes[i] << 8 | string2[idx] );
89
+ idx++;
90
+ }
91
+ }
92
+
74
93
  // one-dimensional representation of 2 dimensional array
75
- d = malloc((sizeof(double)) * (string1_phoneme_count+1) * (string2_phoneme_count+1));
94
+ d = calloc((string1_phoneme_count+1) * (string2_phoneme_count+1), sizeof(double));
76
95
 
77
96
  // First, set the top row and left column of the matrix using the sequential
78
97
  // phonetic edit distance of string1 and string2, respectively
79
- set_initial(d, string1, string1_phoneme_count, string1_phoneme_sizes, string2, string2_phoneme_count, string2_phoneme_sizes, verbose);
98
+ set_initial(d, string1_phoneme_count, string1_phonemes, string2_phoneme_count, string2_phonemes, verbose);
80
99
 
81
100
  print_matrix(d, string1, string1_phoneme_count, string1_phoneme_sizes, string2, string2_phoneme_count, string2_phoneme_sizes, verbose);
82
101
 
@@ -96,38 +115,36 @@ VALUE method_internal_phonetic_distance(VALUE self, VALUE _string1, VALUE _strin
96
115
  // plus the phonetic distance between the sound we're moving from to the
97
116
  // new one.
98
117
 
99
- debug("------- %d/%d (%d) \n", i, j, j*(string1_phoneme_count+1) + i);
118
+ // debug("------- %d/%d (%d) \n", i, j, j*(string1_phoneme_count+1) + i);
100
119
 
101
- // TODO: increment i and j by the phoneme lengths
102
- cost = phonetic_cost(string1, string1_offset, string1_phoneme_sizes[i-1], string2, string2_offset, string2_phoneme_sizes[j-1]);
120
+ cost = phonetic_cost(string1_phonemes[i-1], string2_phonemes[j-1]);
103
121
 
104
122
  insert = d[j*(string1_phoneme_count+1) + i-1];
105
- debug("insert proposes cell %d,%d - %f\n", i-1, j, insert);
123
+ // debug("insert proposes cell %d,%d - %f\n", i-1, j, insert);
106
124
  min = insert;
107
- debug("min (insert): %f\n", min);
125
+ // debug("min (insert): %f\n", min);
108
126
 
109
127
  delete = d[(j-1)*(string1_phoneme_count+1) + i];
110
- debug("delete proposes cell %d,%d - %f\n", i, j-1, delete);
128
+ // debug("delete proposes cell %d,%d - %f\n", i, j-1, delete);
111
129
  if (delete < min) {
112
- debug("delete is %f, better than %f for %d/%d\n", delete, min, i, j);
130
+ // debug("delete is %f, better than %f for %d/%d\n", delete, min, i, j);
113
131
  min = delete;
114
132
  }
115
133
 
116
134
  replace = d[(j-1)*(string1_phoneme_count+1) + i-1];
117
- debug("replace proposes cell %d,%d - %f\n", i-1, j-1, replace);
135
+ // debug("replace proposes cell %d,%d - %f\n", i-1, j-1, replace);
118
136
  if (replace < min) {
119
- debug("replace is %f, better than %f for %d/%d\n", replace, min, i, j);
137
+ // debug("replace is %f, better than %f for %d/%d\n", replace, min, i, j);
120
138
  min = replace;
121
139
  }
122
140
 
123
141
  d[(j * (string1_phoneme_count+1)) + i] = min + cost;
124
- debug("\n");
125
- print_matrix(d, string1, string1_phoneme_count, string1_phoneme_sizes, string2, string2_phoneme_count, string2_phoneme_sizes, verbose);
142
+ // debug("\n");
143
+ // if (verbose) {
144
+ // print_matrix(d, string1, string1_phoneme_count, string1_phoneme_sizes, string2, string2_phoneme_count, string2_phoneme_sizes, verbose);
145
+ // }
126
146
 
127
- string1_offset += string1_phoneme_sizes[i-1];
128
147
  }
129
- string1_offset = 0;
130
- string2_offset += string2_phoneme_sizes[j-1];
131
148
  }
132
149
 
133
150
  // The final element in the `d` array is the value of the shortest path from
@@ -149,11 +166,9 @@ VALUE method_internal_phonetic_distance(VALUE self, VALUE _string1, VALUE _strin
149
166
  // Subsequent values are the cumulative phonetic distance between each
150
167
  // phoneme within the same string.
151
168
  // "aek" -> [0.0, 1.0, 1.61, 2.61]
152
- void set_initial(double *d, int *string1, int string1_phoneme_count, int *string1_phoneme_sizes, int *string2, int string2_phoneme_count, int *string2_phoneme_sizes, bool verbose) {
169
+ void set_initial(double *d, int string1_phoneme_count, int64_t *string1_phonemes, int string2_phoneme_count, int64_t *string2_phonemes, bool verbose) {
153
170
 
154
171
  double initial_distance;
155
- int string1_offset = 0;
156
- int string2_offset = 0;
157
172
  int i, j;
158
173
 
159
174
  if (string1_phoneme_count == 0 || string2_phoneme_count == 0) {
@@ -176,26 +191,14 @@ void set_initial(double *d, int *string1, int string1_phoneme_count, int *string
176
191
  for (i=2; i <= string1_phoneme_count; i++) {
177
192
  // The cost of adding the next phoneme is the cost so far plus the phonetic
178
193
  // distance between the previous one and the current one.
179
- d[i] = d[i-1] +
180
- phonetic_cost(string1, string1_offset, string1_phoneme_sizes[i-2], string1, string1_offset + string1_phoneme_sizes[i-2], string1_phoneme_sizes[i-1]);
181
- string1_offset += string1_phoneme_sizes[i-2];
194
+ d[i] = d[i-1] + phonetic_cost(string1_phonemes[i-2], string1_phonemes[i-1]);
182
195
  }
183
196
 
184
197
  debug("string2 phoneme count: %d\n", string2_phoneme_count);
185
198
 
186
199
  for (j=2; j <= string2_phoneme_count; j++) {
187
200
  // The same exact pattern down the left side of the matrix
188
- d[j * (string1_phoneme_count+1)] = d[(j - 1) * (string1_phoneme_count+1)] +
189
- phonetic_cost(string2, string2_offset, string2_phoneme_sizes[j-2], string2, string2_offset + string2_phoneme_sizes[j-2], string2_phoneme_sizes[j-1]);
190
- string2_offset += string2_phoneme_sizes[j-1];
191
- }
192
-
193
- // And zero out the rest. If you're reading this please show me a way to do
194
- // this faster.
195
- for (j=1; j <= string2_phoneme_count; j++) {
196
- for (i=1; i <= string1_phoneme_count; i++) {
197
- d[j * (string1_phoneme_count+1) + i] = (double) 0.0;
198
- }
201
+ d[j * (string1_phoneme_count+1)] = d[(j - 1) * (string1_phoneme_count+1)] + phonetic_cost(string2_phonemes[j-2], string2_phonemes[j-1]);
199
202
  }
200
203
  }
201
204
 
@@ -206,6 +209,7 @@ void print_matrix(double *d, int *string1, int string1_phoneme_count, int *strin
206
209
  int string1_offset = 0;
207
210
  int string2_offset = 0;
208
211
 
212
+ return;
209
213
  if (!verbose)
210
214
  return;
211
215
 
@@ -1,4 +1,4 @@
1
- // This is compiled from Ruby, in phonetics/lib/phonetics/code_generator.rb:221
1
+ // This is compiled from Ruby, in phonetics/lib/phonetics/code_generator.rb:158
2
2
  int next_phoneme_length(int *string, int cursor, int length) {
3
3
 
4
4
  int max_length;
@@ -7,1354 +7,1354 @@ int next_phoneme_length(int *string, int cursor, int length) {
7
7
  switch(string[cursor + 0]) {
8
8
 
9
9
  case 105:
10
- // Phoneme: "i", bytes: [105]
11
- // vowel features: {"F1":240,"F2":2400,"rounded":false}
10
+ // Phoneme: 'i', bytes: [105]
11
+ // vowel features: {"F1":240,"F2":2400,"rounded":false}
12
12
  return 1;
13
13
  break;
14
14
  case 121:
15
- // Phoneme: "y", bytes: [121]
16
- // vowel features: {"F1":235,"F2":2100,"rounded":false}
15
+ // Phoneme: 'y', bytes: [121]
16
+ // vowel features: {"F1":235,"F2":2100,"rounded":false}
17
17
  return 1;
18
18
  break;
19
19
  case 201:
20
20
  if (max_length > 1) {
21
- switch(string[cursor + 1]) {
21
+ switch(string[cursor + 1]) {
22
+
23
+ case 170:
24
+ // Phoneme: 'ɪ', bytes: [201, 170]
25
+ // vowel features: {"F1":300,"F2":2100,"rounded":false}
26
+ return 2;
27
+ break;
28
+ case 155:
29
+ // Phoneme: 'ɛ', bytes: [201, 155]
30
+ // vowel features: {"F1":610,"F2":1900,"rounded":false}
31
+ return 2;
32
+ break;
33
+ case 182:
34
+ // Phoneme: 'ɶ', bytes: [201, 182]
35
+ // vowel features: {"F1":820,"F2":1530,"rounded":true}
36
+ return 2;
37
+ break;
38
+ case 145:
39
+ // Phoneme: 'ɑ', bytes: [201, 145]
40
+ // vowel features: {"F1":750,"F2":940,"rounded":false}
41
+ return 2;
42
+ break;
43
+ case 146:
44
+ // Phoneme: 'ɒ', bytes: [201, 146]
45
+ // vowel features: {"F1":700,"F2":760,"rounded":true}
46
+ return 2;
47
+ break;
48
+ case 153:
49
+ // Phoneme: 'ə', bytes: [201, 153]
50
+ // vowel features: {"F1":600,"F2":1170,"rounded":false}
51
+ return 2;
52
+ break;
53
+ case 157:
54
+ // Phoneme: 'ɝ', bytes: [201, 157]
55
+ // vowel features: {"F1":600,"F2":1170,"rounded":false,"rhotic":true}
56
+ return 2;
57
+ break;
58
+ case 148:
59
+ // Phoneme: 'ɔ', bytes: [201, 148]
60
+ // vowel features: {"F1":500,"F2":700,"rounded":true}
61
+ return 2;
62
+ break;
63
+ case 164:
64
+ // Phoneme: 'ɤ', bytes: [201, 164]
65
+ // vowel features: {"F1":460,"F2":1310,"rounded":false}
66
+ return 2;
67
+ break;
68
+ case 175:
69
+ // Phoneme: 'ɯ', bytes: [201, 175]
70
+ // vowel features: {"F1":300,"F2":1390,"rounded":false}
71
+ return 2;
72
+ break;
73
+ case 177:
74
+ // Phoneme: 'ɱ', bytes: [201, 177]
75
+ // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Nasal","voiced":true}
76
+ return 2;
77
+ break;
78
+ case 179:
79
+ // Phoneme: 'ɳ', bytes: [201, 179]
80
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Nasal","voiced":true}
81
+ if (max_length > 2) {
82
+ switch(string[cursor + 2]) {
22
83
 
23
- case 170:
24
- // Phoneme: "ɪ", bytes: [201, 170]
25
- // vowel features: {"F1":300,"F2":2100,"rounded":false}
26
- return 2;
27
- break;
28
- case 155:
29
- // Phoneme: "ɛ", bytes: [201, 155]
30
- // vowel features: {"F1":610,"F2":1900,"rounded":false}
31
- return 2;
32
- break;
33
- case 182:
34
- // Phoneme: "ɶ", bytes: [201, 182]
35
- // vowel features: {"F1":820,"F2":1530,"rounded":true}
36
- return 2;
37
- break;
38
- case 145:
39
- // Phoneme: "ɑ", bytes: [201, 145]
40
- // vowel features: {"F1":750,"F2":940,"rounded":false}
41
- return 2;
42
- break;
43
- case 146:
44
- // Phoneme: "ɒ", bytes: [201, 146]
45
- // vowel features: {"F1":700,"F2":760,"rounded":true}
46
- return 2;
47
- break;
48
- case 153:
49
- // Phoneme: "ə", bytes: [201, 153]
50
- // vowel features: {"F1":600,"F2":1170,"rounded":false}
51
- return 2;
52
- break;
53
- case 157:
54
- // Phoneme: "ɝ", bytes: [201, 157]
55
- // vowel features: {"F1":600,"F2":1170,"rounded":false,"rhotic":true}
56
- return 2;
57
- break;
58
- case 148:
59
- // Phoneme: "ɔ", bytes: [201, 148]
60
- // vowel features: {"F1":500,"F2":700,"rounded":true}
61
- return 2;
62
- break;
63
- case 164:
64
- // Phoneme: "ɤ", bytes: [201, 164]
65
- // vowel features: {"F1":460,"F2":1310,"rounded":false}
66
- return 2;
67
- break;
68
- case 175:
69
- // Phoneme: "ɯ", bytes: [201, 175]
70
- // vowel features: {"F1":300,"F2":1390,"rounded":false}
71
- return 2;
72
- break;
73
- case 177:
74
- // Phoneme: "ɱ", bytes: [201, 177]
75
- // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Nasal","voiced":true}
76
- return 2;
77
- break;
78
- case 179:
79
- // Phoneme: "ɳ", bytes: [201, 179]
80
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Nasal","voiced":true}
81
- if (max_length > 2) {
82
- switch(string[cursor + 2]) {
83
-
84
- case 204:
85
- if (max_length > 3) {
86
- switch(string[cursor + 3]) {
87
-
88
- case 138:
89
- // Phoneme: "ɳ̊", bytes: [201, 179, 204, 138]
90
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Nasal","voiced":false}
91
- return 4;
92
- break;
93
- }
94
- } else {
95
- return 3;
96
- }
97
- break;
98
- default:
99
- return 2;
100
- }
84
+ case 204:
85
+ if (max_length > 3) {
86
+ switch(string[cursor + 3]) {
87
+
88
+ case 138:
89
+ // Phoneme: 'ɳ̊', bytes: [201, 179, 204, 138]
90
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Nasal","voiced":false}
91
+ return 4;
92
+ break;
93
+ }
101
94
  } else {
102
- return 2;
95
+ return 3;
103
96
  }
104
97
  break;
105
- case 178:
106
- // Phoneme: "ɲ", bytes: [201, 178]
107
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Nasal","voiced":true}
108
- if (max_length > 2) {
109
- switch(string[cursor + 2]) {
110
-
111
- case 204:
112
- if (max_length > 3) {
113
- switch(string[cursor + 3]) {
98
+ default:
99
+ return 2;
100
+ }
101
+ } else {
102
+ return 2;
103
+ }
104
+ break;
105
+ case 178:
106
+ // Phoneme: 'ɲ', bytes: [201, 178]
107
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Nasal","voiced":true}
108
+ if (max_length > 2) {
109
+ switch(string[cursor + 2]) {
114
110
 
115
- case 138:
116
- // Phoneme: "ɲ̊", bytes: [201, 178, 204, 138]
117
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Nasal","voiced":false}
118
- return 4;
119
- break;
120
- }
121
- } else {
122
- return 3;
123
- }
124
- break;
125
- default:
126
- return 2;
127
- }
111
+ case 204:
112
+ if (max_length > 3) {
113
+ switch(string[cursor + 3]) {
114
+
115
+ case 138:
116
+ // Phoneme: 'ɲ̊', bytes: [201, 178, 204, 138]
117
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Nasal","voiced":false}
118
+ return 4;
119
+ break;
120
+ }
128
121
  } else {
129
- return 2;
122
+ return 3;
130
123
  }
131
124
  break;
132
- case 180:
133
- // Phoneme: "ɴ", bytes: [201, 180]
134
- // consonant features: {"position":"Uvular","position_index":10,"manner":"Nasal","voiced":true}
135
- return 2;
136
- break;
137
- case 150:
138
- // Phoneme: "ɖ", bytes: [201, 150]
139
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Stop","voiced":true}
140
- return 2;
141
- break;
142
- case 159:
143
- // Phoneme: "ɟ", bytes: [201, 159]
144
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Stop","voiced":true}
145
- return 2;
146
- break;
147
- case 162:
148
- // Phoneme: "ɢ", bytes: [201, 162]
149
- // consonant features: {"position":"Uvular","position_index":10,"manner":"Stop","voiced":true}
150
- if (max_length > 2) {
151
- switch(string[cursor + 2]) {
152
-
153
- case 204:
154
- if (max_length > 3) {
155
- switch(string[cursor + 3]) {
125
+ default:
126
+ return 2;
127
+ }
128
+ } else {
129
+ return 2;
130
+ }
131
+ break;
132
+ case 180:
133
+ // Phoneme: 'ɴ', bytes: [201, 180]
134
+ // consonant features: {"position":"Uvular","position_index":10,"manner":"Nasal","voiced":true}
135
+ return 2;
136
+ break;
137
+ case 150:
138
+ // Phoneme: 'ɖ', bytes: [201, 150]
139
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Stop","voiced":true}
140
+ return 2;
141
+ break;
142
+ case 159:
143
+ // Phoneme: 'ɟ', bytes: [201, 159]
144
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Stop","voiced":true}
145
+ return 2;
146
+ break;
147
+ case 162:
148
+ // Phoneme: 'ɢ', bytes: [201, 162]
149
+ // consonant features: {"position":"Uvular","position_index":10,"manner":"Stop","voiced":true}
150
+ if (max_length > 2) {
151
+ switch(string[cursor + 2]) {
156
152
 
157
- case 134:
158
- // Phoneme: "ɢ̆", bytes: [201, 162, 204, 134]
159
- // consonant features: {"position":"Uvular","position_index":10,"manner":"Tap/flap","voiced":true}
160
- return 4;
161
- break;
162
- }
163
- } else {
164
- return 3;
165
- }
166
- break;
167
- default:
168
- return 2;
169
- }
153
+ case 204:
154
+ if (max_length > 3) {
155
+ switch(string[cursor + 3]) {
156
+
157
+ case 134:
158
+ // Phoneme: 'ɢ̆', bytes: [201, 162, 204, 134]
159
+ // consonant features: {"position":"Uvular","position_index":10,"manner":"Tap/flap","voiced":true}
160
+ return 4;
161
+ break;
162
+ }
170
163
  } else {
171
- return 2;
164
+ return 3;
172
165
  }
173
166
  break;
174
- case 149:
175
- // Phoneme: "ɕ", bytes: [201, 149]
176
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Sibilant fricative","voiced":false}
177
- return 2;
178
- break;
179
- case 184:
180
- // Phoneme: "ɸ", bytes: [201, 184]
181
- // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Non-sibilant fricative","voiced":false}
182
- return 2;
183
- break;
184
- case 185:
185
- // Phoneme: "ɹ", bytes: [201, 185]
186
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Approximant","voiced":true}
187
- if (max_length > 2) {
188
- switch(string[cursor + 2]) {
167
+ default:
168
+ return 2;
169
+ }
170
+ } else {
171
+ return 2;
172
+ }
173
+ break;
174
+ case 149:
175
+ // Phoneme: 'ɕ', bytes: [201, 149]
176
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Sibilant fricative","voiced":false}
177
+ return 2;
178
+ break;
179
+ case 184:
180
+ // Phoneme: 'ɸ', bytes: [201, 184]
181
+ // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Non-sibilant fricative","voiced":false}
182
+ return 2;
183
+ break;
184
+ case 185:
185
+ // Phoneme: 'ɹ', bytes: [201, 185]
186
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Approximant","voiced":true}
187
+ if (max_length > 2) {
188
+ switch(string[cursor + 2]) {
189
+
190
+ case 204:
191
+ if (max_length > 3) {
192
+ switch(string[cursor + 3]) {
193
+
194
+ case 160:
195
+ if (max_length > 4) {
196
+ switch(string[cursor + 4]) {
189
197
 
190
198
  case 204:
191
- if (max_length > 3) {
192
- switch(string[cursor + 3]) {
193
-
194
- case 160:
195
- if (max_length > 4) {
196
- switch(string[cursor + 4]) {
197
-
198
- case 204:
199
- if (max_length > 5) {
200
- switch(string[cursor + 5]) {
201
-
202
- case 138:
203
- if (max_length > 6) {
204
- switch(string[cursor + 6]) {
205
-
206
- case 203:
207
- if (max_length > 7) {
208
- switch(string[cursor + 7]) {
209
-
210
- case 148:
211
- // Phoneme: "ɹ̠̊˔", bytes: [201, 185, 204, 160, 204, 138, 203, 148]
212
- // consonant features: {"position":"Post-alveolar","position_index":6,"manner":"Non-sibilant fricative","voiced":false}
213
- return 8;
214
- break;
215
- }
216
- } else {
217
- return 7;
218
- }
219
- break;
220
- }
221
- } else {
222
- return 6;
223
- }
224
- break;
225
- }
226
- } else {
227
- return 5;
228
- }
229
- break;
230
- case 203:
231
- if (max_length > 5) {
232
- switch(string[cursor + 5]) {
233
-
234
- case 148:
235
- // Phoneme: "ɹ̠˔", bytes: [201, 185, 204, 160, 203, 148]
236
- // consonant features: {"position":"Post-alveolar","position_index":6,"manner":"Non-sibilant fricative","voiced":true}
237
- return 6;
238
- break;
239
- }
240
- } else {
241
- return 5;
242
- }
243
- break;
244
- }
199
+ if (max_length > 5) {
200
+ switch(string[cursor + 5]) {
201
+
202
+ case 138:
203
+ if (max_length > 6) {
204
+ switch(string[cursor + 6]) {
205
+
206
+ case 203:
207
+ if (max_length > 7) {
208
+ switch(string[cursor + 7]) {
209
+
210
+ case 148:
211
+ // Phoneme: 'ɹ̠̊˔', bytes: [201, 185, 204, 160, 204, 138, 203, 148]
212
+ // consonant features: {"position":"Post-alveolar","position_index":6,"manner":"Non-sibilant fricative","voiced":false}
213
+ return 8;
214
+ break;
215
+ }
245
216
  } else {
246
- return 4;
217
+ return 7;
247
218
  }
248
219
  break;
249
- case 165:
250
- // Phoneme: "ɹ̥", bytes: [201, 185, 204, 165]
251
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Approximant","voiced":false}
252
- return 4;
253
- break;
254
220
  }
221
+ } else {
222
+ return 6;
223
+ }
224
+ break;
225
+ }
255
226
  } else {
256
- return 3;
227
+ return 5;
257
228
  }
258
229
  break;
259
- default:
260
- return 2;
261
- }
262
- } else {
263
- return 2;
264
- }
265
- break;
266
- case 187:
267
- // Phoneme: "ɻ", bytes: [201, 187]
268
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Approximant","voiced":true}
269
- if (max_length > 2) {
270
- switch(string[cursor + 2]) {
271
-
272
230
  case 203:
273
- if (max_length > 3) {
274
- switch(string[cursor + 3]) {
275
-
276
- case 148:
277
- // Phoneme: "ɻ˔", bytes: [201, 187, 203, 148]
278
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Non-sibilant fricative","voiced":true}
279
- return 4;
280
- break;
281
- }
282
- } else {
283
- return 3;
231
+ if (max_length > 5) {
232
+ switch(string[cursor + 5]) {
233
+
234
+ case 148:
235
+ // Phoneme: 'ɹ̠˔', bytes: [201, 185, 204, 160, 203, 148]
236
+ // consonant features: {"position":"Post-alveolar","position_index":6,"manner":"Non-sibilant fricative","voiced":true}
237
+ return 6;
238
+ break;
284
239
  }
285
- break;
286
- case 204:
287
- if (max_length > 3) {
288
- switch(string[cursor + 3]) {
289
-
290
- case 138:
291
- // Phoneme: "ɻ̊", bytes: [201, 187, 204, 138]
292
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Approximant","voiced":false}
293
- return 4;
294
- break;
295
- }
296
240
  } else {
297
- return 3;
241
+ return 5;
298
242
  }
299
243
  break;
300
- default:
301
- return 2;
302
244
  }
245
+ } else {
246
+ return 4;
247
+ }
248
+ break;
249
+ case 165:
250
+ // Phoneme: 'ɹ̥', bytes: [201, 185, 204, 165]
251
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Approximant","voiced":false}
252
+ return 4;
253
+ break;
254
+ }
303
255
  } else {
304
- return 2;
256
+ return 3;
305
257
  }
306
258
  break;
307
- case 163:
308
- // Phoneme: "ɣ", bytes: [201, 163]
309
- // consonant features: {"position":"Velar","position_index":9,"manner":"Non-sibilant fricative","voiced":true}
310
- return 2;
259
+ default:
260
+ return 2;
261
+ }
262
+ } else {
263
+ return 2;
264
+ }
265
+ break;
266
+ case 187:
267
+ // Phoneme: 'ɻ', bytes: [201, 187]
268
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Approximant","voiced":true}
269
+ if (max_length > 2) {
270
+ switch(string[cursor + 2]) {
271
+
272
+ case 203:
273
+ if (max_length > 3) {
274
+ switch(string[cursor + 3]) {
275
+
276
+ case 148:
277
+ // Phoneme: 'ɻ˔', bytes: [201, 187, 203, 148]
278
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Non-sibilant fricative","voiced":true}
279
+ return 4;
280
+ break;
281
+ }
282
+ } else {
283
+ return 3;
284
+ }
311
285
  break;
312
- case 166:
313
- // Phoneme: "ɦ", bytes: [201, 166]
314
- // consonant features: {"position":"Glottal","position_index":12,"manner":"Non-sibilant fricative","voiced":true}
315
- return 2;
286
+ case 204:
287
+ if (max_length > 3) {
288
+ switch(string[cursor + 3]) {
289
+
290
+ case 138:
291
+ // Phoneme: 'ɻ̊', bytes: [201, 187, 204, 138]
292
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Approximant","voiced":false}
293
+ return 4;
294
+ break;
295
+ }
296
+ } else {
297
+ return 3;
298
+ }
316
299
  break;
317
- case 176:
318
- // Phoneme: "ɰ", bytes: [201, 176]
319
- // consonant features: {"position":"Velar","position_index":9,"manner":"Approximant","voiced":true}
320
- if (max_length > 2) {
321
- switch(string[cursor + 2]) {
322
-
323
- case 204:
324
- if (max_length > 3) {
325
- switch(string[cursor + 3]) {
300
+ default:
301
+ return 2;
302
+ }
303
+ } else {
304
+ return 2;
305
+ }
306
+ break;
307
+ case 163:
308
+ // Phoneme: 'ɣ', bytes: [201, 163]
309
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Non-sibilant fricative","voiced":true}
310
+ return 2;
311
+ break;
312
+ case 166:
313
+ // Phoneme: 'ɦ', bytes: [201, 166]
314
+ // consonant features: {"position":"Glottal","position_index":12,"manner":"Non-sibilant fricative","voiced":true}
315
+ return 2;
316
+ break;
317
+ case 176:
318
+ // Phoneme: 'ɰ', bytes: [201, 176]
319
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Approximant","voiced":true}
320
+ if (max_length > 2) {
321
+ switch(string[cursor + 2]) {
326
322
 
327
- case 138:
328
- // Phoneme: "ɰ̊", bytes: [201, 176, 204, 138]
329
- // consonant features: {"position":"Velar","position_index":9,"manner":"Approximant","voiced":false}
330
- return 4;
331
- break;
332
- }
333
- } else {
334
- return 3;
335
- }
336
- break;
337
- default:
338
- return 2;
339
- }
323
+ case 204:
324
+ if (max_length > 3) {
325
+ switch(string[cursor + 3]) {
326
+
327
+ case 138:
328
+ // Phoneme: 'ɰ̊', bytes: [201, 176, 204, 138]
329
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Approximant","voiced":false}
330
+ return 4;
331
+ break;
332
+ }
340
333
  } else {
341
- return 2;
334
+ return 3;
342
335
  }
343
336
  break;
344
- case 190:
345
- // Phoneme: "ɾ", bytes: [201, 190]
346
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Tap/flap","voiced":true}
347
- if (max_length > 2) {
348
- switch(string[cursor + 2]) {
349
-
350
- case 204:
351
- if (max_length > 3) {
352
- switch(string[cursor + 3]) {
337
+ default:
338
+ return 2;
339
+ }
340
+ } else {
341
+ return 2;
342
+ }
343
+ break;
344
+ case 190:
345
+ // Phoneme: 'ɾ', bytes: [201, 190]
346
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Tap/flap","voiced":true}
347
+ if (max_length > 2) {
348
+ switch(string[cursor + 2]) {
353
349
 
354
- case 188:
355
- // Phoneme: "ɾ̼", bytes: [201, 190, 204, 188]
356
- // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Tap/flap","voiced":true}
357
- return 4;
358
- break;
359
- case 165:
360
- // Phoneme: "ɾ̥", bytes: [201, 190, 204, 165]
361
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Tap/flap","voiced":false}
362
- return 4;
363
- break;
364
- }
365
- } else {
366
- return 3;
367
- }
368
- break;
369
- default:
370
- return 2;
371
- }
350
+ case 204:
351
+ if (max_length > 3) {
352
+ switch(string[cursor + 3]) {
353
+
354
+ case 188:
355
+ // Phoneme: 'ɾ̼', bytes: [201, 190, 204, 188]
356
+ // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Tap/flap","voiced":true}
357
+ return 4;
358
+ break;
359
+ case 165:
360
+ // Phoneme: 'ɾ̥', bytes: [201, 190, 204, 165]
361
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Tap/flap","voiced":false}
362
+ return 4;
363
+ break;
364
+ }
372
365
  } else {
373
- return 2;
366
+ return 3;
374
367
  }
375
368
  break;
376
- case 189:
377
- // Phoneme: "ɽ", bytes: [201, 189]
378
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Tap/flap","voiced":true}
379
- if (max_length > 2) {
380
- switch(string[cursor + 2]) {
381
-
382
- case 204:
383
- if (max_length > 3) {
384
- switch(string[cursor + 3]) {
369
+ default:
370
+ return 2;
371
+ }
372
+ } else {
373
+ return 2;
374
+ }
375
+ break;
376
+ case 189:
377
+ // Phoneme: 'ɽ', bytes: [201, 189]
378
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Tap/flap","voiced":true}
379
+ if (max_length > 2) {
380
+ switch(string[cursor + 2]) {
385
381
 
386
- case 138:
387
- // Phoneme: "ɽ̊", bytes: [201, 189, 204, 138]
388
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Tap/flap","voiced":false}
389
- return 4;
390
- break;
391
- }
392
- } else {
393
- return 3;
394
- }
395
- break;
396
- default:
397
- return 2;
398
- }
382
+ case 204:
383
+ if (max_length > 3) {
384
+ switch(string[cursor + 3]) {
385
+
386
+ case 138:
387
+ // Phoneme: 'ɽ̊', bytes: [201, 189, 204, 138]
388
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Tap/flap","voiced":false}
389
+ return 4;
390
+ break;
391
+ }
399
392
  } else {
400
- return 2;
393
+ return 3;
401
394
  }
402
395
  break;
403
- case 172:
404
- // Phoneme: "ɬ", bytes: [201, 172]
405
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Lateral fricative","voiced":false}
406
- return 2;
407
- break;
408
- case 174:
409
- // Phoneme: "ɮ", bytes: [201, 174]
410
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Lateral fricative","voiced":true}
411
- return 2;
412
- break;
413
- case 173:
414
- // Phoneme: "ɭ", bytes: [201, 173]
415
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Lateral approximant","voiced":true}
416
- if (max_length > 2) {
417
- switch(string[cursor + 2]) {
396
+ default:
397
+ return 2;
398
+ }
399
+ } else {
400
+ return 2;
401
+ }
402
+ break;
403
+ case 172:
404
+ // Phoneme: 'ɬ', bytes: [201, 172]
405
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Lateral fricative","voiced":false}
406
+ return 2;
407
+ break;
408
+ case 174:
409
+ // Phoneme: 'ɮ', bytes: [201, 174]
410
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Lateral fricative","voiced":true}
411
+ return 2;
412
+ break;
413
+ case 173:
414
+ // Phoneme: 'ɭ', bytes: [201, 173]
415
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Lateral approximant","voiced":true}
416
+ if (max_length > 2) {
417
+ switch(string[cursor + 2]) {
418
418
 
419
- case 204:
420
- if (max_length > 3) {
421
- switch(string[cursor + 3]) {
422
-
423
- case 138:
424
- // Phoneme: "ɭ̊", bytes: [201, 173, 204, 138]
425
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Lateral approximant","voiced":false}
426
- if (max_length > 4) {
427
- switch(string[cursor + 4]) {
428
-
429
- case 203:
430
- if (max_length > 5) {
431
- switch(string[cursor + 5]) {
432
-
433
- case 148:
434
- // Phoneme: "ɭ̊˔", bytes: [201, 173, 204, 138, 203, 148]
435
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Lateral fricative","voiced":false}
436
- return 6;
437
- break;
438
- }
439
- } else {
440
- return 5;
441
- }
442
- break;
443
- default:
444
- return 4;
445
- }
446
- } else {
447
- return 4;
448
- }
449
- break;
450
- case 134:
451
- // Phoneme: "ɭ̆", bytes: [201, 173, 204, 134]
452
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Lateral tap/flap","voiced":true}
453
- return 4;
454
- break;
455
- }
456
- } else {
457
- return 3;
458
- }
459
- break;
460
- case 203:
461
- if (max_length > 3) {
462
- switch(string[cursor + 3]) {
419
+ case 204:
420
+ if (max_length > 3) {
421
+ switch(string[cursor + 3]) {
463
422
 
464
- case 148:
465
- // Phoneme: "ɭ˔", bytes: [201, 173, 203, 148]
466
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Lateral fricative","voiced":true}
467
- return 4;
468
- break;
469
- }
423
+ case 138:
424
+ // Phoneme: 'ɭ̊', bytes: [201, 173, 204, 138]
425
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Lateral approximant","voiced":false}
426
+ if (max_length > 4) {
427
+ switch(string[cursor + 4]) {
428
+
429
+ case 203:
430
+ if (max_length > 5) {
431
+ switch(string[cursor + 5]) {
432
+
433
+ case 148:
434
+ // Phoneme: 'ɭ̊˔', bytes: [201, 173, 204, 138, 203, 148]
435
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Lateral fricative","voiced":false}
436
+ return 6;
437
+ break;
438
+ }
470
439
  } else {
471
- return 3;
440
+ return 5;
472
441
  }
473
442
  break;
474
443
  default:
475
- return 2;
444
+ return 4;
476
445
  }
446
+ } else {
447
+ return 4;
448
+ }
449
+ break;
450
+ case 134:
451
+ // Phoneme: 'ɭ̆', bytes: [201, 173, 204, 134]
452
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Lateral tap/flap","voiced":true}
453
+ return 4;
454
+ break;
455
+ }
477
456
  } else {
478
- return 2;
457
+ return 3;
479
458
  }
480
459
  break;
481
- case 186:
482
- // Phoneme: "ɺ", bytes: [201, 186]
483
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Lateral tap/flap","voiced":true}
484
- return 2;
460
+ case 203:
461
+ if (max_length > 3) {
462
+ switch(string[cursor + 3]) {
463
+
464
+ case 148:
465
+ // Phoneme: 'ɭ˔', bytes: [201, 173, 203, 148]
466
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Lateral fricative","voiced":true}
467
+ return 4;
468
+ break;
469
+ }
470
+ } else {
471
+ return 3;
472
+ }
485
473
  break;
474
+ default:
475
+ return 2;
486
476
  }
477
+ } else {
478
+ return 2;
479
+ }
480
+ break;
481
+ case 186:
482
+ // Phoneme: 'ɺ', bytes: [201, 186]
483
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Lateral tap/flap","voiced":true}
484
+ return 2;
485
+ break;
486
+ }
487
487
  } else {
488
488
  return 1;
489
489
  }
490
490
  break;
491
491
  case 101:
492
- // Phoneme: "e", bytes: [101]
493
- // vowel features: {"F1":390,"F2":2300,"rounded":false}
492
+ // Phoneme: 'e', bytes: [101]
493
+ // vowel features: {"F1":390,"F2":2300,"rounded":false}
494
494
  return 1;
495
495
  break;
496
496
  case 195:
497
497
  if (max_length > 1) {
498
- switch(string[cursor + 1]) {
498
+ switch(string[cursor + 1]) {
499
+
500
+ case 184:
501
+ // Phoneme: 'ø', bytes: [195, 184]
502
+ // vowel features: {"F1":370,"F2":1900,"rounded":true}
503
+ return 2;
504
+ break;
505
+ case 166:
506
+ // Phoneme: 'æ', bytes: [195, 166]
507
+ // vowel features: {"F1":800,"F2":1900,"rounded":false}
508
+ return 2;
509
+ break;
510
+ case 176:
511
+ // Phoneme: 'ð', bytes: [195, 176]
512
+ // consonant features: {"position":"Dental","position_index":4,"manner":"Non-sibilant fricative","voiced":true}
513
+ if (max_length > 2) {
514
+ switch(string[cursor + 2]) {
499
515
 
500
- case 184:
501
- // Phoneme: "ø", bytes: [195, 184]
502
- // vowel features: {"F1":370,"F2":1900,"rounded":true}
503
- return 2;
504
- break;
505
- case 166:
506
- // Phoneme: "æ", bytes: [195, 166]
507
- // vowel features: {"F1":800,"F2":1900,"rounded":false}
508
- return 2;
509
- break;
510
- case 176:
511
- // Phoneme: "ð", bytes: [195, 176]
512
- // consonant features: {"position":"Dental","position_index":4,"manner":"Non-sibilant fricative","voiced":true}
513
- if (max_length > 2) {
514
- switch(string[cursor + 2]) {
515
-
516
- case 204:
517
- if (max_length > 3) {
518
- switch(string[cursor + 3]) {
519
-
520
- case 188:
521
- // Phoneme: "ð̼", bytes: [195, 176, 204, 188]
522
- // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Non-sibilant fricative","voiced":true}
523
- return 4;
524
- break;
525
- case 160:
526
- // Phoneme: "ð̠", bytes: [195, 176, 204, 160]
527
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Non-sibilant fricative","voiced":true}
528
- return 4;
529
- break;
530
- }
531
- } else {
532
- return 3;
533
- }
534
- break;
535
- default:
536
- return 2;
537
- }
516
+ case 204:
517
+ if (max_length > 3) {
518
+ switch(string[cursor + 3]) {
519
+
520
+ case 188:
521
+ // Phoneme: 'ð̼', bytes: [195, 176, 204, 188]
522
+ // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Non-sibilant fricative","voiced":true}
523
+ return 4;
524
+ break;
525
+ case 160:
526
+ // Phoneme: 'ð̠', bytes: [195, 176, 204, 160]
527
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Non-sibilant fricative","voiced":true}
528
+ return 4;
529
+ break;
530
+ }
538
531
  } else {
539
- return 2;
532
+ return 3;
540
533
  }
541
534
  break;
542
- case 167:
543
- // Phoneme: "ç", bytes: [195, 167]
544
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Non-sibilant fricative","voiced":false}
545
- return 2;
546
- break;
535
+ default:
536
+ return 2;
537
+ }
538
+ } else {
539
+ return 2;
547
540
  }
541
+ break;
542
+ case 167:
543
+ // Phoneme: 'ç', bytes: [195, 167]
544
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Non-sibilant fricative","voiced":false}
545
+ return 2;
546
+ break;
547
+ }
548
548
  } else {
549
549
  return 1;
550
550
  }
551
551
  break;
552
552
  case 197:
553
553
  if (max_length > 1) {
554
- switch(string[cursor + 1]) {
555
-
556
- case 147:
557
- // Phoneme: "œ", bytes: [197, 147]
558
- // vowel features: {"F1":585,"F2":1710,"rounded":true}
559
- return 2;
560
- break;
561
- case 139:
562
- // Phoneme: "ŋ", bytes: [197, 139]
563
- // consonant features: {"position":"Velar","position_index":9,"manner":"Nasal","voiced":true}
564
- if (max_length > 2) {
565
- switch(string[cursor + 2]) {
554
+ switch(string[cursor + 1]) {
555
+
556
+ case 147:
557
+ // Phoneme: 'œ', bytes: [197, 147]
558
+ // vowel features: {"F1":585,"F2":1710,"rounded":true}
559
+ return 2;
560
+ break;
561
+ case 139:
562
+ // Phoneme: 'ŋ', bytes: [197, 139]
563
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Nasal","voiced":true}
564
+ if (max_length > 2) {
565
+ switch(string[cursor + 2]) {
566
566
 
567
- case 204:
568
- if (max_length > 3) {
569
- switch(string[cursor + 3]) {
570
-
571
- case 138:
572
- // Phoneme: "ŋ̊", bytes: [197, 139, 204, 138]
573
- // consonant features: {"position":"Velar","position_index":9,"manner":"Nasal","voiced":false}
574
- return 4;
575
- break;
576
- }
577
- } else {
578
- return 3;
579
- }
580
- break;
581
- default:
582
- return 2;
583
- }
567
+ case 204:
568
+ if (max_length > 3) {
569
+ switch(string[cursor + 3]) {
570
+
571
+ case 138:
572
+ // Phoneme: 'ŋ̊', bytes: [197, 139, 204, 138]
573
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Nasal","voiced":false}
574
+ return 4;
575
+ break;
576
+ }
584
577
  } else {
585
- return 2;
578
+ return 3;
586
579
  }
587
580
  break;
581
+ default:
582
+ return 2;
583
+ }
584
+ } else {
585
+ return 2;
588
586
  }
587
+ break;
588
+ }
589
589
  } else {
590
590
  return 1;
591
591
  }
592
592
  break;
593
593
  case 97:
594
- // Phoneme: "a", bytes: [97]
595
- // vowel features: {"F1":850,"F2":1610,"rounded":false}
594
+ // Phoneme: 'a', bytes: [97]
595
+ // vowel features: {"F1":850,"F2":1610,"rounded":false}
596
596
  return 1;
597
597
  break;
598
598
  case 202:
599
599
  if (max_length > 1) {
600
- switch(string[cursor + 1]) {
601
-
602
- case 140:
603
- // Phoneme: "ʌ", bytes: [202, 140]
604
- // vowel features: {"F1":600,"F2":1170,"rounded":false}
605
- return 2;
606
- break;
607
- case 138:
608
- // Phoneme: "ʊ", bytes: [202, 138]
609
- // vowel features: {"F1":350,"F2":650,"rounded":true}
610
- return 2;
611
- break;
612
- case 136:
613
- // Phoneme: "ʈ", bytes: [202, 136]
614
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Stop","voiced":false}
615
- return 2;
616
- break;
617
- case 161:
618
- // Phoneme: "ʡ", bytes: [202, 161]
619
- // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Stop","voiced":false}
620
- if (max_length > 2) {
621
- switch(string[cursor + 2]) {
622
-
623
- case 204:
624
- if (max_length > 3) {
625
- switch(string[cursor + 3]) {
600
+ switch(string[cursor + 1]) {
601
+
602
+ case 140:
603
+ // Phoneme: 'ʌ', bytes: [202, 140]
604
+ // vowel features: {"F1":600,"F2":1170,"rounded":false}
605
+ return 2;
606
+ break;
607
+ case 138:
608
+ // Phoneme: 'ʊ', bytes: [202, 138]
609
+ // vowel features: {"F1":350,"F2":650,"rounded":true}
610
+ return 2;
611
+ break;
612
+ case 136:
613
+ // Phoneme: 'ʈ', bytes: [202, 136]
614
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Stop","voiced":false}
615
+ return 2;
616
+ break;
617
+ case 161:
618
+ // Phoneme: 'ʡ', bytes: [202, 161]
619
+ // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Stop","voiced":false}
620
+ if (max_length > 2) {
621
+ switch(string[cursor + 2]) {
626
622
 
627
- case 134:
628
- // Phoneme: "ʡ̆", bytes: [202, 161, 204, 134]
629
- // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Tap/flap","voiced":true}
630
- return 4;
631
- break;
632
- }
633
- } else {
634
- return 3;
635
- }
636
- break;
637
- default:
638
- return 2;
639
- }
623
+ case 204:
624
+ if (max_length > 3) {
625
+ switch(string[cursor + 3]) {
626
+
627
+ case 134:
628
+ // Phoneme: 'ʡ̆', bytes: [202, 161, 204, 134]
629
+ // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Tap/flap","voiced":true}
630
+ return 4;
631
+ break;
632
+ }
640
633
  } else {
641
- return 2;
634
+ return 3;
642
635
  }
643
636
  break;
644
- case 148:
645
- // Phoneme: "ʔ", bytes: [202, 148]
646
- // consonant features: {"position":"Glottal","position_index":12,"manner":"Stop","voiced":false}
647
- if (max_length > 2) {
648
- switch(string[cursor + 2]) {
649
-
650
- case 204:
651
- if (max_length > 3) {
652
- switch(string[cursor + 3]) {
637
+ default:
638
+ return 2;
639
+ }
640
+ } else {
641
+ return 2;
642
+ }
643
+ break;
644
+ case 148:
645
+ // Phoneme: 'ʔ', bytes: [202, 148]
646
+ // consonant features: {"position":"Glottal","position_index":12,"manner":"Stop","voiced":false}
647
+ if (max_length > 2) {
648
+ switch(string[cursor + 2]) {
653
649
 
654
- case 158:
655
- // Phoneme: "ʔ̞", bytes: [202, 148, 204, 158]
656
- // consonant features: {"position":"Glottal","position_index":12,"manner":"Approximant","voiced":true}
657
- return 4;
658
- break;
659
- }
660
- } else {
661
- return 3;
662
- }
663
- break;
664
- default:
665
- return 2;
666
- }
650
+ case 204:
651
+ if (max_length > 3) {
652
+ switch(string[cursor + 3]) {
653
+
654
+ case 158:
655
+ // Phoneme: 'ʔ̞', bytes: [202, 148, 204, 158]
656
+ // consonant features: {"position":"Glottal","position_index":12,"manner":"Approximant","voiced":true}
657
+ return 4;
658
+ break;
659
+ }
667
660
  } else {
668
- return 2;
661
+ return 3;
669
662
  }
670
663
  break;
671
- case 131:
672
- // Phoneme: "ʃ", bytes: [202, 131]
673
- // consonant features: {"position":"Post-alveolar","position_index":6,"manner":"Sibilant fricative","voiced":false}
674
- return 2;
675
- break;
676
- case 146:
677
- // Phoneme: "ʒ", bytes: [202, 146]
678
- // consonant features: {"position":"Post-alveolar","position_index":6,"manner":"Sibilant fricative","voiced":true}
679
- return 2;
680
- break;
681
- case 130:
682
- // Phoneme: "ʂ", bytes: [202, 130]
683
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Sibilant fricative","voiced":false}
684
- return 2;
685
- break;
686
- case 144:
687
- // Phoneme: "ʐ", bytes: [202, 144]
688
- // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Sibilant fricative","voiced":true}
689
- return 2;
690
- break;
691
- case 145:
692
- // Phoneme: "ʑ", bytes: [202, 145]
693
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Sibilant fricative","voiced":true}
694
- return 2;
695
- break;
696
- case 157:
697
- // Phoneme: "ʝ", bytes: [202, 157]
698
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Non-sibilant fricative","voiced":true}
699
- return 2;
700
- break;
701
- case 129:
702
- // Phoneme: "ʁ", bytes: [202, 129]
703
- // consonant features: {"position":"Uvular","position_index":10,"manner":"Non-sibilant fricative","voiced":true}
704
- return 2;
705
- break;
706
- case 149:
707
- // Phoneme: "ʕ", bytes: [202, 149]
708
- // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Non-sibilant fricative","voiced":true}
709
- return 2;
710
- break;
711
- case 139:
712
- // Phoneme: "ʋ", bytes: [202, 139]
713
- // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Approximant","voiced":true}
714
- if (max_length > 2) {
715
- switch(string[cursor + 2]) {
716
-
717
- case 204:
718
- if (max_length > 3) {
719
- switch(string[cursor + 3]) {
664
+ default:
665
+ return 2;
666
+ }
667
+ } else {
668
+ return 2;
669
+ }
670
+ break;
671
+ case 131:
672
+ // Phoneme: 'ʃ', bytes: [202, 131]
673
+ // consonant features: {"position":"Post-alveolar","position_index":6,"manner":"Sibilant fricative","voiced":false}
674
+ return 2;
675
+ break;
676
+ case 146:
677
+ // Phoneme: 'ʒ', bytes: [202, 146]
678
+ // consonant features: {"position":"Post-alveolar","position_index":6,"manner":"Sibilant fricative","voiced":true}
679
+ return 2;
680
+ break;
681
+ case 130:
682
+ // Phoneme: 'ʂ', bytes: [202, 130]
683
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Sibilant fricative","voiced":false}
684
+ return 2;
685
+ break;
686
+ case 144:
687
+ // Phoneme: 'ʐ', bytes: [202, 144]
688
+ // consonant features: {"position":"Retro-flex","position_index":7,"manner":"Sibilant fricative","voiced":true}
689
+ return 2;
690
+ break;
691
+ case 145:
692
+ // Phoneme: 'ʑ', bytes: [202, 145]
693
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Sibilant fricative","voiced":true}
694
+ return 2;
695
+ break;
696
+ case 157:
697
+ // Phoneme: 'ʝ', bytes: [202, 157]
698
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Non-sibilant fricative","voiced":true}
699
+ return 2;
700
+ break;
701
+ case 129:
702
+ // Phoneme: 'ʁ', bytes: [202, 129]
703
+ // consonant features: {"position":"Uvular","position_index":10,"manner":"Non-sibilant fricative","voiced":true}
704
+ return 2;
705
+ break;
706
+ case 149:
707
+ // Phoneme: 'ʕ', bytes: [202, 149]
708
+ // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Non-sibilant fricative","voiced":true}
709
+ return 2;
710
+ break;
711
+ case 139:
712
+ // Phoneme: 'ʋ', bytes: [202, 139]
713
+ // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Approximant","voiced":true}
714
+ if (max_length > 2) {
715
+ switch(string[cursor + 2]) {
720
716
 
721
- case 165:
722
- // Phoneme: "ʋ̥", bytes: [202, 139, 204, 165]
723
- // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Approximant","voiced":false}
724
- return 4;
725
- break;
726
- }
727
- } else {
728
- return 3;
729
- }
730
- break;
731
- default:
732
- return 2;
733
- }
717
+ case 204:
718
+ if (max_length > 3) {
719
+ switch(string[cursor + 3]) {
720
+
721
+ case 165:
722
+ // Phoneme: 'ʋ̥', bytes: [202, 139, 204, 165]
723
+ // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Approximant","voiced":false}
724
+ return 4;
725
+ break;
726
+ }
734
727
  } else {
735
- return 2;
728
+ return 3;
736
729
  }
737
730
  break;
738
- case 153:
739
- // Phoneme: "ʙ", bytes: [202, 153]
740
- // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Trill","voiced":true}
741
- if (max_length > 2) {
742
- switch(string[cursor + 2]) {
743
-
744
- case 204:
745
- if (max_length > 3) {
746
- switch(string[cursor + 3]) {
731
+ default:
732
+ return 2;
733
+ }
734
+ } else {
735
+ return 2;
736
+ }
737
+ break;
738
+ case 153:
739
+ // Phoneme: 'ʙ', bytes: [202, 153]
740
+ // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Trill","voiced":true}
741
+ if (max_length > 2) {
742
+ switch(string[cursor + 2]) {
747
743
 
748
- case 165:
749
- // Phoneme: "ʙ̥", bytes: [202, 153, 204, 165]
750
- // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Trill","voiced":false}
751
- return 4;
752
- break;
753
- }
754
- } else {
755
- return 3;
756
- }
757
- break;
758
- default:
759
- return 2;
760
- }
744
+ case 204:
745
+ if (max_length > 3) {
746
+ switch(string[cursor + 3]) {
747
+
748
+ case 165:
749
+ // Phoneme: 'ʙ̥', bytes: [202, 153, 204, 165]
750
+ // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Trill","voiced":false}
751
+ return 4;
752
+ break;
753
+ }
761
754
  } else {
762
- return 2;
755
+ return 3;
763
756
  }
764
757
  break;
765
- case 128:
766
- // Phoneme: "ʀ", bytes: [202, 128]
767
- // consonant features: {"position":"Uvular","position_index":10,"manner":"Trill","voiced":true}
768
- if (max_length > 2) {
769
- switch(string[cursor + 2]) {
770
-
771
- case 204:
772
- if (max_length > 3) {
773
- switch(string[cursor + 3]) {
758
+ default:
759
+ return 2;
760
+ }
761
+ } else {
762
+ return 2;
763
+ }
764
+ break;
765
+ case 128:
766
+ // Phoneme: 'ʀ', bytes: [202, 128]
767
+ // consonant features: {"position":"Uvular","position_index":10,"manner":"Trill","voiced":true}
768
+ if (max_length > 2) {
769
+ switch(string[cursor + 2]) {
774
770
 
775
- case 165:
776
- // Phoneme: "ʀ̥", bytes: [202, 128, 204, 165]
777
- // consonant features: {"position":"Uvular","position_index":10,"manner":"Trill","voiced":false}
778
- return 4;
779
- break;
780
- }
781
- } else {
782
- return 3;
783
- }
784
- break;
785
- default:
786
- return 2;
787
- }
771
+ case 204:
772
+ if (max_length > 3) {
773
+ switch(string[cursor + 3]) {
774
+
775
+ case 165:
776
+ // Phoneme: 'ʀ̥', bytes: [202, 128, 204, 165]
777
+ // consonant features: {"position":"Uvular","position_index":10,"manner":"Trill","voiced":false}
778
+ return 4;
779
+ break;
780
+ }
788
781
  } else {
789
- return 2;
782
+ return 3;
790
783
  }
791
784
  break;
792
- case 156:
793
- // Phoneme: "ʜ", bytes: [202, 156]
794
- // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Trill","voiced":false}
795
- return 2;
796
- break;
797
- case 162:
798
- // Phoneme: "ʢ", bytes: [202, 162]
799
- // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Trill","voiced":true}
800
- return 2;
801
- break;
802
- case 142:
803
- // Phoneme: "ʎ", bytes: [202, 142]
804
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Lateral approximant","voiced":true}
805
- if (max_length > 2) {
806
- switch(string[cursor + 2]) {
785
+ default:
786
+ return 2;
787
+ }
788
+ } else {
789
+ return 2;
790
+ }
791
+ break;
792
+ case 156:
793
+ // Phoneme: 'ʜ', bytes: [202, 156]
794
+ // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Trill","voiced":false}
795
+ return 2;
796
+ break;
797
+ case 162:
798
+ // Phoneme: 'ʢ', bytes: [202, 162]
799
+ // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Trill","voiced":true}
800
+ return 2;
801
+ break;
802
+ case 142:
803
+ // Phoneme: 'ʎ', bytes: [202, 142]
804
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Lateral approximant","voiced":true}
805
+ if (max_length > 2) {
806
+ switch(string[cursor + 2]) {
807
+
808
+ case 204:
809
+ if (max_length > 3) {
810
+ switch(string[cursor + 3]) {
811
+
812
+ case 157:
813
+ // Phoneme: 'ʎ̝', bytes: [202, 142, 204, 157]
814
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Lateral fricative","voiced":true}
815
+ if (max_length > 4) {
816
+ switch(string[cursor + 4]) {
807
817
 
808
818
  case 204:
809
- if (max_length > 3) {
810
- switch(string[cursor + 3]) {
811
-
812
- case 157:
813
- // Phoneme: "ʎ̝", bytes: [202, 142, 204, 157]
814
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Lateral fricative","voiced":true}
815
- if (max_length > 4) {
816
- switch(string[cursor + 4]) {
817
-
818
- case 204:
819
- if (max_length > 5) {
820
- switch(string[cursor + 5]) {
821
-
822
- case 138:
823
- // Phoneme: "ʎ̝̊", bytes: [202, 142, 204, 157, 204, 138]
824
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Lateral fricative","voiced":false}
825
- return 6;
826
- break;
827
- }
828
- } else {
829
- return 5;
830
- }
831
- break;
832
- default:
833
- return 4;
834
- }
835
- } else {
836
- return 4;
837
- }
838
- break;
839
- case 165:
840
- // Phoneme: "ʎ̥", bytes: [202, 142, 204, 165]
841
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Lateral approximant","voiced":false}
842
- return 4;
843
- break;
844
- case 134:
845
- // Phoneme: "ʎ̆", bytes: [202, 142, 204, 134]
846
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Lateral tap/flap","voiced":true}
847
- return 4;
848
- break;
849
- }
819
+ if (max_length > 5) {
820
+ switch(string[cursor + 5]) {
821
+
822
+ case 138:
823
+ // Phoneme: 'ʎ̝̊', bytes: [202, 142, 204, 157, 204, 138]
824
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Lateral fricative","voiced":false}
825
+ return 6;
826
+ break;
827
+ }
850
828
  } else {
851
- return 3;
829
+ return 5;
852
830
  }
853
831
  break;
854
832
  default:
855
- return 2;
833
+ return 4;
834
+ }
835
+ } else {
836
+ return 4;
856
837
  }
838
+ break;
839
+ case 165:
840
+ // Phoneme: 'ʎ̥', bytes: [202, 142, 204, 165]
841
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Lateral approximant","voiced":false}
842
+ return 4;
843
+ break;
844
+ case 134:
845
+ // Phoneme: 'ʎ̆', bytes: [202, 142, 204, 134]
846
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Lateral tap/flap","voiced":true}
847
+ return 4;
848
+ break;
849
+ }
857
850
  } else {
858
- return 2;
851
+ return 3;
859
852
  }
860
853
  break;
861
- case 159:
862
- // Phoneme: "ʟ", bytes: [202, 159]
863
- // consonant features: {"position":"Velar","position_index":9,"manner":"Lateral approximant","voiced":true}
864
- if (max_length > 2) {
865
- switch(string[cursor + 2]) {
854
+ default:
855
+ return 2;
856
+ }
857
+ } else {
858
+ return 2;
859
+ }
860
+ break;
861
+ case 159:
862
+ // Phoneme: 'ʟ', bytes: [202, 159]
863
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Lateral approximant","voiced":true}
864
+ if (max_length > 2) {
865
+ switch(string[cursor + 2]) {
866
+
867
+ case 204:
868
+ if (max_length > 3) {
869
+ switch(string[cursor + 3]) {
870
+
871
+ case 157:
872
+ // Phoneme: 'ʟ̝', bytes: [202, 159, 204, 157]
873
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Lateral fricative","voiced":true}
874
+ if (max_length > 4) {
875
+ switch(string[cursor + 4]) {
866
876
 
867
877
  case 204:
868
- if (max_length > 3) {
869
- switch(string[cursor + 3]) {
870
-
871
- case 157:
872
- // Phoneme: "ʟ̝", bytes: [202, 159, 204, 157]
873
- // consonant features: {"position":"Velar","position_index":9,"manner":"Lateral fricative","voiced":true}
874
- if (max_length > 4) {
875
- switch(string[cursor + 4]) {
876
-
877
- case 204:
878
- if (max_length > 5) {
879
- switch(string[cursor + 5]) {
880
-
881
- case 138:
882
- // Phoneme: "ʟ̝̊", bytes: [202, 159, 204, 157, 204, 138]
883
- // consonant features: {"position":"Velar","position_index":9,"manner":"Lateral fricative","voiced":false}
884
- return 6;
885
- break;
886
- }
887
- } else {
888
- return 5;
889
- }
890
- break;
891
- default:
892
- return 4;
893
- }
894
- } else {
895
- return 4;
896
- }
897
- break;
898
- case 165:
899
- // Phoneme: "ʟ̥", bytes: [202, 159, 204, 165]
900
- // consonant features: {"position":"Velar","position_index":9,"manner":"Lateral approximant","voiced":false}
901
- return 4;
902
- break;
903
- case 160:
904
- // Phoneme: "ʟ̠", bytes: [202, 159, 204, 160]
905
- // consonant features: {"position":"Uvular","position_index":10,"manner":"Lateral approximant","voiced":true}
906
- return 4;
907
- break;
908
- case 134:
909
- // Phoneme: "ʟ̆", bytes: [202, 159, 204, 134]
910
- // consonant features: {"position":"Velar","position_index":9,"manner":"Lateral tap/flap","voiced":true}
911
- return 4;
912
- break;
913
- }
878
+ if (max_length > 5) {
879
+ switch(string[cursor + 5]) {
880
+
881
+ case 138:
882
+ // Phoneme: 'ʟ̝̊', bytes: [202, 159, 204, 157, 204, 138]
883
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Lateral fricative","voiced":false}
884
+ return 6;
885
+ break;
886
+ }
914
887
  } else {
915
- return 3;
888
+ return 5;
916
889
  }
917
890
  break;
918
891
  default:
919
- return 2;
892
+ return 4;
920
893
  }
894
+ } else {
895
+ return 4;
896
+ }
897
+ break;
898
+ case 165:
899
+ // Phoneme: 'ʟ̥', bytes: [202, 159, 204, 165]
900
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Lateral approximant","voiced":false}
901
+ return 4;
902
+ break;
903
+ case 160:
904
+ // Phoneme: 'ʟ̠', bytes: [202, 159, 204, 160]
905
+ // consonant features: {"position":"Uvular","position_index":10,"manner":"Lateral approximant","voiced":true}
906
+ return 4;
907
+ break;
908
+ case 134:
909
+ // Phoneme: 'ʟ̆', bytes: [202, 159, 204, 134]
910
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Lateral tap/flap","voiced":true}
911
+ return 4;
912
+ break;
913
+ }
921
914
  } else {
922
- return 2;
915
+ return 3;
923
916
  }
924
917
  break;
918
+ default:
919
+ return 2;
925
920
  }
921
+ } else {
922
+ return 2;
923
+ }
924
+ break;
925
+ }
926
926
  } else {
927
927
  return 1;
928
928
  }
929
929
  break;
930
930
  case 111:
931
- // Phoneme: "o", bytes: [111]
932
- // vowel features: {"F1":360,"F2":640,"rounded":true}
931
+ // Phoneme: 'o', bytes: [111]
932
+ // vowel features: {"F1":360,"F2":640,"rounded":true}
933
933
  return 1;
934
934
  break;
935
935
  case 117:
936
- // Phoneme: "u", bytes: [117]
937
- // vowel features: {"F1":350,"F2":650,"rounded":true}
936
+ // Phoneme: 'u', bytes: [117]
937
+ // vowel features: {"F1":350,"F2":650,"rounded":true}
938
938
  return 1;
939
939
  break;
940
940
  case 109:
941
- // Phoneme: "m", bytes: [109]
942
- // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Nasal","voiced":true}
941
+ // Phoneme: 'm', bytes: [109]
942
+ // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Nasal","voiced":true}
943
943
  if (max_length > 1) {
944
- switch(string[cursor + 1]) {
944
+ switch(string[cursor + 1]) {
945
945
 
946
- case 204:
947
- if (max_length > 2) {
948
- switch(string[cursor + 2]) {
946
+ case 204:
947
+ if (max_length > 2) {
948
+ switch(string[cursor + 2]) {
949
949
 
950
- case 165:
951
- // Phoneme: "", bytes: [109, 204, 165]
952
- // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Nasal","voiced":false}
953
- return 3;
954
- break;
955
- }
956
- } else {
957
- return 2;
958
- }
950
+ case 165:
951
+ // Phoneme: '', bytes: [109, 204, 165]
952
+ // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Nasal","voiced":false}
953
+ return 3;
959
954
  break;
960
- default:
961
- return 1;
962
955
  }
956
+ } else {
957
+ return 2;
958
+ }
959
+ break;
960
+ default:
961
+ return 1;
962
+ }
963
963
  } else {
964
964
  return 1;
965
965
  }
966
966
  break;
967
967
  case 110:
968
- // Phoneme: "n", bytes: [110]
969
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Nasal","voiced":true}
968
+ // Phoneme: 'n', bytes: [110]
969
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Nasal","voiced":true}
970
970
  if (max_length > 1) {
971
- switch(string[cursor + 1]) {
971
+ switch(string[cursor + 1]) {
972
972
 
973
- case 204:
974
- if (max_length > 2) {
975
- switch(string[cursor + 2]) {
973
+ case 204:
974
+ if (max_length > 2) {
975
+ switch(string[cursor + 2]) {
976
976
 
977
- case 188:
978
- // Phoneme: "", bytes: [110, 204, 188]
979
- // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Nasal","voiced":true}
980
- return 3;
981
- break;
982
- case 165:
983
- // Phoneme: "n̥", bytes: [110, 204, 165]
984
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Nasal","voiced":false}
985
- return 3;
986
- break;
987
- }
988
- } else {
989
- return 2;
990
- }
977
+ case 188:
978
+ // Phoneme: '', bytes: [110, 204, 188]
979
+ // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Nasal","voiced":true}
980
+ return 3;
991
981
  break;
992
- default:
993
- return 1;
982
+ case 165:
983
+ // Phoneme: 'n̥', bytes: [110, 204, 165]
984
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Nasal","voiced":false}
985
+ return 3;
986
+ break;
987
+ }
988
+ } else {
989
+ return 2;
994
990
  }
991
+ break;
992
+ default:
993
+ return 1;
994
+ }
995
995
  } else {
996
996
  return 1;
997
997
  }
998
998
  break;
999
999
  case 112:
1000
- // Phoneme: "p", bytes: [112]
1001
- // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Stop","voiced":false}
1000
+ // Phoneme: 'p', bytes: [112]
1001
+ // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Stop","voiced":false}
1002
1002
  if (max_length > 1) {
1003
- switch(string[cursor + 1]) {
1003
+ switch(string[cursor + 1]) {
1004
1004
 
1005
- case 204:
1006
- if (max_length > 2) {
1007
- switch(string[cursor + 2]) {
1005
+ case 204:
1006
+ if (max_length > 2) {
1007
+ switch(string[cursor + 2]) {
1008
1008
 
1009
- case 170:
1010
- // Phoneme: "", bytes: [112, 204, 170]
1011
- // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Stop","voiced":false}
1012
- return 3;
1013
- break;
1014
- }
1015
- } else {
1016
- return 2;
1017
- }
1009
+ case 170:
1010
+ // Phoneme: '', bytes: [112, 204, 170]
1011
+ // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Stop","voiced":false}
1012
+ return 3;
1018
1013
  break;
1019
- default:
1020
- return 1;
1021
1014
  }
1015
+ } else {
1016
+ return 2;
1017
+ }
1018
+ break;
1019
+ default:
1020
+ return 1;
1021
+ }
1022
1022
  } else {
1023
1023
  return 1;
1024
1024
  }
1025
1025
  break;
1026
1026
  case 98:
1027
- // Phoneme: "b", bytes: [98]
1028
- // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Stop","voiced":true}
1027
+ // Phoneme: 'b', bytes: [98]
1028
+ // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Stop","voiced":true}
1029
1029
  if (max_length > 1) {
1030
- switch(string[cursor + 1]) {
1030
+ switch(string[cursor + 1]) {
1031
1031
 
1032
- case 204:
1033
- if (max_length > 2) {
1034
- switch(string[cursor + 2]) {
1032
+ case 204:
1033
+ if (max_length > 2) {
1034
+ switch(string[cursor + 2]) {
1035
1035
 
1036
- case 170:
1037
- // Phoneme: "", bytes: [98, 204, 170]
1038
- // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Stop","voiced":true}
1039
- return 3;
1040
- break;
1041
- }
1042
- } else {
1043
- return 2;
1044
- }
1036
+ case 170:
1037
+ // Phoneme: '', bytes: [98, 204, 170]
1038
+ // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Stop","voiced":true}
1039
+ return 3;
1045
1040
  break;
1046
- default:
1047
- return 1;
1048
1041
  }
1042
+ } else {
1043
+ return 2;
1044
+ }
1045
+ break;
1046
+ default:
1047
+ return 1;
1048
+ }
1049
1049
  } else {
1050
1050
  return 1;
1051
1051
  }
1052
1052
  break;
1053
1053
  case 116:
1054
- // Phoneme: "t", bytes: [116]
1055
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Stop","voiced":false}
1054
+ // Phoneme: 't', bytes: [116]
1055
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Stop","voiced":false}
1056
1056
  if (max_length > 1) {
1057
- switch(string[cursor + 1]) {
1057
+ switch(string[cursor + 1]) {
1058
1058
 
1059
- case 204:
1060
- if (max_length > 2) {
1061
- switch(string[cursor + 2]) {
1059
+ case 204:
1060
+ if (max_length > 2) {
1061
+ switch(string[cursor + 2]) {
1062
1062
 
1063
- case 188:
1064
- // Phoneme: "", bytes: [116, 204, 188]
1065
- // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Stop","voiced":false}
1066
- return 3;
1067
- break;
1068
- }
1069
- } else {
1070
- return 2;
1071
- }
1063
+ case 188:
1064
+ // Phoneme: '', bytes: [116, 204, 188]
1065
+ // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Stop","voiced":false}
1066
+ return 3;
1072
1067
  break;
1073
- default:
1074
- return 1;
1075
1068
  }
1069
+ } else {
1070
+ return 2;
1071
+ }
1072
+ break;
1073
+ default:
1074
+ return 1;
1075
+ }
1076
1076
  } else {
1077
1077
  return 1;
1078
1078
  }
1079
1079
  break;
1080
1080
  case 100:
1081
- // Phoneme: "d", bytes: [100]
1082
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Stop","voiced":true}
1081
+ // Phoneme: 'd', bytes: [100]
1082
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Stop","voiced":true}
1083
1083
  if (max_length > 1) {
1084
- switch(string[cursor + 1]) {
1084
+ switch(string[cursor + 1]) {
1085
1085
 
1086
- case 204:
1087
- if (max_length > 2) {
1088
- switch(string[cursor + 2]) {
1086
+ case 204:
1087
+ if (max_length > 2) {
1088
+ switch(string[cursor + 2]) {
1089
1089
 
1090
- case 188:
1091
- // Phoneme: "", bytes: [100, 204, 188]
1092
- // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Stop","voiced":true}
1093
- return 3;
1094
- break;
1095
- }
1096
- } else {
1097
- return 2;
1098
- }
1090
+ case 188:
1091
+ // Phoneme: '', bytes: [100, 204, 188]
1092
+ // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Stop","voiced":true}
1093
+ return 3;
1099
1094
  break;
1100
- default:
1101
- return 1;
1102
1095
  }
1096
+ } else {
1097
+ return 2;
1098
+ }
1099
+ break;
1100
+ default:
1101
+ return 1;
1102
+ }
1103
1103
  } else {
1104
1104
  return 1;
1105
1105
  }
1106
1106
  break;
1107
1107
  case 99:
1108
- // Phoneme: "c", bytes: [99]
1109
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Stop","voiced":false}
1108
+ // Phoneme: 'c', bytes: [99]
1109
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Stop","voiced":false}
1110
1110
  return 1;
1111
1111
  break;
1112
1112
  case 107:
1113
- // Phoneme: "k", bytes: [107]
1114
- // consonant features: {"position":"Velar","position_index":9,"manner":"Stop","voiced":false}
1113
+ // Phoneme: 'k', bytes: [107]
1114
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Stop","voiced":false}
1115
1115
  return 1;
1116
1116
  break;
1117
1117
  case 103:
1118
- // Phoneme: "g", bytes: [103]
1119
- // consonant features: {"position":"Velar","position_index":9,"manner":"Stop","voiced":true}
1118
+ // Phoneme: 'g', bytes: [103]
1119
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Stop","voiced":true}
1120
1120
  return 1;
1121
1121
  break;
1122
1122
  case 113:
1123
- // Phoneme: "q", bytes: [113]
1124
- // consonant features: {"position":"Uvular","position_index":10,"manner":"Stop","voiced":false}
1123
+ // Phoneme: 'q', bytes: [113]
1124
+ // consonant features: {"position":"Uvular","position_index":10,"manner":"Stop","voiced":false}
1125
1125
  return 1;
1126
1126
  break;
1127
1127
  case 115:
1128
- // Phoneme: "s", bytes: [115]
1129
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Sibilant fricative","voiced":false}
1128
+ // Phoneme: 's', bytes: [115]
1129
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Sibilant fricative","voiced":false}
1130
1130
  return 1;
1131
1131
  break;
1132
1132
  case 122:
1133
- // Phoneme: "z", bytes: [122]
1134
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Sibilant fricative","voiced":true}
1133
+ // Phoneme: 'z', bytes: [122]
1134
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Sibilant fricative","voiced":true}
1135
1135
  return 1;
1136
1136
  break;
1137
1137
  case 206:
1138
1138
  if (max_length > 1) {
1139
- switch(string[cursor + 1]) {
1140
-
1141
- case 178:
1142
- // Phoneme: "β", bytes: [206, 178]
1143
- // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Non-sibilant fricative","voiced":true}
1144
- return 2;
1145
- break;
1146
- case 184:
1147
- // Phoneme: "θ", bytes: [206, 184]
1148
- // consonant features: {"position":"Dental","position_index":4,"manner":"Non-sibilant fricative","voiced":false}
1149
- if (max_length > 2) {
1150
- switch(string[cursor + 2]) {
1139
+ switch(string[cursor + 1]) {
1140
+
1141
+ case 178:
1142
+ // Phoneme: 'β', bytes: [206, 178]
1143
+ // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Non-sibilant fricative","voiced":true}
1144
+ return 2;
1145
+ break;
1146
+ case 184:
1147
+ // Phoneme: 'θ', bytes: [206, 184]
1148
+ // consonant features: {"position":"Dental","position_index":4,"manner":"Non-sibilant fricative","voiced":false}
1149
+ if (max_length > 2) {
1150
+ switch(string[cursor + 2]) {
1151
1151
 
1152
- case 204:
1153
- if (max_length > 3) {
1154
- switch(string[cursor + 3]) {
1155
-
1156
- case 188:
1157
- // Phoneme: "θ̼", bytes: [206, 184, 204, 188]
1158
- // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Non-sibilant fricative","voiced":false}
1159
- return 4;
1160
- break;
1161
- case 160:
1162
- // Phoneme: "θ̠", bytes: [206, 184, 204, 160]
1163
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Non-sibilant fricative","voiced":false}
1164
- return 4;
1165
- break;
1166
- }
1167
- } else {
1168
- return 3;
1169
- }
1170
- break;
1171
- default:
1172
- return 2;
1173
- }
1152
+ case 204:
1153
+ if (max_length > 3) {
1154
+ switch(string[cursor + 3]) {
1155
+
1156
+ case 188:
1157
+ // Phoneme: 'θ̼', bytes: [206, 184, 204, 188]
1158
+ // consonant features: {"position":"Linguo-labial","position_index":3,"manner":"Non-sibilant fricative","voiced":false}
1159
+ return 4;
1160
+ break;
1161
+ case 160:
1162
+ // Phoneme: 'θ̠', bytes: [206, 184, 204, 160]
1163
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Non-sibilant fricative","voiced":false}
1164
+ return 4;
1165
+ break;
1166
+ }
1174
1167
  } else {
1175
- return 2;
1168
+ return 3;
1176
1169
  }
1177
1170
  break;
1171
+ default:
1172
+ return 2;
1173
+ }
1174
+ } else {
1175
+ return 2;
1178
1176
  }
1177
+ break;
1178
+ }
1179
1179
  } else {
1180
1180
  return 1;
1181
1181
  }
1182
1182
  break;
1183
1183
  case 102:
1184
- // Phoneme: "f", bytes: [102]
1185
- // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Non-sibilant fricative","voiced":false}
1184
+ // Phoneme: 'f', bytes: [102]
1185
+ // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Non-sibilant fricative","voiced":false}
1186
1186
  return 1;
1187
1187
  break;
1188
1188
  case 118:
1189
- // Phoneme: "v", bytes: [118]
1190
- // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Non-sibilant fricative","voiced":true}
1189
+ // Phoneme: 'v', bytes: [118]
1190
+ // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Non-sibilant fricative","voiced":true}
1191
1191
  return 1;
1192
1192
  break;
1193
1193
  case 120:
1194
- // Phoneme: "x", bytes: [120]
1195
- // consonant features: {"position":"Velar","position_index":9,"manner":"Non-sibilant fricative","voiced":false}
1194
+ // Phoneme: 'x', bytes: [120]
1195
+ // consonant features: {"position":"Velar","position_index":9,"manner":"Non-sibilant fricative","voiced":false}
1196
1196
  return 1;
1197
1197
  break;
1198
1198
  case 207:
1199
1199
  if (max_length > 1) {
1200
- switch(string[cursor + 1]) {
1200
+ switch(string[cursor + 1]) {
1201
1201
 
1202
- case 135:
1203
- // Phoneme: "χ", bytes: [207, 135]
1204
- // consonant features: {"position":"Uvular","position_index":10,"manner":"Non-sibilant fricative","voiced":false}
1205
- return 2;
1206
- break;
1207
- }
1202
+ case 135:
1203
+ // Phoneme: 'χ', bytes: [207, 135]
1204
+ // consonant features: {"position":"Uvular","position_index":10,"manner":"Non-sibilant fricative","voiced":false}
1205
+ return 2;
1206
+ break;
1207
+ }
1208
1208
  } else {
1209
1209
  return 1;
1210
1210
  }
1211
1211
  break;
1212
1212
  case 196:
1213
1213
  if (max_length > 1) {
1214
- switch(string[cursor + 1]) {
1214
+ switch(string[cursor + 1]) {
1215
1215
 
1216
- case 167:
1217
- // Phoneme: "ħ", bytes: [196, 167]
1218
- // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Non-sibilant fricative","voiced":false}
1219
- return 2;
1220
- break;
1221
- }
1216
+ case 167:
1217
+ // Phoneme: 'ħ', bytes: [196, 167]
1218
+ // consonant features: {"position":"Pharyngeal","position_index":11,"manner":"Non-sibilant fricative","voiced":false}
1219
+ return 2;
1220
+ break;
1221
+ }
1222
1222
  } else {
1223
1223
  return 1;
1224
1224
  }
1225
1225
  break;
1226
1226
  case 104:
1227
- // Phoneme: "h", bytes: [104]
1228
- // consonant features: {"position":"Glottal","position_index":12,"manner":"Non-sibilant fricative","voiced":false}
1227
+ // Phoneme: 'h', bytes: [104]
1228
+ // consonant features: {"position":"Glottal","position_index":12,"manner":"Non-sibilant fricative","voiced":false}
1229
1229
  return 1;
1230
1230
  break;
1231
1231
  case 119:
1232
- // Phoneme: "w", bytes: [119]
1233
- // consonant features: {"position":"Labio-velar","position_index":0,"manner":"Approximant","voiced":true}
1232
+ // Phoneme: 'w', bytes: [119]
1233
+ // consonant features: {"position":"Labio-velar","position_index":0,"manner":"Approximant","voiced":true}
1234
1234
  return 1;
1235
1235
  break;
1236
1236
  case 106:
1237
- // Phoneme: "j", bytes: [106]
1238
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Approximant","voiced":true}
1237
+ // Phoneme: 'j', bytes: [106]
1238
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Approximant","voiced":true}
1239
1239
  if (max_length > 1) {
1240
- switch(string[cursor + 1]) {
1240
+ switch(string[cursor + 1]) {
1241
1241
 
1242
- case 204:
1243
- if (max_length > 2) {
1244
- switch(string[cursor + 2]) {
1242
+ case 204:
1243
+ if (max_length > 2) {
1244
+ switch(string[cursor + 2]) {
1245
1245
 
1246
- case 138:
1247
- // Phoneme: "", bytes: [106, 204, 138]
1248
- // consonant features: {"position":"Palatal","position_index":8,"manner":"Approximant","voiced":false}
1249
- return 3;
1250
- break;
1251
- }
1252
- } else {
1253
- return 2;
1254
- }
1246
+ case 138:
1247
+ // Phoneme: '', bytes: [106, 204, 138]
1248
+ // consonant features: {"position":"Palatal","position_index":8,"manner":"Approximant","voiced":false}
1249
+ return 3;
1255
1250
  break;
1256
- default:
1257
- return 1;
1258
1251
  }
1252
+ } else {
1253
+ return 2;
1254
+ }
1255
+ break;
1256
+ default:
1257
+ return 1;
1258
+ }
1259
1259
  } else {
1260
1260
  return 1;
1261
1261
  }
1262
1262
  break;
1263
1263
  case 226:
1264
1264
  if (max_length > 1) {
1265
- switch(string[cursor + 1]) {
1265
+ switch(string[cursor + 1]) {
1266
+
1267
+ case 177:
1268
+ if (max_length > 2) {
1269
+ switch(string[cursor + 2]) {
1266
1270
 
1267
1271
  case 177:
1268
- if (max_length > 2) {
1269
- switch(string[cursor + 2]) {
1270
-
1271
- case 177:
1272
- // Phoneme: "ⱱ", bytes: [226, 177, 177]
1273
- // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Tap/flap","voiced":true}
1274
- if (max_length > 3) {
1275
- switch(string[cursor + 3]) {
1276
-
1277
- case 204:
1278
- if (max_length > 4) {
1279
- switch(string[cursor + 4]) {
1280
-
1281
- case 159:
1282
- // Phoneme: "ⱱ̟", bytes: [226, 177, 177, 204, 159]
1283
- // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Tap/flap","voiced":true}
1284
- return 5;
1285
- break;
1286
- }
1287
- } else {
1288
- return 4;
1289
- }
1290
- break;
1291
- default:
1292
- return 3;
1293
- }
1294
- } else {
1295
- return 3;
1296
- }
1272
+ // Phoneme: 'ⱱ', bytes: [226, 177, 177]
1273
+ // consonant features: {"position":"Labio-dental","position_index":2,"manner":"Tap/flap","voiced":true}
1274
+ if (max_length > 3) {
1275
+ switch(string[cursor + 3]) {
1276
+
1277
+ case 204:
1278
+ if (max_length > 4) {
1279
+ switch(string[cursor + 4]) {
1280
+
1281
+ case 159:
1282
+ // Phoneme: 'ⱱ̟', bytes: [226, 177, 177, 204, 159]
1283
+ // consonant features: {"position":"Bi-labial","position_index":1,"manner":"Tap/flap","voiced":true}
1284
+ return 5;
1297
1285
  break;
1298
1286
  }
1287
+ } else {
1288
+ return 4;
1289
+ }
1290
+ break;
1291
+ default:
1292
+ return 3;
1293
+ }
1299
1294
  } else {
1300
- return 2;
1295
+ return 3;
1301
1296
  }
1302
1297
  break;
1303
1298
  }
1299
+ } else {
1300
+ return 2;
1301
+ }
1302
+ break;
1303
+ }
1304
1304
  } else {
1305
1305
  return 1;
1306
1306
  }
1307
1307
  break;
1308
1308
  case 114:
1309
- // Phoneme: "r", bytes: [114]
1310
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Trill","voiced":true}
1309
+ // Phoneme: 'r', bytes: [114]
1310
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Trill","voiced":true}
1311
1311
  if (max_length > 1) {
1312
- switch(string[cursor + 1]) {
1312
+ switch(string[cursor + 1]) {
1313
1313
 
1314
- case 204:
1315
- if (max_length > 2) {
1316
- switch(string[cursor + 2]) {
1314
+ case 204:
1315
+ if (max_length > 2) {
1316
+ switch(string[cursor + 2]) {
1317
1317
 
1318
- case 165:
1319
- // Phoneme: "", bytes: [114, 204, 165]
1320
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Trill","voiced":false}
1321
- return 3;
1322
- break;
1323
- }
1324
- } else {
1325
- return 2;
1326
- }
1318
+ case 165:
1319
+ // Phoneme: '', bytes: [114, 204, 165]
1320
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Trill","voiced":false}
1321
+ return 3;
1327
1322
  break;
1328
- default:
1329
- return 1;
1330
1323
  }
1324
+ } else {
1325
+ return 2;
1326
+ }
1327
+ break;
1328
+ default:
1329
+ return 1;
1330
+ }
1331
1331
  } else {
1332
1332
  return 1;
1333
1333
  }
1334
1334
  break;
1335
1335
  case 108:
1336
- // Phoneme: "l", bytes: [108]
1337
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Lateral approximant","voiced":true}
1336
+ // Phoneme: 'l', bytes: [108]
1337
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Lateral approximant","voiced":true}
1338
1338
  if (max_length > 1) {
1339
- switch(string[cursor + 1]) {
1339
+ switch(string[cursor + 1]) {
1340
1340
 
1341
- case 204:
1342
- if (max_length > 2) {
1343
- switch(string[cursor + 2]) {
1341
+ case 204:
1342
+ if (max_length > 2) {
1343
+ switch(string[cursor + 2]) {
1344
1344
 
1345
- case 165:
1346
- // Phoneme: "", bytes: [108, 204, 165]
1347
- // consonant features: {"position":"Alveolar","position_index":5,"manner":"Lateral approximant","voiced":false}
1348
- return 3;
1349
- break;
1350
- }
1351
- } else {
1352
- return 2;
1353
- }
1345
+ case 165:
1346
+ // Phoneme: '', bytes: [108, 204, 165]
1347
+ // consonant features: {"position":"Alveolar","position_index":5,"manner":"Lateral approximant","voiced":false}
1348
+ return 3;
1354
1349
  break;
1355
- default:
1356
- return 1;
1357
1350
  }
1351
+ } else {
1352
+ return 2;
1353
+ }
1354
+ break;
1355
+ default:
1356
+ return 1;
1357
+ }
1358
1358
  } else {
1359
1359
  return 1;
1360
1360
  }