New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

audio-slot-param

Package Overview
Dependencies
Maintainers
1
Versions
19
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

audio-slot-param - npm Package Compare versions

Comparing version 1.2.0 to 2.0.0

145

apply.js

@@ -1,36 +0,50 @@

var interpolate = require('./lib/interpolate.js')
var PseudoAudioParam = require('pseudo-audio-param')
module.exports = ApplyParam
function ApplyParam(context, target, param){
var nextId = 0
function ApplyParam (context, target, param) {
var id = nextId++
var release = null
var lastValue = null
var currentTime = context.audio.currentTime
var events = []
var fallback = null
if (!target.getValueAtTime) {
var audioParam = new PseudoAudioParam()
audioParam.applyTo(target)
fallback = target
target = audioParam
}
var maxSchedule = 0
if (param.onSchedule){
if (param.onSchedule) {
release = param.onSchedule(schedule)
if (param.getValueAt){
lastValue = param.getValueAt(currentTime)
if (param.getValueAt) {
send('setValueAtTime', [
param.getValueAt(currentTime),
currentTime]
)
}
} else if (typeof param === 'function'){
} else if (typeof param === 'function') {
release = param(schedule)
lastValue = param()
send('setValueAtTime', [
param(),
currentTime
])
}
if (currentTime != null && isFinite(lastValue)) {
target.setValueAtTime(lastValue, currentTime)
}
return release
// scoped
function schedule(descriptor){
if (!(descriptor instanceof Object)){
function send (method, args) {
if (fallback) {
fallback[method].apply(fallback, args)
}
target[method].apply(target, args)
}
function schedule (descriptor) {
if (!(descriptor instanceof Object)) {
descriptor = { value: descriptor, at: context.audio.currentTime }

@@ -40,87 +54,42 @@ }

var toTime = descriptor.at + (descriptor.duration || 0)
lastValue = descriptor.value
var fromTime = Math.max(descriptor.at, context.audio.currentTime)
toTime = Math.max(fromTime, toTime)
descriptor.at = Math.max(descriptor.at, context.audio.currentTime)
toTime = Math.max(toTime, context.audio.currentTime)
var fromValue = descriptor.fromValue != null
? descriptor.fromValue
: target.getValueAtTime(fromTime)
var fromValue = getValueAt(descriptor.at)
var toValue = descriptor.value
descriptor.fromValue = descriptor.fromValue != null ?
descriptor.fromValue :
fromValue
if (descriptor.mode === 'cancel') {
target.cancelScheduledValues(descriptor.at)
truncate(descriptor.at)
} else if (descriptor.duration) {
if (maxSchedule > descriptor.at){
target.cancelScheduledValues(descriptor.at)
maxSchedule = descriptor.at
send('cancelScheduledValues', [fromTime])
} else {
if (maxSchedule > fromTime) {
send('cancelScheduledValues', [fromTime])
maxSchedule = fromTime
}
if (isRampingAt(descriptor.at)){
target.setValueAtTime(fromValue, descriptor.at)
if (isFinite(fromValue) && (typeof descriptor.fromValue === 'number' || descriptor.mode !== 'log') && descriptor.mode !== 'curve') {
send('setValueAtTime', [fromValue, fromTime])
}
truncate(descriptor.at)
events.push(descriptor)
if (descriptor.mode === 'exp'){
target.exponentialRampToValueAtTime(descriptor.value, toTime)
} else if (descriptor.mode === 'log'){
target.setTargetAtTime(descriptor.value, descriptor.at, descriptor.duration / 8)
if (descriptor.mode === 'curve') {
send('setValueCurveAtTime', [toValue, fromTime, descriptor.duration || 0.0001])
} else if (descriptor.duration) {
if (descriptor.mode === 'exp') {
send('exponentialRampToValueAtTime', [toValue, toTime])
} else if (descriptor.mode === 'log') {
send('setTargetAtTime', [toValue, fromTime, descriptor.duration / 8])
} else {
send('linearRampToValueAtTime', [toValue, toTime])
}
} else {
target.linearRampToValueAtTime(descriptor.value, toTime)
send('setValueAtTime', [toValue, fromTime])
}
} else if (descriptor.mode !== 'init' || !maxSchedule) {
truncate(descriptor.at)
events.push(descriptor)
target.cancelScheduledValues(descriptor.at)
target.setValueAtTime(descriptor.value, descriptor.at)
maxSchedule = descriptor.at
}
if (maxSchedule < toTime){
if (maxSchedule < toTime) {
maxSchedule = toTime
}
}
function truncate(at){
var currentTime = context.audio.currentTime
for (var i=events.length-1;i>=0;i--){
var to = events[i].at + (events[i].duration || 0)
if (events[i].at > at || to < currentTime){
events.splice(i, 1)
}
}
}
function getEndTime(){
var lastEvent = events[events.length-1]
if (lastEvent){
return lastEvent.at + (lastEvent.duration || 0)
}
}
function getValueAt(time){
for (var i=0;i<events.length;i++){
var event = events[i]
var next = events[i+1]
if (!next || next.at > time){
return interpolate(event, time)
}
}
return lastValue
}
function isRampingAt(time){
for (var i=0;i<events.length;i++){
var event = events[i]
if (event.at >= time && (event.at + event.duration||0) <= time){
return event.duration && event.mode !== 'log'
}
}
return false
}
}

@@ -25,3 +25,4 @@ var ObservNode = require('observ-node-array/single')

var msg = {
type: 'set',
mode: 'log',
duration: 0.1,
value: obs(),

@@ -28,0 +29,0 @@ at: context.audio.currentTime

{
"name": "audio-slot-param",
"version": "1.2.0",
"version": "2.0.0",
"description": "Link and transform schedule-based observables and connect to AudioParams (Web Audio API).",

@@ -33,4 +33,5 @@ "main": "index.js",

"observ-node-array": "^1.10.0",
"pseudo-audio-param": "^1.1.0",
"setimmediate2": "^2.0.1"
}
}
var Event = require('geval')
var interpolate = require('./lib/interpolate.js')
var PseudoAudioParam = require('pseudo-audio-param')
var apply = require('./apply')
var setImmediate = require('setimmediate2').setImmediate

@@ -10,5 +12,7 @@ module.exports = ParamTransform

var transforms = []
var lastValues = []
var interpolateChannel = []
var values = []
var rescheduling = false
var scheduleFrom = context.audio.currentTime
params.forEach(function (container, i) {

@@ -23,18 +27,12 @@ if (container.onSchedule) {

var param = container.param
if (param.onSchedule) {
releases.push(param.onSchedule(schedule.bind(this, i)))
interpolateChannel[i] = true
var channel = channels[i] = new PseudoAudioParam()
releases.push(apply(context, channel, param))
releases.push(param.onSchedule(onSchedule))
} else if (typeof param === 'function') {
releases.push(param(schedule.bind(this, i)))
releases.push(param(onChange.bind(this, i)))
values[i] = param()
}
if (param.getValueAt) {
lastValues[i] = param.getValueAt(context.audio.currentTime)
} else if (typeof param === 'function') {
lastValues[i] = param()
}
channels[i] = []
} else if (container.value != null) {
lastValues[i] = container.value
values[i] = container.value
}

@@ -73,62 +71,55 @@

// scoped
function onSchedule (descriptor) {
schedule(Math.max(context.audio.currentTime, descriptor.at))
}
function schedule (index, descriptor) {
if (!interpolateChannel[index]) {
descriptor = { value: descriptor, at: context.audio.currentTime }
}
function onChange (i, value) {
values[i] = value
schedule(context.audio.currentTime)
}
if (descriptor.mode === 'cancel') {
var currentValue = getChannelValueAt(index, descriptor.at)
if (isFinite(currentValue) && getEndTime() > context.audio.currentTime) {
descriptor.value = currentValue
truncate(index, descriptor.at)
channels[index].push(descriptor)
} else {
return false
}
function schedule (from) {
scheduleFrom = Math.max(context.audio.currentTime, Math.min(from, scheduleFrom))
if (!rescheduling) {
rescheduling = true
setImmediate(doSchedule)
}
}
var toTime = descriptor.at + (descriptor.duration || 0)
lastValues[index] = descriptor.value
function doSchedule () {
rescheduling = false
var endTime = Math.max(scheduleFrom, getEndTime())
var duration = endTime - scheduleFrom
descriptor.fromValue = descriptor.fromValue != null
? descriptor.fromValue
: getChannelValueAt(index, descriptor.at)
var steps = Math.ceil(duration * context.audio.sampleRate / 100) || 1
var stepTime = duration / steps
var curve = new Float32Array(steps + 1)
for (var i = 0; i < curve.length; i++) {
var time = stepTime * i + scheduleFrom
curve[i] = getValueAt(time)
}
truncate(index, descriptor.at)
channels[index].push(descriptor)
broadcastIfValid({
at: descriptor.at,
mode: descriptor.mode,
value: getValueAt(toTime),
duration: descriptor.duration
broadcast({
at: scheduleFrom,
mode: 'curve',
value: curve,
duration: duration
})
var endTime = getEndTime()
if (endTime > toTime) {
broadcastIfValid({
at: toTime,
value: getValueAt(endTime),
duration: endTime - toTime
})
}
scheduleFrom = endTime
}
function broadcastIfValid (descriptor) {
if (descriptor && isFinite(descriptor.value)) {
broadcast(descriptor)
}
}
function truncate (index, at) {
var events = channels[index]
var currentTime = context.audio.currentTime
for (var i = events.length - 1; i >= 0; i--) {
var to = events[i].at + (events[i].duration || 0)
if (events[i].at > at || to < currentTime) {
events.splice(i, 1)
function getValueAt (at) {
var lastValue = 1
for (var i = 0; i < params.length; i++) {
var value = channels[i]
? channels[i].getValueAtTime(at)
: values[i]
if (transforms[i]) {
lastValue = transforms[i](lastValue, value)
} else {
lastValue = value
}
}
return lastValue
}

@@ -139,7 +130,8 @@

for (var i = 0; i < params.length; i++) {
var events = channels[i]
if (events) {
if (channels[i] && channels[i].events) {
var events = channels[i].events
var lastEvent = events[events.length - 1]
if (lastEvent) {
var endAt = lastEvent.at + (lastEvent.duration || 0)
var duration = lastEvent.timeConstant ? lastEvent.timeConstant * 8 : lastEvent.duration
var endAt = lastEvent.time + (duration || 0)
if (endAt > maxTime) {

@@ -153,46 +145,2 @@ maxTime = endAt

}
function getValueAt (time) {
var lastValue = 1
for (var i = 0; i < params.length; i++) {
var value = getChannelValueAt(i, time)
var l = lastValue
if (transforms[i]) {
lastValue = transforms[i](lastValue, value)
} else {
lastValue = value
}
if (typeof lastValue === 'number' && isNaN(lastValue)) {
getChannelValueAt(i, time)
transforms[i](l, value)
}
}
return lastValue
}
function getChannelValueAt (index, time) {
var events = channels[index]
if (events) {
for (var i = 0; i < events.length; i++) {
var event = events[i]
var next = events[i + 1]
if (!next || next.at > time) {
if (interpolateChannel[index]) {
return interpolate(event, time)
} else {
return event.value
}
}
}
}
return lastValues[index]
}
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc