Thai Consonant Classes and Tone Marks Explained

September 3, 202616 min readbeginnerreference

Every Thai consonant belongs to one of three classes — mid, high, or low — and together with the four tone marks and the shape of the syllable they decide its tone. You do not need to recite the table to type, but you are already keying it in: ก on D is mid-class, ข on minus is high-class, ค on Digit8 is low-class, and the same ่ on J produces a different tone on each of them. Understanding that is what makes the 44 letters feel like a system instead of a pile of similar-looking keys.

The positions below are Kedmanee positions from CHARS.kedmanee, the same table the on-screen board draws. ThaiTyper’s skill track does not have a “consonant class” atom — it teaches the keys as motor groups (home-consonants, reaches, shift-layer, rare-clusters) — and then teaches the four marks as tone-marks (่ ้) and tone-stacking (่ ้ ๊ ๋). Class is the reason those marks exist: without it, Thai could not write five tones with four diacritics and a blank. If your OS is on Pattachote, the named keys in this article will not match your fingers.

A typist meets class as a failure mode long before they meet it as a grammar lesson. You type ค่า (Digit8, J, K) when the prompt was ข่า (minus, J, K): same ่, same า, different leading letter, different word. The heatmap lights KeyMinus and Digit8, not “high versus low.” This guide names the keys first and then the class, so the next time those two keys light up you know you swapped a pair, not a random number-row miss.

The three consonant classes

Thai sorts its 44 consonants into mid (อักษรกลาง), high (อักษรสูง), and low (อักษรต่ำ) classes. The class is not about the consonant’s own sound — ก and ข do not sound like “mid” and “high.” It is a grammatical grouping that, together with vowel length and the syllable ending, sets the tone of the syllable it begins. Unmarked กา is mid tone; unmarked ขา is rising; unmarked คา is mid again, for a different reason. The mark you add next does different work on each.

The three-way split is why Thai has more letters than sounds. English does not need two keys for /kʰ/; Thai does, because ข (high) and ค (low) write different unmarked tones and take ่ and ้ differently. A layout has to park both. Kedmanee puts the high partner ข on minus, a right-pinky number-row reach, and the low partner ค on Digit8, a right-middle number-row reach. They are not neighbours. Mixing them is a long jump, which is why the pair is a heatmap classic once you leave the home row.

  • Mid class (9): ก จ ฎ ฏ ด ต บ ป อ. Unmarked live syllables are mid tone. They take all four marks.
  • High class (11): ข ฃ ฉ ฐ ถ ผ ฝ ศ ษ ส ห. Unmarked live syllables are rising. They rarely take ๊ or ๋.
  • Low class (24): everything else, including น ง ม ย ร ล ว ค ท พ ฟ. Unmarked live syllables are mid. ่ on them is falling, not low.
  • Class is a property of the leading consonant. ห นำ and อ นำ, later in this article, are the exceptions that rewrite that leading letter.

Mid-class consonants

The nine mid-class consonants are ก จ ฎ ฏ ด ต บ ป อ. They take all four tone marks and produce the most predictable tones, which is why learners often start reading with them. Several — ก, ด, ต, บ, ป, อ, จ — are everyday letters you will type constantly. On Kedmanee they are not a single motor group: ก and ด are home-row, ป and อ are bottom-row, ต and จ are number-row, ฎ and ฏ are Shift.

Name the keys. ก is D, left middle, home — the most common initial in the language, and the first letter the home-consonants atom drills. ด is F, left index, the F bump. จ is Digit0, right pinky, number row. ต is Digit9, right ring, number row. บ is BracketLeft, right pinky, top row. ป is X, left ring, bottom row. อ is V, left index, bottom row — also the vowel carrier in อะ อา. ฎ is Shift+E, the Shift of ำ. ฏ is Shift+D, the Shift of ก, so the same physical key types the common mid-class letter on the base layer and a rare mid-class letter on Shift.

