📄 masnddrv.c
字号:
/****************************************************************************
*
* Copyright (C) 2002-2003 YAMAHA CORPORATION. All rights reserved.
*
* Module : masnddrv.c
*
* Description : MA Sound Driver
*
* Version : 2.7.13 2003.08.22
*
****************************************************************************/
#include "mamachdep.h"
#include "madefs.h"
#include "masnddrv.h"
#include "matable.h"
#if MASMW_SRMCNV_HVS
#include "mahvdrv.h"
#endif
#include "masnddva.h"
#include "maresmgr.h"
#include "masndseq.h"
#include "madevdrv.h"
/*--------------------------------------------------------------------------*/
/* macro definitions */
/*--------------------------------------------------------------------------*/
#define MAKE_TIMER_PART(num, delta_time) \
{ \
if ( delta_time >= 0 ) \
{ \
pbPacketBuf[num++] = (UINT8)( 0x80 ); \
} \
}
#define MAKE_ADDRESS_PART(num, reg_index) \
{ \
pbPacketBuf[num++] = (UINT8)( reg_index & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( (reg_index >> 7) | 0x80 ); \
}
#define MAKE_KEY_ON(num, voice_id, vo_volume, pitch, ch, mtr, led) \
{ \
pbPacketBuf[num++] = (UINT8)( (voice_id >> 7) & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( voice_id & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( (vo_volume & 0x7C) \
| ((mtr << 1) & 0x02) \
| ( led & 0x01)); \
pbPacketBuf[num++] = (UINT8)( (pitch >> 7) & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( pitch & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( (0x40 + ch) | 0x80 ); \
}
#define MAKE_KEY_OFF(num, ch) \
{ \
pbPacketBuf[num++] = (UINT8)( ch | 0x80 ); \
}
#define MAKE_VEL_PITCH(num, vo_volume, pitch, mtr, led) \
{ \
pbPacketBuf[num++] = (UINT8)( (vo_volume & 0x7C) \
| ((mtr << 1) & 0x02) \
| ( led & 0x01)); \
pbPacketBuf[num++] = (UINT8)( (pitch >> 7) & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( pitch | 0x80 ); \
}
#define MAKE_PITCH(num, pitch) \
{ \
pbPacketBuf[num++] = (UINT8)( (pitch >> 7) & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( pitch | 0x80 ); \
}
#define MAKE_MUTE(num, ch) \
{ \
pbPacketBuf[num++] = (UINT8)( (0x20 + ch) | 0x80 ); \
}
#define MAKE_RST(num, ch) \
{ \
pbPacketBuf[num++] = (UINT8)( (0x10 + ch) | 0x80 ); \
}
#define MAKE_RST_MUTE(num, ch) \
{ \
pbPacketBuf[num++] = (UINT8)( (0x30 + ch) | 0x80 ); \
}
#define MAKE_CHANNEL_VOLUME(num, volume, interp) \
{ \
pbPacketBuf[num++] = (UINT8)( (volume & 0x7C) \
| (interp & 0x01) | 0x80 ); \
}
#define MAKE_PANPOT(num, pan, interp) \
{ \
pbPacketBuf[num++] = (UINT8)( (pan & 0x7C) \
| (interp & 0x01) | 0x80 ); \
}
#define MAKE_SFX(num, sfx) \
{ \
pbPacketBuf[num++] = (UINT8)( sfx | 0x80 ); \
}
#define MAKE_STREAM_ON(num, ram_adrs, vo_volume, pitch, ch, mtr, led) \
{ \
pbPacketBuf[num++] = (UINT8)( (ram_adrs >> 7) & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( ram_adrs & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( (vo_volume & 0x7C) \
| ((mtr << 1) & 0x02) \
| ( led & 0x01)); \
pbPacketBuf[num++] = (UINT8)( (pitch >> 7) & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( (pitch & 0x7F) | 0x80 ); \
}
#define MAKE_STREAM_OFF(num, ch) \
{ \
pbPacketBuf[num++] = (UINT8)( ch | 0x30 | 0x80 ); \
}
#define MAKE_SOFTINT_RAM(num, ram_val) \
{ \
pbPacketBuf[num++] = (UINT8)( ram_val | 0x80 ); \
}
#define MAKE_SOFTINT(num, int_val) \
{ \
pbPacketBuf[num++] = (UINT8)( int_val | 0x80 ); \
}
#define MAKE_LED(num, led) \
{ \
pbPacketBuf[num++] = (UINT8)( led | 0x80 ); \
}
#define MAKE_MOTOR(num, mtr) \
{ \
pbPacketBuf[num++] = (UINT8)( mtr | 0x80 ); \
}
#define MAKE_PITCH_BEND(num, bend) \
{ \
pbPacketBuf[num++] = (UINT8)( (bend >> 7) & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( bend | 0x80 ); \
}
#define MAKE_NOP(num, reg_index) \
{ \
pbPacketBuf[num++] = (UINT8)( reg_index & 0x7F ); \
pbPacketBuf[num++] = (UINT8)( (reg_index >> 7) | 0x80 ); \
pbPacketBuf[num++] = (UINT8)( 0x00 | 0x80 ); \
}
#define MAKE_FCOFFSET(num, lfo_rst, fc_offset) \
{ \
pbPacketBuf[num++] = (UINT8)( (lfo_rst & 0x40 ) \
| ((fc_offset >> 7) & 0x3F )); \
pbPacketBuf[num++] = (UINT8)( fc_offset | 0x80 ); \
}
#define MAKE_LPFQ(num, lpfq) \
{ \
pbPacketBuf[num++] = (UINT8)( lpfq | 0x80 ); \
}
#define MAKE_LPFFC3(num, lpfcof) \
{ \
pbPacketBuf[num++] = (UINT8)( (lpfcof >> 7) & 0x3F ); \
pbPacketBuf[num++] = (UINT8)( (lpfcof & 0x7F) | 0x80 ); \
}
#define MAKE_LPFCLR_OFF(num) \
{ \
pbPacketBuf[num++] = (UINT8)( 0xC0 ); \
}
#define MAKE_FIX_DISABLE(num) \
{ \
pbPacketBuf[num++] = (UINT8)( 0x00 ); \
pbPacketBuf[num++] = (UINT8)( 0x00 ); \
pbPacketBuf[num++] = (UINT8)( 0x00 ); \
pbPacketBuf[num++] = (UINT8)( 0x00 ); \
pbPacketBuf[num++] = (UINT8)( 0x00 ); \
pbPacketBuf[num++] = (UINT8)( 0x00 ); \
pbPacketBuf[num++] = (UINT8)( 0x00 ); \
pbPacketBuf[num++] = (UINT8)( 0x80 ); \
}
/*--------------------------------------------------------------------------*/
/* Definitions */
/*--------------------------------------------------------------------------*/
#define MASNDDRV_DEFAULT_MASTER_VOLUME (100)
#define MASNDDRV_DEFAULT_API_VOLUME (100)
#define MASNDDRV_DEFAULT_API_BALANCE (127)
#define MASNDDRV_MAI_EXT_CTRL (0xBC)
#define MASNDDRV_DEFAULT_HV_CH_VOLUME (100)
/* control sequener status */
#define MASNDDRV_STATUS_IDLE (0)
#define MASNDDRV_STATUS_REGISTERED (1)
#define MASNDDRV_STATUS_PLAYING (2)
#define MASNDDRV_STATUS_WAITING (3)
/* for device control */
#define MASNDDRV_LED_MODE_OFF (0)
#define MASNDDRV_LED_MODE_DIRECT (1)
#define MASNDDRV_LED_MODE_SYNC (2)
#define MASNDDRV_MTR_MODE_OFF (0)
#define MASNDDRV_MTR_MODE_DIRECT (1)
#define MASNDDRV_MTR_MODE_SYNC (2)
#define MASNDDRV_LED_SYNC (1)
#define MASNDDRV_MTR_SYNC (2)
#define MASNDDRV_NUM_DEVICETYPE (3)
#define MASNDDRV_NUM_BANK3 (38)
#define MASNDDRV_RESMODE1_NORMAL (0)
#define MASNDDRV_RESMODE1_MA2 (1)
#define MASNDDRV_RESMODE1_MA3 (2)
#define MASNDDRV_RESMODE2_NORMAL (0)
#define MASNDDRV_RESMODE2_MA5MONO (1)
#define MASNDDRV_WTVOL_MODE_MA3 (0)
#define MASNDDRV_WTVOL_MODE_NORMAL (1)
#define MASNDDRV_DIRECT_TIMERCOUNT (20)
#define MASNDDRV_HV_TIMERCOUNT (20)
#define MASNDDRV_FM_VOICE (1)
#define MASNDDRV_WT_VOICE (2)
#define MASNDDRV_ST_VOICE (3)
#define MASNDDRV_AL_VOICE (4)
#define MASNDDRV_FM_SLOT (0)
#define MASNDDRV_WT_SLOT (1)
#define MASNDDRV_ST_SLOT (2)
#define MASNDDRV_MODE_MONO (0)
#define MASNDDRV_MODE_POLY (1)
/* timer */
/* 2.85742 * 7 [ms] */
#define MASNDDRV_TIMER_MST (0x4D)
#define MASNDDRV_TIMER_COUNT (7)
/* slot */
#define MASNDDRV_NUM_SLOT (MA_MAX_FM_SLOT+MA_MAX_WT_SLOT+MA_MAX_STREAM_AUDIO)
#define MASNDDRV_MAX_FM_SLOT (15)
#define MASNDDRV_MAX_FM_EXT_SLOT (31)
#define MASNDDRV_MIN_WT_SLOT (32)
#define MASNDDRV_MAX_WT_SLOT (47)
#define MASNDDRV_MAX_WT_EXT_SLOT (63)
#define MASNDDRV_MIN_STM_SLOT (64)
#define MASNDDRV_MAX_STM_SLOT (65)
#define MASNDDRV_MASK_FM_SLOT (0x1F)
#define MASNDDRV_MASK_WT_SLOT (0x1F)
/* create parameter */
#define MASNDDRV_MAX_CNVMODE (0x7F) /* maximum value of cnv_mode */
#define MASNDDRV_MAX_RESMODE (5) /* maximum value of res_mode */
/* voice */
#define MASNDDRV_MAX_REG_VOICE (128)
#define MASNDDRV_MAX_RAM_BANK (16)
#define MASNDDRV_NUM_VOICEINFO (2) /* number of voice information */
#define MASNDDRV_NUM_SETBANK (16)
#define MASNDDRV_NUM_ALVOICE (16)
#define MASNDDRV_MASK_ALVOICE (0xF)
#define MASNDDRV_MASK_ALFLAG (0x80)
#define MASNDDRV_MASK_ALNOISE (0x02)
/* stream */
#define MASNDDRV_STMADPCM_ENDPOINT (0x07C0) /* steram audio ADPCM end point */
#define MASNDDRV_STMADPCM_ST_ENDPOINT (0x03E0) /* stream audio ADPCM stereo end point */
#define MASNDDRV_STMPCM_ENDPOINT (0x03DF) /* stream audio PCM end point */
#define MASNDDRV_STMPCM_ST_ENDPOINT (0x01EF) /* stream audio PCM stereo end point */
#define MASNDDRV_STM16PCM_ENDPOINT (0x01EF) /* stream audio 16bit PCM end point */
#define MASNDDRV_STM16PCM_ST_ENDPOINT (0x00F7) /* stream audio 16bit PCM stereo end point */
#define MASNDDRV_MAX_DB (192)
#define MASNDDRV_FS (48000)
#define MASNDDRV_MIN_GML1_DRUM (35) /* minimum number of GM Level1 drum */
#define MASNDDRV_MAX_GML1_DRUM (81) /* maximum number of GM Level1 drum */
/*--- for DVA ---*/
#define MASNDDRV_MASK_MODE (0xC0)
/*--- for HV ---*/
#define MASNDDRV_NUM_HVTYPE (2)
#define MASNDDRV_HV_NOTE_ON (0)
#define MASNDDRV_HV_NOTE_OFF (1)
#define MASNDDRV_HV_SET_VOICE (2)
#define MASNDDRV_HV_PROGRAM_CHANGE (3)
#define MASNDDRV_HV_PITCH_BEND (4)
#define MASNDDRV_HV_PITCH_BEND_SENS (5)
#define MASNDDRV_HV_PROSODIC_PITCH_BEND_SENS (6)
#define MASNDDRV_HV_FRAME_ON (37)
#define MASNDDRV_HV_FRAME_OFF (1)
#define MASNDDRV_HV_FRAME_NORMAL (28)
#define MASNDDRV_HV_FRAME_CHANGE (36)
#define MASNDDRV_HV_EXCHANNEL (127)
#define MASNDDRV_HV_CHANNEL_NUMBER (0)
#define MASNDDRV_HV_EXIST (0x80)
#define MASNDDRV_DUMMY_HVDRVFUNC \
{ \
dummy_mahvdrv_Initialize, \
dummy_mahvdrv_SetDictionary, \
dummy_mahvdrv_SetCommand, \
dummy_mahvdrv_Generate, \
dummy_mahvdrv_Terminate \
}
/*--- for AL ---*/
#define MASNDDRV_MAX_LPFQ (0x1F)
#define MASNDDRV_MIN_LPFCOF (0x0008)
#define MASNDDRV_MAX_LPFCOF (0x1FF8)
#define MASNDDRV_KEY_CENTER (60)
/* mask for setcommand */
#define MASNDDRV_MASK_CHANNEL (0x0F)
#define MASNDDRV_MASK_KEY (0x7F)
#define MASNDDRV_MASK_BANK (0xFF)
#define MASNDDRV_MASK_PROGRAM (0x7F)
#define MASNDDRV_MASK_VOLUME (0x7F)
#define MASNDDRV_MASK_XVB (0xF8)
#define MASNDDRV_MASK_SUS (0xEF)
#define MASNDDRV_MASK_BEND (0x3FFF)
#define MASNDDRV_MASK_DEPTH (0x07)
#define MASNDDRV_MASK_WAVEID (0x1F)
#define MASNDDRV_MASK_LPF (0x7F)
#define MASNDDRV_MASK_HVEVENT (0x3F)
/* for coase tune, fine tune */
#define MASNDDRV_MASK_COASETUNE (0x7F)
#define MASNDDRV_MASK_FINETUNE (0x3FFF)
#define MASNDDRV_MAX_HW_PITCHBEND (0x0FFF)
/*--------------------------------------------------------------------------*/
/* Struct Definitions */
/*--------------------------------------------------------------------------*/
typedef struct _MASNDDRVCHINFO
{
UINT8 bBankNo; /* bank number */
UINT8 bProgNo; /* program number */
UINT8 bPoly; /* poly/mono */
UINT8 bSfx; /* sfx */
UINT8 bVolume; /* volume */
UINT8 bExpression; /* expression */
UINT8 bBendRange; /* bend range */
UINT8 bKeyControl; /* key control */
UINT8 bNoteOn; /* note on */
UINT8 bSlotNo; /* slot number */
UINT8 bAlFlag; /* al flag bit7=1:alch, bit0-6=1:al voice number */
UINT8 bLedSync; /* led sync flag 1:sync */
UINT8 bMtrSync; /* motor sync flag 1:sync */
UINT8 bVolInterp; /* volume interpolation 0:off 1:on */
UINT8 bPcFlag; /* program change flag 0:none 1:done for AL */
UINT32 dLpfQ; /* AL resonance */
UINT32 dLpfCof; /* AL brightness */
SINT32 sdLpfQShift; /* AL resonance shift value */
SINT32 sdLpfCofShift; /* AL brightness shift value */
UINT32 dPitchBend; /* pitchbend value [6.10] (default:0x0400) */
UINT32 dCoaseTune; /* coase tune value [6.10] (default:0x0400) */
UINT32 dFineTune; /* fine tune value [6.10] (default:0x0400) */
UINT32 dTunePitch; /* (coase tune * fine tune) [6.10] (default:0x0400) */
} MASNDDRVCHINFO, *PMASNDDRVCHINFO;
typedef struct _MASNDDRVSTREAMINFO
{
UINT8 bFormat; /* format */
UINT8 bPan; /* pan */
UINT32 dFrequency; /* frequency */
UINT32 dSeekP; /* seek point (byte) */
} MASNDDRVSTMINFO, * PMASNDDRVSTMINFO;
typedef struct _MASNDDRVSLOTINFO
{
UINT8 bCh; /* channel number */
UINT32 dKey; /* key number */
} MASNDDRVSLOTINFO;
typedef struct _MASNDDRVVOICEINFO
{
UINT16 wBankProg; /* bank, program number */
UINT8 bSynth; /* synth type */
UINT16 wKey; /* key number */
UINT16 wRamAdrs; /* ram address */
} MASNDDRVVOICEINFO, * PMASNDDRVVOICEINFO;
typedef struct _MASNDDRVALVOICEINFO
{
UINT32 dBankNo; /* bank number */
UINT32 dProgNo; /* program number */
UINT8 *pAlVoice; /* pointer to AL voice parameter */
UINT32 dAlVoiceSize; /* size of AL voice parameter */
} MASNDDRVALVOICEINFO, * PMASNDDRVALVOICEINFO;
typedef struct _MASNDDRVVINFO
{
UINT8 bSynth; /* synth type */
UINT16 wKey; /* key number */
UINT16 wAddress; /* address */
} MASNDDRVVINFO, * PMASNDDRVVINFO;
typedef struct _MASNDDRVLEDINFO
{
UINT32 dCtrl; /* control 0:off 1:direct 2:sync */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -