mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-13 15:40:57 +00:00
![Jerome Fisher](/assets/img/avatar_default.png)
- Signedness fix. - Changed partial age to 32-bit... They don't exactly run until the heat-death of the universe. svn-id: r15943
283 lines
7.6 KiB
C++
283 lines
7.6 KiB
C++
/* Copyright (c) 2003-2004 Various contributors
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to
|
|
* deal in the Software without restriction, including without limitation the
|
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
* sell copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
* IN THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef MT32EMU_STRUCTURES_H
|
|
#define MT32EMU_STRUCTURES_H
|
|
|
|
namespace MT32Emu {
|
|
|
|
const unsigned int MAX_SAMPLE_OUTPUT = 4096;
|
|
|
|
#ifdef _MSC_VER
|
|
#define MT32EMU_ALIGN_PACKED __declspec(align(1))
|
|
typedef unsigned __int64 Bit64u;
|
|
typedef signed __int64 Bit64s;
|
|
#else
|
|
#define MT32EMU_ALIGN_PACKED __attribute__((packed))
|
|
typedef unsigned long long Bit64u;
|
|
typedef signed long long Bit64s;
|
|
#endif
|
|
|
|
typedef unsigned int Bit32u;
|
|
typedef signed int Bit32s;
|
|
typedef unsigned short int Bit16u;
|
|
typedef signed short int Bit16s;
|
|
typedef unsigned char Bit8u;
|
|
typedef signed char Bit8s;
|
|
|
|
// The following structures represent the MT-32's memory
|
|
// Since sysex allows this memory to be written to in blocks of bytes,
|
|
// we keep this packed so that we can copy data into the various
|
|
// banks directly
|
|
#if defined(_MSC_VER) || defined (__MINGW32__)
|
|
#pragma pack(push, 1)
|
|
#else
|
|
#pragma pack(1)
|
|
#endif
|
|
|
|
struct TimbreParam {
|
|
struct commonParam {
|
|
char name[10];
|
|
Bit8u pstruct12; // 1&2 0-12 (1-13)
|
|
Bit8u pstruct34; // #3&4 0-12 (1-13)
|
|
Bit8u pmute; // 0-15 (0000-1111)
|
|
Bit8u nosustain; // 0-1(Normal, No sustain)
|
|
} MT32EMU_ALIGN_PACKED common;
|
|
|
|
struct partialParam {
|
|
struct wgParam {
|
|
Bit8u coarse; // 0-96 (C1,C#1-C9)
|
|
Bit8u fine; // 0-100 (-50 to +50 (cents?))
|
|
Bit8u keyfollow; // 0-16 (-1,-1/2,0,1,1/8,1/4,3/8,1/2,5/8,3/4,7/8,1,5/4,3/2,2.s1,s2)
|
|
Bit8u bender; // 0,1 (ON/OFF)
|
|
Bit8u waveform; // 0-1 (SQU/SAW)
|
|
Bit8u pcmwave; // 0-127 (1-128)
|
|
Bit8u pulsewid; // 0-100
|
|
Bit8u pwvelo; // 0-14 (-7 - +7)
|
|
} MT32EMU_ALIGN_PACKED wg;
|
|
|
|
struct envParam {
|
|
Bit8u depth; // 0-10
|
|
Bit8u sensitivity; // 1-100
|
|
Bit8u timekeyfollow; // 0-4
|
|
Bit8u time[4]; // 1-100
|
|
Bit8u level[5]; // 1-100 (-50 - +50)
|
|
} MT32EMU_ALIGN_PACKED env;
|
|
|
|
struct lfoParam {
|
|
Bit8u rate; // 0-100
|
|
Bit8u depth; // 0-100
|
|
Bit8u modsense; // 0-100
|
|
} MT32EMU_ALIGN_PACKED lfo;
|
|
|
|
struct tvfParam {
|
|
Bit8u cutoff; // 0-100
|
|
Bit8u resonance; // 0-30
|
|
Bit8u keyfollow; // 0-16 (-1,-1/2,1/4,0,1,1/8,1/4,3/8,1/2,5/8,3/2,7/8,1,5/4,3/2,2,s1,s2)
|
|
Bit8u biaspoint; // 0-127 (<1A-<7C >1A-7C)
|
|
Bit8u biaslevel; // 0-14 (-7 - +7)
|
|
Bit8u envdepth; // 0-100
|
|
Bit8u envsense; // 0-100
|
|
Bit8u envdkf; // DEPTH KEY FOLL0W 0-4
|
|
Bit8u envtkf; // TIME KEY FOLLOW 0-4
|
|
Bit8u envtime[5]; // 1-100
|
|
Bit8u envlevel[4]; // 1-100
|
|
} MT32EMU_ALIGN_PACKED tvf;
|
|
|
|
struct tvaParam {
|
|
Bit8u level; // 0-100
|
|
Bit8u velosens; // 0-100
|
|
Bit8u biaspoint1; // 0-127 (<1A-<7C >1A-7C)
|
|
Bit8u biaslevel1; // 0-12 (-12 - 0)
|
|
Bit8u biaspoint2; // 0-127 (<1A-<7C >1A-7C)
|
|
Bit8u biaslevel2; // 0-12 (-12 - 0)
|
|
Bit8u envtkf; // TIME KEY FOLLOW 0-4
|
|
Bit8u envvkf; // VELOS KEY FOLL0W 0-4
|
|
Bit8u envtime[5]; // 1-100
|
|
Bit8u envlevel[4]; // 1-100
|
|
} MT32EMU_ALIGN_PACKED tva;
|
|
} MT32EMU_ALIGN_PACKED partial[4];
|
|
} MT32EMU_ALIGN_PACKED;
|
|
|
|
struct PatchParam {
|
|
Bit8u timbreGroup; // TIMBRE GROUP 0-3 (group A, group B, Memory, Rhythm)
|
|
Bit8u timbreNum; // TIMBRE NUMBER 0-63
|
|
Bit8u keyShift; // KEY SHIFT 0-48 (-24 - +24 semitones)
|
|
Bit8u fineTune; // FINE TUNE 0-100 (-50 - +50 cents)
|
|
Bit8u benderRange; // BENDER RANGE 0-24
|
|
Bit8u assignMode; // ASSIGN MODE 0-3 (POLY1, POLY2, POLY3, POLY4)
|
|
Bit8u reverbSwitch; // REVERB SWITCH 0-1 (OFF,ON)
|
|
Bit8u dummy; // (DUMMY)
|
|
} MT32EMU_ALIGN_PACKED;
|
|
|
|
struct MemParams {
|
|
struct PatchTemp {
|
|
PatchParam patch;
|
|
Bit8u outlevel; // OUTPUT LEVEL 0-100
|
|
Bit8u panpot; // PANPOT 0-14 (R-L)
|
|
Bit8u dummyv[6];
|
|
} MT32EMU_ALIGN_PACKED patchSettings[8];
|
|
|
|
struct RhythmTemp {
|
|
Bit8u timbre; // TIMBRE 0-94 (M1-M64,R1-30,OFF)
|
|
Bit8u outlevel; // OUTPUT LEVEL 0-100
|
|
Bit8u panpot; // PANPOT 0-14 (R-L)
|
|
Bit8u reverbSwitch; // REVERB SWITCH 0-1 (OFF,ON)
|
|
} MT32EMU_ALIGN_PACKED rhythmSettings[86]; // FIXME: Was 64, but let's support the next model...
|
|
|
|
TimbreParam MT32EMU_ALIGN_PACKED timbreSettings[8];
|
|
|
|
PatchParam MT32EMU_ALIGN_PACKED patches[128];
|
|
|
|
struct PaddedTimbre {
|
|
TimbreParam timbre;
|
|
Bit8u padding[10];
|
|
} MT32EMU_ALIGN_PACKED timbres[64 + 64 + 64 + 30]; // Group A, Group B, Memory, Rhythm
|
|
|
|
struct SystemArea {
|
|
Bit8u masterTune; // MASTER TUNE 0-127 432.1-457.6Hz
|
|
Bit8u reverbMode; // REVERB MODE 0-3 (room, hall, plate, tap delay)
|
|
Bit8u reverbTime; // REVERB TIME 0-7 (1-8)
|
|
Bit8u reverbLevel; // REVERB LEVEL 0-7 (1-8)
|
|
Bit8u reserveSettings[9]; // PARTIAL RESERVE (PART 1) 0-32
|
|
Bit8u chanAssign[9]; // MIDI CHANNEL (PART1) 0-16 (1-16,OFF)
|
|
Bit8u masterVol; // MASTER VOLUME 0-100
|
|
} MT32EMU_ALIGN_PACKED system;
|
|
};
|
|
|
|
struct MemBanks {
|
|
Bit8u pTemp[8][sizeof(MemParams::PatchTemp)];
|
|
Bit8u rTemp[86][sizeof(MemParams::RhythmTemp)];
|
|
Bit8u tTemp[8][sizeof(TimbreParam)];
|
|
Bit8u patchBank[128][sizeof(PatchParam)];
|
|
Bit8u timbreBank[64 + 64 + 64 + 30][sizeof(MemParams::PaddedTimbre)];
|
|
Bit8u systemBank[sizeof(MemParams::SystemArea)];
|
|
// System memory 0x100000
|
|
// Display 0x200000
|
|
// Reset 0x7F0000
|
|
};
|
|
|
|
#if defined(_MSC_VER) || defined (__MINGW32__)
|
|
#pragma pack(pop)
|
|
#else
|
|
#pragma pack()
|
|
#endif
|
|
|
|
struct PCMWaveEntry {
|
|
Bit32u addr;
|
|
Bit32u len;
|
|
double tune;
|
|
bool loop;
|
|
};
|
|
|
|
struct soundaddr {
|
|
Bit16u pcmplace;
|
|
Bit16u pcmoffset;
|
|
};
|
|
|
|
struct StereoVolume {
|
|
Bit16s leftvol;
|
|
Bit16s rightvol;
|
|
};
|
|
|
|
// This is basically a per-partial, pre-processed combination of timbre and patch/rhythm settings
|
|
struct PatchCache {
|
|
bool playPartial;
|
|
bool PCMPartial;
|
|
int pcm;
|
|
char waveform;
|
|
int pulsewidth;
|
|
int pwsens;
|
|
|
|
float pitch;
|
|
|
|
int lfodepth;
|
|
int lforate;
|
|
Bit32u lfoperiod;
|
|
int modsense;
|
|
|
|
float pitchKeyfollow;
|
|
|
|
int filtkeyfollow;
|
|
|
|
int tvfbias;
|
|
int tvfblevel;
|
|
int tvfdir;
|
|
|
|
int ampbias[2];
|
|
int ampblevel[2];
|
|
int ampdir[2];
|
|
|
|
int ampdepth;
|
|
int ampenvdir;
|
|
int amplevel;
|
|
int tvfdepth;
|
|
|
|
bool useBender;
|
|
float benderRange; // 0.0, 1.0, .., 24.0 (semitones)
|
|
|
|
TimbreParam::partialParam::envParam pitchEnv;
|
|
TimbreParam::partialParam::tvaParam ampEnv;
|
|
TimbreParam::partialParam::tvfParam filtEnv;
|
|
|
|
Bit32s ampsustain;
|
|
Bit32s pitchsustain;
|
|
Bit32s filtsustain;
|
|
|
|
Bit32u structureMix;
|
|
int structurePosition;
|
|
int structurePair;
|
|
|
|
// The following fields are actually common to all partials in the timbre
|
|
bool dirty;
|
|
Bit32u partialCount;
|
|
bool sustain;
|
|
float pitchShift;
|
|
bool reverb;
|
|
const StereoVolume *pansetptr;
|
|
};
|
|
|
|
class Partial; // Forward reference for class defined in partial.h
|
|
|
|
struct dpoly {
|
|
bool isPlaying;
|
|
|
|
unsigned int key;
|
|
int freqnum;
|
|
int vel;
|
|
|
|
bool isDecay;
|
|
|
|
const Bit32u *volumeptr;
|
|
|
|
Partial *partials[4];
|
|
|
|
bool pedalhold; // This marks keys that have been released on the keyboard, but are being held by the pedal
|
|
bool sustain;
|
|
|
|
bool isActive() const;
|
|
Bit32u getAge() const;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|