That last pair is a trap. Learners who “know ก is D” will, the first time they need ฏ, press D again and get ก. ฏ is the Shift of that same key, opposite-hand Shift, left middle still on D. ฎ is worse: it shares E with ำ, so a dropped Shift produces ำ in the middle of a name. The rare-clusters atom exists for these two, not because they are conceptually hard, but because they live on keys you already own for something common.

  1. Type กา ก่า ก้า as D K, D J K, D H K. Mid class, live, all four tones you actually use day to day (๊ and ๋ wait until later).
  2. Type ตา ตา ตา as Digit9 then K, returning the right ring to L (ส) after each ต.
  3. Type ไป as ไ on W then ป on X. Mid-class ป is a bottom-row left-ring key, not a home-row neighbour of ก.
  4. Type อ on V ten times, returning the left index to F (ด). อ is mid-class and a vowel seat; it is not a rare letter.

High and low classes

The eleven high-class consonants (ข ฃ ฉ ฐ ถ ผ ฝ ศ ษ ส ห) and the twenty-four low-class consonants — the rest of the alphabet — split the remaining letters. Many low-class consonants have a high-class partner that makes the same sound, which is how Thai writes tones it otherwise could not spell. For a typist the split is a map of reaches: several high-class letters sit on awkward keys, because the typewriter put the rarer partner wherever a slot was free.

High-class keys you will actually press. ข on minus, right pinky, number row — ข้าว, ขาว, ของ. ถ on Digit5, left index, number row — ที่, ถาม. ผ on Z, left pinky, bottom row — ผี, ผิด. ฝ on slash, right pinky, bottom row. ศ on Shift+L and ษ on Shift+K, the Shift of ส and า. ส on L, right ring, home — high class on a rest key. ห on S, left ring, home — high class, and the letter that leads ห นำ. ฉ is Shift+C, ฐ is Shift+BracketLeft, ฃ is Backslash; those three wait for rare-clusters.

Low-class workhorses, with the keys. น on O, right ring, top row — one of the most frequent letters, and Kedmanee’s famous awkward reach. ง on quote, right pinky, just past ว. ม on comma, right middle, bottom row. ย on P, right pinky, top row. ร on I, right middle, top row. ล on BracketRight, right pinky, top row. ว on semicolon, right pinky, home. ค on Digit8. ท on M. พ on R. ฟ on A, left pinky, home — low class, the partner of ฝ. ท is low; ถ is its high partner on Digit5. If the heatmap names KeyO, you are not failing “low class.” You are missing น.

  • ส on L is high class and home-row. ซ, the low /s/, is Shift+semicolon, the Shift of ว.
  • ห on S is high class and home-row. ฮ, the low /h/, is Shift+V, the Shift of อ.
  • ข on minus is high /kh/. ค on Digit8 is low /kh/. ฆ is Shift+S, the Shift of ห, and you will barely type it.
  • น on O is low class. It is not on the home row. Drilling class will not move it; drilling the O reach will.

How class and tone mark combine

The same tone mark does different things depending on the class of the consonant. ไม้เอก (่) gives a low tone on a mid- or high-class consonant but a falling tone on a low-class one. That is why ก่า and ข่า are low, while ค่า is falling — identical ่ on J, three different readings. The class of the leading consonant is half the equation. Whether the syllable is live or dead (its ending and vowel length) is the other half. You do not compute this mid-keystroke. You copy the prompt. You need the rule when you have typed a legal-looking wrong word and cannot see why it is wrong.

Work the three live open syllables with า on K, the gentlest trailing vowel. กา is D then K: mid class, live, unmarked, mid tone. ขา is minus then K: high class, live, unmarked, rising. คา is Digit8 then K: low class, live, unmarked, mid. Add ่ on J after the consonant, before า: ก่า, ข่า, ค่า. Same three keys plus J, three different tones. Add ้ on H instead: ก้า, ข้า, ค้า. Mid and high take ้ as falling; low takes ้ as high. That is the whole live-syllable table you will use in ordinary text.

