Sound change rules (also known as phonological rules) are mainly used in the Sound Change field and in custom affixes. This notation can also be used in the Custom Spelling field to mimic spelling idiosyncrasies of natural languages, and in illegal combinations field to prohibit combinations of phonemes.

A basic rule like a > o means change every a to o. Try it yourself:

InputRuleOutput
alabama
a > o

The symbol is also valid: a → o.

You can also specify if the change should only happen in a particular environment: a > o / _b means change every a to o if it comes before a b. The / means "in the environment of" and _ signifies where the a is.

InputRuleOutput
alabama
a > o / _b

Word boundaries


# signifies a word boundary. Notice how the following pattern only changes the first a.

InputRuleOutput
alabama
a > o / #_

Sets


Capture a set of phonemes inside curly brackets: {b,m} matches b or m.

InputRuleOutput
alabama
{b,m} > p
alabama
a > o / _{b,m}

Note: Curly brackets cannot be used in the replacement side. Instead, bar symbol | creates a random choice between replacement options: b > m | n | b changes b to m or n or b (effectively creating no change). All three options are equally probable, but can be weighted with the * symbol: b > m*3 | n*2 | b is the same as b > m | m | m | n | n | b.

C can be used for "any consonant" and V for "any vowel":

InputRuleOutput
alabama
V > o / C_

Additionally, X is "any phoneme", D is any IPA letter (does not capture diacritics) while (superscript D) captures any diacritic symbol. To capture other classes of phonemes like stops, nasals, etc. you should use distinctive feature notation.

Optional patterns


Round brackets makes a pattern optional:

InputRuleOutput
to god
o > e / _(C)#

Adding a star symbol * means the optional pattern is repeatable, i.e. zero or more of the pattern:

InputRuleOutput
to gods
o > e / _(C)*#

Deletion


Null symbol signifies nothing and can be used to delete phonemes:

InputRuleOutput
alabama
C > ∅

You can also literally write nothing: C >. Note that the null ∅ character (U+2205) should not be confused the Scandinavian letter Ø (U+00D8).

Insertion


The null symbol can be useful for inserting infixes into a certain position of the word:

InputRuleOutput
burro
∅ > it / _V#

Exceptions to rules


The ! symbol signifies an exception to a rule: m > n / !_e means m changes to n everywhere except before e. Similarly, m > n / !e_ means m changes to n everywhere except after e.

Exception rules can also be added to the end of a normal rule, eg: m > n / _e !s_ means m changes n before e, except after s.

Distinctive features


Square brackets are used to specify the presence (+) or absence (-) of distinctive features of a phoneme. The following rule nasalizes a vowel before another nasal:

InputRuleOutput
bon
V > [+nasal] / _[+nasal]

[+nasal] matches both nasal vowels and nasal consonants. But you could specify that you only want it to affect nasal consonants with [C +nasal]:

InputRuleOutput
bon boõ
V > [+nasal] / _[C +nasal]

Various features can be used to narrow down the match. The following rule deletes voiceless stops, which in this case is only t (d is a stop but is voiced, and h is voiceless but not a stop):

InputRuleOutput
tahad
[+stop -voice] > ∅

Here is a complete list:

FeatureMeaning
[±affricate]affricate consonants
[±alveolar]alveolar consonants
[±approx]approximants
[±back]back vowels
[±click]click consonants
C or [±consonant]consonants
[±cons]consonantals (different to consonants)
[±cont]continuants
[±dorsal]dorsals
[±fricative]fricative consonants
[±front]front vowels
[±high]high vowels
[±implosive]implosive consonants
[±labial]labial consonants and round vowels
[±laryngeal]laryngeal consonants
[±lat]lateral consonants
[±liquid]liquid consonants
[±low]low vowels
[±nasal]nasal consonants or nasal vowels
[C ±nasal]nasal consonants
[V ±nasal]nasal vowels
[±palatal]palatal consonants
[±retroflex]retroflex consonants
[±round]round vowels
[±son]sonorants
[V ±stress]stressed vowels
[±tap]tap consonants
[±trill]trill consonants
[±uvular]uvular consonants
[±velar]velar consonants
[±voice]voiced consonant or vowel (unless specifically a voiceless vowel)
[C ±voice]voiced consonant
[V ±voice]voiced vowels
V or [±vowel]vowels

Syllables


% signifies a syllable boundary, and sigma σ matches a whole syllable. The difference between the two is that syllable boundary also includes word boundaries. So a rule such as a > e / _% would match a at the end of word, where as a > e / _σ wouldn't.

Stress


You can use the feature [V ±stress]. For example [V -stress] > ə mimics English's tendency to turn unstressed vowels into ə. However you cannot make rules that modify the word's stress location (we're still working on this feature!). You can also target an individual vowel: [ɪ +stress] > i

Additionally, [V ±stress] does not work for spelling rules. The generator is not smart enough to know where syllables begin and end once it's dealing with your unique spelling system, and not pure IPA. Instead you must check Make spelling rules sensitive to stress symbol option and make rules that account for the literal ˈ stress symbol. Eg: the following rule looks for the stress mark and any optional consonants before the vowel. A separate rule will be needed to remove the stress symbols:

InputRuleOutput
ˈama ˈdrama draˈma
a > á / ˈ(C)*_

Same phoneme in a set


There may be scenarios where you want to match two of the same phonemes from a class, e.g., between two of the same vowels. To do this, use the a matching subscript number (₁₂₃₄₅₆₇₈₉) after the uppercase class:

InputRuleOutput
mitigate
t > d / V₁_V₁

Different numbers can signify that they are different phonemes. The following pattern matches two consonants in a row and swaps them:

InputRuleOutput
ask
C₁C₂ > C₂C₁

Subscripts can also be used after distinctive features: [C +nasal]₁; or sets: {n,m}₁. Multi-patterns can be captured inside curly brackets too:

InputRuleOutput
tada
{CV}₁{CV}₂ > {CV}₂{CV}₁

For ease of typing, regular numbers also work, e.g. C1C2 > C2C1.

Reduplication


Reduplication is a process in some languages where the whole word, or part of the word, is repeated exactly (or with a slight change). It often plays more of a grammatical function (such as forming the plural of a word) rather than being a global sound change process.

A quick-and-dirty rule to do a full reduplication is X(X)* > @@, where X* matches any number of any phoneme (the whole word), and @ replaces the match with itself (doubled @@):

InputRuleOutput
bye
X(X)* > @@

Partial reduplication comes in many forms, and there a few strategies for expressing them as rules. The Pangasinan language (Philippines) may reduplicate the first CVC pattern:

InputRuleOutput
baley
#CVC > @@

However, in a more complicated example, it repeats the first consonant only and first vowel. You could express this as being inserted at the beginning of the word with subscript numbers:

InputRuleOutput
plato
∅ > C₁V₁ / #_C₁C₂V₁

Non-Latin alphabets


Custom spelling supports all Unicode alphabets and scripts, such as Japanese, Chinese, Cyrillic and even Unicode Emojis.

Order of rules


The order of rules matter. Vulgar will find-and-replace the first rule to a word, then apply the next rule over the top of what it just did. This can be a problem if a IPA symbol appears in multiple patterns. For instance, the following ordering is problematic:

ʊ > u
aʊ > ow

The intent here is for the diphthong (as in the word "cow") to change to ow. However, a previous rule has already changed any ʊ (as in the word "put") to u, which means has already changed to au. The easiest solution is to reverse the order of the rules:

aʊ > ow
ʊ > u

Another solution is to use the exception ! symbol: ʊ > u / !a_.