📄 mammfcnv.c
字号:
/****************************************************************************
*
* Copyright (C) 2002-2003 YAMAHA CORPORATION. All rights reserved.
*
* Module : mammfcnv.c
*
* Description : SMAF Converter
*
* Version : 2.0.1 2003.09.02
*
****************************************************************************/
#include "masnddrv.h"
#include "mamachdep.h"
#include "madevdrv.h"
#include "maresmgr.h"
#include "malib.h"
#include "mammfcnv.h"
#define MMF_MAX_TRACK_NUM 8
#define MMF_MAX_PHRASE_INFO 7
#define MMF_MAX_EVENT_NUM 10
#define MMF_MAX_NOTE_OFF_NUM 256
#define MMF_MAX_STREAM_DATA_NUM2 62
#define MMF_MAX_STREAM_DATA_NUM3 32
#define MMF_MAX_VOICE_DATA_NUM2 16
#define MMF_MAX_WAVE_DATA_NUM3 127
#define MMF_CHANNEL_NUM 16
#define MMF_FUNC_SUCCESS MASMW_SUCCESS
#define MMF_FUNC_ERROR MASMW_ERROR
#define MMF_ERR_ARGUMENT MASMW_ERROR_ARGUMENT
#define MMF_ERR_FILE MASMW_ERROR_FILE
#define MMF_ERR_CLASS MASMW_ERROR_CONTENTS_CLASS
#define MMF_ERR_TYPE MASMW_ERROR_CONTENTS_TYPE
#define MMF_ERR_SIZE MASMW_ERROR_CHUNK_SIZE
#define MMF_ERR_CHUNK MASMW_ERROR_CHUNK
#define MMF_ERR_NOTAG MASMW_ERROR_UNMATCHED_TAG
#define MMF_ERR_SLENGTH MASMW_ERROR_SHORT_LENGTH
#define MMF_ERR_LLENGTH MASMW_ERROR_LONG_LENGTH
#define MMF_ERR_NODATA MASMW_ERROR_NO_INFORMATION
#define MMF_SEQ_ID_NULL -1
#define MMF_STATUS_IDLE 0
#define MMF_STATUS_SAT_PROFILE 1
#define MMF_STATUS_LOADED 2
#define MMF_CRC_NULL 0xFFFF0000
#define MMF_POSITION_OF_CCLASS 16
#define MMF_POSITION_OF_CTYPE 17
#define MMF_STSP_OFFSET_NULL 0xFFFFFFFF
#define MMF_STSP_TIME_NULL 0xFFFFFFFF
#define MMF_CHUNK_HEADER_SIZE 8
#define MMF_FILE_CRC_SIZE 2
#define MMF_ATR_TRACK_NO MMF_MAX_TRACK_NUM - 1
#define MMF_MINIMUM_TRACKSIZE2 6
#define MMF_MINIMUM_TRACKSIZE3 20
#define MMF_PLAY_TIME_MIN 20
#define MMF_PLAY_TIME_MAX 0x00200000
#define MMF_MA2_VOICE_NOTFOUND 0
#define MMF_MA2_VOICE_FOUND 1
#define MMF_FM_VOICE_MODE_4OP 0
#define MMF_FM_VOICE_MODE_2OP 1
#define MMF_STREAM_ID_INI 0xFF
#define MMF_STREAM_ID_REGIST 0x00
#define MMF_MA2_VOICE_NULL 0xFF
#define MMF_MA3_WAVE_NULL 0xFF
#define MMF_LED_SYNC_STATUS 0x10
#define MMF_VIB_SYNC_STATUS 0x20
#define MMF_KEY_CONTROL_STATUS 0xC0
#define MMF_AL_VOICE_FLAG 0x02
#define MMF_FMWT_VOICE_FLAG 0x01
#define MMF_FM_VOICE_PARAMETER 0x00
#define MMF_WT_VOICE_PARAMETER 0x01
#define MMF_AL_VOICE_PARAM_SIZE 27
#define MMF_2OPFM_VOICE_PARAM_SIZE 17
#define MMF_4OPFM_VOICE_PARAM_SIZE 31
#define MMF_WT_VOICE_PARAM_SIZE 16
#define MMF_MAX_VOICE_PARAM_SIZE MMF_AL_VOICE_PARAM_SIZE + MMF_4OPFM_VOICE_PARAM_SIZE + 2
#define MMF_WT_VOICE_WAVE_SIZE 8192
#define MMF_WAVE_BIN_2S_COMP_8BIT 0x01
#define MMF_WAVE_BIN_OFFSET_8BIT 0x11
#define MMF_WAVE_ADPCM_4BIT 0x20
#define MMF_STREAM_TYPE_8BIT_2SCOMP 3
#define MMF_STREAM_TYPE_8BIT_BINARY 2
#define MMF_STREAM_TYPE_4BIT_ADPCM 1
#define MMF_STREAM_ERROR 0xFF
#define MMF_WAVE_SF_MINIMUM 4000
#define MMF_WAVE_SF_4BIT_MAX 24000
#define MMF_WAVE_SF_8BIT_MAX 12000
#define MMF_API_MASTERVOL_DEFAULT 100
#define MMF_MA1_SEQ_MASTERVOLUME 76
#define MMF_MA2_SEQ_MASTERVOLUME 127
#define MMF_MA3_SEQ_MASTERVOLUME 45
#define MMF_MA5_SEQ_MASTERVOLUME 100
#define MMF_HUFFMAN_TREE_FAILURE 0
#define MMF_HUFFMAN_TREE_SUCCESS 1
#define MMF_LOADINFO_SUCCESS 0
#define MMF_LOADINFO_FAILURE 1
#define MMF_LOADINFO_ERROR MMF_FUNC_ERROR
#define MMF_EXCLUSIVE_CHECK_FAILURE 0
#define MMF_PHRAZE_SIZE_A 8
#define MMF_PHRAZE_SIZE_B 12
#define MMF_TAG_STARTPOINT 0x7374
#define MMF_TAG_STOPPOINT 0x7370
#define MMF_TAG_PHRASE_A 0x5041
#define MMF_TAG_PHRASE_B 0x5042
#define MMF_TAG_PHRASE_E 0x5045
#define MMF_TAG_PHRASE_I 0x5049
#define MMF_TAG_PHRASE_K 0x504B
#define MMF_TAG_PHRASE_R 0x5052
#define MMF_TAG_PHRASE_S 0x5053
#define MMF_SMAF_TYPE_NULL 0
#define MMF_SMAF_TYPE_MA1 1
#define MMF_SMAF_TYPE_MA2 2
#define MMF_SMAF_TYPE_MA3 3
#define MMF_SMAF_TYPE_MA5 5
#define MMF_FM_MODE_2OP32 0
#define MMF_FM_MODE_4OP16 1
#define MMF_P_SOUNDSET_GMX 0
#define MMF_P_SOUNDSET_GML1 2
#define MMF_WT_VOLUME_MA3 0
#define MMF_WT_VOLUME_MA5 4
#define MMF_RESOUCE_MODE_MA3 2
#define MMF_RESOUCE_MODE_MA12 3
#define MMF_RESOUCE_MODE_MA5 4
#define MMF_RESOUCE_MODE_MA5_64 5
#define MMF_SEQUENCETYPE_DERAYED 0
#define MMF_AL_CHANNEL_NULL 0xFF
#define MMF_HV_CHANNEL_NULL 16
#define MMF_BANK_NUMBER_DEF 0
#define MMF_PROGRAM_NUMBER_DEF 0
#define MMF_RESONANCE_DEF 0x40
#define MMF_BRIGHTNESS_DEF 0x40
#define MMF_SETVOLUME_3RD_PARAM 0x07
#define MMF_LED_SEQ_SYNC_OFF 0
#define MMF_LED_SEQ_SYNC_ON 1
#define MMF_VIB_SEQ_SYNC_OFF 0
#define MMF_VIB_SEQ_SYNC_ON 1
#define MMF_KEYCONTROL_ON 2
#define MMF_KEYCONTROL_OFF 1
#define MMF_KEYCONTROL_DEFAULT 0
#define MMF_EVNET_EOS 0xFF
#define MMF_CHANNEL_MODE_POLY 0
#define MMF_CHANNEL_MODE_MONO 1
#define MMF_BANK_NUMBER_DEF 0
#define MMF_PROGRAM_NUMBER_DEF 0
#define MMF_RPN_DEF 0x7F
#define MMF_MODULATION_DEF 0
#define MMF_CHANNEL_VOLUME_DEF 100
#define MMF_CHANNEL_PAN_DEF 0x40
#define MMF_EXPRESSION_DEF 0x7F
#define MMF_HOLD_DEF 0
#define MMF_MONO_POLY_MODE_DEF MMF_CHANNEL_MODE_POLY
#define MMF_PITCH_BEND_DEF 0x40
#define MMF_BEND_RANGE_DEF 2
#define MMF_OCTAVE_SHIFT_DEF 4
#define MMF_VELOCITY_DEF_MA3 90
#define MMF_VELOCITY_DEF_MA5 100
#define MMF_BLOCK_FNUM_DEF 0
#define MMF_STREAM_PAIR_DEF 0xFF
#define MMF_STREAM_PAN_DEF 0xFF
#define MMF_STREAM_PAN_OFF 0x80
#define SNDDRV_DEF_STREAM_PAN 255
#define SNDDRV_DEF_RESONANCE 64
#define SNDDRV_DEF_BRIGHTNESS 64
#define SNDDRV_DEF_CHANNEL_VOLUME 100
#define SNDDRV_DEF_CHANNEL_PANPOT 64
#define SNDDRV_DEF_EXPRESSION 127
#define SNDDRV_DEF_BENDRANGE 2
#define SNDDRV_DEF_PITCHBEND 0x2000
#define MMF_CONVERT_PHASE_PLAY 0x00000000
#define MMF_CONVERT_PHASE_SEEK_G 0x00010000
#define MMF_CONVERT_PHASE_SEEK_C 0x00020000
#define MMF_CONVERT_PHASE_SEEK_END 0x00030000
#define MMF_CONVERT_PHASE_PLAY_END 0x00FF0000
#define MMF_SEEK_EVENT_END 0xFFFF
/* OPDA infomation structure */
typedef struct _tagOption_Info{
UINT8 * pbCnti; /* pointer to CNTI Body */
UINT32 dCntiSize; /* size of CNTI Body */
UINT8 * pbOpda; /* pointer to OPDA Body */
UINT32 dOpdaSize; /* size of OPDA Body */
} OPTIONINFO, *POPTIONINFO;
/* Track information structure */
typedef struct _tagTrack_Info{
UINT8 * pbMtr; /* pointer to MTR(ATR) Body */
UINT32 dMtrSize; /* size of MTR(ATR) Body */
UINT8 * pbMspi; /* pointer to MspI(AspI) Body */
UINT32 dMspiSize; /* size of MspI(AspI) Body */
UINT8 * pbMtsu; /* pointer to Mtsu Body */
UINT32 dMtsuSize; /* size of Mtsu Body */
UINT8 * pbMtsq; /* pointer to Mtsq(Atsq) Body */
UINT32 dMtsqSize; /* size of Mtsq(Atsq) Body */
UINT8 * pbMtsp; /* pointer to Mtsp Body */
UINT32 dMtspSize; /* size of Mtsp Body */
UINT8 * pbMthv; /* pointer to Mthv Body */
UINT32 dMthvSize; /* size of Mthv Body */
UINT32 dPlayTime; /* play time (tick) */
UINT32 dTimeBase; /* time base (msec/tick) */
UINT32 dStartPoint; /* start point(offset) */
UINT32 dStopPoint; /* stop point(offset) */
UINT32 dStartTick; /* start point(tick) */
UINT32 dStopTick; /* stop point(tick) */
} TRACKINFO, *PTRACKINFO;
/* Phrase information structure */
typedef struct _tagPhrase_Info{
UINT32 dStartPoint; /* start point of phrase(offset) */
UINT32 dStopPoint; /* stop point of phrase(offset) */
UINT32 dStartTick; /* start point of phrase(tick) */
UINT32 dStopTick; /* stop point of phrase(tick) */
} PHRASEINFO, *PPHRASEINFO;
/* Huffman information structure */
typedef struct _tagHuffman_Info{
UINT32 dMtsqSize; /* size of Mtsq(Atsq) Body */
UINT32 dSeqSize; /* size of sequence data */
UINT32 dReadSize; /* read data size */
SINT16 swLeft[512]; /* Huffman Tree (Left) */
SINT16 swRight[512]; /* Huffman Tree (Right) */
UINT8 * psBuffer; /* pointer to reference area */
SINT8 sbBitC; /* counter of reference bit */
UINT8 bByte; /* value of reference byte */
UINT8 * psFBuf; /* pointer to sequence data top */
SINT8 sbFBit; /* counter of sequence data top bit */
UINT8 bFByte ; /* value of sequence data top byte */
} HUFFMANINFO, *PHUFFMANINFO;
/* HV information structure */
typedef struct _tagHv_Info{
UINT8* pbVoice; /* pointer to HVP0 chunk header */
UINT32 dVoiceSize; /* size of HV voice parameter */
UINT8* pbScript; /* pointer to Mhsc body */
UINT32 dScriptSize; /* size of Mhsc body */
UINT8 bHvChannel; /* HV channel # */
} HVINFO, *PHVINFO;
/* Load information structure */
typedef struct _tagLoad_Info{
UINT8 * pbMmmd; /* pointer to MMMD top */
UINT32 dMmmdSize; /* size of MMMD (whole) */
UINT32 dCrc; /* file CRC */
UINT32 dSmafType; /* SMAF Type */
UINT32 dPlayTime; /* play time (tick) */
UINT32 dStartTime; /* start time (start point tick) */
UINT32 dTimeBase; /* time base (msec/tick) */
UINT8 (*pfnGetByte)(PHUFFMANINFO psHuf);
OPTIONINFO sOption_Info;
TRACKINFO sTrack_Info[MMF_MAX_TRACK_NUM];
PHRASEINFO sPhrase_Info[MMF_MAX_PHRASE_INFO];
HUFFMANINFO sHuffman_Info;
HVINFO sHV_Info;
} LOADINFO, *PLOADINFO;
/* Stream information structure(for MA-2) */
typedef struct _tagStream_Info2{
UINT8 bStrmID; /* key number of stream */
UINT8 * pbWave; /* pointer to Awa body */
UINT32 dWaveSize; /* size of Awa body */
UINT32 dFs; /* sampling frequency */
} STREAMINFO2, *PSTREAMINFO2;
/* Stream information structure(for MA-3/5) */
typedef struct _tagStream_Info3{
UINT8 fbNote; /* stream data flag */
UINT8 bPairID; /* stream pair ID */
UINT8 bPan; /* stream pan */
} STREAMINFO3, *PSTREAMINFO3;
/* Stream information structure */
typedef struct _tagStream_Info{
STREAMINFO2 sStream_Info2[MMF_MAX_STREAM_DATA_NUM2];
STREAMINFO3 sStream_Info3[MMF_MAX_STREAM_DATA_NUM3];
} STREAMINFO, *PSTREAMINFO;
/* Voice information structure(for MA-1/2) */
typedef struct _tagVoice_Info2{
UINT8 bBank; /* bank number */
UINT8 bProg; /* program number */
} VOICEINFO2, *PVOICEINFO2;
/* Wave information structure(for MA-3/5) */
typedef struct _tagWave_Info3{
UINT32 dAdrs; /* wave address */
UINT32 dSize; /* wave data size */
} WAVEINFO3, *PWAVEINFO3;
/* Voice information structure */
typedef struct _tagVoice_Info{
VOICEINFO2 sVoice_Info2[MMF_MAX_VOICE_DATA_NUM2];
WAVEINFO3 sWave_Info3[MMF_MAX_WAVE_DATA_NUM3];
} VOICEINFO, *PVOICEINFO;
/* Channel information structure */
typedef struct _tagChannel_Info{
UINT8 bBankM; /* bank select MSB */
UINT8 bBankL; /* bank select LSB */
UINT8 bBank; /* bank number (sound driver) */
UINT8 bProg; /* program change */
UINT8 bRpnM; /* RPN MSB */
UINT8 bRpnL; /* RPN LSB */
UINT8 bMod; /* modulation */
UINT8 bChVol; /* channel volume */
UINT8 bPan; /* channel pan */
UINT8 bExp; /* expression */
UINT8 bHold; /* hold */
UINT8 bMono; /* channel mode mono/poly */
UINT8 bPitch; /* pitch bend (MSB) */
UINT8 bSens1; /* pitch bend lenge 1 */
UINT8 bSens2; /* pitch bend lenge 2 */
UINT8 bOct; /* octerve shift */
UINT8 bVel; /* note on velocity */
UINT8 bBlockFnum1; /* ma-2 pitch bend (0xB0) */
UINT8 bBlockFnum2; /* ma-2 pitch bend (0xC0) */
UINT8 fbLed; /* LED synchronous flag */
UINT8 fbVib; /* Motor synchronous flag */
} CHANNELINFO, *PCHANNELINFO;
/* Event information structure */
typedef struct _tagEvent_Block{
UINT32 dEventTime; /* event activation time */
UINT32 dSeqID; /* sequencer ID (sound driver) */
UINT32 dCmd; /* command ID (sound driver) */
UINT32 dParam1; /* parameter 1 */
UINT32 dParam2; /* parameter 2 */
UINT32 dParam3; /* parameter 3 */
UINT8 * pbSeq; /* pointer to next event data */
UINT32 dIndex; /* index of next event */
UINT32 dTrackNo; /* track no. */
void * pvNext; /* pointer to next event block */
} EVENTBLOCK, *PEVENTBLOCK;
/* Note OFF information structure */
typedef struct _tagNoteOff_Block{
UINT32 dOffTime; /* note off activation time */
UINT32 dSeqID; /* sequencer ID (sound driver) */
UINT32 dCmd; /* command ID (sound driver) */
UINT32 dCh; /* channel no. */
UINT32 dKey; /* key no. */
void * pvNext; /* pointer to next note off block */
} OFFBLOCK, *POFFBLOCK;
/* Playback information structure */
typedef struct _tagPlay_Info{
PEVENTBLOCK psNextEvent; /* pointer to next event block */
PEVENTBLOCK psEmptyEvent; /* pointer to empty event block */
POFFBLOCK psNextOff; /* pointer to next note off block */
POFFBLOCK psEmptyOff; /* pointer to empty note off block */
UINT32 dSmafType; /* SMAF Type */
UINT32 dHWTimeBase; /* tick to H/W time base */
UINT32 dPlayTime; /* play time (tick) */
UINT32 dStartTime; /* start time (start point tick) */
UINT32 dSeekTime; /* seek time (msec) */
UINT32 dSeekError; /* seek time error (msec) */
UINT32 dRamAdrs; /* ram address */
UINT32 dRamSize; /* ram size */
UINT32 dSeekParam; /* seek event flag */
UINT32 dPastTime; /* past time (tick) */
UINT8 bMasterVol; /* master volume (sequence) */
UINT8 bEos; /* EOS flag */
UINT16 fwMono; /* channel mode change flag */
UINT8 bResonance; /* resonance */
UINT8 bBrightness; /* brightness */
UINT8 bStreamReserve; /* stream reserve */
UINT8 bAlChReserve; /* AL channel number */
UINT8 bHVChannel; /* HV channel number */
UINT8 bFmVoice; /* FM Voice Mode 0:4op, 1:2op */
UINT8 (*pfnGetByte)(void); /* pointer to byte get function */
SINT32 (*pfnGetEvent)(void); /* pointer to event get function */
STREAMINFO sStream_Info;
VOICEINFO sVoice_Info;
CHANNELINFO sChannel_Info[MMF_CHANNEL_NUM + 1];
EVENTBLOCK sEvent_Block[MMF_MAX_EVENT_NUM];
OFFBLOCK sNoteOff_Block[MMF_MAX_NOTE_OFF_NUM];
} PLAYINFO, *PPLAYINFO;
/* SMAF information structure */
typedef struct _tagSmaf_Info{
SINT32 sdMmfSeqID; /* sequence id (sound driver) */
UINT32 dStatus; /* converter status */
LOADINFO sLoad_Info[2];
PLAYINFO sPlay_Info;
} SMAFINFO, *PSMAFINFO;
static SMAFINFO gsSmaf_Info;
static const UINT8 abBitMaskTable1[8] = {
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
static const UINT16 awBitMaskTable2[8] = {
0x00FF, 0x01FE, 0x03FC, 0x07F8, 0x0FF0, 0x1FE0, 0x3FC0, 0x7F80 };
static const UINT8 abTableA[16] = {
0, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15 };
static const UINT8 abTableD[16] = {
0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
static const UINT8 abExpression2[16] = {
0x80,0x00,0x1f,0x27,0x2f,0x37,0x3f,0x47,0x4f,0x57,0x5f,0x67,0x6f,0x77,0x7f,0x80 };
static const UINT8 abModulation2[16] = {
0x80,0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x60,0x70,0x7f,0x80 };
/*********************************************************************************
* get_4byte
*
* Description:
* SMAF data load (error check and regist)
* Argument:
* pbBuf pointer to top data
* Return:
* nothing
********************************************************************************/
static UINT32 get_4byte(
UINT8* pbBuf
)
{
return (UINT32)( (((UINT32)pbBuf[0]) << 24) +
(((UINT32)pbBuf[1]) << 16) +
(((UINT32)pbBuf[2]) << 8) +
((UINT32)pbBuf[3]));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -