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

📄 mamidcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
				case 0xD0:	/* Channel pressure */
					pMt->dwOffset++;
					break;
					
				case 0xB0:
					switch (pMt->pBase[pMt->dwOffset])
					{
					case 0x00: /* Bank MSB */
						bCmd2 = pMt->pBase[pMt->dwOffset +1];
						preBank[bCh] = (UINT16)((preBank[bCh] & 0x00FF) | ((UINT16)bCmd2 << 8));
						pMt->dwOffset += 2;
						break;
					case 0x20: /* Bank LSB */
						bCmd2 = pMt->pBase[pMt->dwOffset +1];
						preBank[bCh] = (UINT16)((preBank[bCh] & 0xFF00) | ((UINT16)bCmd2));
						pMt->dwOffset += 2;
						break; 
					default:
						pMt->dwOffset += 2;
						break;
					}
					break;
				case 0x90:
					if ((gwBank[bCh] & 0xFF00) == 0x7800) 
					{
						gdwDrumVoice4op[pMt->pBase[pMt->dwOffset]] = 1;
						pMt->dwOffset += 2;
						break;
					}
					if ((bCh == 9) && ((gwBank[bCh] & 0xFF00) != 0x7900))
					{
						gdwDrumVoice4op[pMt->pBase[pMt->dwOffset]] = 1;
						pMt->dwOffset += 2;
						break;
					}
					gdwMelodyVoice4op[gdwProg[bCh]] = 1;
					pMt->dwOffset += 2;
					break;
				default:
					pMt->dwOffset += 2;
				}
			}
			else
			{
				switch (bCmd)
				{
				case 0xF0:			/* SysEx */
				case 0xF7:			/* SysEx */
					pMt->bSmfCmd = 0;
					dwSize = 0;
					do
					{
						bTemp = pMt->pBase[pMt->dwOffset++];
						dwSize = (dwSize << 7) + (UINT32)(bTemp & 0x7f);
					} while (bTemp >= 0x80);
					
					pMt->dwOffset += dwSize;
					break;

				case 0xF1:			/* System Msg */
				case 0xF3:			/* System Msg */
					pMt->dwOffset++;
					break;
				
				case 0xF2:			/* System Msg */
					pMt->dwOffset += 2;
					break;

				case 0xF4:			/* System Msg */
				case 0xF5:			/* System Msg */
				case 0xF6:			/* System Msg */
				case 0xF8:			/* System Msg */
				case 0xF9:			/* System Msg */
				case 0xFA:			/* System Msg */
				case 0xFB:			/* System Msg */
				case 0xFC:			/* System Msg */
				case 0xFD:			/* System Msg */
				case 0xFE:			/* System Msg */
					break;

				case 0xFF:										/* Meta          */
					bCmd2 = pMt->pBase[pMt->dwOffset++];		/* Meta Command  */
					dwSize = 0;									/* Size          */
					do
					{
						bTemp = pMt->pBase[pMt->dwOffset++];
						dwSize = (dwSize << 7) + (UINT32)(bTemp & 0x7f);
					} while (bTemp >= 0x80);

					switch (bCmd2)
					{
					case 0x03:
						if (dwTr == 0)
						{
							pI->pTitle = &pMt->pBase[pMt->dwOffset];
							pI->dwSizeTitle = dwSize;
						}
						break;
					
					case 0x02:
						pI->pCopyright = &pMt->pBase[pMt->dwOffset];
						pI->dwSizeCopyright = dwSize;
						break;

					case 0x2f:		/* End */
						dwEndFlag &= ~(1L << dwTr);
						break;
						
					case 0x51:		/* Set Tempo */
						switch (dwSize)
						{
						case 3:
						case 4:
							dwTime = ((UINT32)pMt->pBase[pMt->dwOffset] << 16) + 
							         ((UINT32)pMt->pBase[pMt->dwOffset + 1] << 8) +
							          (UINT32)pMt->pBase[pMt->dwOffset + 2];
							if ((dwTotalTicks == 0) && (dwTime == 250000)) bSetup |= 0x02;
							if (dwTotalTicks == (SINT32)pI->dwTimeResolution) bSetup |= 0x08;
							dwTime = (dwTime << 7) / 125;
							dwDelta = dwTime / pI->dwTimeResolution;
						}
						break;
						
					case 0x58:		/* Set TimeSignature */
						if ((dwTotalTicks == 0) && 
						    (pMt->pBase[pMt->dwOffset] == 1) &&
						    (pMt->pBase[pMt->dwOffset + 1] == 2)) bSetup |= 0x01;
						if (dwTotalTicks == (SINT32)pI->dwTimeResolution) bSetup |= 0x04;
						break;
					}
					pMt->dwOffset += dwSize;
					break;
				}
			}
			GetTrackTime((UINT8)dwTr, pI, &dwEndFlag);
			if (bSetup == 0x0B) break;
		}

		if (bSetup == 0x0B)
		{
			dwCurrentTime = 0;
			pI->bSetupBar = 1;
			pI->dwStart = pI->iTrack[0].dwOffset;
			
		} else {
			pI->dwTotalTicks = dwTotalTicks;
			pI->dwDataEndTime = dwCurrentTime;

			MASMFCNV_DBGMSG(("MaMidCnv : GetSMFInfo/ dwTotalTicks  = %ld\n", dwTotalTicks));
			MASMFCNV_DBGMSG(("MaMidCnv : GetSMFInfo/ dwCurrentTime = %ld\n", dwCurrentTime));

			if ((pI->dwDataEndTime >> 10) <= MINIMUM_LENGTH) return (MASMW_ERROR_SHORT_LENGTH);

			return (MASMW_SUCCESS);
		}
	}

	/*--- Check Length -----------------------------*/
	while (dwEndFlag != 0)
	{
		dwTr = GetLeastTimeTrack(pI, &dwEndFlag);
		if (dwTr < 0) break;
		pMt = &(pI->iTrack[dwTr]);
		
		dwTime = pMt->dwTicks - dwTotalTicks;
		dwCurrentTime += dwTime * dwDelta;
		dwTotalTicks = pMt->dwTicks;
		if (dwCurrentTime < 0)
		{
			MASMFCNV_DBGMSG(("MaMidCnv : GetSMFInfo Error/ CT2=%ld, %ld, %ld, %ld\n", dwCurrentTime, dwTime, dwDelta, dwTr));
			return (MASMW_ERROR_LONG_LENGTH);
		}

		bCmd = pMt->pBase[pMt->dwOffset++];

		if (bCmd < 0xf0)
		{
			bCh = (UINT8)(bCmd & 0x0F);
			/*--- MidiMsg ---*/
			if (bCmd < 0x80)
			{
				bCmd = pMt->bSmfCmd;
				if (bCmd < 0x80) return (MASMW_ERROR_SMF_CMD);
				pMt->dwOffset--;
				bCh = (UINT8)(bCmd & 0x0F);
			} else {
				if (bCmd < 0xf8) pMt->bSmfCmd = bCmd;
			}
			
			switch (bCmd & 0xf0)
			{
			case 0xC0:	/* Program change */
				gwBank[bCh] = (UINT16)preBank[bCh];
				gdwProg[bCh] = pMt->pBase[pMt->dwOffset];
				pMt->dwOffset++;
				break;
			case 0xD0:	/* Channel pressure */
				pMt->dwOffset++;
				break;
				
			case 0xB0:
				switch (pMt->pBase[pMt->dwOffset])
				{
				case 0x00: /* Bank MSB */
					bCmd2 = pMt->pBase[pMt->dwOffset +1];
					preBank[bCh] = (UINT16)((preBank[bCh] & 0x00FF) | ((UINT16)bCmd2 << 8));
					pMt->dwOffset += 2;
					break;
				case 0x20: /* Bank LSB */
					bCmd2 = pMt->pBase[pMt->dwOffset +1];
					preBank[bCh] = (UINT16)((preBank[bCh] & 0xFF00) | ((UINT16)bCmd2));
					pMt->dwOffset += 2;
					break; 
				default:
					pMt->dwOffset += 2;
					break;
				}
				break;
			case 0x90:
				if ((gwBank[bCh] & 0xFF00) == 0x7800) 
				{
					gdwDrumVoice4op[pMt->pBase[pMt->dwOffset]] = 1;
					pMt->dwOffset += 2;
					break;
				}
				if ((bCh == 9) && ((gwBank[bCh] & 0xFF00) != 0x7900))
				{
					gdwDrumVoice4op[pMt->pBase[pMt->dwOffset]] = 1;
					pMt->dwOffset += 2;
					break;
				}
				gdwMelodyVoice4op[gdwProg[bCh]] = 1;
				pMt->dwOffset += 2;
				break;
			default:
				pMt->dwOffset += 2;
			}
		}
		else
		{
			switch (bCmd)
			{
			case 0xF0:			/* SysEx */
			case 0xF7:			/* SysEx */
				pMt->bSmfCmd = 0;
				dwSize = 0;
				do
				{
					bTemp = pMt->pBase[pMt->dwOffset++];
					dwSize = (dwSize << 7) + (UINT32)(bTemp & 0x7f);
				} while (bTemp >= 0x80);
				
				pMt->dwOffset += dwSize;
				break;

			case 0xF1:			/* System Msg */
			case 0xF3:			/* System Msg */
				pMt->dwOffset++;
				break;
			
			case 0xF2:			/* System Msg */
				pMt->dwOffset += 2;
				break;

			case 0xF4:			/* System Msg */
			case 0xF5:			/* System Msg */
			case 0xF6:			/* System Msg */
			case 0xF8:			/* System Msg */
			case 0xF9:			/* System Msg */
			case 0xFA:			/* System Msg */
			case 0xFB:			/* System Msg */
			case 0xFC:			/* System Msg */
			case 0xFD:			/* System Msg */
			case 0xFE:			/* System Msg */
				break;

			case 0xFF:										/* Meta          */
				bCmd2 = pMt->pBase[pMt->dwOffset++];		/* Meta Command  */
				dwSize = 0;									/* Size          */
				do
				{
					bTemp = pMt->pBase[pMt->dwOffset++];
					dwSize = (dwSize << 7) + (UINT32)(bTemp & 0x7f);
				} while (bTemp >= 0x80);

				switch (bCmd2)
				{
				case 0x03:
					pI->pTitle = &pMt->pBase[pMt->dwOffset];
					pI->dwSizeTitle = dwSize;
					break;
				
				case 0x02:
					pI->pCopyright = &pMt->pBase[pMt->dwOffset];
					pI->dwSizeCopyright = dwSize;
					break;

				case 0x2f:		/* End */
					dwEndFlag &= ~(1L << dwTr);
					break;

⌨️ 快捷键说明

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