⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readmidi.c

📁 MIDI解码程序(用VC编写)
💻 C
📖 第 1 页 / 共 5 页
字号:
		case 0x0A:	/* EQ frequency3 */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);			num_events++;			break;		case 0x0B:	/* EQ Q3 */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);			num_events++;			break;		case 0x0D:	/* EQ gain4 */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);			num_events++;			break;		case 0x0E:	/* EQ frequency4 */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);			num_events++;			break;		case 0x0F:	/* EQ Q4 */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);			num_events++;			break;		case 0x11:	/* EQ gain5 */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);			num_events++;			break;		case 0x12:	/* EQ frequency5 */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);			num_events++;			break;		case 0x13:	/* EQ Q5 */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);			num_events++;			break;		case 0x14:	/* EQ shape5 */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);			num_events++;			break;		default:		    	break;	    }	  }	}    }    /* Effect 2 (Insertion Effects) */    else if(len >= 8 &&       val[0] == 0x43 && /* Yamaha ID */       val[2] == 0x4C && /* XG Model ID */       ((val[1] <  0x10 && val[5] == 0x03) ||	/* Bulk Dump*/        (val[1] >= 0x10 && val[3] == 0x03)))	/* Parameter Change */    {	uint8 addhigh, addmid, addlow;		/* Addresses */	uint8 *body;				/* SysEx body */	int ent;				/* Entry # of sub-event */	uint8 *body_end;			/* End of SysEx body */	if (val[1] < 0x10)	/* Bulk Dump */	{	    addhigh = val[5];	    addmid = val[6];	    addlow = val[7];	    body = val + 8;	    body_end = val + len - 3;	}	else			/* Parameter Change */	{	    addhigh = val[3];	    addmid = val[4];	    addlow = val[5];	    body = val + 6;	    body_end = val + len - 2;	}	/* set the SYSEX_XG_MSB info */	SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_MSB, 0, addhigh, addmid);	num_events++;	for (ent = addlow; body <= body_end; body++, ent++) {	    SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);			 num_events++;	}    }    /* XG Multi Part Data parameter change */    else if(len >= 10 &&       val[0] == 0x43 && /* Yamaha ID */       val[2] == 0x4C && /* XG Model ID */       ((val[1] <  0x10 && val[5] == 0x08 &&	/* Bulk Dump */         val[4] == 0x29 || val[4] == 0x3F) ||	/* Blocks 1 or 2 */        (val[1] >= 0x10 && val[3] == 0x08)))	/* Parameter Change */    {	uint8 addhigh, addmid, addlow;		/* Addresses */	uint8 *body;				/* SysEx body */	uint8 p;				/* Channel part number [0..15] */	int ent;				/* Entry # of sub-event */	uint8 *body_end;			/* End of SysEx body */	if (val[1] < 0x10)	/* Bulk Dump */	{	    addhigh = val[5];	    addmid = val[6];	    addlow = val[7];	    body = val + 8;	    p = addmid;	    body_end = val + len - 3;	}	else			/* Parameter Change */	{	    addhigh = val[3];	    addmid = val[4];	    addlow = val[5];	    body = val + 6;	    p = addmid;	    body_end = val + len - 2;	}	/* set the SYSEX_XG_MSB info */	SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_MSB, p, addhigh, addmid);	num_events++;	for (ent = addlow; body <= body_end; body++, ent++) {	    switch(ent) {		case 0x00:	/* Element Reserve *//*			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Element Reserve is not supported. (CH:%d VAL:%d)", p, *body); */		    break;		case 0x01:	/* bank select MSB */		    SETMIDIEVENT(evm[num_events], 0, ME_TONE_BANK_MSB, p, *body, SYSEX_TAG);		    num_events++;		    break;		case 0x02:	/* bank select LSB */		    SETMIDIEVENT(evm[num_events], 0, ME_TONE_BANK_LSB, p, *body, SYSEX_TAG);		    num_events++;		    break;		case 0x03:	/* program number */		    SETMIDIEVENT(evm[num_events], 0, ME_PROGRAM, p, *body, SYSEX_TAG);		    num_events++;		    break;		case 0x04:	/* Rcv CHANNEL */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, p, *body, 0x99);			num_events++;		    break;		case 0x05:	/* mono/poly mode */			if(*body == 0) {SETMIDIEVENT(evm[num_events], 0, ME_MONO, p, 0, SYSEX_TAG);}			else {SETMIDIEVENT(evm[num_events], 0, ME_POLY, p, 0, SYSEX_TAG);}			num_events++;		    break;		case 0x06:	/* Same Note Number Key On Assign */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, p, *body, ent);			num_events++;		    break;		case 0x07:	/* Part Mode */			drum_setup_xg[*body] = p;			SETMIDIEVENT(evm[num_events], 0, ME_DRUMPART, p, *body, SYSEX_TAG);			num_events++;		    break;		case 0x08:	/* note shift */		    SETMIDIEVENT(evm[num_events], 0, ME_KEYSHIFT, p, *body, SYSEX_TAG);		    num_events++;		    break;		case 0x09:	/* Detune 1st bit */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Detune 1st bit is not supported. (CH:%d VAL:%d)", p, *body); 		    break;		case 0x0A:	/* Detune 2nd bit */		    ctl->cmsg(CMSG_INFO, VERB_NOISY, "Detune 2nd bit is not supported. (CH:%d VAL:%d)", p, *body); 		    break;		case 0x0B:	/* volume */		    SETMIDIEVENT(evm[num_events], 0, ME_MAINVOLUME, p, *body, SYSEX_TAG);		    num_events++;		    break;		case 0x0C:	/* Velocity Sense Depth */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_GS_LSB, p, *body, 0x21);			num_events++;			break;		case 0x0D:	/* Velocity Sense Offset */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_GS_LSB, p, *body, 0x22);			num_events++;			break;		case 0x0E:	/* pan */		    if(*body == 0) {			SETMIDIEVENT(evm[num_events], 0, ME_RANDOM_PAN, p, 0, SYSEX_TAG);		    }		    else {			SETMIDIEVENT(evm[num_events], 0, ME_PAN, p, *body, SYSEX_TAG);		    }		    num_events++;		    break;		case 0x0F:	/* Note Limit Low */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x42);			num_events++;		    break;		case 0x10:	/* Note Limit High */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x43);			num_events++;			break;		case 0x11:	/* Dry Level */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, p, *body, ent);			num_events++;			break;		case 0x12:	/* chorus send */		    SETMIDIEVENT(evm[num_events], 0, ME_CHORUS_EFFECT, p, *body, SYSEX_TAG);		    num_events++;		    break;		case 0x13:	/* reverb send */		    SETMIDIEVENT(evm[num_events], 0, ME_REVERB_EFFECT, p, *body, SYSEX_TAG);		    num_events++;		    break;		case 0x14:	/* Variation Send */		    SETMIDIEVENT(evm[num_events], 0, ME_CELESTE_EFFECT, p, *body, SYSEX_TAG);		    num_events++;		    break;		case 0x15:	/* Vibrato Rate */			SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x08, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);			num_events += 3;		    break;		case 0x16:	/* Vibrato Depth */			SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x09, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);			num_events += 3;		    break;		case 0x17:	/* Vibrato Delay */			SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x0A, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);			num_events += 3;		    break;		case 0x18:	/* Filter Cutoff Frequency */			SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x20, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);			num_events += 3;		    break;		case 0x19:	/* Filter Resonance */			SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x21, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);			num_events += 3;		    break;		case 0x1A:	/* EG Attack Time */			SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x63, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);			num_events += 3;		    break;		case 0x1B:	/* EG Decay Time */			SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x64, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);			num_events += 3;		    break;		case 0x1C:	/* EG Release Time */			SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x66, SYSEX_TAG);			SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);			num_events += 3;		    break;		case 0x1D:	/* MW Pitch Control */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x16);			num_events++;			break;		case 0x1E:	/* MW Filter Control */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x17);			num_events++;			break;		case 0x1F:	/* MW Amplitude Control */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x18);			num_events++;			break;		case 0x20:	/* MW LFO PMod Depth */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x1A);			num_events++;			break;		case 0x21:	/* MW LFO FMod Depth */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x1B);			num_events++;			break;		case 0x22:	/* MW LFO AMod Depth */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x1C);			num_events++;			break;		case 0x23:	/* bend pitch control */		    SETMIDIEVENT(evm[num_events], 0, ME_RPN_MSB, p, 0, SYSEX_TAG);		    SETMIDIEVENT(evm[num_events + 1], 0, ME_RPN_LSB, p, 0, SYSEX_TAG);		    SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, (*body - 0x40) & 0x7F, SYSEX_TAG);		    num_events += 3;		    break;		case 0x24:	/* Bend Filter Control */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x22);			num_events++;			break;		case 0x25:	/* Bend Amplitude Control */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x23);			num_events++;			break;		case 0x26:	/* Bend LFO PMod Depth */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x25);			num_events++;			break;		case 0x27:	/* Bend LFO FMod Depth */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x26);			num_events++;			break;		case 0x28:	/* Bend LFO AMod Depth */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x27);			num_events++;			break;		case 0x30:	/* Rcv Pitch Bend */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x48);			num_events++;			break;		case 0x31:	/* Rcv Channel Pressure */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x49);			num_events++;			break;		case 0x32:	/* Rcv Program Change */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4A);			num_events++;			break;		case 0x33:	/* Rcv Control Change */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4B);			num_events++;			break;		case 0x34:	/* Rcv Poly Pressure */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4C);			num_events++;			break;		case 0x35:	/* Rcv Note Message */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4D);			num_events++;			break;		case 0x36:	/* Rcv RPN */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4E);			num_events++;			break;		case 0x37:	/* Rcv NRPN */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4F);			num_events++;			break;		case 0x38:	/* Rcv Modulation */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x50);			num_events++;			break;		case 0x39:	/* Rcv Volume */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x51);			num_events++;			break;		case 0x3A:	/* Rcv Pan */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x52);			num_events++;			break;		case 0x3B:	/* Rcv Expression */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x53);			num_events++;			break;		case 0x3C:	/* Rcv Hold1 */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x54);			num_events++;			break;		case 0x3D:	/* Rcv Portamento */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x55);			num_events++;			break;		case 0x3E:	/* Rcv Sostenuto */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x56);			num_events++;			break;		case 0x3F:	/* Rcv Soft */			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x57);			num_events++;			break;		case 0x40:	/* Rcv Bank Select */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -