Alexandre Barroso ←

An inventory is a field of contrasts

A vowel inventory isn't a list of segments tucked away in a drawer. It's a field of contrasts — and each vowel, rather than a point with a label, is a territory: the slice of acoustic space closer to it than to any neighbour. Put seven together and the space partitions itself into a mosaic, each cell drawn not by the vowel itself but by whoever stands around it:

The interesting part lives in the locality. Push one vowel to the side and only the neighbouring cells redraw; the ones across the map don't even notice. It's a good picture for something we see all the time: systems can reorganize on the inside, here and there, without the overall architecture budging. The big picture stays standing while the local details settle.

That, underneath, is the old dispersion intuition: a system spreads its categories to keep them adequately distinct across the available space (Flemming, 2004). And if each one's identity is relational — defined by contrast with the rest — then even the features we assign them can be read off the contrasts the category enters, rather than handed down in advance: features name the dimensions the contrasts run along (Mielke, 2011).

Strip the territories away and look only at the network of who borders whom, and the global dispersion — how much the system fills the space — barely stirs when you poke a single vowel. You can say the same in a tableau: a vowel's "right" place depends on who its neighbours are. With a neighbour up high, distinctiveness pushes it low:

A Harmonic Grammar tableau with a neighbour up high: the distinctiveness constraint pushes the target vowel low.

Put the neighbour down low and, with exactly the same candidates, the winner rises:

The same with a neighbour down low: the same constraint pushes the target vowel high.

Worth checking the sum: the global dispersion of an inventory, the pairs that border each other, and what happens to both when you displace a single vowel:

pythondispersion and contrasts, before and after a nudge
import math
# vowels in F1,F2  (E = ɛ, O = ɔ)
F1R, F2R = (280, 760), (750, 2400)
V = {"i": (300, 2300), "e": (400, 2100), "E": (550, 1900), "a": (700, 1500),
     "O": (550, 1100), "o": (400, 900), "u": (320, 800)}
def norm(v): return ((v[1] - F2R[0]) / (F2R[1] - F2R[0]), (v[0] - F1R[0]) / (F1R[1] - F1R[0]))
def dd(a, b): return math.hypot(a[0] - b[0], a[1] - b[1])
def dispersion(Pv):
    ns = list(Pv)
    return sum(min(dd(norm(Pv[n]), norm(Pv[m])) for m in ns if m != n) for n in ns) / len(ns)
def contrasts(Pv):                       # Voronoi neighbours (substantial shared border)
    ns = list(Pv); cnt = {}
    for gx in range(80):
        for gy in range(56):
            p = (gx / 79, gy / 55)
            o = sorted(ns, key=lambda n: dd(p, norm(Pv[n])))
            k = tuple(sorted((o[0], o[1]))); cnt[k] = cnt.get(k, 0) + 1
    return {k for k, c in cnt.items() if c >= 0.008 * 80 * 56}

A0 = contrasts(V)
print(f"D = {dispersion(V):.3f}   contrasts = {len(A0)} pairs")
V2 = dict(V); V2["e"] = (430, 1850)      # poke a single vowel
A1 = contrasts(V2)
print(f"moving [e]:  D = {dispersion(V2):.3f}   contrasts = {len(A1)} pairs")
print("edges that changed:", sorted(A0 ^ A1))

In the end, a vowel is less a thing than a place among other places. Move its neighbours and you'll have moved it; leave them be and it holds. Identity, here, is an address — not an essence.

  1. Flemming, E. (2004). Contrast and Perceptual Distinctiveness. Preprint.
  2. Mielke, J. (2011). Distinctive Features. The Blackwell Companion to Phonology.

Barroso, A. M. (2025). An inventory is a field of contrasts. alexandrebarroso.com. https://alexandrebarroso.com/notes/an-inventory-is-a-field-of-contrasts.html

@misc{barroso2025aninventoryisafieldofcontrasts,
  author       = {Alexandre Menezes Barroso},
  title        = {An inventory is a field of contrasts},
  year         = {2025},
  howpublished = {alexandrebarroso.com},
  url          = {https://alexandrebarroso.com/notes/an-inventory-is-a-field-of-contrasts.html},
  note         = {alexandrebarroso.com}
}