R/ShepardTone.R

Defines functions ShepardTone

Documented in ShepardTone

ShepardTone <- function(inMainFreq, inDuration = 1, inSampleFreq = 22050,
                        inPhaseFlag = 1, indBLevel = NULL)
{
  theMinFreq <- 15
  theMaxFreq <- inSampleFreq/2

  N <- round(inDuration*inSampleFreq)
  outSignal <- array(0L, N)
  theTime <- (0:(N-1))/inSampleFreq

  BellCenterFreq <- 1000
  BellMinFreq <- 100

  theFreq <- inMainFreq

    while (theFreq > theMinFreq) {
      theAmpl <- BellShape(log(theFreq/BellCenterFreq),0,
                           log(BellCenterFreq/BellMinFreq),1)
      outSignal <- outSignal + theAmpl*sin(2*pi*theFreq*theTime +
                                           inPhaseFlag*runif(1)*pi)
      theFreq <- theFreq/2
    }

  theFreq <- inMainFreq*2
    while (theFreq < theMaxFreq) {
      theAmpl <- BellShape(log(theFreq/BellCenterFreq),0,
                               log(BellCenterFreq/BellMinFreq),1)
      outSignal <- outSignal + theAmpl*sin(2*pi*theFreq*theTime +
                                           inPhaseFlag*runif(1)*pi)
      theFreq <- theFreq*2
    }

    if (!is.null(indBLevel)){
      outSignal <- AdaptLevel(outSignal, indBLevel)
    }

  return(as.numeric(outSignal))
}
m-vidal/pv01 documentation built on Dec. 2, 2020, 1:24 a.m.