LMMS
Loading...
Searching...
No Matches
fmopl.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <math.h>
#include "fmopl.h"

Macros

#define INLINE   static inline
#define HAS_YM3812   1
#define PI   3.14159265358979323846
#define OPL_ARRATE   141280 /* RATE 4 = 2826.24ms @ 3.6MHz */
#define OPL_DRRATE   1956000 /* RATE 4 = 39280.64ms @ 3.6MHz */
#define DELTAT_MIXING_LEVEL   (1) /* DELTA-T ADPCM MIXING LEVEL */
#define FREQ_BITS   24 /* frequency turn */
#define FREQ_RATE   (1<<(FREQ_BITS-20))
#define TL_BITS   (FREQ_BITS+2)
#define OPL_OUTSB   (TL_BITS+3-16) /* OPL output final shift 16bit */
#define OPL_MAXOUT   (0x7fff<<OPL_OUTSB)
#define OPL_MINOUT   (-0x8000<<OPL_OUTSB)
#define SIN_ENT   2048
#define ENV_BITS   16
#define EG_ENT   4096
#define EG_OFF   ((2*EG_ENT)<<ENV_BITS) /* OFF */
#define EG_DED   EG_OFF
#define EG_DST   (EG_ENT<<ENV_BITS) /* DECAY START */
#define EG_AED   EG_DST
#define EG_AST   0 /* ATTACK START */
#define EG_STEP   (96.0/EG_ENT) /* OPL is 0.1875 dB step */
#define VIB_ENT   512
#define VIB_SHIFT   (32-9)
#define AMS_ENT   512
#define AMS_SHIFT   (32-9)
#define VIB_RATE   256
#define SLOT1   0
#define SLOT2   1
#define ENV_MOD_RR   0x00
#define ENV_MOD_DR   0x01
#define ENV_MOD_AR   0x02
#define DV   (EG_STEP/2)
#define U(x)
#define SC(db)
#define TL_MAX   (EG_ENT*2) /* limit(tl + ksr + envelope) + sinwave */
#define ML   2
#define LOG_ERR   3 /* ERROR */
#define LOG_WAR   2 /* WARNING */
#define LOG_INF   1 /* INFORMATION */
#define LOG_LEVEL   LOG_ERR
#define LOG(n, x)
#define OP_OUT(slot, env, con)
#define WHITE_NOISE_db   6.0

Functions

INLINE int Limit (int val, int max, int min)
INLINE void OPL_STATUS_SET (FM_OPL *OPL, int flag)
INLINE void OPL_STATUS_RESET (FM_OPL *OPL, int flag)
INLINE void OPL_STATUSMASK_SET (FM_OPL *OPL, int flag)
INLINE void OPL_KEYON (OPL_SLOT *SLOT)
INLINE void OPL_KEYOFF (OPL_SLOT *SLOT)
INLINE UINT32 OPL_CALC_SLOT (OPL_SLOT *SLOT)
static void set_algorythm (OPL_CH *CH)
INLINE void CALC_FCSLOT (OPL_CH *CH, OPL_SLOT *SLOT)
INLINE void set_mul (FM_OPL *OPL, int slot, int v)
INLINE void set_ksl_tl (FM_OPL *OPL, int slot, int v)
INLINE void set_ar_dr (FM_OPL *OPL, int slot, int v)
INLINE void set_sl_rr (FM_OPL *OPL, int slot, int v)
INLINE void OPL_CALC_CH (OPL_CH *CH)
INLINE void OPL_CALC_RH (OPL_CH *CH)
static void init_timetables (FM_OPL *OPL, int ARRATE, int DRRATE)
static int OPLOpenTable (void)
static void OPLCloseTable (void)
INLINE void CSMKeyControll (OPL_CH *CH)
static void OPL_initalize (FM_OPL *OPL)
static void OPLWriteReg (FM_OPL *OPL, int r, int v)
static int OPL_LockTable (void)
static void OPL_UnLockTable (void)
void YM3812UpdateOne (FM_OPL *OPL, INT16 *buffer, int length)
void OPLResetChip (FM_OPL *OPL)
FM_OPLOPLCreate (int type, int clock, int rate)
void OPLDestroy (FM_OPL *OPL)
void OPLSetTimerHandler (FM_OPL *OPL, OPL_TIMERHANDLER TimerHandler, int channelOffset)
void OPLSetIRQHandler (FM_OPL *OPL, OPL_IRQHANDLER IRQHandler, int param)
void OPLSetUpdateHandler (FM_OPL *OPL, OPL_UPDATEHANDLER UpdateHandler, int param)
int OPLWrite (FM_OPL *OPL, int a, int v)
unsigned char OPLRead (FM_OPL *OPL, int a)
int OPLTimerOver (FM_OPL *OPL, int c)

