% Visible Speech Modifiers
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Inner
beginchar(incr ccode,curve#+lmodside#+rmodside#,mod_height#,0);
pickup finepen;
top rt z1=(rrside,h);
bot z3=(x1,0);
lft z2=(llside,1/2[0,h]);
draw z1--z2..{down}z3;
endchar;

% Outer
beginchar(incr ccode,curve#+lmodside#+rmodside#,mod_height#,0);
pickup finepen;
bot lft z1=(llside,0);
top z3=(x1,h);
rt z2=(rrside,1/2[0,h]);
draw z1--z2..{up}z3;
endchar;

% Close, Open
for ud=-1,1:
beginchar(incr ccode,3/2curve#+lmodside#+rmodside#,mod_height#,0);
fix_width;
pickup finepen;
lft z1=(llside,if ud>0: h else: 0 fi);
rt z2=(rrside,y1);
if ud>0: bot else: top fi z3=(1/2[llside,rrside],if ud>0: 0 else: h fi);
draw z1--z3--z2;
cutoff(z1,90*ud); cutoff(z2,90*ud);
endchar;
endfor;

% Trill
beginchar(incr ccode,5/4curve#+lmodside#+rmodside#,loop_h#,0);
pickup pencircle xscaled thin yscaled 2/3fine rotated 55;
top y1=h;
x1=1/2[llside,rrside];
lft x2=llside;
rt x3=rrside;
z3-z4=whatever*(dir 55);
x4=1/3[llside,rrside];
y1-y3=y4-y6;
bot z6=(1/2[llside,rrside],0);
showdependencies;
vardef leftwards(expr it)=
       xpart direction 1 of (z1..(x2,it)..{right}z3) < 0 enddef;
y2=solve leftwards(y1,y3);
draw z1..z2..{right}z3;
draw z3--z4;
rt x5=rrside;
vardef rightwards(expr it)=
       xpart direction 1 of (z4..(x5,it)..z6) > 0 enddef;
y5=solve rightwards(y4,y6);
draw z4..z5..z6;
endchar;

% Nasal
beginchar(incr ccode,3/2curve#+lmodside#+rmodside#,loop_h#,0);
pickup pencircle xscaled thick yscaled fine rotated 30;
top z1=(1/2[llside,rrside],h);
bot z4=(x1,0);
lft x2=llside;
rt x3=rrside;
y1-y2=y3-y4;
pair d[];
d1=d4=dir (180+30);
vardef leftwards(expr it)=
       xpart direction 1 of (z1{d1}..(x2,h-it)..
               (x3,it)..{d4}z4) < 0 enddef;
y3=solve leftwards(y4,y1);
draw z1{d1}..z2..z3..{d4}z4;
labels(1,2,3,4);
endchar;

% Side open (1)
beginchar(incr ccode,3/2curve#+lmodside#+rmodside#,mod_height#,0);
pickup penrazor scaled fine;
top lft z1=(llside,h);
bot lft z2=(llside,0);
top rt z3=(rrside,h);
bot rt z4=(rrside,0);
draw z1--z2;
draw z3--z4;
fill z4--(z4+(0,curve))--(z2+(0,curve))--z2--cycle;
endchar;

% Side open (2)
beginchar(incr ccode,3/2curve#+lmodside#+rmodside#,
       mod_height#+thin#,curve#);
pickup penrazor scaled fine;
top lft z1=(llside,h);
bot lft z2=(llside,-d);
top rt z3=(rrside,h);
bot rt z4=(rrside,-d);
draw z1--z2;
draw z3--z4;
pickup penrazor scaled 3/2curve rotated 90;
y5=1/2[-d,h];
draw (x1,y5)--(x3,y5);
endchar;

% Inverted/Protruded
for ud=1,-1:
beginchar(incr ccode,2/3loop_w#+lmodside#+rmodside#,
       2/3loop_h#+thick#,0);
pickup pencircle xscaled thin yscaled slab rotated (-20*ud);
x1=x5;
if ud=1: rt else: lft fi x1=if ud=1: rrside else: llside fi;
y1-y5=3/8loop_h;
h-y1=y5-thick;
x2=x4=wide_spot[if ud=1: llside,rrside else: rrside,llside fi];
top y2=h+curve_overshoot;
bot y4=thick-curve_overshoot;
if ud=1: lft else: rt fi z3=(if ud=1: llside else: rrside fi,1/2[thick,h]);
draw z1..{ud*left}z2..{down}z3..{ud*right}z4..z5;
endchar;
endfor;

% Stop
beginchar(incr ccode,thick#+lmodside#+rmodside#,
       1/2mod_height#,0);
pickup thickpen;
drawdot(1/2[llside,rrside],h);
endchar;

% Emission, and breath glide/Suction
for ud=1,-1:
% ...stopped/not stopped
for st=0,1:
beginchar(incr ccode,3/4loop_w#+lmodside#+rmodside#,2/3loop_h#,0);
pickup thinpen;
x1=x3;
x1=if ud=1: llside else: rrside fi;
if ud=1: rt else: lft fi x2=if ud=1: rrside else: llside fi;
bot y3=0u;
top y1=h;
fix_height;
y3-y2=y2-y1;
draw z1--z2--z3;
cutoff (z1,90+ud*90);
cutoff (z3,90+ud*90);
if st=1:
 pickup thickpen;
 if ud=1: lft else: rt fi x4=if ud=1: llside else: rrside fi;
 y4=1/2[y1,y3];
 drawdot z4;
fi
endchar;
endfor; endfor;

% Hiatus/Abrupt
for ud=1,-1:
beginchar(incr ccode,curve#+lmodside#+rmodside#,loop_h#,0);
pickup finepen;
if ud=1:
 top lft z1=(llside,h);
 z2=(1/2[llside,rrside],2/3h);
 rt z3=z2+(1/2curve,0);
else:
 bot rt z1=(rrside,2/3h-1/2curve);
 z2=(1/2[llside,rrside],h-1/2curve);
 lft z3=z2-(1/2curve,0);
fi
fill fullcircle scaled curve shifted z2;
draw z1..{ud*down}z3;
endchar;
endfor;

% Holder
beginchar(incr ccode,curve#+lmodside#+rmodside#,mod_height#,thick#);
pickup finepen;
top z1=(1/2[llside,rrside],h);
bot z2=(1/2[llside,rrside],-d);
z3=1/2[z1,z2];
draw z1--z2;
pickup curvepen;
drawdot z3;
endchar;

% Accent
beginchar(incr ccode,fine#+lmodside#+rmodside#,loop_h#+thick#,0);
pickup finepen;
top z1=(1/2[llside,rrside],h);
bot z2=(x1,h-2curve);
draw z1--z2;
endchar;

% Emphasis
beginchar(incr ccode,fine#+lmodside#+rmodside#,curve#,curve#);
pickup finepen;
top z1=(1/2[llside,rrside],h);
bot z2=(x1,-d);
draw z1--z2;
endchar;

% Whistle/voiced whistle
% Code similar to closed throat consonant
for u=1,2:
beginchar(incr ccode,loop_w#+2sidebar#,3/4loop_h#+thick#,0);
y1=y3=y.i1=y.i3=.5[thick,h];
x1=rside+apex_overshoot;
x3=lside-apex_overshoot;
x.i3-x3=x1-x.i1=3/4fine;
x2=x4=x.i2=x.i4=1/2[lside,rside];
y4=h+curve_overshoot;
y2=thick-curve_overshoot;
y4-y.i4=y.i2-y2=curve;
fill superellipse(z1,z4,z3,z2,.655);
cullit;
unfill superellipse(z.i1,z.i4,z.i3,z.i2,.66);
if u=2: pickup thickpen; draw z.i2--z.i4; fi
labels(1,2,3,4);
endchar;
endfor;

% Plus: simultaneous pronunciation
beginchar(incr ccode,1/2loop_w#+2sidebar#,3/4loop_h#,0);
pickup penrazor scaled fine;
fix_height;
fix_width;
z1=(1/2[lside,rside],h);
z2=(x1,1/4loop_h);
z3=(lside,1/2[1/4loop_h,h]);
z4=(rside,y3);
draw z1--z2;
pickup penrazor scaled fine rotated 90;
draw z3--z4;
endchar;