{"version":3,"sources":["jsdelivr-header.js","/npm/jsfxr@1.3.0/sfxr.js"],"names":[],"mappings":"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","file":"/npm/jsfxr@1.3.0/sfxr.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/jsfxr@1.3.0/sfxr.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","// Wave shapes\nvar SQUARE = 0;\nvar SAWTOOTH = 1;\nvar SINE = 2;\nvar NOISE = 3;\n\n// Playback volume\nvar masterVolume = 1;\n\nvar OVERSAMPLING = 8;\n\n/*** Core data structure ***/\n\n// Sound generation parameters are on [0,1] unless noted SIGNED & thus\n// on [-1,1]\nfunction Params() {\n  this.oldParams = true;  // Note what structure this is\n\n  // Wave shape\n  this.wave_type = SQUARE;\n\n  // Envelope\n  this.p_env_attack = 0;   // Attack time\n  this.p_env_sustain = 0.3;  // Sustain time\n  this.p_env_punch = 0;    // Sustain punch\n  this.p_env_decay = 0.4;    // Decay time\n\n  // Tone\n  this.p_base_freq = 0.3;    // Start frequency\n  this.p_freq_limit = 0;   // Min frequency cutoff\n  this.p_freq_ramp = 0;    // Slide (SIGNED)\n  this.p_freq_dramp = 0;   // Delta slide (SIGNED)\n  // Vibrato\n  this.p_vib_strength = 0; // Vibrato depth\n  this.p_vib_speed = 0;    // Vibrato speed\n\n  // Tonal change\n  this.p_arp_mod = 0;      // Change amount (SIGNED)\n  this.p_arp_speed = 0;    // Change speed\n\n  // Square wave duty (proportion of time signal is high vs. low)\n  this.p_duty = 0;         // Square duty\n  this.p_duty_ramp = 0;    // Duty sweep (SIGNED)\n\n  // Repeat\n  this.p_repeat_speed = 0; // Repeat speed\n\n  // Flanger\n  this.p_pha_offset = 0;   // Flanger offset (SIGNED)\n  this.p_pha_ramp = 0;     // Flanger sweep (SIGNED)\n\n  // Low-pass filter\n  this.p_lpf_freq = 1;     // Low-pass filter cutoff\n  this.p_lpf_ramp = 0;     // Low-pass filter cutoff sweep (SIGNED)\n  this.p_lpf_resonance = 0;// Low-pass filter resonance\n  // High-pass filter\n  this.p_hpf_freq = 0;     // High-pass filter cutoff\n  this.p_hpf_ramp = 0;     // High-pass filter cutoff sweep (SIGNED)\n\n  // Sample parameters\n  this.sound_vol = 0.5;\n  this.sample_rate = 44100;\n  this.sample_size = 8;\n}\n\n/*** Helper functions ***/\n\nfunction sqr(x) { return x * x }\nfunction cube(x) { return x * x * x }\nfunction sign(x) { return x < 0 ? -1 : 1 }\nfunction log(x, b) { return Math.log(x) / Math.log(b); }\nvar pow = Math.pow;\n\nfunction frnd(range) {\n  return Math.random() * range;\n}\n\nfunction rndr(from, to) {\n  return Math.random() * (to - from) + from;\n}\n\nfunction rnd(max) {\n  return Math.floor(Math.random() * (max + 1));\n}\n\n/*** Import/export functions ***/\n\n// http://stackoverflow.com/questions/3096646/how-to-convert-a-floating-point-number-to-its-binary-representation-ieee-754-i\nfunction assembleFloat(sign, exponent, mantissa)\n{\n    return (sign << 31) | (exponent << 23) | (mantissa);\n}\n\nfunction floatToNumber(flt)\n{\n    if (isNaN(flt)) // Special case: NaN\n        return assembleFloat(0, 0xFF, 0x1337); // Mantissa is nonzero for NaN\n\n    var sign = (flt < 0) ? 1 : 0;\n    flt = Math.abs(flt);\n    if (flt == 0.0) // Special case: +-0\n        return assembleFloat(sign, 0, 0);\n\n    var exponent = Math.floor(Math.log(flt) / Math.LN2);\n    if (exponent > 127 || exponent < -126) // Special case: +-Infinity (and huge numbers)\n        return assembleFloat(sign, 0xFF, 0); // Mantissa is zero for +-Infinity\n\n    var mantissa = flt / Math.pow(2, exponent);\n    return assembleFloat(sign, exponent + 127, (mantissa * Math.pow(2, 23)) & 0x7FFFFF);\n}\n\n// http://stackoverflow.com/a/16001019\nfunction numberToFloat(bytes) {\n    var sign = (bytes & 0x80000000) ? -1 : 1;\n    var exponent = ((bytes >> 23) & 0xFF) - 127;\n    var significand = (bytes & ~(-1 << 23));\n\n    if (exponent == 128) \n        return sign * ((significand) ? Number.NaN : Number.POSITIVE_INFINITY);\n\n    if (exponent == -127) {\n        if (significand == 0) return sign * 0.0;\n        exponent = -126;\n        significand /= (1 << 22);\n    } else significand = (significand | (1 << 23)) / (1 << 23);\n\n    return sign * significand * Math.pow(2, exponent);\n}\n\n// export parameter list to URL friendly base58 string\n// https://gist.github.com/diafygi/90a3e80ca1c2793220e5/\nvar b58alphabet = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\nvar params_order = [\n  \"wave_type\",\n  \"p_env_attack\",\n  \"p_env_sustain\",\n  \"p_env_punch\",\n  \"p_env_decay\",\n  \"p_base_freq\",\n  \"p_freq_limit\",\n  \"p_freq_ramp\",\n  \"p_freq_dramp\",\n  \"p_vib_strength\",\n  \"p_vib_speed\",\n  \"p_arp_mod\",\n  \"p_arp_speed\",\n  \"p_duty\",\n  \"p_duty_ramp\",\n  \"p_repeat_speed\",\n  \"p_pha_offset\",\n  \"p_pha_ramp\",\n  \"p_lpf_freq\",\n  \"p_lpf_ramp\",\n  \"p_lpf_resonance\",\n  \"p_hpf_freq\",\n  \"p_hpf_ramp\"\n];\n\nvar params_signed = [\"p_freq_ramp\", \"p_freq_dramp\", \"p_arp_mod\", \"p_duty_ramp\", \"p_pha_offset\", \"p_pha_ramp\", \"p_lpf_ramp\", \"p_hpf_ramp\"];\n\nParams.prototype.toB58 = function() {\n  var convert = [];\n  for (var pi in params_order) {\n    var p = params_order[pi];\n    if (p == \"wave_type\") {\n      convert.push(this[p]);\n    } else if (p.indexOf(\"p_\") == 0) {\n      var val = this[p];\n      val = floatToNumber(val);\n      convert.push(0xff & val);\n      convert.push(0xff & (val >> 8))\n      convert.push(0xff & (val >> 16))\n      convert.push(0xff & (val >> 24))\n    }\n  }\n  return function(B,A){var d=[],s=\"\",i,j,c,n;for(i in B){j=0,c=B[i];s+=c||s.length^i?\"\":1;while(j in d||c){n=d[j];n=n?n*256+c:c;c=n/58|0;d[j]=n%58;j++}}while(j--)s+=A[d[j]];return s}(convert, b58alphabet);\n}\n\nParams.prototype.fromB58 = function(b58encoded) {\n  this.fromJSON(sfxr.b58decode(b58encoded));\n  return this;\n}\n\nParams.prototype.fromJSON = function(struct) {\n  for (var p in struct) {\n    if (struct.hasOwnProperty(p)) {\n      this[p] = struct[p];\n    }\n  }\n  return this;\n}\n\n/*** Presets ***/\n\n// These functions roll up random sounds appropriate to various\n// typical game events:\n\nParams.prototype.pickupCoin = function () {\n  this.wave_type = SAWTOOTH;\n  this.p_base_freq = 0.4 + frnd(0.5);\n  this.p_env_attack = 0;\n  this.p_env_sustain = frnd(0.1);\n  this.p_env_decay = 0.1 + frnd(0.4);\n  this.p_env_punch = 0.3 + frnd(0.3);\n  if (rnd(1)) {\n    this.p_arp_speed = 0.5 + frnd(0.2);\n    this.p_arp_mod = 0.2 + frnd(0.4);\n  }\n  return this;\n}\n\nParams.prototype.laserShoot = function () {\n  this.wave_type = rnd(2);\n  if(this.wave_type === SINE && rnd(1))\n    this.wave_type = rnd(1);\n  if (rnd(2) === 0) {\n    this.p_base_freq = 0.3 + frnd(0.6);\n    this.p_freq_limit = frnd(0.1);\n    this.p_freq_ramp = -0.35 - frnd(0.3);\n  } else {\n    this.p_base_freq = 0.5 + frnd(0.5);\n    this.p_freq_limit = this.p_base_freq - 0.2 - frnd(0.6);\n    if (this.p_freq_limit < 0.2) this.p_freq_limit = 0.2;\n    this.p_freq_ramp = -0.15 - frnd(0.2);\n  }\n  if (this.wave_type === SAWTOOTH)\n    this.p_duty = 1;\n  if (rnd(1)) {\n    this.p_duty = frnd(0.5);\n    this.p_duty_ramp = frnd(0.2);\n  } else {\n    this.p_duty = 0.4 + frnd(0.5);\n    this.p_duty_ramp = -frnd(0.7);\n  }\n  this.p_env_attack = 0;\n  this.p_env_sustain = 0.1 + frnd(0.2);\n  this.p_env_decay = frnd(0.4);\n  if (rnd(1))\n    this.p_env_punch = frnd(0.3);\n  if (rnd(2) === 0) {\n    this.p_pha_offset = frnd(0.2);\n    this.p_pha_ramp = -frnd(0.2);\n  }\n  //if (rnd(1))\n    this.p_hpf_freq = frnd(0.3);\n\n  return this;\n}\n\nParams.prototype.explosion = function () {\n  this.wave_type = NOISE;\n  if (rnd(1)) {\n    this.p_base_freq = sqr(0.1 + frnd(0.4));\n    this.p_freq_ramp = -0.1 + frnd(0.4);\n  } else {\n    this.p_base_freq = sqr(0.2 + frnd(0.7));\n    this.p_freq_ramp = -0.2 - frnd(0.2);\n  }\n  if (rnd(4) === 0)\n    this.p_freq_ramp = 0;\n  if (rnd(2) === 0)\n    this.p_repeat_speed = 0.3 + frnd(0.5);\n  this.p_env_attack = 0;\n  this.p_env_sustain = 0.1 + frnd(0.3);\n  this.p_env_decay = frnd(0.5);\n  if (rnd(1)) {\n    this.p_pha_offset = -0.3 + frnd(0.9);\n    this.p_pha_ramp = -frnd(0.3);\n  }\n  this.p_env_punch = 0.2 + frnd(0.6);\n  if (rnd(1)) {\n    this.p_vib_strength = frnd(0.7);\n    this.p_vib_speed = frnd(0.6);\n  }\n  if (rnd(2) === 0) {\n    this.p_arp_speed = 0.6 + frnd(0.3);\n    this.p_arp_mod = 0.8 - frnd(1.6);\n  }\n\n  return this;\n}\n\nParams.prototype.powerUp = function () {\n  if (rnd(1)) {\n    this.wave_type = SAWTOOTH;\n    this.p_duty = 1;\n  } else {\n    this.p_duty = frnd(0.6);\n  }\n  this.p_base_freq = 0.2 + frnd(0.3);\n  if (rnd(1)) {\n    this.p_freq_ramp = 0.1 + frnd(0.4);\n    this.p_repeat_speed = 0.4 + frnd(0.4);\n  } else {\n    this.p_freq_ramp = 0.05 + frnd(0.2);\n    if (rnd(1)) {\n      this.p_vib_strength = frnd(0.7);\n      this.p_vib_speed = frnd(0.6);\n    }\n  }\n  this.p_env_attack = 0;\n  this.p_env_sustain = frnd(0.4);\n  this.p_env_decay = 0.1 + frnd(0.4);\n\n  return this;\n}\n\nParams.prototype.hitHurt = function () {\n  this.wave_type = rnd(2);\n  if (this.wave_type === SINE)\n    this.wave_type = NOISE;\n  if (this.wave_type === SQUARE)\n    this.p_duty = frnd(0.6);\n  if (this.wave_type === SAWTOOTH)\n    this.p_duty = 1;\n  this.p_base_freq = 0.2 + frnd(0.6);\n  this.p_freq_ramp = -0.3 - frnd(0.4);\n  this.p_env_attack = 0;\n  this.p_env_sustain = frnd(0.1);\n  this.p_env_decay = 0.1 + frnd(0.2);\n  if (rnd(1))\n    this.p_hpf_freq = frnd(0.3);\n  return this;\n}\n\nParams.prototype.jump = function () {\n  this.wave_type = SQUARE;\n  this.p_duty = frnd(0.6);\n  this.p_base_freq = 0.3 + frnd(0.3);\n  this.p_freq_ramp = 0.1 + frnd(0.2);\n  this.p_env_attack = 0;\n  this.p_env_sustain = 0.1 + frnd(0.3);\n  this.p_env_decay = 0.1 + frnd(0.2);\n  if (rnd(1))\n    this.p_hpf_freq = frnd(0.3);\n  if (rnd(1))\n    this.p_lpf_freq = 1 - frnd(0.6);\n  return this;\n}\n\nParams.prototype.blipSelect = function () {\n  this.wave_type = rnd(1);\n  if (this.wave_type === SQUARE)\n    this.p_duty = frnd(0.6);\n  else\n    this.p_duty = 1;\n  this.p_base_freq = 0.2 + frnd(0.4);\n  this.p_env_attack = 0;\n  this.p_env_sustain = 0.1 + frnd(0.1);\n  this.p_env_decay = frnd(0.2);\n  this.p_hpf_freq = 0.1;\n  return this;\n}\n\nParams.prototype.synth = function () {\n  this.wave_type = rnd(1);\n  this.p_base_freq = [0.2723171360931539, 0.19255692561524382, 0.13615778746815113][rnd(2)];\n  this.p_env_attack = rnd(4) > 3 ? frnd(0.5) : 0;\n  this.p_env_sustain = frnd(1);\n  this.p_env_punch = frnd(1);\n  this.p_env_decay = frnd(0.9) + 0.1;\n  this.p_arp_mod = [0, 0, 0, 0, -0.3162, 0.7454, 0.7454][rnd(6)];\n  this.p_arp_speed = frnd(0.5) + 0.4;\n  this.p_duty = frnd(1);\n  this.p_duty_ramp = rnd(2) == 2 ? frnd(1) : 0;\n  this.p_lpf_freq = [1, 0.9 * frnd(1) * frnd(1) + 0.1][rnd(1)];\n  this.p_lpf_ramp = rndr(-1, 1);\n  this.p_lpf_resonance = frnd(1);\n  this.p_hpf_freq = rnd(3) == 3 ? frnd(1) : 0;\n  this.p_hpf_ramp = rnd(3) == 3 ? frnd(1) : 0;\n  return this;\n}\n\nParams.prototype.tone = function () {\n  this.wave_type = SINE;\n  this.p_base_freq = 0.35173364; // 440 Hz\n  this.p_env_attack = 0;\n  this.p_env_sustain = 0.6641; // 1 sec\n  this.p_env_decay = 0;\n  this.p_env_punch = 0;\n  return this;\n}\n\nParams.prototype.click = function() {\n  const base = [\"explosion\", \"hitHurt\"][rnd(1)];\n  this[base]();\n  if (rnd(1)) {\n    this.p_freq_ramp = -0.5 + frnd(1.0);\n  }\n  if (rnd(1)) {\n    this.p_env_sustain = (frnd(0.4) + 0.2) * this.p_env_sustain;\n    this.p_env_decay = (frnd(0.4) + 0.2) * this.p_env_decay;\n  }\n  if (rnd(3) == 0) {\n    this.p_env_attack = frnd(0.3);\n  }\n  this.p_base_freq = 1 - frnd(0.25);\n  this.p_hpf_freq = 1 - frnd(0.1);\n  return this;\n}\n\nParams.prototype.random = function () {\n  this.wave_type = rnd(3);\n  if (rnd(1))\n    this.p_base_freq = cube(frnd(2) - 1) + 0.5;\n  else\n    this.p_base_freq = sqr(frnd(1));\n  this.p_freq_limit = 0;\n  this.p_freq_ramp = Math.pow(frnd(2) - 1, 5);\n  if (this.p_base_freq > 0.7 && this.p_freq_ramp > 0.2)\n    this.p_freq_ramp = -this.p_freq_ramp;\n  if (this.p_base_freq < 0.2 && this.p_freq_ramp < -0.05)\n    this.p_freq_ramp = -this.p_freq_ramp;\n  this.p_freq_dramp = Math.pow(frnd(2) - 1, 3);\n  this.p_duty = frnd(2) - 1;\n  this.p_duty_ramp = Math.pow(frnd(2) - 1, 3);\n  this.p_vib_strength = Math.pow(frnd(2) - 1, 3);\n  this.p_vib_speed = rndr(-1, 1);\n  this.p_env_attack = cube(rndr(-1, 1));\n  this.p_env_sustain = sqr(rndr(-1, 1));\n  this.p_env_decay = rndr(-1, 1);\n  this.p_env_punch = Math.pow(frnd(0.8), 2);\n  if (this.p_env_attack + this.p_env_sustain + this.p_env_decay < 0.2) {\n    this.p_env_sustain += 0.2 + frnd(0.3);\n    this.p_env_decay += 0.2 + frnd(0.3);\n  }\n  this.p_lpf_resonance = rndr(-1, 1);\n  this.p_lpf_freq = 1 - Math.pow(frnd(1), 3);\n  this.p_lpf_ramp = Math.pow(frnd(2) - 1, 3);\n  if (this.p_lpf_freq < 0.1 && this.p_lpf_ramp < -0.05)\n    this.p_lpf_ramp = -this.p_lpf_ramp;\n  this.p_hpf_freq = Math.pow(frnd(1), 5);\n  this.p_hpf_ramp = Math.pow(frnd(2) - 1, 5);\n  this.p_pha_offset = Math.pow(frnd(2) - 1, 3);\n  this.p_pha_ramp = Math.pow(frnd(2) - 1, 3);\n  this.p_repeat_speed = frnd(2) - 1;\n  this.p_arp_speed = frnd(2) - 1;\n  this.p_arp_mod = frnd(2) - 1;\n  return this;\n}\n\nParams.prototype.mutate = function () {\n  if (rnd(1)) this.p_base_freq += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_freq_ramp += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_freq_dramp += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_duty += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_duty_ramp += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_vib_strength += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_vib_speed += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_vib_delay += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_env_attack += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_env_sustain += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_env_decay += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_env_punch += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_lpf_resonance += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_lpf_freq += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_lpf_ramp += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_hpf_freq += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_hpf_ramp += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_pha_offset += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_pha_ramp += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_repeat_speed += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_arp_speed += frnd(0.1) - 0.05;\n  if (rnd(1)) this.p_arp_mod += frnd(0.1) - 0.05;\n  return this;\n}\n\n/*** Simpler namespaced functional API ***/\n\nsfxr = {};\n\nsfxr.toBuffer = function(synthdef) {\n  return (new SoundEffect(synthdef)).getRawBuffer()[\"buffer\"];\n};\n\nsfxr.toWebAudio = function(synthdef, audiocontext) {\n  var sfx = new SoundEffect(synthdef);\n  var buffer = sfx.getRawBuffer()[\"normalized\"];\n  if (audiocontext) {\n    var buff = audiocontext.createBuffer(1, buffer.length, sfx.sampleRate);\n    var nowBuffering = buff.getChannelData(0);\n    for (var i = 0; i < buffer.length; i++) {\n      nowBuffering[i] = buffer[i];\n    }\n    var proc = audiocontext.createBufferSource();\n    proc.buffer = buff;\n    return proc;\n  }\n};\n\nsfxr.toWave = function(synthdef) {\n  return (new SoundEffect(synthdef)).generate();\n};\n\nsfxr.toAudio = function(synthdef) {\n  return sfxr.toWave(synthdef).getAudio();\n}\n\nsfxr.play = function(synthdef) {\n  return sfxr.toAudio(synthdef).play();\n}\n\nsfxr.b58decode = function(b58encoded) {\n  var decoded = function(S,A){var d=[],b=[],i,j,c,n;for(i in S){j=0,c=A.indexOf(S[i]);if(c<0)return undefined;c||b.length^i?i:b.push(0);while(j in d||c){n=d[j];n=n?n*58+c:c;c=n>>8;d[j]=n%256;j++}}while(j--)b.push(d[j]);return new Uint8Array(b)}(b58encoded,b58alphabet);\n  var result = {};\n  for (var pi in params_order) {\n    var p = params_order[pi];\n    var offset = (pi - 1) * 4 + 1;\n    if (p == \"wave_type\") {\n      result[p] = decoded[0];\n    } else {\n      var val = (decoded[offset] | (decoded[offset + 1] << 8) | (decoded[offset + 2] << 16) | (decoded[offset + 3] << 24));\n      result[p] = numberToFloat(val);\n    }\n  }\n  return result;\n}\n\nsfxr.b58encode = function(synthdef) {\n  var p = new Params();\n  p.fromJSON(synthdef);\n  return p.toB58();\n}\n\nsfxr.generate = function(algorithm, options) {\n  const p = new Params();\n  const opts = options || {};\n  p.sound_vol = opts[\"sound_vol\"] || 0.25;\n  p.sample_rate = opts[\"sample_rate\"] || 44100;\n  p.sample_size = opts[\"sample_size\"] || 8;\n  return p[algorithm]();\n}\n\n/*** Main entry point ***/\n\nfunction SoundEffect(ps) {\n  if (typeof(ps) == \"string\") {\n    var PARAMS = new Params();\n    if (ps.indexOf(\"#\") == 0) {\n      ps = ps.slice(1);\n    }\n    ps = PARAMS.fromB58(ps);\n  }\n  this.init(ps);\n}\n\nSoundEffect.prototype.init = function (ps) {\n  this.parameters = ps;\n  this.initForRepeat();  // First time through, this is a bit of a misnomer\n\n  // Waveform shape\n  this.waveShape = parseInt(ps.wave_type);\n\n  // Filter\n  this.fltw = Math.pow(ps.p_lpf_freq, 3) * 0.1;\n  this.enableLowPassFilter = (ps.p_lpf_freq != 1);\n  this.fltw_d = 1 + ps.p_lpf_ramp * 0.0001;\n  this.fltdmp = 5 / (1 + Math.pow(ps.p_lpf_resonance, 2) * 20) *\n    (0.01 + this.fltw);\n  if (this.fltdmp > 0.8) this.fltdmp=0.8;\n  this.flthp = Math.pow(ps.p_hpf_freq, 2) * 0.1;\n  this.flthp_d = 1 + ps.p_hpf_ramp * 0.0003;\n\n  // Vibrato\n  this.vibratoSpeed = Math.pow(ps.p_vib_speed, 2) * 0.01;\n  this.vibratoAmplitude = ps.p_vib_strength * 0.5;\n\n  // Envelope\n  this.envelopeLength = [\n    Math.floor(ps.p_env_attack * ps.p_env_attack * 100000),\n    Math.floor(ps.p_env_sustain * ps.p_env_sustain * 100000),\n    Math.floor(ps.p_env_decay * ps.p_env_decay * 100000)\n  ];\n  this.envelopePunch = ps.p_env_punch;\n\n  // Flanger\n  this.flangerOffset = Math.pow(ps.p_pha_offset, 2) * 1020;\n  if (ps.p_pha_offset < 0) this.flangerOffset = -this.flangerOffset;\n  this.flangerOffsetSlide = Math.pow(ps.p_pha_ramp, 2) * 1;\n  if (ps.p_pha_ramp < 0) this.flangerOffsetSlide = -this.flangerOffsetSlide;\n\n  // Repeat\n  this.repeatTime = Math.floor(Math.pow(1 - ps.p_repeat_speed, 2) * 20000\n                               + 32);\n  if (ps.p_repeat_speed === 0)\n    this.repeatTime = 0;\n\n  this.gain = Math.exp(ps.sound_vol) - 1;\n\n  this.sampleRate = ps.sample_rate;\n  this.bitsPerChannel = ps.sample_size;\n}\n\nSoundEffect.prototype.initForRepeat = function() {\n  var ps = this.parameters;\n  this.elapsedSinceRepeat = 0;\n\n  this.period = 100 / (ps.p_base_freq * ps.p_base_freq + 0.001);\n  this.periodMax = 100 / (ps.p_freq_limit * ps.p_freq_limit + 0.001);\n  this.enableFrequencyCutoff = (ps.p_freq_limit > 0);\n  this.periodMult = 1 - Math.pow(ps.p_freq_ramp, 3) * 0.01;\n  this.periodMultSlide = -Math.pow(ps.p_freq_dramp, 3) * 0.000001;\n\n  this.dutyCycle = 0.5 - ps.p_duty * 0.5;\n  this.dutyCycleSlide = -ps.p_duty_ramp * 0.00005;\n\n  if (ps.p_arp_mod >= 0)\n    this.arpeggioMultiplier = 1 - Math.pow(ps.p_arp_mod, 2) * .9;\n  else\n    this.arpeggioMultiplier = 1 + Math.pow(ps.p_arp_mod, 2) * 10;\n  this.arpeggioTime = Math.floor(Math.pow(1 - ps.p_arp_speed, 2) * 20000 + 32);\n  if (ps.p_arp_speed === 1)\n    this.arpeggioTime = 0;\n}\n\nSoundEffect.prototype.getRawBuffer = function () {\n  var fltp = 0;\n  var fltdp = 0;\n  var fltphp = 0;\n\n  var noise_buffer = Array(32);\n  for (var i = 0; i < 32; ++i)\n    noise_buffer[i] = Math.random() * 2 - 1;\n\n  var envelopeStage = 0;\n  var envelopeElapsed = 0;\n\n  var vibratoPhase = 0;\n\n  var phase = 0;\n  var ipp = 0;\n  var flanger_buffer = Array(1024);\n  for (var i = 0; i < 1024; ++i)\n    flanger_buffer[i] = 0;\n\n  var num_clipped = 0;\n\n  var buffer = [];\n  var normalized = [];\n\n  var sample_sum = 0;\n  var num_summed = 0;\n  var summands = Math.floor(44100 / this.sampleRate);\n\n  for(var t = 0; ; ++t) {\n\n    // Repeats\n    if (this.repeatTime != 0 && ++this.elapsedSinceRepeat >= this.repeatTime)\n      this.initForRepeat();\n\n    // Arpeggio (single)\n    if(this.arpeggioTime != 0 && t >= this.arpeggioTime) {\n      this.arpeggioTime = 0;\n      this.period *= this.arpeggioMultiplier;\n    }\n\n    // Frequency slide, and frequency slide slide!\n    this.periodMult += this.periodMultSlide;\n    this.period *= this.periodMult;\n    if(this.period > this.periodMax) {\n      this.period = this.periodMax;\n      if (this.enableFrequencyCutoff)\n        break;\n    }\n\n    // Vibrato\n    var rfperiod = this.period;\n    if (this.vibratoAmplitude > 0) {\n      vibratoPhase += this.vibratoSpeed;\n      rfperiod = this.period * (1 + Math.sin(vibratoPhase) * this.vibratoAmplitude);\n    }\n    var iperiod = Math.floor(rfperiod);\n    if (iperiod < OVERSAMPLING) iperiod = OVERSAMPLING;\n\n    // Square wave duty cycle\n    this.dutyCycle += this.dutyCycleSlide;\n    if (this.dutyCycle < 0) this.dutyCycle = 0;\n    if (this.dutyCycle > 0.5) this.dutyCycle = 0.5;\n\n    // Volume envelope\n    if (++envelopeElapsed > this.envelopeLength[envelopeStage]) {\n      envelopeElapsed = 0;\n      if (++envelopeStage > 2)\n        break;\n    }\n    var env_vol;\n    var envf = envelopeElapsed / this.envelopeLength[envelopeStage];\n    if (envelopeStage === 0) {         // Attack\n      env_vol = envf;\n    } else if (envelopeStage === 1) {  // Sustain\n      env_vol = 1 + (1 - envf) * 2 * this.envelopePunch;\n    } else {                           // Decay\n      env_vol = 1 - envf;\n    }\n\n    // Flanger step\n    this.flangerOffset += this.flangerOffsetSlide;\n    var iphase = Math.abs(Math.floor(this.flangerOffset));\n    if (iphase > 1023) iphase = 1023;\n\n    if (this.flthp_d != 0) {\n      this.flthp *= this.flthp_d;\n      if (this.flthp < 0.00001)\n        this.flthp = 0.00001;\n      if (this.flthp > 0.1)\n        this.flthp = 0.1;\n    }\n\n    // 8x oversampling\n    var sample = 0;\n    for (var si = 0; si < OVERSAMPLING; ++si) {\n      var sub_sample = 0;\n      phase++;\n      if (phase >= iperiod) {\n        phase %= iperiod;\n        if (this.waveShape === NOISE)\n          for(var i = 0; i < 32; ++i)\n            noise_buffer[i] = Math.random() * 2 - 1;\n      }\n\n      // Base waveform\n      var fp = phase / iperiod;\n      if (this.waveShape === SQUARE) {\n        if (fp < this.dutyCycle)\n          sub_sample=0.5;\n        else\n          sub_sample=-0.5;\n      } else if (this.waveShape === SAWTOOTH) {\n        if (fp < this.dutyCycle)\n          sub_sample = -1 + 2 * fp/this.dutyCycle;\n        else\n          sub_sample = 1 - 2 * (fp-this.dutyCycle)/(1-this.dutyCycle);\n      } else if (this.waveShape === SINE) {\n        sub_sample = Math.sin(fp * 2 * Math.PI);\n      } else if (this.waveShape === NOISE) {\n        sub_sample = noise_buffer[Math.floor(phase * 32 / iperiod)];\n      } else {\n        throw \"ERROR: Bad wave type: \" + this.waveShape;\n      }\n\n      // Low-pass filter\n      var pp = fltp;\n      this.fltw *= this.fltw_d;\n      if (this.fltw < 0) this.fltw = 0;\n      if (this.fltw > 0.1) this.fltw = 0.1;\n      if (this.enableLowPassFilter) {\n        fltdp += (sub_sample - fltp) * this.fltw;\n        fltdp -= fltdp * this.fltdmp;\n      } else {\n        fltp = sub_sample;\n        fltdp = 0;\n      }\n      fltp += fltdp;\n\n      // High-pass filter\n      fltphp += fltp - pp;\n      fltphp -= fltphp * this.flthp;\n      sub_sample = fltphp;\n\n      // Flanger\n      flanger_buffer[ipp & 1023] = sub_sample;\n      sub_sample += flanger_buffer[(ipp - iphase + 1024) & 1023];\n      ipp = (ipp + 1) & 1023;\n\n      // final accumulation and envelope application\n      sample += sub_sample * env_vol;\n    }\n\n    // Accumulate samples appropriately for sample rate\n    sample_sum += sample;\n    if (++num_summed >= summands) {\n      num_summed = 0;\n      sample = sample_sum / summands;\n      sample_sum = 0;\n    } else {\n      continue;\n    }\n\n    sample = sample / OVERSAMPLING * masterVolume;\n    sample *= this.gain;\n\n    // store the original normalized floating point sample\n    normalized.push(sample);\n\n    if (this.bitsPerChannel === 8) {\n      // Rescale [-1, 1) to [0, 256)\n      sample = Math.floor((sample + 1) * 128);\n      if (sample > 255) {\n        sample = 255;\n        ++num_clipped;\n      } else if (sample < 0) {\n        sample = 0;\n        ++num_clipped;\n      }\n      buffer.push(sample);\n    } else {\n      // Rescale [-1, 1) to [-32768, 32768)\n      sample = Math.floor(sample * (1<<15));\n      if (sample >= (1<<15)) {\n        sample = (1 << 15)-1;\n        ++num_clipped;\n      } else if (sample < -(1<<15)) {\n        sample = -(1 << 15);\n        ++num_clipped;\n      }\n      buffer.push(sample & 0xFF);\n      buffer.push((sample >> 8) & 0xFF);\n    }\n  }\n  \n  return {\n    \"buffer\": buffer,\n    \"normalized\": normalized,\n    \"clipped\": num_clipped,\n  }\n}\n\nSoundEffect.prototype.generate = function() {\n  var rendered = this.getRawBuffer();\n  var wave = new RIFFWAVE();\n  wave.header.sampleRate = this.sampleRate;\n  wave.header.bitsPerSample = this.bitsPerChannel;\n  wave.Make(rendered.buffer);\n  wave.clipping = rendered.clipped;\n  wave.buffer = rendered.normalized;\n  wave.getAudio = _sfxr_getAudioFn(wave);\n  return wave;\n}\n\nvar _actx = null;\nvar _sfxr_getAudioFn = function(wave) {\n  return function() {\n    // check for procedural audio\n    var actx = null;\n    if (!_actx) {\n      if ('AudioContext' in window) {\n        _actx = new AudioContext();\n      } else if ('webkitAudioContext' in window) {\n        _actx = new webkitAudioContext();\n      }\n    }\n    actx = _actx;\n    \n    if (actx) {\n      var buff = actx.createBuffer(1, wave.buffer.length, wave.header.sampleRate);\n      var nowBuffering = buff.getChannelData(0);\n      for (var i=0;i<wave.buffer.length;i++) {\n        nowBuffering[i] = wave.buffer[i];\n      }\n      var volume = 1.0;\n      var obj = {\n        \"channels\": [],\n        \"setVolume\": function(v) { volume = v; return obj; },\n        \"play\": function() {\n          var proc = actx.createBufferSource();\n          proc.buffer = buff;\n          var gainNode = actx.createGain()\n          gainNode.gain.value = volume;\n          gainNode.connect(actx.destination)\n          proc.connect(gainNode);\n          if (proc[\"start\"]) {\n            proc.start();\n          } else if (proc[\"noteOn\"]) {\n            proc.noteOn(0);\n          }\n          this.channels.push(proc);\n          return proc;\n        }\n      };\n      return obj;\n    } else {\n      var audio = new Audio();\n      audio.src = wave.dataURI;\n      return audio;\n    }\n  };\n};\n\n/*** conversions from slider values, internal, and units ***/\n\n// convert from slider values to internal representation\n\nvar sliders = {\n  p_env_attack:  function (v) { return v * v * 100000.0 },\n  p_env_sustain: function (v) { return v * v * 100000.0 },\n  p_env_punch:   function (v) { return v },\n  p_env_decay:   function (v) { return v * v * 100000.0 },\n\n  p_base_freq:  function (v) { return 8 * 44100 * (v * v + 0.001) / 100 },\n  p_freq_limit: function (v) { return 8 * 44100 * (v * v + 0.001) / 100 },\n  p_freq_ramp:  function (v) { return 1.0 - Math.pow(v, 3.0) * 0.01 },\n  p_freq_dramp: function (v) { return -Math.pow(v, 3.0) * 0.000001 },\n\n  p_vib_speed:    function (v) { return Math.pow(v, 2.0) * 0.01 },\n  p_vib_strength: function (v) { return v * 0.5 },\n\n  p_arp_mod:   function (v) { \n    return v >= 0 ? 1.0 - Math.pow(v, 2) * 0.9 : 1.0 + Math.pow(v, 2) * 10; },\n  p_arp_speed: function (v) { return (v === 1.0) ? 0 :\n                              Math.floor(Math.pow(1.0 - v, 2.0) * 20000 + 32)},\n\n  p_duty:      function (v) { return 0.5 - v * 0.5; },\n  p_duty_ramp: function (v) { return -v * 0.00005 },\n\n  p_repeat_speed: function (v) { return (v === 0) ? 0 :\n                                 Math.floor(Math.pow(1-v, 2) * 20000) + 32 },\n\n  p_pha_offset: function (v) { return (v < 0 ? -1 : 1) * Math.pow(v,2)*1020 },\n  p_pha_ramp:   function (v) { return (v < 0 ? -1 : 1) * Math.pow(v,2) },\n\n  p_lpf_freq:   function (v) { return Math.pow(v, 3) * 0.1 },\n  p_lpf_ramp:   function (v) { return 1.0 + v * 0.0001 },\n  p_lpf_resonance: function (v) { return 5.0 / (1.0 + Math.pow(v, 2) * 20) }, // * (0.01 + fltw);\n\n  p_hpf_freq: function (v) { return Math.pow(v, 2) * 0.1 },\n  p_hpf_ramp: function (v) { return 1.0 + v * 0.0003 },\n\n  sound_vol: function (v) { return Math.exp(v) - 1; }\n};\n\nvar sliders_inverse = {\n  p_env_attack:  function (v) { return Math.sqrt(v / 100000.0); },\n  p_env_sustain: function (v) { return Math.sqrt(v / 100000.0); },\n  p_env_punch:   function (v) { return v; },\n  p_env_decay:   function (v) { return Math.sqrt(v / 100000.0); },\n\n  p_base_freq:  function (v) { return Math.sqrt(v * 100 / 8 / 44100 - 0.001); },\n  p_freq_limit: function (v) { return Math.sqrt(v * 100 / 8 / 44100 - 0.001); },\n  p_freq_ramp:  function (v) { return Math.cbrt((1.0 - v) / 0.01); },\n  p_freq_dramp: function (v) { return Math.cbrt(v / -0.000001); },\n\n  p_vib_speed:    function (v) { return Math.sqrt(v / 0.01); },\n  p_vib_strength: function (v) { return v / 0.5; },\n\n  p_arp_mod:   function (v) {\n    return v < 1 ? Math.sqrt((1.0 - v) / 0.9) : -Math.sqrt((v - 1.0) / 10.0);\n  },\n  p_arp_speed: function (v) { return (v === 0) ? 1.0 :\n                              ( (1.0 - Math.sqrt((v - (v < 100 ? 30 : 32)) / 20000)))},\n\n  p_duty:      function (v) { return (v - 0.5) / -0.5; },\n  p_duty_ramp: function (v) { return v / -0.00005 },\n\n  p_repeat_speed: function (v) { return v === 0 ? 0 : -(Math.sqrt((v - 32) / 20000) - 1.0) },\n\n  p_pha_offset: function (v) { return (v < 0 ? -1 : 1) * Math.sqrt(Math.abs(v) / 1020) },\n  p_pha_ramp:   function (v) { return (v < 0 ? -1 : 1) * Math.sqrt(Math.abs(v)) },\n\n  p_lpf_freq:   function (v) { return Math.cbrt(v / 0.1); },\n  p_lpf_ramp:   function (v) { return (v - 1.0) / 0.0001; },\n  p_lpf_resonance: function (v) { return Math.sqrt((1.0 / (v / 5.0) - 1) / 20) },\n\n  p_hpf_freq: function (v) { return Math.sqrt(v / 0.1); },\n  p_hpf_ramp: function (v) { return (v - 1.0) / 0.0003; },\n  sound_vol: function (v) { return Math.log(v + 1);; }\n}\n\n// convert from internal representation to domain value without units\n\nvar domain = {\n  p_env_attack:  function (v) { return (v / 44100); },\n  p_env_sustain: function (v) { return (v / 44100); },\n  p_env_punch:   function (v) { return (v * 100); },\n  p_env_decay:   function (v) { return (v / 44100); },\n\n  p_base_freq:   function (v) { return v; },\n  p_freq_limit:  function (v) { return v; },\n  p_freq_ramp:   function (v) { return (44100*Math.log(v)/Math.log(0.5)); },\n  p_freq_dramp:  function (v) { return (v*44100 / Math.pow(2, -44101./44100)); },\n\n  p_vib_speed:    function (v) { return (441000/64. * v); },\n  p_vib_strength: function (v) { return (v*100); },\n\n  p_arp_mod:   function (v) { return (1./v); },\n  p_arp_speed: function (v) { return (v / 44100); },\n\n  p_duty:      function (v) { return (100 * v); },\n  p_duty_ramp: function (v) { return (8 * 44100 * v); },\n\n  p_repeat_speed: function (v) { return v === 0 ? 0 : (44100./v); },\n\n  p_pha_offset: function (v) { return (1000*v/44100); },\n  p_pha_ramp:   function (v) { return (1000*v); },\n\n  p_lpf_freq:   function (v) { return (v === .1) ? 0 : 8 * 44100 * v / (1-v); },\n  p_lpf_ramp:  function (v) { return Math.pow(v, 44100); },\n  p_lpf_resonance: function (v) { return (100*(1-v*.11));},\n\n  p_hpf_freq:   function (v) { return 8 * 44100 * v / (1-v); },\n  p_hpf_ramp: function (v) { return Math.pow(v, 44100); },\n\n  sound_vol: function (v) { return 10 * Math.log(v*v) / Math.log(10); }\n}\n\nvar domain_inverse = {\n  p_env_attack:  function (v) { return (v * 44100); },\n  p_env_sustain: function (v) { return (v * 44100); },\n  p_env_punch:   function (v) { return (v / 100); },\n  p_env_decay:   function (v) { return (v * 44100); },\n\n  p_base_freq:   function (v) { return v; },\n  p_freq_limit:  function (v) { return v; },\n  p_freq_ramp:   function (v) { return Math.exp(Math.log(0.5) * v / 44100); },\n  p_freq_dramp:  function (v) { return v * Math.pow(2, -44101./44100) / 44100; },\n\n  p_vib_speed:    function (v) { return (64. / 441000) * v; },\n  p_vib_strength: function (v) { return (v / 100); },\n\n  p_arp_mod:   function (v) { return (1. / v); },\n  p_arp_speed: function (v) { return (v * 44100); },\n\n  p_duty:      function (v) { return (v / 100); },\n  p_duty_ramp: function (v) { return (v / (8 * 44100)); },\n\n  p_repeat_speed: function (v) { return v <= 0 ? 0 : v > 1378 ? 32 : (44100 / v); },\n\n  p_pha_offset: function (v) { return (v / 1000) * 44100; },\n  p_pha_ramp:   function (v) { return (v / 1000); },\n\n  p_lpf_freq:   function (v) { return (v / (v + 8 * 44100)); },\n  p_lpf_ramp:  function (v) { return Math.pow(v, 1 / 44100); },\n  p_lpf_resonance: function (v) { return (1 - v / 100) / .11; },\n\n  p_hpf_freq:   function (v) { return (v / (v + 8 * 44100)); },\n  p_hpf_ramp: function (v) { return Math.pow(v, 1 / 44100); },\n\n  sound_vol: function (v) { return Math.sqrt(Math.pow(10, v / 10)); }\n}\n\n// convert from internal representation to printable units\n\nvar units = {\n  p_env_attack:  function (v) { return (v / 44100).toPrecision(4) + ' sec' },\n  p_env_sustain: function (v) { return (v / 44100).toPrecision(4) + ' sec' },\n  p_env_punch:   function (v) { return '+' + (v * 100).toPrecision(4) + '%'},\n  p_env_decay:   function (v) { return (v / 44100).toPrecision(4) + ' sec' },\n  \n  p_base_freq:   function (v) { return v.toPrecision(4) + 'Hz' },\n  p_freq_limit:  function (v) { return v.toPrecision(4) + 'Hz' },\n  p_freq_ramp:   function (v) { \n    return (44100*Math.log(v)/Math.log(0.5)).toPrecision(4) + ' 8va/sec'; },\n  p_freq_dramp:  function (v) { \n    return (v*44100 / Math.pow(2, -44101./44100)).toExponential(3) +\n      ' 8va/s^2'; },\n\n  p_vib_speed:    function (v) { return v === 0 ? 'OFF' : \n                                 (441000/64. * v).toPrecision(4) + ' Hz'},\n  p_vib_strength: function (v) { return v === 0 ? 'OFF' : \n                                 '&plusmn; ' + (v*100).toPrecision(4) + '%' },\n\n  p_arp_mod:   function (v) { return ((v === 1) ? 'OFF' : \n                                      'x ' + (1./v).toPrecision(4)) },\n  p_arp_speed: function (v) { return (v === 0 ? 'OFF' :\n                                      (v / 44100).toPrecision(4) +' sec') },\n\n  p_duty:      function (v) { return (100 * v).toPrecision(4) + '%'; },\n  p_duty_ramp: function (v) { return (8 * 44100 * v).toPrecision(4) +'%/sec'},\n\n  p_repeat_speed: function (v) { return v === 0 ? 'OFF' : \n                                 (44100/v).toPrecision(4) + ' Hz' },\n\n  p_pha_offset: function (v) { return v === 0 ? 'OFF' :\n                               (1000*v/44100).toPrecision(4) + ' msec' },\n  // Not so sure about this:\n  p_pha_ramp:   function (v) { return v === 0 ? 'OFF' :\n               (1000*v).toPrecision(4) + ' msec/sec' },\n\n  p_lpf_freq:   function (v) { \n    return (v === .1) ? 'OFF' : Math.round(8 * 44100 * v / (1-v)) + ' Hz'; },\n  p_lpf_ramp:  function (v) {  if (v === 1) return 'OFF';\n    return Math.pow(v, 44100).toPrecision(4) + ' ^sec'; },\n  p_lpf_resonance: function (v) { return (100*(1-v*.11)).toPrecision(4)+'%';},\n\n  p_hpf_freq:   function (v) { \n    return (v === 0) ? 'OFF' : Math.round(8 * 44100 * v / (1-v)) + ' Hz'; },\n  p_hpf_ramp: function (v) {  if (v === 1) return 'OFF';\n    return Math.pow(v, 44100).toPrecision(4) + ' ^sec'; },\n\n  sound_vol: function (v) { \n    v = 10 * Math.log(v*v) / Math.log(10);\n    var sign = v >= 0 ? '+' : '';\n    return sign + v.toPrecision(4) + ' dB'; \n  }\n};\n\n/*** Plumbing ***/\n\n(function (root, factory) {\n  if(typeof define === \"function\" && define.amd) {\n    // Now we're wrapping the factory and assigning the return\n    // value to the root (window) and returning it as well to\n    // the AMD loader.\n    define([\"./riffwave\"], function(RIFFWAVE){\n      return (root.jsfxr = factory(RIFFWAVE));\n    });\n  } else if(typeof module === \"object\" && module.exports) {\n    // I've not encountered a need for this yet, since I haven't\n    // run into a scenario where plain modules depend on CommonJS\n    // *and* I happen to be loading in a CJS browser environment\n    // but I'm including it for the sake of being thorough\n    RIFFWAVE = require(\"./riffwave.js\");\n    module.exports = (root.jsfxr = factory(RIFFWAVE));\n  } else {\n    root.jsfxr = factory(root.RIFFWAVE);\n  }\n}(this, function(RIFFWAVE) {\n  // module code here....\n  return {\n    \"sfxr\": sfxr,\n    \"convert\": {\n      \"sliders\": sliders,\n      \"domain\": domain,\n      \"sliders_inverse\": sliders_inverse,\n      \"domain_inverse\": domain_inverse,\n      \"units\": units,\n    },\n    \"parameters\": {\n      \"order\": params_order,\n      \"signed\": params_signed,\n    },\n    \"Params\": Params,\n    \"SoundEffect\": SoundEffect,\n    \"waveforms\": {\n      \"SQUARE\": SQUARE,\n      \"SAWTOOTH\": SAWTOOTH,\n      \"SINE\": SINE,\n      \"NOISE\": NOISE\n    }\n  };\n}));\n"]}