windows-nt/Source/XPSP1/NT/drivers/ddk/wdmaudio/fmsynth/miniport.h
2020-09-26 16:20:57 +08:00

299 lines
8 KiB
C

//
// Copyright (c) 1997-2000 Microsoft Corporation. All rights reserved.
//
// ======================================================================
// miniport.h
// defines globals used by miniport.cpp
//
// ======================================================================
/* MIDI defines */
#define NUMCHANNELS (16)
#define NUMPATCHES (256)
#define DRUMCHANNEL (9) /* midi channel 10 */
#define BCODE
#define fEnabled TRUE
#define AsULMUL(a, b) ((DWORD)((DWORD)(a) * (DWORD)(b)))
#define AsLSHL(a, b) ((DWORD)((DWORD)(a) << (DWORD)(b)))
#define AsULSHR(a, b) ((DWORD)((DWORD)(a) >> (DWORD)(b)))
#define AsMemCopy CopyMemory
// indexed FM registers
#define AD_LSI (0x000)
#define AD_LSI2 (0x101)
#define AD_TIMER1 (0x001)
#define AD_TIMER2 (0x002)
#define AD_MASK (0x004)
#define AD_CONNECTION (0x104)
#define AD_NEW (0x105)
#define AD_NTS (0x008)
#define AD_MULT (0x020)
#define AD_MULT2 (0x120)
#define AD_LEVEL (0x040)
#define AD_LEVEL2 (0x140)
#define AD_AD (0x060)
#define AD_AD2 (0x160)
#define AD_SR (0x080)
#define AD_SR2 (0x180)
#define AD_FNUMBER (0x0a0)
#define AD_FNUMBER2 (0x1a0)
#define AD_BLOCK (0x0b0)
#define AD_BLOCK2 (0x1b0)
#define AD_DRUM (0x0bd)
#define AD_FEEDBACK (0x0c0)
#define AD_FEEDBACK2 (0x1c0)
#define AD_WAVE (0x0e0)
#define AD_WAVE2 (0x1e0)
/* transformation of linear velocity value to
logarithmic attenuation */
BYTE gbVelocityAtten[64] = {
40, 37, 35, 33, 31, 29, 27, 25, 24, 22, 21, 20, 19, 18, 17, 16,
16, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8,
7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3,
2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 };
/*
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
*/
BYTE BCODE gbPercMap[53][2] =
{
{ 0, 35 },
{ 0, 35 },
{ 2, 52 },
{ 3, 48 },
{ 4, 58 },
{ 5, 60 },
{ 6, 47 },
{ 7, 43 },
{ 6, 49 },
{ 9, 43 },
{ 6, 51 },
{ 11, 43 },
{ 6, 54 },
{ 6, 57 },
{ 14, 72 },
{ 6, 60 },
{ 16, 76 },
{ 17, 84 },
{ 18, 36 },
{ 19, 76 },
{ 20, 84 },
{ 21, 83 },
{ 22, 84 },
{ 23, 24 },
{ 16, 77 },
{ 25, 60 },
{ 26, 65 },
{ 27, 59 },
{ 28, 51 },
{ 29, 45 },
{ 30, 71 },
{ 31, 60 },
{ 32, 58 },
{ 33, 53 },
{ 34, 64 },
{ 35, 71 },
{ 36, 61 },
{ 37, 61 },
{ 38, 48 },
{ 39, 48 },
{ 40, 69 },
{ 41, 68 },
{ 42, 63 },
{ 43, 74 },
{ 44, 60 },
{ 45, 80 },
{ 46, 64 },
{ 47, 69 },
{ 48, 73 },
{ 49, 75 },
{ 50, 68 },
{ 51, 48 },
{ 52, 53 }
} ;
/* typedefs for MIDI patches */
#define PATCH_1_4OP (0) /* use 4-operator patch */
#define PATCH_2_2OP (1) /* use two 2-operator patches */
#define PATCH_1_2OP (2) /* use one 2-operator patch */
#define NUM2VOICES 18
#define NUMOPS 4
#pragma pack (1)
typedef struct _operStruct {
BYTE bAt20; /* flags which are send to 0x20 on fm */
BYTE bAt40; /* flags seet to 0x40 */
/* the note velocity & midi velocity affect total level */
BYTE bAt60; /* flags sent to 0x60 */
BYTE bAt80; /* flags sent to 0x80 */
BYTE bAtE0; /* flags send to 0xe0 */
} operStruct;
typedef struct _noteStruct {
operStruct op[NUMOPS]; /* operators */
BYTE bAtA0[2]; /* send to 0xA0, A3 */
BYTE bAtB0[2]; /* send to 0xB0, B3 */
/* use in a patch, the block should be 4 to indicate
normal pitch, 3 => octave below, etc. */
BYTE bAtC0[2]; /* sent to 0xc0, C3 */
BYTE bOp; /* see PATCH_??? */
BYTE bDummy; /* place holder */
} noteStruct;
typedef struct _patchStruct {
noteStruct note; /* note. This is all in the structure at the moment */
} patchStruct;
#include "patch.h"
#pragma pack()
/* MIDI */
typedef struct _voiceStruct {
BYTE bNote; /* note played */
BYTE bChannel; /* channel played on */
BYTE bPatch; /* what patch is the note,
drums patch = drum note + 128 */
BYTE bOn; /* TRUE if note is on, FALSE if off */
BYTE bVelocity; /* velocity */
BYTE bJunk; /* filler */
DWORD dwTime; /* time that was turned on/off;
0 time indicates that its not in use */
DWORD dwOrigPitch[2]; /* original pitch, for pitch bend */
BYTE bBlock[2]; /* value sent to the block */
BYTE bSusHeld; /* turned off, but held on by sustain */
} voiceStruct;
/* a bit of tuning information */
#define FSAMP (50000.0) /* sampling frequency */
#define PITCH(x) ((DWORD)((x) * (double) (1L << 19) / FSAMP))
/* x is the desired frequency,
== FNUM at b=1 */
#define EQUAL (1.059463094359)
#ifdef EUROPE
# define A (442.0)
#else
# define A (440.0)
#endif
#define ASHARP (A * EQUAL)
#define B (ASHARP * EQUAL)
#define C (B * EQUAL / 2.0)
#define CSHARP (C * EQUAL)
#define D (CSHARP * EQUAL)
#define DSHARP (D * EQUAL)
#define E (DSHARP * EQUAL)
#define F (E * EQUAL)
#define FSHARP (F * EQUAL)
#define G (FSHARP * EQUAL)
#define GSHARP (G * EQUAL)
/* operator offset location */
static WORD BCODE gw2OpOffset[ NUM2VOICES ][ 2 ] =
{
{ 0x000,0x003 },
{ 0x001,0x004 },
{ 0x002,0x005 },
{ 0x008,0x00b },
{ 0x009,0x00c },
{ 0x00a,0x00d },
{ 0x010,0x013 },
{ 0x011,0x014 },
{ 0x012,0x015 },
{ 0x100,0x103 },
{ 0x101,0x104 },
{ 0x102,0x105 },
{ 0x108,0x10b },
{ 0x109,0x10c },
{ 0x10a,0x10d },
{ 0x110,0x113 },
{ 0x111,0x114 },
{ 0x112,0x115 },
} ;
/* pitch values, from middle c, to octave above it */
static DWORD BCODE gdwPitch[12] = {
PITCH(C), PITCH(CSHARP), PITCH(D), PITCH(DSHARP),
PITCH(E), PITCH(F), PITCH(FSHARP), PITCH(G),
PITCH(GSHARP), PITCH(A), PITCH(ASHARP), PITCH(B)};