示例#1
0
  obs.currentValue = computed([obs.mode, obs.quantize, inverted, param], function (mode, quantize, inverted, param) {
    if (param != null) {
      if (inverted) {
        param = Sum([1, Negate(param)])
      }

      if (mode === 'exp') {
        param = Square(param)
      }

      var result = Sum([
        Multiply([param, Abs(range)]),
        when(inverted, obs.maxValue, obs.minValue)
      ])

      if (quantize) {
        result = Quantize(result, quantize)
      }

      return result
    } else {
      return obs.minValue.currentValue
    }
  }, {
示例#2
0
function LinkParam (context) {
  var obs = ObservStruct({
    param: Value(),
    minValue: Param(context, 0),
    maxValue: Param(context, 1),
    mode: Prop('linear'),
    quantize: Prop(0)
  })

  var releases = []

  obs._type = 'LinkParam'
  obs.context = context

  var range = Sum([
    obs.maxValue,
    Negate(obs.minValue)
  ])

  releases.push(
    watch(range) // HACK: avoid regenerating transform AudioNodes
  )

  // only relink params if the param we want changes
  var param = computed([context.paramLookup, obs.param], (paramLookup, paramId) => {
    return context.paramLookup.get(paramId)
  }, {
    passthru: true // treat nested observables as values instead of expanding
  })

  var inverted = computed([range], range => {
    return getValue(range, context.audio.currentTime) < 0
  })

  obs.currentValue = computed([obs.mode, obs.quantize, inverted, param], function (mode, quantize, inverted, param) {
    if (param != null) {
      if (inverted) {
        param = Sum([1, Negate(param)])
      }

      if (mode === 'exp') {
        param = Square(param)
      }

      var result = Sum([
        Multiply([param, Abs(range)]),
        when(inverted, obs.maxValue, obs.minValue)
      ])

      if (quantize) {
        result = Quantize(result, quantize)
      }

      return result
    } else {
      return obs.minValue.currentValue
    }
  }, {
    nextTick: true,
    comparer: (a, b) => {
      // also compare AudioNodes and ParamSources
      if (a instanceof global.AudioNode || ParamSource.isParam(a)) {
        return a === b
      }
    }
  })

  obs.destroy = function () {
    Param.destroy(obs)
    while (releases.length) {
      releases.pop()()
    }
  }

  return obs
}