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; } }
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; }
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); };