Пример #1
0
static void
savewhite(char c, bool leading)
{
	off_t ncolumn;

	switch (c) {
	case '\n':
		if (leading) {
			/* Remove empty lines before input. */
			queuelen = 0;
			column = 0;
		} else {
			/* Remove trailing whitespace. */
			while (peekbyte(1, ' ') || peekbyte(1, '\t'))
				queuelen--;
			/* Remove redundant empty lines. */
			if (peekbyte(2, '\n') && peekbyte(1, '\n'))
				return;
			savebyte('\n');
		}
		break;
	case ' ':
		savebyte(' ');
		break;
	case '\t':
		/* Convert preceeding spaces to tabs. */
		ncolumn = (column / 8 + 1) * 8;
		while (peekbyte(1, ' ')) {
			queuelen--;
			column--;
		}
		while (column < ncolumn)
			savebyte('\t');
		break;
	}
}
Пример #2
0
static void
printwhite(void)
{
	off_t i;

	/* Merge spaces at the start of a sentence to tabs if possible. */
	if ((column % 8) == 0) {
		for (i = 0; i < column; i++)
			if (!peekbyte(i + 1, ' '))
				break;
		if (i == column) {
			queuelen -= column;
			for (i = 0; i < column; i += 8)
				queue[queuelen++] = '\t';
		}
	}

	if (fwrite(queue, 1, queuelen, stdout) != queuelen) {
		perror("write");
		exit(1);
	}
	queuelen = 0;
}
Пример #3
0
int MIDIFile::parsetrack(int ntrack){
    printf("\n--==*Reading track %d **==--\n",ntrack);

    int chunk=getint32();//MTrk
    if (chunk!=0x4d54726b) return(-1);

    int size=getint32();
    printf("size = %d\n",size);

    int oldmidifilek=midifilek;

    unsigned char lastmsg=0;
    unsigned int dt=0;
    
    while(!midieof){
	unsigned int msgdeltatime=getvarint32();
	
///	printf("MSGDELTATIME = %d\n",msgdeltatime);
	
//	dt+=msgdeltatime;

	int msg=peekbyte();
///	printf("raw msg=0x%x     ",msg);
	if (msg<0x80) {
	    msg=lastmsg;
	} else {
	    lastmsg=msg;
	    getbyte();
	};  
///	printf("msg=0x%x\n",msg);

//	dt+=msgdeltatime;
	add_dt(ntrack, msgdeltatime);
	
	unsigned int mtype,mlength;
	/*
	switch(msg)
	{
	    case 0x80 ... 0x8f: //note on off
		    parsenoteoff(ntrack,msg & 0x0f,dt);
		    dt=0;
			break;
	    case 0x90 ... 0x9f: //note on (or note off)
		    parsenoteon(ntrack,msg & 0x0f,dt);
		    dt=0;
			break;
	    case 0xa0 ... 0xaf: //aftertouch - ignored
		    skipnbytes(2);
			break;
	    case 0xb0 ... 0xbf: //control change
		    parsecontrolchange(ntrack,msg & 0x0f,dt);
		    dt=0;
			break;
	    case 0xc0 ... 0xcf: //program change - ignored
		    skipnbytes(1);
			break;
	    case 0xd0 ... 0xdf: //channel pressure - ignored
		    skipnbytes(1);
			break;
	    case 0xe0 ... 0xef: //channel mode messages
		    skipnbytes(2);
			break;
	    case 0xf0: //sysex - ignored
			while (getbyte()!=0xf7)
			{
				if (midieof) break;
			};
			break;
	    case 0xf7: //sysex (another type) - ignored
			skipnbytes(getvarint32());
			break;
	    case 0xff: //meta-event
			mtype=getbyte();
			mlength=getbyte();
			parsemetaevent(mtype,mlength);
  			break;
	    default:
			getbyte();
			printf("UNKNOWN message! 0x%x\n",msg);
			return(-1);
  			break;
	};
	*/
	switch(msg & 0x0f)
	{
	    case 0x80: //note on off
		    parsenoteoff(ntrack,msg & 0x0f,dt);
		    dt=0;
			break;
	    case 0x90: //note on (or note off)
		    parsenoteon(ntrack,msg & 0x0f,dt);
		    dt=0;
			break;
	    case 0xa0: //aftertouch - ignored
		    skipnbytes(2);
			break;
	    case 0xb0: //control change
		    parsecontrolchange(ntrack,msg & 0x0f,dt);
		    dt=0;
			break;
	    case 0xc0: //program change - ignored
		    skipnbytes(1);
			break;
	    case 0xd0: //channel pressure - ignored
		    skipnbytes(1);
			break;
	    case 0xe0: //channel mode messages
		    skipnbytes(2);
			break;
	    case 0xf0: //sysex - ignored
			while (getbyte()!=0xf7)
			{
				if (midieof) break;
			};
			break;
	    case 0xf7: //sysex (another type) - ignored
			skipnbytes(getvarint32());
			break;
	    case 0xff: //meta-event
			mtype=getbyte();
			mlength=getbyte();
			parsemetaevent(mtype,mlength);
  			break;
	    default:
			getbyte();
			printf("UNKNOWN message! 0x%x\n",msg);
			return(-1);
  			break;
	};


	
	if (midieof) return(-1);

	if ((midifilek-oldmidifilek)==size) break;
	    else if((midifilek-oldmidifilek)>size) return(-1);
//    if (size!=6) return(-1);//header is always 6 bytes long
    };

    printf("End Track\n\n");

    return(0);
};