55 lines
2.3 KiB
C
Executable file
55 lines
2.3 KiB
C
Executable file
/*
|
|
CHORUS and FLANGE effects
|
|
Both effects use a delay line to hold previous samples. This allows
|
|
the current sample to be combined in some way with a sample that
|
|
occurred in the past. An obvious effect this would allow would be
|
|
an echo where the current sample is combined with a sample from,
|
|
say, 250 milliseconds ago. The chorus and flange effects do this
|
|
as well but they combine samples from only about 50ms (or less) ago.
|
|
|
|
CHORUS EFFECT
|
|
This combines one or more samples up to about 50ms ago. In this
|
|
library, the additional samples are evenly spread through the
|
|
supplied delay line.
|
|
E.G. If the number of voices is specified as 2 then the effect
|
|
combines the current sample and the oldest sample (the last one in
|
|
the delay line). If the number of voices is 3 then the effect
|
|
combines the most recent sample, the oldest sample and the sample
|
|
in the middle of the delay line.
|
|
For two voices the effect can be represented as:
|
|
result = (sample(0) + sample(dt))/2
|
|
where sample(0) represents the current sample and sample(dt) is
|
|
the sample in the delay line from dt milliseconds ago.
|
|
|
|
FLANGE EFFECT
|
|
This combines only one sample from the delay line but the position
|
|
of that sample varies sinusoidally.
|
|
In this case the effect can be represented as:
|
|
result = sample(0) + sample(dt + depth*sin(2*PI*Fe))
|
|
The value of the sine function is always a number from -1 to +1
|
|
and so the result of depth*(sinFe) is always a number from
|
|
-depth to +depth. Thus, the delayed sample will be selected from
|
|
the range (dt-depth) to (dt+depth). This selection will vary
|
|
at whatever rate is specified as the frequency of the effect Fe.
|
|
|
|
Try these settings:
|
|
#define FLANGE_DELAY_LENGTH (2*AUDIO_BLOCK_SAMPLES)
|
|
and
|
|
int s_idx = 2*FLANGE_DELAY_LENGTH/4;
|
|
int s_depth = FLANGE_DELAY_LENGTH/4;
|
|
double s_freq = 3;
|
|
The flange effect can also produce a chorus effect if a longer
|
|
delay line is used with a slower rate, for example try:
|
|
#define FLANGE_DELAY_LENGTH (12*AUDIO_BLOCK_SAMPLES)
|
|
and
|
|
int s_idx = 3*FLANGE_DELAY_LENGTH/4;
|
|
int s_depth = FLANGE_DELAY_LENGTH/8;
|
|
double s_freq = .0625;
|
|
|
|
When trying out these effects with recorded music as input, it is
|
|
best to use those where there is a solo voice which is clearly
|
|
"in front" of the accompaniment. Tracks which already contain
|
|
flange or chorus effects don't work well.
|
|
|
|
*/
|