1
/******************************************/
2
/* Algorithm 6 (TX81Z) Subclass of */
3
/* 4 Operator FM Synth */
4
/* by Perry R. Cook, 1995-96 */
5
/* This connection topology is three */
6
/* Carriers and a common Modulator */
9
/* 4-|-->2 - +-> Out */
12
/* Controls: control1 = vowel */
13
/* control2 = spectral tilt */
14
/* control3 = LFO speed */
15
/* modWheel = LFO amount */
17
/******************************************/
21
FM4Alg6 :: FM4Alg6() : FM4Op()
23
/* We still don't make the waves here yet, because */
24
/* we still don't know what they will be. */
31
MY_FLOAT FM4Alg6 :: tick()
35
temp = gains[3] * adsr[3]->tick() * waves[3]->tick();
36
temp2 = vibWave->tick() * modDepth * (MY_FLOAT) 0.1; /* Calculate frequency mod */
38
waves[0]->setFreq(baseFreq * ((MY_FLOAT) 1.0 + temp2) * ratios[0]);
39
waves[1]->setFreq(baseFreq * ((MY_FLOAT) 1.0 + temp2) * ratios[1]);
40
waves[2]->setFreq(baseFreq * ((MY_FLOAT) 1.0 + temp2) * ratios[2]);
41
waves[3]->setFreq(baseFreq * ((MY_FLOAT) 1.0 + temp2) * ratios[3]);
43
waves[0]->addPhaseOffset(temp * mods[0]);
44
waves[1]->addPhaseOffset(temp * mods[1]);
45
waves[2]->addPhaseOffset(temp * mods[2]);
46
waves[3]->addPhaseOffset(twozero->lastOut());
48
temp = gains[0] * tilt[0] * adsr[0]->tick() * waves[0]->tick();
49
temp += gains[1] * tilt[1] * adsr[1]->tick() * waves[1]->tick();
50
temp += gains[2] * tilt[2] * adsr[2]->tick() * waves[2]->tick();
52
return temp * (MY_FLOAT) 0.33;
55
void FM4Alg6 :: controlChange(int number, MY_FLOAT value)