Dead syllables change the unmarked row. กก (D, D) is a dead mid-class syllable and reads low without a mark. ขก is dead high and also low unmarked. คก is dead low and reads high unmarked. Adding ่ still means “the next tone in that class’s dead row,” not “always low.” You will not type from this table. You will type เด็ก (G, F, Shift+H, D) and นก (O, D) because the prompt shows those letters. The table explains why นก has no ่ and still is not mid tone.

  1. กา ขา คา: D K, minus K, Digit8 K. Unmarked live. Feel the three leading keys before you add a mark.
  2. ก่า ข่า ค่า: insert J after the consonant, then K. Same ่, three classes.
  3. ก้า ข้า ค้า: insert H after the consonant, then K. ้ is the neighbour of ่, not a different finger.
  4. ไม่ is ไ W, ม comma, ่ J. Low-class ม with ่ is falling, which is why ไม่ is not pronounced like ใหม่ (ใ period, ห on S, ม, ่ — ห นำ, next section).

Why there are paired letters

Some sounds, like /kʰ/, exist in both a high-class form (ข) and a low-class form (ค). Pairing a sound across two classes lets Thai spell the full range of tones for that sound, sometimes with the help of a leading ห or อ. For a typist this explains why the alphabet has more letters than distinct sounds — and why a few keys you rarely reach still earn their place. You cannot “just use ค for every /kh/.” ขาว is ข; คาว is ค. They are different words, and they live on minus versus Digit8.

The pairs you will actually mix, with both keys. ข minus / ค Digit8. ถ Digit5 / ท M (ท is bottom-row right index; ถ is number-row left index — opposite hands). ผ Z / พ R (left pinky bottom versus left index top). ฝ slash / ฟ A (right pinky bottom versus left pinky home — ฟ is the home-row letter, ฝ is the reach). ห S / ฮ Shift+V. ช Equal / ฉ Shift+C. ส L / ซ Shift+semicolon. When a drill shows ฟ and you type ฝ, you did not miss a class lecture. You reached for slash instead of resting on A.

  • ข (minus) versus ค (Digit8): ขาว versus คาว, ของ versus คน. High partner is the number-row pinky; low partner is the number-row middle.
  • ถ (Digit5) versus ท (M): ที่ starts with ถ, ทาน starts with ท. Digit5 is left index up; M is right index down.
  • ผ (Z) versus พ (R): ผิด versus พิษ. Z is the worst left-pinky reach on the board; พ is a short left-index top-row reach.
  • ฝ (slash) versus ฟ (A): ฝัน versus ฟัน. If the heatmap names Slash and KeyA, this is the pair.

The four tone marks

Thai has four tone marks — ไม้เอก (่), ไม้โท (้), ไม้ตรี (๊), and ไม้จัตวา (๋) — that sit above the consonant. On the Kedmanee keyboard all four belong to the right index finger: ่ on J (home bump), ้ on H (one step left of J), ๊ on Shift+U (top row, the Shift of ี), ๋ on Shift+J (the Shift of ่). ThaiTyper splits them on purpose: the tone-marks atom is ่ and ้, the two you type in ไม่ แล้ว ข้าว น้ำ. The tone-stacking atom adds ๊ and ๋, which fail as Shift chords on that same finger, not as a new idea of tone.

Keystroke order, from lib/typing/clusters.ts and the platform orthography checker: pre-posed vowel if any, then the base consonant, then stacked vowels, then the tone mark, then trailing ะ า ำ. ที่ is ท on M, ี on U, ่ on J — consonant, stacked vowel, tone. ข้าว is ข on minus, ้ on H, า on K, ว on semicolon. ไม่ is ไ on W, ม on comma, ่ on J. Putting the mark before the consonant, or before ี in ที่, is the mark-order issue the checker flags. The dotted circle ◌่ appears when a mark is typed with no base at all.

๊ and ๋ are rare and they share hardware with keys you already use. ๊ is Shift+U, so a dropped Shift produces ี: ก๊าซ becomes กียาซ-shaped nonsense. ๋ is Shift+J, so a dropped Shift produces ่: you wanted the rare rising mark and got mai ek. Opposite-hand Shift: left Shift, right index. Same-hand Shift on U or J is how ๊ and ๋ never appear. ็ on Shift+H is not a tone mark; it is maitaikhu, the shortener in เด็ก, and it lives on the Shift of ้. Do not put it in the four-mark set.

  1. ่ ้ ่ ้ on J and H until the right index can tell them apart without looking.
  2. ข้าว: minus, H, K, semicolon. ขาว is the same without H. One key is the whole difference.
  3. ก๊าซ: D, Shift+U, K, Shift+semicolon (ซ). Left Shift, then U, then release.
  4. เด็ก: G, F, Shift+H, D. ็ is Shift+H, not a tone. If you press H without Shift you get ้ and เด็ becomes เด้.

