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

📄 maphrcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	case 0x82L:
		gPhrInfo.sChInfo[dCh].sdOctShift = -2L;
		break;
	case 0x83L:
		gPhrInfo.sChInfo[dCh].sdOctShift = -3L;
		break;
	case 0x84L:
		gPhrInfo.sChInfo[dCh].sdOctShift = -4L;
		break;
	default:   /* reserved */
		break;
	}

	return (0L);
}

/****************************************************************************
 *	BankSelect
 *
 *	Function:
 *			Update BankSelect(for LV2).
 *	Argument:
 *			dCh		#Channel(0..15)
 *			dBankNo	Bank Number(0,1,128,129)
 *	Return:
 *			0		success
 *
 ****************************************************************************/
static SINT32	BankSelect(UINT32 dCh, UINT32 dBankNo)

{
	if(	(dBankNo == 0x00L)	||
		(dBankNo == 0x01L)	||
		(dBankNo == 0x80L)	||
		(dBankNo == 0x81L)) {

		gPhrInfo.sChInfo[dCh].dNewBank = dBankNo;
	}

	return (0L);
}

/****************************************************************************
 *	CnvProgramChange
 *
 *	Function:
 *			Put Program Change to sound driver(for LV1).
 *	Argument:
 *			dCh		#Channel(0..15)
 *			dProgNo	Program Number(0..127)
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	CnvProgramChange(UINT32 dCh, UINT32 dProgNo)
{
	UINT32			dPhrCh;
	UINT32			dBankNo;
	PMALIBVOCINFO	pVi;
	PMAPHRCHINFO	pCi = &(gPhrInfo.sChInfo[dCh]);

	if(dProgNo > 3L)	return (0L);

	pCi->dProgNo	= dProgNo;
	dPhrCh			= (UINT32)(dCh >> 2);
	pVi = &(gPhrInfo.sApiInfo[dPhrCh].sDataInfo.sVocInfo[dProgNo]);

	switch(pVi->dBankNo) {
	case 0x00L :	/*	default melody voice */
		dBankNo = 0x00L;
		dProgNo = pVi->dProgNo;
		break;
	case 0x01L :	/*	extend melody voice	*/
		dBankNo = (UINT32)(1L + dPhrCh);
		break;
	default :	/*	no voice	*/
		dBankNo = 0x00L;
		dProgNo = 0x00L;
		break;
	}

	MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L, MASNDDRV_CMD_PROGRAM_CHANGE,
						 dCh, dBankNo, dProgNo);
	return (1L);
}

/****************************************************************************
 *	CnvProgramChange2
 *
 *	Function:
 *			Put Program Change to sound driver(for LV2).
 *	Argument:
 *			dCh		#Channel(0..15)
 *			dProgNo	Program Number(0..127)
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	CnvProgramChange2(UINT32 dCh, UINT32 dProgNo)
{
	UINT32			dPhrCh;
	UINT32			dBankNo;
	PMALIBVOCINFO	pVi;
	PMAPHRCHINFO	pCi = &(gPhrInfo.sChInfo[dCh]);

	if(dProgNo > 127L)	return (0L);

	pCi->dProgNo	= dProgNo;
	dPhrCh			= (UINT32)(dCh >> 2);
	switch(pCi->dBankNo) {
	case 0x00L :	/*	default melody voice	*/
		dBankNo	= 0x00L;
		break;
	case 0x01L :	/*	extend melody voice	*/
		pVi = &(gPhrInfo.sApiInfo[dPhrCh].sDataInfo.sVocInfo[0]);
		pVi = GetVoiceInfo(0x01L, dProgNo, pVi);
		if(pVi == NULL) {	/*	not found extend voice	*/
			dBankNo	= 0x00L;
			dProgNo	= 0x00L;
		}
		else {				/*	found extend voice	*/
			dBankNo	= (UINT32)(0x01L + dPhrCh);
		}
		break;
	case 0x80L :	/*	default drum voice	*/
		dBankNo	= 0x80L;
		dProgNo	= 0x00L;
		break;
	case 0x81L :	/*	extend drum voice	*/
		dBankNo	= (UINT32)(0x81L + dPhrCh);
		dProgNo	= 0x00L;
		break;
	default :
		return (0L);
	}

	MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L, MASNDDRV_CMD_PROGRAM_CHANGE,
								 dCh, dBankNo, dProgNo);
	return (1L);
}

/****************************************************************************
 *	CnvChannelVolume
 *
 *	Function:
 *			Put Channel Volume to sound driver.
 *	Argument:
 *			dCh		#Channel(0..15)
 *			dVol	Volume(0..127)
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	CnvChannelVolume(UINT32 dCh, UINT32 dVol)
{
	PMAPHRCHINFO	pCi = &(gPhrInfo.sChInfo[dCh]);

	if(dVol > 127L)	return (0L);

	if(pCi->dVolume != dVol) {
		MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
							MASNDDRV_CMD_CHANNEL_VOLUME, dCh, dVol, 0L);
		pCi->dVolume = dVol;	/*	update	*/
		return (1L);
	}
	return (0L);
}

