aboutsummaryrefslogtreecommitdiff
path: root/backends/midi/mt32/partial.h
blob: 20160dca5fc7f6809ac2a0c0ca18d199128fd718 (plain)
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