Lexurgy Sound Changer Tutorial — Using Features

Everything so far has treated sounds as indivisible units. But Lexurgy also lets you break down sounds into the features that describe them, allowing certain kinds of complex sound changes to be written more efficiently and robustly.

When to Use Features

Features can take quite a bit of effort to set up, so it's usually best to start a project without using features. Bring features in when:

  • You want to use IPA diacritics.
  • You need to deal with suprasegmentals like tone, stress, or vowel length, or secondary articulations like palatalization.
  • You have several assimilation or dissimilation rules that are bulky and hard to read.

Binary Features

Let's look at an example of a simple vowel space defined using binary features, as used in distinctive feature theory:

Ready
Input WordOutput Word

This example defines four features: low, high, front, and back, representing the position of the tongue in the mouth when making that vowel. Each of these features has two values: low has the value +low for low vowels like [a], and the value -low for non-low vowels. It then defines a symbol for each vowel in the language, and gives each vowel a feature matrix, showing which feature values that vowel has. Now, anytime Lexurgy encounters an [e] in a word, it knows that that [e] is a front vowel, but not a low, high, or back vowel.

The final-vowel-raising rule uses these features to change all mid vowels (which are -low -high) to the corresponding high vowel. The matrix [+high] on the result side of the rule means that the high feature, and only the high feature, will be changed to +high, while all other features (like the front and back features) are left unchanged.

Absent Values

Binary features actually have a third value: absent, written with a * before the feature name. (This makes the name "binary" rather suspect... linguistic terminology can be confusing sometimes!) So the absence of the low feature is written *low and the absence of the back feature is written *back. Any character that you haven't explicitly given a value for the low feature automatically has *low. This would most likely be the case with any consonant sounds, where the low feature is irrelevant.

You can use absent features in rules just like any other feature value:

Ready
Input WordOutput Word

Any characters in an input word that don't match symbols are considered to lack all features, so they'll only match matrices consisting entirely of absent features, like [*low *front], or the wildcard [].

Univalent Features

You can also define univalent features, which only have two values: present and absent.

Ready
Input WordOutput Word

The feature nasalized has only the two values +nasalized and -nasalized. Any sound that isn't explicitly defined to be +nasalized is automatically -nasalized. There's no separate *nasalized value—*nasalized is just another way of writing -nasalized.

Multivalent Features

Lexurgy also allows features with any number of values. For example, you can recreate part the IPA consonant chart like this:

Ready
Input WordOutput Word

This defines three features: voicing, place, and manner. With multivalent features, each value has a name; rather than writing [+place] or [-manner], which wouldn't make sense, you have to use the names, like [labial nasal].

Just like binary and univalent features, multivalent features always have an absent value. In this example, we didn't specify a voicing for [m], [n], and [l], so they automatically have the absent value *voicing.

Naming the Absent Value

You can give the absent value of any multivalent feature a name. The above example could also be written:

Ready
Input WordOutput Word

Then all sounds are automatically voiceless unless you explicitly declare them to be voiced.

Feature Variables

Languages often undergo assimilation, where one sound becomes more like a nearby sound. Lexurgy provides feature variables to make assimilation rules easier to write. Feature variables copy a feature value from one sound to another:

Ready
Input WordOutput Word

The [consonant $place] matrix in the environment matches any consonant, but captures the value of that consonant's place feature. This feature value is copied into the matching $place in the output matrix.

Beware of matrices containing only feature variables! The matrix [$place] matches any sound and blithely copies its place feautre, even if its value is *place. This can easily lead to errors:

Ready
Input WordOutput Word

Since vowels aren't declared to have a place, the rule copies *place from the a in amata onto the m, obliterating its place of articulation and producing the non-existent sound [nasal consonant].

Negated Values

You can match any sound that doesn't have a given feature by putting ! before the feature value.

This is often useful if there are gaps in the symbol chart. Suppose you want to voice fricatives between vowels, and write these rules:

Ready
Input WordOutput Word

This causes an error, since [h] has no voiced counterpart. To fix this, you can indicate that only non-glottal fricatives voice:

Ready
Input WordOutput Word

Diacritics

The IPA indicates some features explicitly using diacritics: [ʰ] indicates aspiration, [ː] makes a vowel long, [ ̥ ] makes a sound voiceless, and so on.

You can define such diacritics in Lexurgy like this:

Ready
Input WordOutput Word

If the base symbol has a feature matrix defined, the diacritic will overwrite any conflicting values, while leaving all other values intact:

Ready
Input WordOutput Word

Notice that Lexurgy only uses diacritics when necessary: it uses the -voiced diacritic to represent voiceless nasals, but doesn't try to represent [-voiced labial stop] as , since b is already defined with that matrix.

You can also choose how diacritics are attached to their base symbol: (before) makes the diacritic go before the base symbol, while (first) makes it go after the first character of the base symbol.

Ready
Input WordOutput Word

Floating Diacritics

By default, diacritics create an entirely new sound. In this example, the aspirated stops are unaffected by the intervocalic-voicing rule:

Ready
Input WordOutput Word

But some features are more superficial. You'd normally expect [á] ([a] with a high tone) and [aː] ([a] held for longer) to follow the same sound changes as plain [a]. To indicate this, mark the diacritics as (floating):

Ready
Input WordOutput Word

If you want a particular rule to only affect plain [a], put ! after it:

Ready
Input WordOutput Word

Ignoring Floating Diacritics in Capture Variables

Capture variables normally don't pay attention to features—they copy entire sounds. But that means they won't match sounds that differ only by floating diacritics:

Ready
Input WordOutput Word

You can fix this with an inexact capture variable, marked with ~$ instead of $:

Ready
Input WordOutput Word