/****************************************************************************
 *	CnvModulation
 *
 *	Function:
 *			Put Modulation Depth to sound driver.
 *	Argument:
 *			dCh		#Channel(0..15)
 *			dMod	Modulation(0..4)
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	CnvModulation(UINT32 dCh, UINT32 dMod)
{
	PMAPHRCHINFO	pCi = &(gPhrInfo.sChInfo[dCh]);

	if(dMod > 4L)	return (0L);

	if(pCi->dMod != dMod) {
		MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
							MASNDDRV_CMD_MODULATION_DEPTH, dCh, dMod, 0L);
		pCi->dMod = dMod;	/*	update	*/
		return (1L);
	}
	return (0L);
}

/****************************************************************************
 *	CnvExpression
 *
 *	Function:
 *			Put Expression to sound driver.
 *	Argument:
 *			dCh		#Channel(0..15)
 *			dExp	Expression(0..127)
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	CnvExpression(UINT32 dCh, UINT32 dExp)
{
	PMAPHRCHINFO	pCi = &(gPhrInfo.sChInfo[dCh]);

	if(dExp > 127L)	return (0L);

	if(pCi->dExp != dExp) {
		MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
							MASNDDRV_CMD_EXPRESSION, dCh, dExp, 0L);
		pCi->dExp = dExp;	/*	update	*/
		return (1L);
	}
	return (0L);
}

/****************************************************************************
 *	CnvPanpot
 *
 *	Function:
 *			Put Panpot to sound driver.
 *	Argument:
 *			dCh		#Channel(0..15)
 *			dPan	Panpot(0..127)
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	CnvPanpot(UINT32 dCh, UINT32 dPan)
{
	PMAPHRCHINFO	pCi = &(gPhrInfo.sChInfo[dCh]);

	if(dPan > 127L)	return (0L);

	if(pCi->dPan != dPan) {
		MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
							MASNDDRV_CMD_PANPOT, dCh, dPan, 0L);
		pCi->dPan = dPan;	/*	update	*/
		return (1L);
	}
	return (0L);
}

/****************************************************************************
 *	CnvPitchBendRange
 *
 *	Function:
 *			Update PitchBend Range.
 *	Argument:
 *			dCh		#Channel(0..15)
 *			dRange	PitchBend Range(0..24)
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	PitchBendRange(UINT32 dCh, UINT32 dRange)
{
	if(dRange > 24L)	return (0L);

	gPhrInfo.sChInfo[dCh].dNewRange = dRange;

	return (0L);
}

/****************************************************************************
 *	CnvPitchBend
 *
 *	Function:
 *			Put PitchBend to sound driver.
 *	Argument:
 *			dCh		#Channel(0..15)
 *			dPitch	PitchBend(0..127)
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	CnvPitchBend(UINT32 dCh, UINT32 dPitch)
{
	SINT32			sdRet = 1L;
	PMAPHRCHINFO	pCi = &(gPhrInfo.sChInfo[dCh]);

	if(dPitch > 127L)	return (0L);

	if(pCi->dRange != pCi->dNewRange) {
		pCi->dRange = pCi->dNewRange;	/*	update	*/
		MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
							MASNDDRV_CMD_BEND_RANGE, dCh, pCi->dRange, 0L);
		sdRet++;
	}

	MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
						MASNDDRV_CMD_PITCH_BEND, dCh, (UINT32)(dPitch << 7), 0L);
	pCi->dPitch = dPitch;	/*	update	*/
	return (sdRet);
}

/****************************************************************************
 *	CnvNoteOff
 *
 *	Function:
 *			Put NoteOff to sound driver.
 *	Argument:
 *			dCh		#Channel(0..15)
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	CnvNoteOff(UINT32 dCh)
{
	PMAPHRCHINFO	pCi = &(gPhrInfo.sChInfo[dCh]);

	/*
	MAPHRCNV_DBGMSG(("CnvNoteOff[%d] \n", bCh));
	*/

	if(pCi->dNoteOffTime != 0xFFFFFFFF) {
		MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
							MASNDDRV_CMD_NOTE_OFF_MA2, dCh, pCi->dKey, 0L);
		pCi->dNoteOffTime = 0xFFFFFFFF;
		return (1L);
	}

	return (0L);
}

/****************************************************************************
 *	CnvNoteOn
 *
 *	Function:
 *			Put NoteOn to sound driver(for LV1).
 *	Argument:
 *			dCh				#Channel(0..15)
 *			dOct			OctaveShift(0..3)
 *			dKey			Key Number(1..12)
 *			dNoteOffTime	NoteOff time[tick]
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	CnvNoteOn(UINT32 dCh, UINT32 dOct, UINT32 dKey,
														 UINT32 dNoteOffTime)
{
	SINT32			sdKey;
	SINT32			sdOct;
	PMAPHRCHINFO	pCi = &(gPhrInfo.sChInfo[dCh]);

	sdOct	= (SINT32)(dOct + pCi->sdOctShift + 3L);
	sdKey	= (SINT32)((sdOct * 12L) + dKey);

	/*	Process for when nNote is out of the range (Note[0..127])	*/
	if(sdKey < 0L)			sdKey = 0L;
	else if(sdKey > 127L)	sdKey = 127L;

	/*	Velocity 127 fixed */
	/*
	MAPHRCNV_DBGMSG(("CnvNoteOn[%d %d %02X %08lX] -> [%02X]\n", dCh,
										dOct, dKey, dNoteOffTime, dNote));
	*/

	MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L,
						MASNDDRV_CMD_NOTE_ON_MA2, dCh, (UINT32)sdKey, 0x7FL);
	pCi->dKey			= (UINT32)sdKey;
	pCi->dNoteOffTime	= dNoteOffTime;
	return (1L);
}

