View source: R/postprocessing.R
| crossFade | R Documentation |
crossFade joins two input vectors (waveforms) by overlapping and
cross-fading them. This is standard for joining two separately generated
sounds without audible artifacts.
crossFade(
x,
y,
crossLen = 15,
crossLen_points = NULL,
samplingRate = NULL,
shape = c("equalPower", "lin", "exp", "log", "cos", "logistic", "gaussian"),
cutToZC = FALSE,
steepness = 1,
SNR = NULL
)
x, y |
two numeric vectors (waveforms) to be joined |
crossLen |
overlap in ms |
crossLen_points |
overlap in points (overrides crossLen) |
samplingRate |
the sampling rate of input vectors, Hz (needed only if crossLen is given in ms rather than points) |
shape |
controls the type of fade function: 'equalPower' = equal power (default), 'lin' = linear, 'exp' = exponential, 'log' = logarithmic, 'cos' = cosine, 'logistic' = logistic S-curve, 'gaussian' = Gaussian curve |
cutToZC |
if TRUE, input vectors are truncated so that |
steepness |
scaling factor regulating the steepness of fading curves (except for shapes 'lin' and 'cos'): 0 = linear, >1 = steeper than default |
SNR |
if a number, the two sounds are normalized so that the RMS
amplitude of |
A numeric vector with the original sampling rate. The length is going
to be length(x) + length(y) - crossLen_points, or a bit less if
cutting to nearest zero crossings.
fade
sound1 = sin(1:100 / 9)
sound2 = sin(7:106 / 3)
plot(c(sound1, sound2), type = 'b')
# an ugly discontinuity at 100 that will make an audible click
sound = crossFade(sound1, sound2, crossLen_points = 25)
plot(sound, type = 'b') # a nice, smooth transition
length(sound) # but note that cross-fading costs us crossLen_points = 25
# points even without cutting to zc, and much more if we trim to
# zero crossings and then overlap
sound = crossFade(sound1, sound2, crossLen_points = 25,
SNR = 6) # make sound1 6 dB louder (RMS) than sound2
plot(sound, type = 'b') # a nice, smooth transition
# Actual sounds, alternative shapes of fade-in/out
sound3 = soundgen(formants = 'a', pitch = 200, sylLen = 300,
addSilence = 0, attackLen = c(50, 0))
sound4 = soundgen(formants = 'u', pitch = 200, sylLen = 300,
addSilence = 0, attackLen = c(0, 50))
# simple concatenation (with a click)
cf1 = c(sound3, sound4)
osc(cf1, 16000, from = .25, to = .35)
# playme(cf1, 16000)
# concatenation from zc to zc (no click, but a rough transition)
cf2 = crossFade(sound3, sound4, crossLen_points = 0, cutToZC = TRUE)
osc(cf2, 16000, from = .25, to = .35)
# playme(cf2, 16000)
# crossFade over 35 ms - brief, but smooth
cf3 = crossFade(sound3, sound4, crossLen = 35, samplingRate = 16000)
osc(cf3, 16000, from = .25, to = .35)
# playme(cf3, 16000)
# equal-power cross-fade over 300 ms (shortens the sound by ~300 ms)
cf4 = crossFade(sound3, sound4, samplingRate = 16000,
crossLen = 300, shape = 'equalPower')
osc(cf4, 16000)
# playme(cf4, 16000)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.