Variables

static const int slot_array [32]
static const UINT32 KSL_TABLE [8 *16]
static const INT32 SL_TABLE [16]
static INT32TL_TABLE
static INT32 ** SIN_TABLE
static INT32AMS_TABLE
static INT32VIB_TABLE
static INT32 ENV_CURVE [2 *EG_ENT+1]
static const UINT32 MUL_TABLE [16]
static INT32 RATE_0 [16]
static int num_lock = 0
static voidcur_chip = NULL
static OPL_CHS_CH
static OPL_CHE_CH
OPL_SLOTSLOT7_1
OPL_SLOTSLOT7_2
OPL_SLOTSLOT8_1
OPL_SLOTSLOT8_2
static INT32 outd [1]
static INT32 ams
static INT32 vib
INT32ams_table
INT32vib_table
static INT32 amsIncr
static INT32 vibIncr
static INT32 feedback2

Macro Definition Documentation

◆ AMS_ENT

#define AMS_ENT   512

◆ AMS_SHIFT

#define AMS_SHIFT   (32-9)

◆ DELTAT_MIXING_LEVEL

#define DELTAT_MIXING_LEVEL   (1) /* DELTA-T ADPCM MIXING LEVEL */

◆ DV

#define DV   (EG_STEP/2)

◆ EG_AED

#define EG_AED   EG_DST

◆ EG_AST

#define EG_AST   0 /* ATTACK START */

◆ EG_DED

#define EG_DED   EG_OFF

◆ EG_DST

#define EG_DST   (EG_ENT<<ENV_BITS) /* DECAY START */

◆ EG_ENT

#define EG_ENT   4096

◆ EG_OFF

#define EG_OFF   ((2*EG_ENT)<<ENV_BITS) /* OFF */

◆ EG_STEP

#define EG_STEP   (96.0/EG_ENT) /* OPL is 0.1875 dB step */

◆ ENV_BITS

#define ENV_BITS   16

◆ ENV_MOD_AR

#define ENV_MOD_AR   0x02

◆ ENV_MOD_DR

#define ENV_MOD_DR   0x01

◆ ENV_MOD_RR

#define ENV_MOD_RR   0x00

◆ FREQ_BITS

#define FREQ_BITS   24 /* frequency turn */

◆ FREQ_RATE

#define FREQ_RATE   (1<<(FREQ_BITS-20))

◆ HAS_YM3812

#define HAS_YM3812   1

◆ INLINE

#define INLINE   static inline

◆ LOG

#define LOG ( n,
x )

◆ LOG_ERR

#define LOG_ERR   3 /* ERROR */

◆ LOG_INF

#define LOG_INF   1 /* INFORMATION */

◆ LOG_LEVEL

#define LOG_LEVEL   LOG_ERR

◆ LOG_WAR

#define LOG_WAR   2 /* WARNING */

◆ ML

#define ML   2

◆ OP_OUT

#define OP_OUT ( slot,
env,
con )
Value:
slot->wavetable[((slot->Cnt+con)/(0x1000000/SIN_ENT))&(SIN_ENT-1)][env]
#define SIN_ENT
Definition fmopl.c:83