Live and dead syllables

Thai spelling books call a syllable live (พยางค์เป็น) when it has a long vowel or ends in a sonorant — ง น ม ย ว ล — and dead (พยางค์ตาย) when the vowel is short with no final, or the final is a stop (ก ด บ, the sounds /k t p/). Live unmarked mid-class is mid tone; dead unmarked mid-class is already low. That is why กา and กก, both built from ก on D, do not read the same, and why you cannot treat “no ่” as “no tone work.”

For the typist this matters at the prompt, not at the theory. นก is น on O then ก on D — dead, low class, unmarked, high tone — and there is no ่ to press. ไม่ is a live low-class syllable with ่, so J is required. If you add ่ to นก because “low class words need a mark,” you have invented น่ก, which is not the word. Copy the letters. Use class to diagnose a miss: if you typed น่ก, you added a mark the dead syllable does not write.

ห นำ and อ นำ

ห นำ is a leading ห that does not add an /h/ sound; it borrows high class for a following low-class consonant so the syllable can take the high-class tone pattern. หน หม หล หย หว หง are the usual clusters. ห is on S, left ring, home — you already own it from home-consonants. หมา is S, comma, K. นา, without ห, is O, K, and is a different word with a different class. ใหม่ is ใ on period, ห on S, ม on comma, ่ on J — four keys, and the ห is why ใหม่ is not ไม่.

อ นำ is rarer. อ is mid-class, on V, and in a handful of words it leads another consonant to force a mid-class pattern (อย่าง is the famous case: ไ, อ, ย, ่, า, ง). You will type อ constantly as a vowel carrier (อยู่, อะ) and only occasionally as this class trick. The motor fact is the same: อ is V, left index down from ด on F. A heatmap that lights KeyV is usually the vowel seat, not อ นำ. Learn ใหม่ versus ไม่ first; อ นำ can wait until the prompt actually shows อย.

  • ใหม่: period (ใ), S (ห), comma (ม), J (่). The ห is the class, not an extra /h/.
  • ไม่: W (ไ), comma (ม), J. No ห. Three keys, not four.
  • หมา: S, comma, K. นา: O, K. One leading ห on the home row is the whole spelling difference.
  • อยู่: V (อ), ย on P, ่ on J, ู on Shift+Digit6. Here อ is the vowel seat, not อ นำ.

Why it helps typists

When you drill tone marks and stacked vowels, you are placing these marks on consonants of different classes. Recognising the pattern helps you anticipate which mark a word needs and catch a mistype faster, because a wrong tone mark usually looks — and reads — wrong straight away. มา versus ม้า is H present or absent on a low-class ม. ขาว versus ข้าว is the same H on a high-class ข. The finger is identical. The class tells you why the unmarked forms already differed before you touched H.

Use class as a heatmap legend, not as a study plan. KeyD plus KeyF hot is ก versus ด, both mid, both home — a neighbour swap, drill D and F. KeyJ plus KeyH hot is ่ versus ้, one finger, two marks — the tone-marks atom. KeyMinus plus Digit8 hot is ข versus ค, a class pair on two number-row keys. Slash plus KeyA is ฝ versus ฟ. None of those diagnoses is “I should reread the tone table.” They are named keys. Open the matching skill, slow that finger, and pass at 90% (SKILL_PASS) before you add speed.

Do not pause mid-word to classify the letter. The skill track’s order — home-consonants, reaches, trailing-vowels, stacked-vowels, preposed-order, tone-marks, tone-stacking — already puts the marks on after the bases they attach to. Class is the story of why ่ is not a single sound. The motor skill is still: consonant, stacked vowel, ่ on J or ้ on H. If a linguistics explanation ever costs you a look down at the board, drop it and return to the named key.

Related guides