% 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;