• Jump To … +
    index.js conga.js cowbell.js hihat.js kick.js mini.js monosynth.js pluck.js snare.js tom.js tonewheel.js delay.js feedback-comb-filter.js filter.js gain-envelope.js gain.js lfo.js mono-buffer.js noise.js osc-bank.js osc.js pulse.js sample.js soft-clipper.js source.js vca.js vcf.js vco.js wave-shaper.js synth.js
  • ¶

    SoftClipper

    import { createAudioNode } from "../synth"
    import WaveShaper from "./wave-shaper"
  • ¶

    Structure

    Input -> Gain -> WaveShaper -> Output

    let curve = null
    
    /**
     * Create a SoftClipper
     */
    export default function SoftClipper (ac, state) {
      const clipper = createAudioNode(ac, "Gain", SoftClipper.params)
      clipper.drive = clipper.gain
      if (!curve) curve = createSoftClipperCurve()
      const shaper = WaveShaper(ac, curve, "2x")
      clipper.connect(shaper)
      clipper.connect = shaper.connect.bind(shaper)
      return clipper.update(state)
    }
    SoftClipper.params = ["drive"]
    
    function createSoftClipperCurve () {
      const n = 65536
      const curve = new Float32Array(n)
      for (let i = 0; i < n; i++) {
        const x = (i - (n / 2)) / (n / 2)
        curve[i] = Math.tanh(x)
      }
      return curve
    }