/****************************************************************************
 *	CnvNoteOn
 *
 *	Function:
 *			Put NoteOn to sound driver(for LV2).
 *	Argument:
 *			dCh				#Channel(0..15)
 *			dOct			OctaveShift(0..3)
 *			dKey			Key Number(1..12)
 *			dNoteOffTime	NoteOff time[tick]
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	CnvNoteOn2(UINT32 dCh, UINT32 dOct, UINT32 dKey,
														 UINT32 dNoteOffTime)
{
	SINT32			sdKey;
	SINT32			sdOct;
	PMALIBVOCINFO	pVi;
	PMAPHRCHINFO	pCi = &(gPhrInfo.sChInfo[dCh]);

	if((dKey < 1L) || (12L < dKey)) {
		pCi->dNoteOffTime = 0xFFFFFFFF;
		return (0L);
	}

	switch(pCi->dBankNo) {
	case 0x00L :
	case 0x01L :	/*	default or extend melody voice	*/
		sdOct = (SINT32)(dOct + pCi->sdOctShift + 3L);
		sdKey = (SINT32)((sdOct * 12L) + dKey);
		if(sdKey < 0L)			sdKey = 0L;
		else if(127L < sdKey)	sdKey = 127L;
		break;
	case 0x80L :	/*	default drum voice	*/
		sdKey = (SINT32)(dOct * 12L + dKey + 34L);	/*	1..48 -> 35..82	*/
		break;
	case 0x81L :	/*	extend drum voice	*/
		sdKey	= (SINT32)(dOct * 12L + dKey);		/*	1..48	*/
		pVi		= &(gPhrInfo.sApiInfo[(dCh >> 2)].sDataInfo.sVocInfo[0]);
		pVi		= GetVoiceInfo(0x81L, (UINT32)sdKey, pVi);
		if(pVi == NULL) {	/*	not found extend voice	*/
			pCi->dNoteOffTime = 0xFFFFFFFF;
			return (0L);
		}
		break;
	default :
		pCi->dNoteOffTime = 0xFFFFFFFF;
		return (0L);
	}

	MaSndDrv_SetCommand(gPhrInfo.sdSeqId, -1L, MASNDDRV_CMD_NOTE_ON_MA2,
				dCh, (UINT32)sdKey, pCi->dVelocity);
	pCi->dKey			= (UINT32)sdKey;
	pCi->dNoteOffTime	= dNoteOffTime;
	return (1L);
}

/****************************************************************************
 *	CnvExclusiveMessage
 *
 *	Function:
 *			Interpret the exclusive mesage and
 *			Put command to sound driver(for LV1).
 *	Argument:
 *			dPhrCh	Sequence Number(0..3)
 *			pbExMsg	Pointer to exclusive message.
 *			dSize	Size of exlusive message.
 *	Return:
 *			Number of put command.
 *
 ****************************************************************************/
static SINT32	CnvExclusiveMessage(UINT32 dPhrCh, UINT8* pbExMsg, UINT32 dSize)
{
	UINT32			dCh;
	UINT32			dBlkFnum;
	SINT32			sdRet;
	PMAPHRCHINFO	pCi;

	MAPHRCNV_DBGMSG(("CnvExclusiveMessage[%d %08lX %08lX] \n",
												 dPhrCh, pbExMsg, dSize));

	if(dSize != 6L) return (0L);

	sdRet = 0L;
	if(	(pbExMsg[0] == 0x43)	&&
		(pbExMsg[1] == 0x03)	&&
		(pbExMsg[2] == 0x90)	&&
		(pbExMsg[5] == 0xF7)) {			/*	Extend NoteOn/Off	*/

		dCh	= (UINT32)((pbExMsg[3] & 0x03) + (dPhrCh << 2));
		pCi	= &(gPhrInfo.sChInfo[dCh]);

		if((pbExMsg[3] & 0xF0) == 0xC0) {
			pCi->dExNoteFlag |= 0x02L;
			pCi->dRegH = (UINT32)pbExMsg[4];
		}
		else if((pbExMsg[3] & 0xF0) == 0xB0) {
			pCi->dExNoteFlag |= 0x01L;
			pCi->dRegL = (UINT32)pbExMsg[4];
		}
		else {
			return (0L);
		}

		if((pCi->dExNoteFlag & 0x03L) == 0x03L) {

⌨️ 快捷键说明

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