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

📄 readmidi.c

📁 MIDI解码程序(用VC编写)
💻 C
📖 第 1 页 / 共 5 页
字号:
			addr_h = 0x41;		}		addr = (((int32)addr_h)<<16 | ((int32)addr_m)<<8 | (int32)addr_l);		switch(addr_h) {		case 0x40:			if((addr & 0xFFF000) == 0x401000) {				switch(addr & 0xFF) {				case 0x00:	/* Tone Number */					SETMIDIEVENT(evm[0], 0, ME_TONE_BANK_MSB, p,val[7], SYSEX_TAG);					SETMIDIEVENT(evm[1], 0, ME_PROGRAM, p, val[8], SYSEX_TAG);					num_events += 2;					break;				case 0x02:	/* Rx. Channel */					if (val[7] == 0x10) {						SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB,								block_to_part(val[5],								midi_port_number ^ port), 0x80, 0x45);					} else {						SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB,								block_to_part(val[5],								midi_port_number ^ port),								MERGE_CHANNEL_PORT2(val[7],								midi_port_number ^ port), 0x45);					}					num_events++;					break;				case 0x03:	/* Rx. Pitch Bend */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x48);					num_events++;					break;				case 0x04:	/* Rx. Channel Pressure */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x49);					num_events++;					break;				case 0x05:	/* Rx. Program Change */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4A);					num_events++;					break;				case 0x06:	/* Rx. Control Change */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4B);					num_events++;					break;				case 0x07:	/* Rx. Poly Pressure */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4C);					num_events++;					break;				case 0x08:	/* Rx. Note Message */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4D);					num_events++;					break;				case 0x09:	/* Rx. RPN */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4E);					num_events++;					break;				case 0x0A:	/* Rx. NRPN */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4F);					num_events++;					break;				case 0x0B:	/* Rx. Modulation */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x50);					num_events++;					break;				case 0x0C:	/* Rx. Volume */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x51);					num_events++;					break;				case 0x0D:	/* Rx. Panpot */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x52);					num_events++;					break;				case 0x0E:	/* Rx. Expression */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x53);					num_events++;					break;				case 0x0F:	/* Rx. Hold1 */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x54);					num_events++;					break;				case 0x10:	/* Rx. Portamento */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x55);					num_events++;					break;				case 0x11:	/* Rx. Sostenuto */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x56);					num_events++;					break;				case 0x12:	/* Rx. Soft */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x57);					num_events++;					break;				case 0x13:	/* MONO/POLY Mode */					if(val[7] == 0) {SETMIDIEVENT(evm[0], 0, ME_MONO, p, val[7], SYSEX_TAG);}					else {SETMIDIEVENT(evm[0], 0, ME_POLY, p, val[7], SYSEX_TAG);}					num_events++;					break;				case 0x14:	/* Assign Mode */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x24);					num_events++;					break;				case 0x15:	/* Use for Rhythm Part */					if(val[7]) {						rhythm_part[val[7] - 1] = p;					}					break;				case 0x16:	/* Pitch Key Shift (dummy. see parse_sysex_event()) */					break;				case 0x17:	/* Pitch Offset Fine */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x26);					num_events++;					break;				case 0x19:	/* Part Level */					SETMIDIEVENT(evm[0], 0, ME_MAINVOLUME, p, val[7], SYSEX_TAG);					num_events++;					break;				case 0x1A:	/* Velocity Sense Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x21);					num_events++;					break;				case 0x1B:	/* Velocity Sense Offset */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x22);					num_events++;					break;				case 0x1C:	/* Part Panpot */					if (val[7] == 0) {						SETMIDIEVENT(evm[0], 0, ME_RANDOM_PAN, p, 0, SYSEX_TAG);					} else {						SETMIDIEVENT(evm[0], 0, ME_PAN, p, val[7], SYSEX_TAG);					}					num_events++;					break;				case 0x1D:	/* Keyboard Range Low */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x42);					num_events++;					break;				case 0x1E:	/* Keyboard Range High */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x43);					num_events++;					break;				case 0x1F:	/* CC1 Controller Number */					ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 Controller Number is not supported. (CH:%d VAL:%d)", p, val[7]);					break;				case 0x20:	/* CC2 Controller Number */					ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 Controller Number is not supported. (CH:%d VAL:%d)", p, val[7]);					break;				case 0x21:	/* Chorus Send Level */					SETMIDIEVENT(evm[0], 0, ME_CHORUS_EFFECT, p, val[7], SYSEX_TAG);					num_events++;					break;				case 0x22:	/* Reverb Send Level */					SETMIDIEVENT(evm[0], 0, ME_REVERB_EFFECT, p, val[7], SYSEX_TAG);					num_events++;					break;				case 0x23:	/* Rx. Bank Select */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x58);					num_events++;					break;				case 0x24:	/* Rx. Bank Select LSB */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x59);					num_events++;					break;				case 0x2C:	/* Delay Send Level */					SETMIDIEVENT(evm[0], 0, ME_CELESTE_EFFECT, p, val[7], SYSEX_TAG);					num_events++;					break;				case 0x2A:	/* Pitch Fine Tune */					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x00, SYSEX_TAG);					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x01, SYSEX_TAG);					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);					SETMIDIEVENT(evm[3], 0, ME_DATA_ENTRY_LSB, p, val[8], SYSEX_TAG);					num_events += 4;					break;				case 0x30:	/* TONE MODIFY1: Vibrato Rate */					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x08, SYSEX_TAG);					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);					num_events += 3;					break;				case 0x31:	/* TONE MODIFY2: Vibrato Depth */					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x09, SYSEX_TAG);					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);					num_events += 3;					break;				case 0x32:	/* TONE MODIFY3: TVF Cutoff Freq */					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x20, SYSEX_TAG);					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);					num_events += 3;					break;				case 0x33:	/* TONE MODIFY4: TVF Resonance */					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x21, SYSEX_TAG);					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);					num_events += 3;					break;				case 0x34:	/* TONE MODIFY5: TVF&TVA Env.attack */					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x63, SYSEX_TAG);					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);					num_events += 3;					break;				case 0x35:	/* TONE MODIFY6: TVF&TVA Env.decay */					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x64, SYSEX_TAG);					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);					num_events += 3;					break;				case 0x36:	/* TONE MODIFY7: TVF&TVA Env.release */					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x66, SYSEX_TAG);					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);					num_events += 3;					break;				case 0x37:	/* TONE MODIFY8: Vibrato Delay */					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x0A, SYSEX_TAG);					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);					num_events += 3;					break;				case 0x40:	/* Scale Tuning */					for (i = 0; i < 12; i++) {						SETMIDIEVENT(evm[i],								0, ME_SCALE_TUNING, p, i, val[i + 7] - 64);						ctl->cmsg(CMSG_INFO, VERB_NOISY,								"Scale Tuning %s (CH:%d %d cent)",								note_name[i], p, val[i + 7] - 64);					}					num_events += 12;					break;				default:					ctl->cmsg(CMSG_INFO,VERB_NOISY,"Unsupported GS SysEx. (ADDR:%02X %02X %02X VAL:%02X %02X)",addr_h,addr_m,addr_l,val[7],val[8]);					break;				}			} else if((addr & 0xFFF000) == 0x402000) {				switch(addr & 0xFF) {				case 0x00:	/* MOD Pitch Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x16);					num_events++;					break;				case 0x01:	/* MOD TVF Cutoff Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x17);					num_events++;					break;				case 0x02:	/* MOD Amplitude Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x18);					num_events++;					break;				case 0x03:	/* MOD LFO1 Rate Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x19);					num_events++;					break;				case 0x04:	/* MOD LFO1 Pitch Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1A);					num_events++;					break;				case 0x05:	/* MOD LFO1 TVF Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1B);					num_events++;					break;				case 0x06:	/* MOD LFO1 TVA Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1C);					num_events++;					break;				case 0x07:	/* MOD LFO2 Rate Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1D);					num_events++;					break;				case 0x08:	/* MOD LFO2 Pitch Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1E);					num_events++;					break;				case 0x09:	/* MOD LFO2 TVF Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1F);					num_events++;					break;				case 0x0A:	/* MOD LFO2 TVA Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x20);					num_events++;					break;				case 0x10:	/* !!!FIXME!!! Bend Pitch Control */					SETMIDIEVENT(evm[0], 0, ME_RPN_MSB, p, 0, SYSEX_TAG);					SETMIDIEVENT(evm[1], 0, ME_RPN_LSB, p, 0, SYSEX_TAG);					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, (val[7] - 0x40) & 0x7F, SYSEX_TAG);					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x21);					num_events += 4;					break;				case 0x11:	/* Bend TVF Cutoff Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x22);					num_events++;					break;				case 0x12:	/* Bend Amplitude Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x23);					num_events++;					break;				case 0x13:	/* Bend LFO1 Rate Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x24);					num_events++;					break;				case 0x14:	/* Bend LFO1 Pitch Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x25);					num_events++;					break;				case 0x15:	/* Bend LFO1 TVF Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x26);					num_events++;					break;				case 0x16:	/* Bend LFO1 TVA Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x27);					num_events++;					break;				case 0x17:	/* Bend LFO2 Rate Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x28);					num_events++;					break;				case 0x18:	/* Bend LFO2 Pitch Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x29);					num_events++;					break;				case 0x19:	/* Bend LFO2 TVF Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2A);					num_events++;					break;				case 0x1A:	/* Bend LFO2 TVA Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2B);					num_events++;					break;				case 0x20:	/* CAf Pitch Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x00);					num_events++;					break;				case 0x21:	/* CAf TVF Cutoff Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x01);					num_events++;					break;				case 0x22:	/* CAf Amplitude Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x02);					num_events++;					break;				case 0x23:	/* CAf LFO1 Rate Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x03);					num_events++;					break;				case 0x24:	/* CAf LFO1 Pitch Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x04);					num_events++;					break;				case 0x25:	/* CAf LFO1 TVF Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x05);					num_events++;					break;				case 0x26:	/* CAf LFO1 TVA Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x06);					num_events++;					break;				case 0x27:	/* CAf LFO2 Rate Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x07);					num_events++;					break;				case 0x28:	/* CAf LFO2 Pitch Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x08);					num_events++;					break;				case 0x29:	/* CAf LFO2 TVF Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x09);					num_events++;					break;				case 0x2A:	/* CAf LFO2 TVA Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0A);					num_events++;					break;				case 0x30:	/* PAf Pitch Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0B);					num_events++;					break;				case 0x31:	/* PAf TVF Cutoff Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0C);					num_events++;					break;				case 0x32:	/* PAf Amplitude Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0D);					num_events++;					break;				case 0x33:	/* PAf LFO1 Rate Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0E);					num_events++;					break;				case 0x34:	/* PAf LFO1 Pitch Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0F);					num_events++;					break;				case 0x35:	/* PAf LFO1 TVF Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x10);					num_events++;					break;				case 0x36:	/* PAf LFO1 TVA Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x11);					num_events++;					break;				case 0x37:	/* PAf LFO2 Rate Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x12);					num_events++;					break;				case 0x38:	/* PAf LFO2 Pitch Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x13);					num_events++;					break;				case 0x39:	/* PAf LFO2 TVF Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x14);					num_events++;					break;				case 0x3A:	/* PAf LFO2 TVA Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x15);					num_events++;					break;				case 0x40:	/* CC1 Pitch Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2C);					num_events++;					break;				case 0x41:	/* CC1 TVF Cutoff Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2D);					num_events++;					break;				case 0x42:	/* CC1 Amplitude Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2E);					num_events++;					break;				case 0x43:	/* CC1 LFO1 Rate Control */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2F);					num_events++;					break;				case 0x44:	/* CC1 LFO1 Pitch Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x30);					num_events++;					break;				case 0x45:	/* CC1 LFO1 TVF Depth */					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x31);					nu

⌨️ 快捷键说明

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