%
% WARNING: don't leave blank lines in the PS-code; they are
% transformed into \par 
%

%
% Should put in a lily-ps.ps header?
%
%

%
% header info (macros/defs, etc) should go into a \special{! ... }, 
% note the ! sign.  See dvips.info for details.
%

% Use of 
% /foo { operatorname } bind def
%
% ``compiles'' operatorname binding in the body of foo, making
% the code faster, and more reliable (less flexible)


% transplant a TeX dimension into the PS output.
\def\PSsetTeXdimen#1{\expandafter\special{! /#1 (\the\csname #1\endcsname) deftexdimen}}

\def\turnOnPostScript{%
\def\embeddedps##1{%
        % This sets CTM so that you get to the currentpoint
        % by executing a 0 0 moveto
        \special{ps: @beginspecial @setspecial ##1 @endspecial}       
}
%
% width, slope, height 
%
\special{! % round cappings
1 setlinecap
/draw_beam
{
        2 div /beam_thick exch def
        /beam_slope exch def
        /beam_wd exch def
        beam_slope beam_wd mul /beam_ht exch def
        0 beam_thick neg moveto 
        beam_wd beam_ht rlineto 
        0 beam_thick 2 mul rlineto
        0 beam_thick lineto
        closepath fill
} bind def
% PS helper: convert (0.2pt) to the token 0.2
/settexdimen {  /thestring exch def
        thestring 0 thestring length 2 sub
        getinterval
        token
        pop exch pop } 
def
%
/deftexdimen {
        settexdimen
        def     
} def
}
%
\PSsetTeXdimen{staffrulethickness}
\PSsetTeXdimen{staffheight}
\special{! %
/draw_decresc
        {
                staffrulethickness setlinewidth
                /cresc_cont exch def
                /cresc_ht exch def
                /cresc_wd exch def
%
                cresc_wd cresc_cont moveto
                0 cresc_ht lineto
                stroke
                cresc_wd cresc_cont neg moveto
                0 cresc_ht neg lineto
                stroke
        }
        bind def
        /draw_cresc
        {
                staffrulethickness setlinewidth
                /cresc_cont exch def
                /cresc_ht exch def
                /cresc_wd exch def
%
                0 cresc_cont moveto
                cresc_wd cresc_ht lineto
                stroke
                0 cresc_cont neg moveto
                cresc_wd cresc_ht neg lineto
                stroke
        }
        bind def
 /lily_distance {
        1 copy mul exch 1 copy mul add sqrt
 } bind def
 /draw_plet
        {
                staffrulethickness setlinewidth
                /dir exch def
                /plet_dy exch def
                /plet_dx exch def
		staffheight 2 div /plet_gapx exch def
		plet_dy plet_dx div plet_gapx mul /plet_gapy exch def
		staffheight 4 div dir mul /plet_h exch def
%
		0 0 moveto
                0 plet_h lineto 
		plet_dx plet_gapx sub 2 div 
			plet_dy plet_gapy sub 2 div plet_h add lineto
		plet_dx plet_gapx add 2 div 
			plet_dy plet_gapy add 2 div plet_h add moveto
		plet_dx plet_dy plet_h add lineto
		plet_dx plet_dy lineto
		stroke
        }
        bind def
 staffheight 2 div /slurhtlimit exch def
 /slurratio 0.3333 def
 %
 %  (b*ratio)/(1 + b / htlimit)
 /getslurcontrol 
 { 
        slurhtlimit 90 div /slur_alpha exch def
        slurratio 60 div slur_alpha div  /slur_beta  exch def
        slur_beta mul 1 atan slur_alpha mul
 } bind def
 staffrulethickness 1.5 mul  /slur_thick exch def
 /draw_slur
 {
        staffrulethickness setlinewidth
        0 0 moveto
        /slur_dir exch def
        /slur_height exch def
        /slur_dy exch def
        /slur_dx exch def
        slur_dy slur_dx lily_distance /slur_b  exch def
        slur_b getslurcontrol slur_height add
        slur_dir mul /slur_ht exch def
        slur_b getslurcontrol /slur_indent exch def       
%
        slur_dy slur_dx atan rotate
        slur_indent slur_ht
        slur_b slur_indent sub slur_ht
        slur_b 0
        rcurveto        
 %
        slur_indent neg slur_ht slur_dir slur_thick mul  sub
        slur_indent slur_b sub slur_ht slur_dir slur_thick mul  sub
        slur_b neg  0
        rcurveto
 %
        gsave
                fill
        grestore
        stroke
 } bind def
 /draw_control_slur
 {
        staffrulethickness setlinewidth
        0 0 moveto
        rcurveto        
        rcurveto
        gsave
	fill
        grestore
        stroke
 } bind def
}}


\def\turnOnExperimentalFeatures{%
% draw a slur in embedded postscript
\special{ps:
}}
