diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /language/vispeech/vispeech.mf |
Initial commit
Diffstat (limited to 'language/vispeech/vispeech.mf')
-rw-r--r-- | language/vispeech/vispeech.mf | 401 |
1 files changed, 401 insertions, 0 deletions
diff --git a/language/vispeech/vispeech.mf b/language/vispeech/vispeech.mf new file mode 100644 index 0000000000..62f0700f23 --- /dev/null +++ b/language/vispeech/vispeech.mf @@ -0,0 +1,401 @@ +% Visible Speech, header file, with macros and everything. +%%%%%%%%%%%%%%%%%%%%%%%%%%%% +mode_setup; + +15u#=1pt#; % Looks pretty good. +loop_h#=loop_w#=100u#; % seem to be square +vowel_asc#=30u#; +vowel_d#=30u#; +curve_overshoot#=0u#; % zero, but maybe will change. +apex_overshoot#=4u#; +horiz_gap#=vert_gap#=50u#; % appear equal. +sidebar#=10u#; +vowel_curl#=20u#; +curve#=20u#; +thin#=10u#; +fine#=7u#; +thick#=13u#; +lmodside#=3/4sidebar#; +rmodside#=sidebar#; +mod_height#=7/8loop_h#; +define_pixels(u,vowel_asc,vowel_d,loop_h,loop_w,curve_overshoot, + apex_overshoot,vert_gap,horiz_gap,sidebar,vowel_curl, + curve,thin,fine,thick,lmodside,rmodside,mod_height); + +wide_spot=.5; % widest point on loop, as ratio of other dim. +voice_length=.67; % length of voicing line, as ratio. + +pickup pencircle scaled fine; finepen:=savepen; +pickup pencircle scaled thin; thinpen:=savepen; +pickup pencircle scaled thick; thickpen:=savepen; +pickup pencircle scaled curve; curvepen:=savepen; +pickup penrazor scaled thick; hrazorpen:=savepen; +pickup penrazor scaled thick rotated 90; vrazorpen:=savepen; + +path p; +path p[]; +string rl; +rl="r"; +string tb; +tb="t"; +ccode=0; + +vardef lside=(sidebar) enddef; +vardef rside=(w-sidebar) enddef; + +def fix_width= if odd (rside-lside): w:=w+1 fi enddef; +def fix_height= if odd (h+d): h:=h+1 fi enddef; + +% set string rl to "r" or "l" for gap on left or right. +def rtorlft=if rl="r": rt else: lft fi enddef; +def lftorrt=if rl="r": lft else: rt fi enddef; +def zorw=if rl="r": lside else: rside fi enddef; +def worz=if rl="r": rside else: lside fi enddef; +def vmorp=if rl="r": - else: + fi enddef; + +def vlooppoints = +fix_height; +h-y1=y5; +y1-y5=vert_gap; +pickup thinpen; +rtorlft x1=worz; +rtorlft x5=worz; +x2=x4=wide_spot[zorw,worz]; +top y2=h+curve_overshoot; +bot y4=-curve_overshoot; +pickup curvepen; +lftorrt x3=zorw vmorp curve_overshoot; +y3=.5h; +p:=z1..z2..z3{down}..z4..z5; +penpos1(thin,(angle direction 0 of p) vmorp 90); +penpos2(thin,90); +penpos3(curve,90 - vmorp 90); +penpos4(thin,270); +penpos5(thin,(angle direction 4 of p) vmorp 90); +enddef; + +def simplevloop = +vlooppoints; +pickup thinpen; +draw z1..controls postcontrol 0 of p and precontrol 1 of p..z2; +draw z4..controls postcontrol 3 of p and precontrol 4 of p..z5; +cutoff (z1,180+angle direction 0 of p); +cutoff (z5,angle direction 4 of p); +penstroke z2e..z3e{down}..z4e; +labels(1,2,3,4,5); +enddef; + +% set string tb to "t" or "b" for gap on top or bottom. +def toporbot=if tb="t": top else: bot fi enddef; +def botortop=if tb="t": bot else: top fi enddef; +def zorh=if tb="t": 0 else: h fi enddef; +def horz=if tb="t": h else: 0 fi enddef; +def hmorp=if tb="t": - else: + fi enddef; + +def hlooppoints = +fix_width; +rside-x1=x5-lside; +x1-x5=horiz_gap; +pickup thinpen; +toporbot y1=horz; +toporbot y5=horz; +y2=y4=wide_spot[zorh,horz]; +rt x2=rside+curve_overshoot; +lft x4=lside-curve_overshoot; +pickup curvepen; +botortop y3=zorh hmorp curve_overshoot; +x3=.5[lside,rside]; +p:=z1..z2..z3{left}..z4..z5; +penpos1(thin,(angle direction 0 of p) hmorp 90); +penpos2(thin,0); +penpos3(curve,0 hmorp 90); +penpos4(thin,180); +penpos5(thin,(angle direction 4 of p) hmorp 90); +enddef; + +def simplehloop = +hlooppoints; +pickup thinpen; +draw z1..controls postcontrol 0 of p and precontrol 1 of p..z2; +draw z4..controls postcontrol 3 of p and precontrol 4 of p..z5; +cutoff (z1,180+angle direction 0 of p); +cutoff (z5,angle direction 4 of p); +penstroke z2e..z3e{left}..z4e; +labels(1,2,3,4,5); +enddef; + +def vsqig = +transform vsqigtrans; +(lside,0) transformed vsqigtrans = (rside,h); +(lside,h) transformed vsqigtrans = (rside,0); +(rside,0) transformed vsqigtrans = (lside,h); +pickup thinpen; +rt x.taga=rside; +rt x.tagb=rside; +top y.taga=h; +top y.tagb=y.taga - 1/2(h-vert_gap); +draw (z.taga--z.tagb) + if rl="r": else: rotatedaround(.5[(lside,0),(rside,h)],180) fi; +pickup pencircle scaled .5[fine,thin]; +bot y.s.3=0; +1.5*(y.s.3-y.s.2)=y.s.2-y.s.1=y.s.1-y.tagb; +x.s.3=x.s.1+thin; +x.s.2=x.taga+thin; +x.s.1=x.taga-2fine; +draw (z.tagb..z.s.1..z.s.2..z.s.3) + if rl="r": else: rotatedaround(.5[(lside,0),(rside,h)],180) fi; +labels(taga,tagb,s.1,s.2,s.3) +enddef; + +def hsqig = +transform hsqigtrans; +(lside,0) transformed hsqigtrans = (rside,h); +(lside,h) transformed hsqigtrans = (rside,0); +(rside,0) transformed hsqigtrans = (lside,h); +pickup thinpen; +top y.taga=h; +top y.tagb=h; +lft x.taga=lside; +lft x.tagb=x.taga + 1/2(rside-lside-horiz_gap); +draw (z.taga--z.tagb) + if tb="t": else: rotatedaround(.5[(lside,0),(rside,h)],180) fi; +pickup pencircle scaled .5[fine,thin]; +rt x.s.3=rside+fine; +1.5*(x.s.3-x.s.2)=x.s.2-x.s.1=x.s.1-x.tagb; +y.s.3=y.s.1+thin; +y.s.2=y.taga+thin; +y.s.1=y.taga-2fine; +draw (z.tagb..z.s.1..z.s.2..z.s.3) + if tb="t": else: rotatedaround(.5[(lside,0),(rside,h)],180) fi; +labels(taga,tagb,s.1,s.2,s.3) +enddef; + +def vcurlpoints = + x1.1=x1.2=x5.1=x5.2=x1 vmorp thin; + lasty:=ypart point infinity of p; + y1.1=y1 + 1.5thin; + y1.2=y1 - .5thin; + y5.1=lasty - 1.5thin; + y5.2=lasty + .5thin; +enddef; + +def vcurl = + vcurlpoints; + pickup thinpen; + cutdraw z1.1{z1-z2}..z1..z1.2..tension 2 and 1..{vmorp right}z2; + cutdraw z5.1{point infinity of p-(point ((length p)-1) of p)}.. + point infinity of p..z5.2 + ..tension 2 and 1..{vmorp right}(point ((length p)-1) of p); + cullit; +enddef; + +def hcurlpoints = + y1.1=y1.2=y5.1=y5.2=y1 hmorp thin; + lastx:=xpart point infinity of p; + x1.1=x1 + 1.7thin; + x1.2=x1 - .5thin; + x5.1=lastx - 1.7thin; + x5.2=lastx + .5thin; +enddef; + +def hcurl = + hcurlpoints; + pickup thinpen; + cutdraw z1.1{z1-z2}..z1..z1.2..tension 2 and 1..{hmorp up}z2; + cutdraw z5.1{point infinity of p-(point ((length p)-1) of p)}.. + point infinity of p..z5.2 + ..tension 2 and 1..{hmorp up}(point ((length p)-1) of p); + cullit; +enddef; + +def begloopchar(expr code) = +beginchar(code,loop_w#+2sidebar#,loop_h#,0u#); enddef; + +def autoloopchar = begloopchar(incr ccode) enddef; + +def vvoice = + z.larynx=if known x7: z4 vmorp (1/2curve,0) else: z3 fi; + y.voice=y.larynx; + x.voice=voice_length[if rl="r": lside,rside else: rside,lside fi]; + pickup vrazorpen; + draw z.voice--z.larynx; +enddef; + +def hvoice = + z.larynx=if known x7: z4 hmorp (0,1/2curve) else: z3 fi; + x.voice=x.larynx; + y.voice=voice_length[if tb="t": 0,h else: h,0 fi]; + pickup hrazorpen; + draw z.voice--z.larynx; +enddef; + +vardef upward(expr x) = + ypart direction 1 of (z1{curl 5}..(x,y2)..z3{down}..z4) > 0 +enddef; + +def vdintpoints = +h-y1=y7; +y1-y7=vert_gap; +pickup thinpen; +rtorlft x1=worz; +rtorlft x7=worz; +x2=x6; +top y2=h+curve_overshoot; +bot y6=-curve_overshoot; +pickup curvepen; +lftorrt x3=zorw vmorp curve_overshoot; +x5=x3; +y3-y5=.5h; +y5=1/4h; +lftorrt x4=(zorw - vmorp 1.2curve) vmorp curve_overshoot; +y4=.5h; +x2=solve upward(x1,x3); +p:=z1{curl 5}..z2..z3{down}..z4& + z4..z5{down}..z6..{curl 5}z7; +penpos1(thin,(angle direction 0 of p) vmorp 90); +penpos2(thin,90); +penpos3(curve,90 - vmorp 90); +penpos4(curve,90 - vmorp 90); +penpos5(curve,90 - vmorp 90); +penpos6(thin,270); +penpos7(thin,(angle direction 6 of p) vmorp 90); +enddef; + + +vardef rightward(expr y) = + xpart direction 1 of (z1{curl 5}..(x2,y)..z3{left}..z4) > 0 +enddef; + +def hdintpoints = +rside-x1=x7-lside; +x1-x7=horiz_gap; +pickup thinpen; +toporbot y1=horz; +toporbot y7=horz; +y2=y6; +rt x2=rside+curve_overshoot; +lft x6=lside-curve_overshoot; +pickup curvepen; +botortop y3=zorh hmorp curve_overshoot; +y5=y3; +x3-x5=.5(rside-lside); +x5=1/4[lside,rside]; +botortop y4=(zorh - hmorp 1.2curve) hmorp curve_overshoot; +x4=.5[lside,rside]; +y2=solve rightward(y1,y3); +p:=z1{curl 5}..z2..z3{left}..z4& + z4..z5{left}..z6..{curl 5}z7; +penpos1(thin,(angle direction 0 of p) - hmorp 90); +penpos2(thin,0); +penpos3(curve,0 hmorp 90); +penpos4(curve,0 hmorp 90); +penpos5(curve,0 hmorp 90); +penpos6(thin,180); +penpos7(thin,(angle direction 6 of p) - hmorp 90); +enddef; + +def vclose= + pickup thinpen; + top rtorlft z.one=(worz,h); + bot rtorlft z.two=(worz,0); + draw z.one--z.two; +enddef; + +def hclose= + pickup thinpen; + lft toporbot z.one=(lside,horz); + rt toporbot z.two=(rside,horz); + draw z.one--z.two; +enddef; + +def bothvloop = for t="r","l": for u=1,2: enddef; + +def bothhloop = for t="t","b": for u=1,2: enddef; + + +full_serif=curve; % *half* the width of a full-sized serif. +slab=fine; +curl_w=3/2curve; + +pickup penrazor scaled slab rotated 90; serifpen:=savepen; + +def serifize(expr y) = + pickup serifpen; + draw (x.stem-full_serif,y)--(x.stem+full_serif,y); +enddef; + +def roundingbar = + serifize(1/2[-d,h]) enddef; + +def vowelstem = + pickup hrazorpen; + draw (x.stem,0)--(x.stem,loop_h); +enddef; + +curl_top=3/8curl_w; + +def widecurl(expr pt,ud,rl) = + % ud and rl are 1 or -1 for up and right or down and left, resp. + begingroup save x; save y; + z1=pt; + % allow for top or bot... + z2=pt+(curl_top*rl,if ud>0: vowel_asc - else: -vowel_d + fi 1/2thin); + % allow for lft or rt... + z3=pt+(curl_w*rl-1/2thin*rl,0); +% penpos1(thick,90-ud*90); +% penpos2(thin,-90*rl); +% penstroke z1e{up*ud}..z2e{right*rl}; + pickup pencircle xscaled thick yscaled thin; + draw z1{up*ud}..z2{right*rl}; + pickup thinpen; + draw z2{right*rl}..{down*ud}z3; + cullit; + cutoff(z3,270*ud); + endgroup; +enddef; + +def closebulb(expr pt,ud,rl) = + begingroup save x; save y; +% pickup pencircle scaled 1u; + z1=pt-(rl*1/2thick,0); +% z2=pt+(curl_top*rl,if ud>0: vowel_asc else: -vowel_d fi); +% z3=pt+(curl_w*rl,fine*ud); +% z4=z2+(-rl*1/4fine,-ud*fine); +% z5=z1+(rl*thick,0); +% draw z1{up*ud}..{rl*right}z2..{ud*down}z3..{ud*up}z4& +% z4..{ud*down}z5; +% labels(1,2,3,4,5); + p1:=fullcircle scaled curve shifted + (pt + (rl*(curl_w-1/2curve), + (if ud>0: vowel_asc - else: -vowel_d + fi 1/2curve))); + fill p1; + z2=point if ud>0: 2 else: 6 fi of p1; + z3=z1+(rl*thick,0); + z4=point if rl>0: 4 else: 0 fi of p1; + fill z1{ud*up}..{rl*right}z2--z4..z3{ud*down}--cycle; + endgroup; +enddef; + +vardef llside=(3/4lmodside) enddef; % modifiers and breath glide + % are shifted left. +vardef rrside=(w-rmodside) enddef; + +pickup penrazor scaled 2/3fine rotated 90; smallserifpen:=savepen; + +def width_serif(expr ht)= draw (lside,ht)--(rside,ht) enddef; + +%%%%%%%%%%% +font_slant 0; +font_normal_space 70u#; +font_normal_stretch 15u#; +font_normal_shrink 10u#; +font_x_height loop_h#; +font_quad loop_w#; +font_extra_space 0; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +input viscons; +input visvowels; +input visglides; +input vismods; + |