automation-events
Version:
A module which provides an implementation of an automation event list.
141 lines (140 loc) • 12.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.AutomationEventList = void 0;
var _createExtendedExponentialRampToValueAutomationEvent = require("../functions/create-extended-exponential-ramp-to-value-automation-event");
var _createExtendedLinearRampToValueAutomationEvent = require("../functions/create-extended-linear-ramp-to-value-automation-event");
var _createSetValueAutomationEvent = require("../functions/create-set-value-automation-event");
var _createSetValueCurveAutomationEvent = require("../functions/create-set-value-curve-automation-event");
var _getEndTimeAndValueOfPreviousAutomationEvent = require("../functions/get-end-time-and-value-of-previous-automation-event");
var _getEventTime = require("../functions/get-event-time");
var _getExponentialRampValueAtTime = require("../functions/get-exponential-ramp-value-at-time");
var _getLinearRampValueAtTime = require("../functions/get-linear-ramp-value-at-time");
var _getTargetValueAtTime = require("../functions/get-target-value-at-time");
var _getValueCurveValueAtTime = require("../functions/get-value-curve-value-at-time");
var _getValueOfAutomationEventAtIndexAtTime = require("../functions/get-value-of-automation-event-at-index-at-time");
var _anyRampToValueAutomationEvent = require("../guards/any-ramp-to-value-automation-event");
var _cancelAndHoldAutomationEvent = require("../guards/cancel-and-hold-automation-event");
var _cancelScheduledValuesAutomationEvent = require("../guards/cancel-scheduled-values-automation-event");
var _exponentialRampToValueAutomationEvent = require("../guards/exponential-ramp-to-value-automation-event");
var _linearRampToValueAutomationEvent = require("../guards/linear-ramp-to-value-automation-event");
var _setTargetAutomationEvent = require("../guards/set-target-automation-event");
var _setValueAutomationEvent = require("../guards/set-value-automation-event");
var _setValueCurveAutomationEvent = require("../guards/set-value-curve-automation-event");
class AutomationEventList {
constructor(defaultValue) {
this._automationEvents = [];
this._currenTime = 0;
this._defaultValue = defaultValue;
}
[Symbol.iterator]() {
return this._automationEvents[Symbol.iterator]();
}
add(automationEvent) {
const eventTime = (0, _getEventTime.getEventTime)(automationEvent);
if ((0, _cancelAndHoldAutomationEvent.isCancelAndHoldAutomationEvent)(automationEvent) || (0, _cancelScheduledValuesAutomationEvent.isCancelScheduledValuesAutomationEvent)(automationEvent)) {
const index = this._automationEvents.findIndex(currentAutomationEvent => {
if ((0, _cancelScheduledValuesAutomationEvent.isCancelScheduledValuesAutomationEvent)(automationEvent) && (0, _setValueCurveAutomationEvent.isSetValueCurveAutomationEvent)(currentAutomationEvent)) {
return currentAutomationEvent.startTime + currentAutomationEvent.duration >= eventTime;
}
return (0, _getEventTime.getEventTime)(currentAutomationEvent) >= eventTime;
});
const removedAutomationEvent = this._automationEvents[index];
if (index !== -1) {
this._automationEvents = this._automationEvents.slice(0, index);
}
if ((0, _cancelAndHoldAutomationEvent.isCancelAndHoldAutomationEvent)(automationEvent)) {
const lastAutomationEvent = this._automationEvents[this._automationEvents.length - 1];
if (removedAutomationEvent !== undefined && (0, _anyRampToValueAutomationEvent.isAnyRampToValueAutomationEvent)(removedAutomationEvent)) {
if (lastAutomationEvent !== undefined && (0, _setTargetAutomationEvent.isSetTargetAutomationEvent)(lastAutomationEvent)) {
throw new Error('The internal list is malformed.');
}
const startTime = lastAutomationEvent === undefined ? removedAutomationEvent.insertTime : (0, _setValueCurveAutomationEvent.isSetValueCurveAutomationEvent)(lastAutomationEvent) ? lastAutomationEvent.startTime + lastAutomationEvent.duration : (0, _getEventTime.getEventTime)(lastAutomationEvent);
const startValue = lastAutomationEvent === undefined ? this._defaultValue : (0, _setValueCurveAutomationEvent.isSetValueCurveAutomationEvent)(lastAutomationEvent) ? lastAutomationEvent.values[lastAutomationEvent.values.length - 1] : lastAutomationEvent.value;
const value = (0, _exponentialRampToValueAutomationEvent.isExponentialRampToValueAutomationEvent)(removedAutomationEvent) ? (0, _getExponentialRampValueAtTime.getExponentialRampValueAtTime)(eventTime, startTime, startValue, removedAutomationEvent) : (0, _getLinearRampValueAtTime.getLinearRampValueAtTime)(eventTime, startTime, startValue, removedAutomationEvent);
const truncatedAutomationEvent = (0, _exponentialRampToValueAutomationEvent.isExponentialRampToValueAutomationEvent)(removedAutomationEvent) ? (0, _createExtendedExponentialRampToValueAutomationEvent.createExtendedExponentialRampToValueAutomationEvent)(value, eventTime, this._currenTime) : (0, _createExtendedLinearRampToValueAutomationEvent.createExtendedLinearRampToValueAutomationEvent)(value, eventTime, this._currenTime);
this._automationEvents.push(truncatedAutomationEvent);
}
if (lastAutomationEvent !== undefined && (0, _setTargetAutomationEvent.isSetTargetAutomationEvent)(lastAutomationEvent)) {
this._automationEvents.push((0, _createSetValueAutomationEvent.createSetValueAutomationEvent)(this.getValue(eventTime), eventTime));
}
if (lastAutomationEvent !== undefined && (0, _setValueCurveAutomationEvent.isSetValueCurveAutomationEvent)(lastAutomationEvent) && lastAutomationEvent.startTime + lastAutomationEvent.duration > eventTime) {
const duration = eventTime - lastAutomationEvent.startTime;
const ratio = (lastAutomationEvent.values.length - 1) / lastAutomationEvent.duration;
const length = Math.max(2, 1 + Math.ceil(duration * ratio));
const fraction = duration / (length - 1) * ratio;
const values = lastAutomationEvent.values.slice(0, length);
if (fraction < 1) {
for (let i = 1; i < length; i += 1) {
const factor = fraction * i % 1;
values[i] = lastAutomationEvent.values[i - 1] * (1 - factor) + lastAutomationEvent.values[i] * factor;
}
}
this._automationEvents[this._automationEvents.length - 1] = (0, _createSetValueCurveAutomationEvent.createSetValueCurveAutomationEvent)(values, lastAutomationEvent.startTime, duration);
}
}
} else {
const index = this._automationEvents.findIndex(currentAutomationEvent => (0, _getEventTime.getEventTime)(currentAutomationEvent) > eventTime);
const previousAutomationEvent = index === -1 ? this._automationEvents[this._automationEvents.length - 1] : this._automationEvents[index - 1];
if (previousAutomationEvent !== undefined && (0, _setValueCurveAutomationEvent.isSetValueCurveAutomationEvent)(previousAutomationEvent) && (0, _getEventTime.getEventTime)(previousAutomationEvent) + previousAutomationEvent.duration > eventTime) {
return false;
}
const persistentAutomationEvent = (0, _exponentialRampToValueAutomationEvent.isExponentialRampToValueAutomationEvent)(automationEvent) ? (0, _createExtendedExponentialRampToValueAutomationEvent.createExtendedExponentialRampToValueAutomationEvent)(automationEvent.value, automationEvent.endTime, this._currenTime) : (0, _linearRampToValueAutomationEvent.isLinearRampToValueAutomationEvent)(automationEvent) ? (0, _createExtendedLinearRampToValueAutomationEvent.createExtendedLinearRampToValueAutomationEvent)(automationEvent.value, eventTime, this._currenTime) : automationEvent;
if (index === -1) {
this._automationEvents.push(persistentAutomationEvent);
} else {
if ((0, _setValueCurveAutomationEvent.isSetValueCurveAutomationEvent)(automationEvent) && eventTime + automationEvent.duration > (0, _getEventTime.getEventTime)(this._automationEvents[index])) {
return false;
}
this._automationEvents.splice(index, 0, persistentAutomationEvent);
}
}
return true;
}
flush(time) {
const index = this._automationEvents.findIndex(currentAutomationEvent => (0, _getEventTime.getEventTime)(currentAutomationEvent) > time);
if (index > 1) {
const remainingAutomationEvents = this._automationEvents.slice(index - 1);
const firstRemainingAutomationEvent = remainingAutomationEvents[0];
if ((0, _setTargetAutomationEvent.isSetTargetAutomationEvent)(firstRemainingAutomationEvent)) {
remainingAutomationEvents.unshift((0, _createSetValueAutomationEvent.createSetValueAutomationEvent)((0, _getValueOfAutomationEventAtIndexAtTime.getValueOfAutomationEventAtIndexAtTime)(this._automationEvents, index - 2, firstRemainingAutomationEvent.startTime, this._defaultValue), firstRemainingAutomationEvent.startTime));
}
this._automationEvents = remainingAutomationEvents;
}
}
getValue(time) {
if (this._automationEvents.length === 0) {
return this._defaultValue;
}
const indexOfNextEvent = this._automationEvents.findIndex(automationEvent => (0, _getEventTime.getEventTime)(automationEvent) > time);
const nextAutomationEvent = this._automationEvents[indexOfNextEvent];
const indexOfCurrentEvent = (indexOfNextEvent === -1 ? this._automationEvents.length : indexOfNextEvent) - 1;
const currentAutomationEvent = this._automationEvents[indexOfCurrentEvent];
if (currentAutomationEvent !== undefined && (0, _setTargetAutomationEvent.isSetTargetAutomationEvent)(currentAutomationEvent) && (nextAutomationEvent === undefined || !(0, _anyRampToValueAutomationEvent.isAnyRampToValueAutomationEvent)(nextAutomationEvent) || nextAutomationEvent.insertTime > time)) {
return (0, _getTargetValueAtTime.getTargetValueAtTime)(time, (0, _getValueOfAutomationEventAtIndexAtTime.getValueOfAutomationEventAtIndexAtTime)(this._automationEvents, indexOfCurrentEvent - 1, currentAutomationEvent.startTime, this._defaultValue), currentAutomationEvent);
}
if (currentAutomationEvent !== undefined && (0, _setValueAutomationEvent.isSetValueAutomationEvent)(currentAutomationEvent) && (nextAutomationEvent === undefined || !(0, _anyRampToValueAutomationEvent.isAnyRampToValueAutomationEvent)(nextAutomationEvent))) {
return currentAutomationEvent.value;
}
if (currentAutomationEvent !== undefined && (0, _setValueCurveAutomationEvent.isSetValueCurveAutomationEvent)(currentAutomationEvent) && (nextAutomationEvent === undefined || !(0, _anyRampToValueAutomationEvent.isAnyRampToValueAutomationEvent)(nextAutomationEvent) || currentAutomationEvent.startTime + currentAutomationEvent.duration > time)) {
if (time < currentAutomationEvent.startTime + currentAutomationEvent.duration) {
return (0, _getValueCurveValueAtTime.getValueCurveValueAtTime)(time, currentAutomationEvent);
}
return currentAutomationEvent.values[currentAutomationEvent.values.length - 1];
}
if (currentAutomationEvent !== undefined && (0, _anyRampToValueAutomationEvent.isAnyRampToValueAutomationEvent)(currentAutomationEvent) && (nextAutomationEvent === undefined || !(0, _anyRampToValueAutomationEvent.isAnyRampToValueAutomationEvent)(nextAutomationEvent))) {
return currentAutomationEvent.value;
}
if (nextAutomationEvent !== undefined && (0, _exponentialRampToValueAutomationEvent.isExponentialRampToValueAutomationEvent)(nextAutomationEvent)) {
const [startTime, value] = (0, _getEndTimeAndValueOfPreviousAutomationEvent.getEndTimeAndValueOfPreviousAutomationEvent)(this._automationEvents, indexOfCurrentEvent, currentAutomationEvent, nextAutomationEvent, this._defaultValue);
return (0, _getExponentialRampValueAtTime.getExponentialRampValueAtTime)(time, startTime, value, nextAutomationEvent);
}
if (nextAutomationEvent !== undefined && (0, _linearRampToValueAutomationEvent.isLinearRampToValueAutomationEvent)(nextAutomationEvent)) {
const [startTime, value] = (0, _getEndTimeAndValueOfPreviousAutomationEvent.getEndTimeAndValueOfPreviousAutomationEvent)(this._automationEvents, indexOfCurrentEvent, currentAutomationEvent, nextAutomationEvent, this._defaultValue);
return (0, _getLinearRampValueAtTime.getLinearRampValueAtTime)(time, startTime, value, nextAutomationEvent);
}
return this._defaultValue;
}
}
exports.AutomationEventList = AutomationEventList;