◆ OPL_ARRATE

#define OPL_ARRATE   141280 /* RATE 4 = 2826.24ms @ 3.6MHz */

◆ OPL_DRRATE

#define OPL_DRRATE   1956000 /* RATE 4 = 39280.64ms @ 3.6MHz */

◆ OPL_MAXOUT

#define OPL_MAXOUT   (0x7fff<<OPL_OUTSB)

◆ OPL_MINOUT

#define OPL_MINOUT   (-0x8000<<OPL_OUTSB)

◆ OPL_OUTSB

#define OPL_OUTSB   (TL_BITS+3-16) /* OPL output final shift 16bit */

◆ PI

#define PI   3.14159265358979323846

◆ SC

#define SC ( db)
Value:
(INT32)((db*((3/EG_STEP)*(1<<ENV_BITS)))+EG_DST)
#define EG_STEP
Definition fmopl.c:99
#define EG_DST
Definition fmopl.c:95
#define ENV_BITS
Definition fmopl.c:87
long INT32
Definition jmorecfg.h:161

◆ SIN_ENT

#define SIN_ENT   2048

◆ SLOT1

#define SLOT1   0

◆ SLOT2

#define SLOT2   1

◆ TL_BITS

#define TL_BITS   (FREQ_BITS+2)

◆ TL_MAX

#define TL_MAX   (EG_ENT*2) /* limit(tl + ksr + envelope) + sinwave */

◆ U

#define U ( x)
Value:
((UINT32)(x))
unsigned x[BMAX+1]
Definition inflate.c:1586
unsigned int UINT32
Definition fmopl.h:18

◆ VIB_ENT

#define VIB_ENT   512

◆ VIB_RATE

#define VIB_RATE   256

◆ VIB_SHIFT

#define VIB_SHIFT   (32-9)

◆ WHITE_NOISE_db

#define WHITE_NOISE_db   6.0

Function Documentation

◆ CALC_FCSLOT()

INLINE void CALC_FCSLOT ( OPL_CH * CH,
OPL_SLOT * SLOT )

◆ CSMKeyControll()

INLINE void CSMKeyControll ( OPL_CH * CH)

◆ init_timetables()

void init_timetables ( FM_OPL * OPL,
int ARRATE,
int DRRATE )
static

◆ Limit()

INLINE int Limit ( int val,
int max,
int min )

◆ OPL_CALC_CH()

INLINE void OPL_CALC_CH ( OPL_CH * CH)

◆ OPL_CALC_RH()

INLINE void OPL_CALC_RH ( OPL_CH * CH)

◆ OPL_CALC_SLOT()

INLINE UINT32 OPL_CALC_SLOT ( OPL_SLOT * SLOT)

◆ OPL_initalize()

void OPL_initalize ( FM_OPL * OPL)
static

◆ OPL_KEYOFF()

INLINE void OPL_KEYOFF ( OPL_SLOT * SLOT)

◆ OPL_KEYON()

INLINE void OPL_KEYON ( OPL_SLOT * SLOT)

◆ OPL_LockTable()

int OPL_LockTable ( void )
static

◆ OPL_STATUS_RESET()

INLINE void OPL_STATUS_RESET ( FM_OPL * OPL,
int flag )

◆ OPL_STATUS_SET()

INLINE void OPL_STATUS_SET ( FM_OPL * OPL,
int flag )

◆ OPL_STATUSMASK_SET()

INLINE void OPL_STATUSMASK_SET ( FM_OPL * OPL,
int flag )

◆ OPL_UnLockTable()

void OPL_UnLockTable ( void )
static

◆ OPLCloseTable()

void OPLCloseTable ( void )
static

◆ OPLCreate()

FM_OPL * OPLCreate ( int type,
int clock,
int rate )

◆ OPLDestroy()

void OPLDestroy ( FM_OPL * OPL)

◆ OPLOpenTable()

