1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
/* 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_PARTIAL_H
#define MT32EMU_PARTIAL_H
namespace MT32Emu {
struct envstatus {
Bit32s envpos;
Bit32s envstat;
Bit32s envbase;
Bit32s envdist;
Bit32s envsize;
bool sustaining;
bool decaying;
Bit32s prevlevel;
Bit32s counter;
Bit32s count;
};
class Synth;
// Class definition of MT-32 partials. 32 in all.
class Partial {
private:
Synth *synth; // Only used for sending debug output
int ownerPart; // -1 if unassigned
int mixType;
int structurePosition; // 0 or 1 of a structure pair
bool useNoisePair;
Bit16s myBuffer[MAX_SAMPLE_OUTPUT];
bool play;
// Keyfollowed note value
int noteVal;
// Keyfollowed filter values
int realVal;
int filtVal;
envstatus envs[3];
int pulsewidth;
Bit32u lfoPos;
soundaddr partialOff;
Bit32u ampEnvCache;
Bit32u pitchEnvCache;
float history[32];
bool pitchSustain;
int loopPos;
dpoly *poly;
Bit16s *mixBuffers(Bit16s * buf1, Bit16s * buf2, int len);
Bit16s *mixBuffersRingMix(Bit16s * buf1, Bit16s * buf2, int len);
Bit16s *mixBuffersRing(Bit16s * buf1, Bit16s * buf2, int len);
void mixBuffersStereo(Bit16s * buf1, Bit16s * buf2, Bit16s * outBuf, int len);
Bit32s getFiltEnvelope();
Bit32s getAmpEnvelope();
Bit32s getPitchEnvelope();
void initKeyFollow(int freqNum);
public:
PatchCache *patchCache;
PatchCache cachebackup;
Partial *pair;
bool alreadyOutputed;
Bit64s age;
Partial(Synth *synth);
int getOwnerPart();
bool isActive();
void activate(int part);
void deactivate(void);
void startPartial(dpoly *usePoly, PatchCache *useCache, Partial *pairPartial);
void startDecay(int envnum, Bit32s startval);
void startDecayAll();
bool shouldReverb();
// Returns true only if data written to buffer
// This function (unlike the one below it) returns processed stereo samples
// made from combining this single partial with its pair, if it has one.
bool produceOutput(Bit16s * partialBuf, long length);
// This function produces mono sample output using the partial's private internal buffer
Bit16s *generateSamples(long length);
};
}
#endif
|