Change timbre of shepard tone: overtones are now nearly harmonic
This commit is contained in:
parent
a629a65194
commit
18acf9eb95
|
@ -40,13 +40,13 @@ void Synth::process(float* output, const uint32_t frames)
|
||||||
phase += hz * sampleInterval;
|
phase += hz * sampleInterval;
|
||||||
phase = frac(phase);
|
phase = frac(phase);
|
||||||
|
|
||||||
//Don't bother rendering anything over the Nyquist rate.
|
//Anti-aliasing: don't bother rendering anything over the Nyquist rate.
|
||||||
if( hz > hzNyq ) break;
|
if( hz > hzNyq ) break;
|
||||||
output[i] += getAmplitude(hz) * (phase > 0.5); // * sin(2.0 * M_PI * phase);
|
output[i] += getAmplitude(hz) * sin(2.0 * M_PI * phase);
|
||||||
|
|
||||||
//Remember phase, move to higher overtone.
|
//Remember phase, move to higher overtone.
|
||||||
phases[(voice + idxFund) & VOICE_MASK] = phase;
|
phases[(voice + idxFund) & VOICE_MASK] = phase;
|
||||||
hz *= ratio;
|
hz *= ratio * (voice + 1.0) / (voice + 2.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
output[i] *= volume / static_cast<double>(NUM_VOICES);
|
output[i] *= volume / static_cast<double>(NUM_VOICES);
|
||||||
|
@ -60,8 +60,8 @@ void Synth::process(float* output, const uint32_t frames)
|
||||||
&& getAmplitude(hzFund) < MIN_VOLUME)
|
&& getAmplitude(hzFund) < MIN_VOLUME)
|
||||||
{
|
{
|
||||||
++idxFund;
|
++idxFund;
|
||||||
hz *= ratio;
|
hz *= 2.0 * ratio;
|
||||||
hzFund *= ratio;
|
hzFund *= 2.0 * ratio;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,8 +72,8 @@ void Synth::process(float* output, const uint32_t frames)
|
||||||
&& getAmplitude(hzFund) > MIN_VOLUME)
|
&& getAmplitude(hzFund) > MIN_VOLUME)
|
||||||
{
|
{
|
||||||
--idxFund;
|
--idxFund;
|
||||||
hz /= ratio;
|
hz /= 2.0 * ratio;
|
||||||
hzFund /= ratio;
|
hzFund /= 2.0 * ratio;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,10 +93,10 @@ void Synth::setFrequencyShift(double in){
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr double minRatio = 1.0;
|
static constexpr double minRatio = 1.0;
|
||||||
static constexpr double maxRatio = 3.0;
|
static constexpr double maxRatio = 1.05;
|
||||||
//Slew to given ratio.
|
//Slew to given inharmonicity ratio.
|
||||||
//0 : next voice is one fifth above previous voice.
|
//0 : next voice is exactly harmonic.
|
||||||
//1 : next voice is one octave above previous voice.
|
//1 : next voice is 5% inharmonic.
|
||||||
void Synth::setTargetRatio(double in){
|
void Synth::setTargetRatio(double in){
|
||||||
targetRatio = minRatio + in * (maxRatio - minRatio);
|
targetRatio = minRatio + in * (maxRatio - minRatio);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue