#include "pre_mus.h"

beamit (b, b_first_note, b_last_note)
int     b,
        b_first_note,
        b_last_note;
{
    int     beat,
            perfectplace,
            count = 0;
    int     open = 0,
            hdsq = 0,
            in_beam = 0;
    struct notes   *notep;

    if (b_last_note - b_first_note < 2)
	return;

    if (autobeam <= 0) {	/* Oxford rules */
	if (tsig_n_now >= 6)
	    perfectplace = 3 * (SBL / tsig_d_now);
	else
	    perfectplace = (SBL / tsig_d_now);
    }
    else
	perfectplace = autobeam * SBL / tsig_d_now;

    for (beat = b_first_note, notep = notev + b_first_note;
	    beat < b_last_note; beat++, notep++) {
/* first check for triple */
	if (notep -> n_tnote != 0
		&& *(notep -> n_tnote) == NTEXTSYM
		&& *(notep -> n_tnote + 1) == '3'
		&& notep -> n_length < 32
		&& notep -> n_pitch != RESTSYM
		&& notep -> n_pitch != IRESTSYM) {
	    if (!in_beam) {
		if (open || count > 1) {
				/* triple encountered, beam opened */
		    if (notev[beat - 2].n_beam == 0)
			notev[beat - 2].n_beam = -1;
		    else
			notev[beat - 2].n_beam = 0;
		    notev[beat - 1].n_beam = 1;
		}
		else {		/* open beam for the triple */
		    notev[beat - 1].n_beam = 1;
		}
	    }
	    open = 0;
	    count = 1;
	    if (!in_beam)
		notev[beat + 1].n_beam = -1;/* close after next note */
	    in_beam = 1;
	    beat++;
	    notep++;
	}
	hdsq += notep -> n_length;
/* beam start specified */
	if (notep -> n_beam == 1) {
	    if (open) {		/* close any opened beam */
		if (notev[beat - 1].n_beam == 0)
		    notev[beat - 1].n_beam = -1;
		else
		    notev[beat - 1].n_beam = 0;
		open = 0;
	    }
	    in_beam = 1;
/* end of beam specified */
	}
	else
	    if (notep -> n_beam == -1) {
		if (in_beam) {
		    in_beam = 0;
		    count = 0;
		}
		else
		    if (open) {	/* just end of beam given */
			open = 0;
			count = 0;
			notep -> n_beam = -1;
		    }
/* if OK to start a new beam */
	    }
	    else
		if (!in_beam) {
		    if (open == 0) {
			if (notep -> n_length < 32
				&& notep -> n_pitch != RESTSYM
				&& notep -> n_pitch != IRESTSYM)
			    count++;
			else
			    count = 0;

			if (count == 2) {
			    notev[beat - 1].n_beam = 1;
			    if ((hdsq % perfectplace) == 0) {
				notep -> n_beam = -1;
				count = 0;
			    }
			    else
				open = 1;
			}
			if ((hdsq % perfectplace) == 0)
			    count = 0;
		    }

		    else {	/* beam started */
			count = 0;
			if (notep -> n_length >= 32
				|| notep -> n_pitch == RESTSYM
				|| notep -> n_pitch == IRESTSYM) {
			    notev[beat - 1].n_beam = -1;
			    open = 0;
			}
			else {
			    if (hdsq % perfectplace == 0) {
				notep -> n_beam = -1;
				open = 0;
			    }
			}
		    }		/* end if open */
		}		/* end if not in given beam */
    }				/* end for all notes in bar */
    if (open)
	notev[beat - 1].n_beam = -1;
}				/* end proc beamit */
