Generating in Inspiration Pad Pro (Part 3 of 3)

As I said in the first part, Inspiration Pad Pro was designed for RPGs, so it’s very flexible, but limited to keyboard characters (it’s possible to use the HTML entity equivalents, and I did that in the final form of the generator1). I hadn’t made this generator, so this will be more step by step. It should be possible to create generators for parts of speech with different endings, and possibly to derive words from an output (I haven’t done either of those tho.)

  1. The IPA symbol HTML codes can be found here or by looking on each one’s wikipedia page which are linked from the IPA page.

Please note, I’m very much a beginner at this and there are likely to be better ways than I use. Our rules and phonotactics for Maanxmuʃt are:

Words take the form of (C)(C)CV(C)(C)(C), where the onset can be:

any consonant
ʃ(any non-voiced nasal, stop, or fricative)1(r or l)
a stop or fricative + r or l, but not dl or vl
1 = m, n, p, t, k, θ, x

Codas consist of:

any non-voiced consonants, but r and ʀ can’t follow diphthongs and m can’t follow long vowels or diphthongs
(r or l)x
x(ʃ or t)
n(coronal and dorsal stops and fricatives)2
2 = t d k ʃ θ x

Long vowels are rare in unstressed syllables and the stress is always on the first syllable. ɦ and ʀ only appear outside of consonant clusters. After a nasal x changes to d. And after a vowel h changes to x.

IPP generators break things down into tables, which things are picked (or rolled) from. Each table can refer to other tables and each entry on a table can have a frequency set.

So I’ll start by figuring out how I want to break down words. I know I’ll need tables for stressed and unstressed syllables because the differing frequencies in long vowels. First I’ll break down what my categories are (these will be different tables).

I can put the vowels, diphthongs, and long vowels together, and decide frequencies for each of the options (the manual refers to this as adding weight). I want the basic vowels to be the most common, with e and u being less common in those, so for now I’ll weight e and u at 2 and the others at 4 (this means e and u are half as likely to show up). My tables for the stressed and unstressed vowels end up looking like this:

Table: StressVowels
4:i
2:e
4:a
2:u
4:o
ii
2:ee
aa
2:uu
2:oo
uo
ie
iu
ei
ou

Table: UnStressVowels
5:i
4:e
5:a
4:u
5:o
ii
ee
aa
uu
oo
2:uo
2:ie
2:iu
2:ei
2:ou

This of course doesn’t yet give me words, so next I’ll make a table for basic consonants. Unfortunately, I have to pick some alternatives for ʃ, θ, ɦ, and ʀ (or look up their HTML codes). I’ll go with sh, th, h, and R, because that’s easy. That done, I can make a word table, which simply looks like this (for now):

Table: Maanxmust
2:[@Cons][@StressVowels]
[@Cons][@StressVowels][@Cons][@UnStressVowels]

Two notes: [@…] calls the relevant table and 2: says that the first line will show up twice as often as the second (you can see it in the vowel tables as well). With this I get results like this:

rahi
ki
xaadi
rawuo
wiu
ke
ka
heeshee
po
tuudei

Not a bad start. Time to work on the rest of the onset choices. Added an Onset and Sh+Consonant+Liquid table, and altered the word table.

Table: Maanxmust
3:[@Onset][@StressVowels]
2:[@Onset][@StressVowels][@Onset][@UnStressVowels]
[@Onset][@StressVowels][@Onset][@UnStressVowels][@Onset][@UnStressVowels]

Table: Onset
2:[@Cons]
[@ShCLiquid]

Table: ShCLiquid
4:sh[@SCons]
2:sh[@SCons]r
sh[@SCons]l
4:shr
2:shl

Let’s see what our results are now:

kowosho
shmrooxei
naa
te
shtouxo
shmra
shrashnumi
ho
shlo
ri

Looking pretty good.

The next category of onsets is a bit more complicated: a stop or fricative + r or l, but not dl or vl. The long way would be to make separate sets of tables for r and l, but we’re not going to do that, because I figured out the Replace filter (I didn’t find their example enlightening and couldn’t find any examples of it in use, but after looking at the other filters I managed to get it)

Once I wrote the table for the stops and fricatives combined with liquids, I changed the onset table to this:

Table: Onset
3:[@Cons]
[@ShCLiquid]
2:[@SorFandL >> replace /dl/dr/ >> replace /vl/vr/]

The first filter is “>> replace /dl/dr/”, changing dl to dr.

You can string multiple filters together, so at first it was 2:[@SorFandL >> Bold >> replace /dl/dx/ >> replace /vl/vx/] so I could see it and be sure that the l’s were changing. (I also increased the frequency of the relevant items)

So that’s great, but now we need codas. Our coda choices are:

sonorant consonants, unvoiced stops or unvoiced fricatives, but r and ʀ can’t follow diphthongs and m can’t follow long vowels or diphthongs
(r or l)x
x(ʃ or t)
n(coronal and dorsal stops and fricatives)

