#include <stdio.h>
#include <midi.h>

char *index();

put_cmd(cmd, present, time)
	int *cmd, *present;
	double time;
{
	static long now;
	long ticks, interval;
	Int i;

	if (cmd[1] == RT_TCIP) return;
	ticks = time * MPU_TPS(MPU_DEFAULT_TEMPO, MPU_DEFAULT_TIME_BASE);
	interval = ticks - now;
	i = MPU_CLOCK_PERIOD;
	while (interval >= i)
		putchar(0xf8), interval -= i;	/* measure boundary */
	putchar(interval);
	for (i=1; i < 4; i++) if (present[i]) putchar(cmd[i]);
	now = ticks;
}

#define FIELD_WIDTH	(3)
#define FIELDS(x)	(x * FIELD_WIDTH -1)

parse_midi(obuf, present, ibuf)
	int *obuf, *present; 
	char *ibuf;
{
	Int i=0, j=0;

	for (; i < FIELDS(6); i += FIELD_WIDTH, j++) {
		if (!ibuf[i]) break;
		ibuf[i+2] = '\0';
		if (ibuf[i+1] != ' ')
			sscanf(ibuf+i, "%x", obuf+j), present[j] = 1;
		else
			present[j] = 0;
	}
}

ReAssemble(f)
	FILE *f;
{
	char s[BUFSIZ];
	while (fgets(s, sizeof s, f)) {
		register char *c = index(s, ';');
		if (c) {
			double time;
			int cmd[BUFSIZ], present[BUFSIZ];
			*c++ = '\0';
			parse_midi(cmd, present, s);
			sscanf(c, "%lf", &time);
			put_cmd(cmd, present, time);
		} else fprintf(stderr, "%s: format error\n", av0), exit(1);
	}
}	

main(ac, av) char *av[]; {
	int i;
	av0 = av[0];
	if (ac>1) for (i=1; i<ac; i++) {
		FILE *f = sopen(av[i],"r");
		if (f) ReAssemble(f,stdout), sclose(f);
		else perror(av[i]);
	} else ReAssemble(stdin,stdout);
	exit(0);
}