int OPLOpenTable ( void )
static

◆ OPLRead()

unsigned char OPLRead ( FM_OPL * OPL,
int a )

◆ OPLResetChip()

void OPLResetChip ( FM_OPL * OPL)

◆ OPLSetIRQHandler()

void OPLSetIRQHandler ( FM_OPL * OPL,
OPL_IRQHANDLER IRQHandler,
int param )

◆ OPLSetTimerHandler()

void OPLSetTimerHandler ( FM_OPL * OPL,
OPL_TIMERHANDLER TimerHandler,
int channelOffset )

◆ OPLSetUpdateHandler()

void OPLSetUpdateHandler ( FM_OPL * OPL,
OPL_UPDATEHANDLER UpdateHandler,
int param )

◆ OPLTimerOver()

int OPLTimerOver ( FM_OPL * OPL,
int c )

◆ OPLWrite()

int OPLWrite ( FM_OPL * OPL,
int a,
int v )

◆ OPLWriteReg()

void OPLWriteReg ( FM_OPL * OPL,
int r,
int v )
static

◆ set_algorythm()

void set_algorythm ( OPL_CH * CH)
static

◆ set_ar_dr()

INLINE void set_ar_dr ( FM_OPL * OPL,
int slot,
int v )

◆ set_ksl_tl()

INLINE void set_ksl_tl ( FM_OPL * OPL,
int slot,
int v )

◆ set_mul()

INLINE void set_mul ( FM_OPL * OPL,
int slot,
int v )

◆ set_sl_rr()

INLINE void set_sl_rr ( FM_OPL * OPL,
int slot,
int v )

◆ YM3812UpdateOne()

void YM3812UpdateOne ( FM_OPL * OPL,
INT16 * buffer,
int length )

Variable Documentation

◆ ams

INT32 ams
static

◆ AMS_TABLE

INT32* AMS_TABLE
static

◆ ams_table

INT32* ams_table

◆ amsIncr

INT32 amsIncr
static

◆ cur_chip

void* cur_chip = NULL
static

◆ E_CH

OPL_CH* E_CH
static

◆ ENV_CURVE

INT32 ENV_CURVE[2 *EG_ENT+1]
static

◆ feedback2

INT32 feedback2
static

◆ KSL_TABLE

const UINT32 KSL_TABLE[8 *16]
static

◆ MUL_TABLE

const UINT32 MUL_TABLE[16]
static
Initial value:
= {
ML/2, 1*ML, 2*ML, 3*ML, 4*ML, 5*ML, 6*ML, 7*ML,
8*ML, 9*ML,10*ML,10*ML,12*ML,12*ML,15*ML,15*ML
}
#define ML
Definition fmopl.c:206

◆ num_lock

int num_lock = 0
static

◆ outd

INT32 outd[1]
static

◆ RATE_0

INT32 RATE_0[16]
static
Initial value:
=
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}

◆ S_CH

OPL_CH* S_CH
static

◆ SIN_TABLE

INT32** SIN_TABLE
static

◆ SL_TABLE

const INT32 SL_TABLE[16]
static
Initial value:
={
SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7),
SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)
}
#define SC(db)
Definition fmopl.c:181

◆ SLOT7_1

OPL_SLOT* SLOT7_1

◆ SLOT7_2

OPL_SLOT * SLOT7_2

◆ SLOT8_1

OPL_SLOT * SLOT8_1

◆ SLOT8_2

OPL_SLOT * SLOT8_2

◆ slot_array

const int slot_array[32]
static
Initial value:
=
{
0, 2, 4, 1, 3, 5,-1,-1,
6, 8,10, 7, 9,11,-1,-1,
12,14,16,13,15,17,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1
}

◆ TL_TABLE

INT32* TL_TABLE
static

◆ vib

INT32 vib
static

◆ VIB_TABLE

INT32* VIB_TABLE
static

◆ vib_table

INT32* vib_table

◆ vibIncr

INT32 vibIncr
static