I’m going to skip the first one for now, because it’ll probably mean significantly changing other tables. I’ll start a coda table, and use Inline tables for the middle two because I want them to be equal weight. For the last one, because the phonotactics say that after a nasal x changes to d, I’ll leave off x even though it’s a dorsal fricative. I’m also going to add a blank (\z), so that we don’t have to specify that nothing is also possible in the word table. So with those three done, the coda tables look like this:

Table:Coda
2:[|r|l]x
x[|t|sh]
3:n[@NasalCoda]
\z

Table: NasalCoda
3:t
d
k
2:sh
2:th

The inline tables are [|r|l] and [|t|sh]. Time to add those to the word table and see how it looks. Hm, too many codas ending in x. Time to adjust weights. I also added periods between syllables to make it easier to tell where they started and stopped. Looking pretty good:

raxsh.tle.shnunt
drinth
pee
penth
poxsh.wa
mox
minsh.shloonsh
kri
Ralx
Ranth.xluont.wienth

Now to conquer that last coda category. This is one of those places where there is almost definitely a more elegant solution than what I’ll come up with. It took some doing, but the final result was that I split up the vowel tables into A (basic), B (long), and C (diphthong). Vowels are now picked with the coda, so there’s a stress and unstress coda table. Then I made tables for m and the rhotics. Those look like this:

Table:MCodaStress
[@StressVowelsA]m

Table:MCodaUnstress
[@UnstressVowelsA]m

Table:RhoticCodaStress
2:[@StressVowelsA][|r|R]
[@StressVowelsB][|r|R]

Table:RhoticCodaUnstress
4:[@UnStressVowelsA][|r|R]
[@UnStressVowelsB][|r|R]

I fixed the word table and added one for phonotactics using the Replace filter liberally (see below for that). Here’s the words I’m getting:

vruow
jimshrawi
dikthaaxosh
kranRiRoo
pant
joxsh
powRosh
tla
hoxshthe
laaw

I’m pretty darn happy with those results. Here’s my final generator:

Table:Phonotactics
[@Word >> replace /ih/ix/ >> replace /eh/ex/ >> replace /ah/ax/ >> replace /uh/ux/ >> replace /oh/ox/ >> replace /mx/md/ &
replace /nx/nd/ >> replace /shsh/sh/ >> replace /thth/th/ >>replace /tt/t/ >> replace /xth/kth/ >> replace /Rsh/rsh/]

Table:Word
3:[@Onset][@CodaStress]
2:[@Onset][@CodaStress][@Onset][@CodaUnstress]
[@Onset][@CodaStress][@Onset][@CodaUnstress][@Onset][@CodaUnstress]

Table: Onset
4:[@Cons]
[@ShCLiquid]
2:[@SorFandL >> Replace /dl/d/ >> replace /vl/vr/ ]

Table: Cons
3:m
n
3:p
t
6:d
k
sh
2:v
6:th
x
5:h
4:l
6:j
4:w
4:r
5:R

Table: ShCLiquid
4:sh[@SCons]
2:sh[@SCons]r
sh[@SCons]l
4:shr
2:shl

Table:SCons
2:m
3:n
3:p
4:t
4:k
2:th
x

Table:SorFandL
3:[@StoporFric]r
2:[@StoporFric]l

Table:StoporFric
p
3:t
2:d
3:k
3:sh
4:v
2:th
x

Table:CodaStress
[@StressV][|r|l]x
2:[@StressV]x[|t|sh]
4:[@StressV]n[@NasalCoda]
7:[@StressV]
5:[@StressV][@UnVoiceCoda1]
4:[@MCodaStress]
2:[@RhoticCodaStress]

Table:CodaUnStress
[@UnstressV][|r|l]x
2:[@UnstressV]x[|t|sh]
4:[@UnstressV]n[@NasalCoda]
7:[@UnstressV]
6:[@UnstressV][@UnVoiceCoda1]
4:[@MCodaUnstress]
2:[@RhoticCodaUnstress]

Table: NasalCoda
3:t
d
k
2:sh
2:th

Table:StressV
2:[@StressVowelsA]
[@StressVowelsB]
[@StressVowelsC]

Table:UnstressV
4:[@UnStressVowelsA]
[@UnStressVowelsB]
2:[@UnStressVowelsC]

Table: StressVowelsA
2:i
e
2:a
u
2:o

Table: StressVowelsB
ii
2:ee
aa
2:uu
2:oo

Table: StressVowelsC
uo
ie
iu
ei
ou

Table: UnStressVowelsA
2:i
e
2:a
u
2:o

Table: UnStressVowelsB
ii
ee
aa
uu
oo

Table: UnStressVowelsC
uo
ie
iu
ei
ou

Table:UnVoiceCoda1
5:n
3:p
4:t
4:k
2:sh
3:th
x
2:l
j
3:w

Table:MCodaStress
[@StressVowelsA]m

Table:MCodaUnstress
[@UnstressVowelsA]m

Table:RhoticCodaStress
2:[@StressVowelsA][|r|R]
[@StressVowelsB][|r|R]

Table:RhoticCodaUnstress
4:[@UnStressVowelsA][|r|R]
[@UnStressVowelsB][|r|R]

Enjoy this post? Support me on Patreon or Ko-fi