\ifx\indivbarrules\undefined\else\endinput\fi

\immediate\write10{MusiXDashed and Dotted BaRlines 1.0\space<23 February 2002>}%
% by Rainer Dunker
% Ideas and code based on musixbar.tex
% by Mthimkhulu Molekwa <MMolekwa@rrs.co.za>

\makeatletter

\newdimen\barline@depth

\def\barlinedash#1{\vskip.5\Internote
		   \hrule\@width#1\@height\Internote
		   \vskip.5\Internote}
\def\barlinedots#1{\vskip.5\Internote
		   \hbox to #1{\hss\tenrm.\hss}
		   \vskip.5\Internote}
  
\def\rul@indiv#1{%
  \n@loop
    \Comp@High
    \multiply\barline@depth -1\relax
    \advance\barline@depth\altitude
    \expandafter\ifx\csname s@b\romannumeral\noinstrum@nt\endcsname\relax
      % normal barline below instrument
      \raise\altitude\rlap{\vrule\@depth\barline@depth\@width#1\@height0pt }%
    \else
      \expandafter\ifx\csname s@b\romannumeral\noinstrum@nt\endcsname 2%
	% dashed barline below instrument
	\raise\altitude\hbox{%
	  \lower\barline@depth\rlap{%
	    \vbox to \barline@depth{%
	      \xleaders\vbox{\barlinedash{#1}}\vfill}}}%
      \else
	\expandafter\ifx\csname s@b\romannumeral\noinstrum@nt\endcsname 3%
	  % dotted barline below instrument
	  \raise\altitude\hbox{%
	    \lower\barline@depth\rlap{%
	      \vbox to \barline@depth{%
		\xleaders\vbox{\barlinedots{#1}}\vfill}}}%
	\fi
      \fi
    \fi
    \ifnum\st@ffs>1 % multi-staff instrument
      \multi@instrum@bars{#1}%
    \else           % single-staff instrument
      \expandafter\ifx\csname h@bl\romannumeral\noinstrum@nt\endcsname\relax
	% normal barline through instrument
	\raise\altitude\rlap{\vrule\@depth0pt \@width#1\@height\y@v}%
      \else
	\expandafter\ifx\csname h@bl\romannumeral\noinstrum@nt\endcsname 2%
	  % dashed barline through instrument
	  \raise\altitude\rlap{%
	    \vbox to \y@v{%
	      \cleaders\vbox to 2\internote{\vss
					    \hrule\@width#1\@height\internote
					    \vss}%
		       \vfill}}%
	\else
	  \expandafter\ifx\csname h@bl\romannumeral\noinstrum@nt\endcsname 3%
	    % dotted barline through instrument
	    \raise\altitude\rlap{%
	      \vbox to \y@v{%
		\cleaders\vbox to 2\internote{\vss
					      \hbox to #1{\hss\tenrm.\hss}%
					      \vss}%
			 \vfill}}%
	  \fi
	\fi
      \fi
    \fi
    \barline@depth\altitude
    \advance\barline@depth\y@v
  \repeat
  \addspace#1}

\def\multi@instrum@bars#1{%
  \begingroup
    % retrieve staff height
    \count@=\nblines \advance\count@ -1 \multiply\count@ 2
    \dimen@=\count@\internote
    \p@loop
      % barline within staff
      \expandafter\ifx\csname h@bl\romannumeral\noinstrum@nt\endcsname\relax
	% normal barline through staff
	\raise\altportee\rlap{\vrule\@depth0pt \@width#1\@height\dimen@}%
      \else
	\expandafter\ifx\csname h@bl\romannumeral\noinstrum@nt\endcsname 2%
	  % dashed barline through staff
	  \raise\altportee\rlap{%
	    \vbox to \dimen@{%
	      \cleaders\vbox to 2\internote{\vss
					    \hrule\@width#1\@height\internote
					    \vss}%
		       \vfill}}%
	\else
	  \expandafter\ifx\csname h@bl\romannumeral\noinstrum@nt\endcsname 3%
	    % dotted barline through staff
	    \raise\altportee\rlap{%
	      \vbox to \dimen@{%
		\cleaders\vbox to 2\internote{\vss
					      \hbox to #1{\hss\tenrm.\hss}%
					      \vss}%
			 \vfill}}%
	  \fi
	\fi
      \fi
      \count@portee
      % barline above staff
      \ifnum\noport@@<\st@ffs % not for topmost staff
	\barline@depth\interportee
	\advance\barline@depth -\dimen@
	\raise\altportee\hbox{\raise\dimen@\rlap{%
	  \expandafter\ifx\csname s@mb\romannumeral\noinstrum@nt\endcsname
			  \relax
	    % normal barline
	    \vrule\@height\barline@depth\@width#1\relax
	  \else
	    \expandafter\ifx\csname s@mb\romannumeral\noinstrum@nt\endcsname 2%
	      % dashed barline
	      \vbox to \barline@depth{%
		\xleaders\vbox{\barlinedash{#1}}\vfill}%
	    \else
	      \expandafter\ifx\csname s@mb\romannumeral\noinstrum@nt\endcsname
			      3% dotted barline
		\vbox to \barline@depth{%
		  \xleaders\vbox{\barlinedots{#1}}\vfill}%
	      \fi
	    \fi
	  \fi}}%
      \fi
    \repeat
  \endgroup}


% Activate individual barline processing
\def\indivbarrules{%
  \let\writ@rule\rul@indiv
  \sepbarrule 1}

%== separates bar line of specified instrument from one of previous instrument
\def\sepbarrule#1{\expandafter\let\csname s@b\romannumeral#1\endcsname 1}

%== connects bar line of specified instrument to one of previous instrument
%   with dashed line
\def\condashbarrule#1{%
  \ifnum#1>1 \expandafter\let\csname s@b\romannumeral#1\endcsname 2\fi}

%== connects bar line of specified instrument to one of previous instrument
%   with dotted line
\def\condotbarrule#1{%
  \ifnum#1>1 \expandafter\let\csname s@b\romannumeral#1\endcsname 3\fi}

%== connects bar line of specified instrument to one of previous instrument
\def\conbarrule#1{%
  \ifnum#1>1 \expandafter\let\csname s@b\romannumeral#1\endcsname\relax\fi}
  
%== hides bar line for specified instrument
\def\hidebarrule#1{\expandafter\let\csname h@bl\romannumeral#1\endcsname 1}
  
%== dashes bar line for specified instrument
\def\showdashbarrule#1{\expandafter\let\csname h@bl\romannumeral#1\endcsname 2}
  
%== dots bar line for specified instrument
\def\showdotbarrule#1{\expandafter\let\csname h@bl\romannumeral#1\endcsname 3}
  
%== shows bar line for specified instrument
\def\showbarrule#1{\expandafter\let\csname h@bl\romannumeral#1\endcsname\relax}
  
%== separates bar line within multistaff instrument
\def\sepmultibarrule#1{\expandafter\let\csname s@mb\romannumeral#1\endcsname 1}
  
%== dashes bar line between staves of multistaff instrument
\def\condashmultibarrule#1{%
  \expandafter\let\csname s@mb\romannumeral#1\endcsname 2}
  
%== dots bar line between staves of multistaff instrument
\def\condotmultibarrule#1{%
  \expandafter\let\csname s@mb\romannumeral#1\endcsname 3}
  
%== shows bar line between staves of multistaff instrument
\def\conmultibarrule#1{%
  \expandafter\let\csname s@mb\romannumeral#1\endcsname\relax}

% set barlines for all instruments together
\def\allbarrules#1{\n@loop#1\noinstrum@nt\repeat}


\makeatother
\endinput

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Here comes an example of how to use these macros

\input musixtex
\input musixdbr

\instrumentnumber4
\setstaffs23
\setstaffs32
\setlines14
\setsize2\tinyvalue

\indivbarrules

\startpiece
  % normal barlines
  \bar
  % barlines on staves
  \allbarrules\sepbarrule
  \allbarrules\sepmultibarrule
  \allbarrules\showbarrule
  \bar
  % barlines between staves
  \allbarrules\conbarrule
  \allbarrules\conmultibarrule
  \allbarrules\hidebarrule
  \bar
  % dashed barlines on staves
  \allbarrules\sepbarrule
  \allbarrules\sepmultibarrule
  \allbarrules\showdashbarrule
  \bar
  % dashed barlines between staves
  \allbarrules\condashbarrule
  \allbarrules\condashmultibarrule
  \allbarrules\hidebarrule
  \bar
  % dotted barlines on staves
  \allbarrules\sepbarrule
  \allbarrules\sepmultibarrule
  \allbarrules\showdotbarrule
  \bar
  % dotted barlines between staves
  \allbarrules\condotbarrule
  \allbarrules\condotmultibarrule
  \allbarrules\hidebarrule
  \bar
  % a wild mixture of all
  \showdotbarrule1\hidebarrule2\showdashbarrule3\showbarrule4%
  \condashbarrule2\conbarrule3\condotbarrule4%
  \condashmultibarrule2\sepmultibarrule3%
  \bar
  % conventional ending
  \allbarrules\showbarrule
  \allbarrules\conbarrule
  \allbarrules\conmultibarrule
\Endpiece
\bye
