UNPKG

sono

Version:

A simple yet powerful JavaScript library for working with Web Audio

127 lines (104 loc) 3.72 kB
'use strict'; exports.__esModule = true; var _context = require('../context'); var _context2 = _interopRequireDefault(_context); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var offlineCtx = void 0; /* In contrast with a standard AudioContext, an OfflineAudioContext doesn't render the audio to the device hardware; instead, it generates it, as fast as it can, and outputs the result to an AudioBuffer. */ function getOfflineContext(numOfChannels, length, sampleRate) { if (offlineCtx) { return offlineCtx; } numOfChannels = numOfChannels || 2; sampleRate = sampleRate || 44100; length = sampleRate || numOfChannels; var OfflineCtx = window.OfflineAudioContext || window.webkitOfflineAudioContext; offlineCtx = OfflineCtx ? new OfflineCtx(numOfChannels, length, sampleRate) : null; return offlineCtx; } /* * clone audio buffer */ function cloneBuffer(buffer) { var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var length = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : buffer.length; if (!_context2.default || _context2.default.isFake) { return buffer; } var numChannels = buffer.numberOfChannels; var cloned = _context2.default.createBuffer(numChannels, length, buffer.sampleRate); for (var i = 0; i < numChannels; i++) { cloned.getChannelData(i).set(buffer.getChannelData(i).slice(offset, offset + length)); } return cloned; } /* * reverse audio buffer */ function reverseBuffer(buffer) { var numChannels = buffer.numberOfChannels; for (var i = 0; i < numChannels; i++) { Array.prototype.reverse.call(buffer.getChannelData(i)); } return buffer; } /* * ramp audio param */ function ramp(param, fromValue, toValue, duration, linear) { if (_context2.default.isFake) { return; } param.setValueAtTime(fromValue, _context2.default.currentTime); if (linear) { param.linearRampToValueAtTime(toValue, _context2.default.currentTime + duration); } else { param.exponentialRampToValueAtTime(toValue, _context2.default.currentTime + duration); } } /* * get frequency from min to max by passing 0 to 1 */ function getFrequency(value) { if (_context2.default.isFake) { return 0; } // get frequency by passing number from 0 to 1 // Clamp the frequency between the minimum value (40 Hz) and half of the // sampling rate. var minValue = 40; var maxValue = _context2.default.sampleRate / 2; // Logarithm (base 2) to compute how many octaves fall in the range. var numberOfOctaves = Math.log(maxValue / minValue) / Math.LN2; // Compute a multiplier from 0 to 1 based on an exponential scale. var multiplier = Math.pow(2, numberOfOctaves * (value - 1.0)); // Get back to the frequency value between min and max. return maxValue * multiplier; } /* * Format seconds as timecode string */ function timeCode(seconds) { var delim = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ':'; // const h = Math.floor(seconds / 3600); // const m = Math.floor((seconds % 3600) / 60); var m = Math.floor(seconds / 60); var s = Math.floor(seconds % 3600 % 60); // const hr = (h < 10 ? '0' + h + delim : h + delim); var mn = (m < 10 ? '0' + m : m) + delim; var sc = s < 10 ? '0' + s : s; // return hr + mn + sc; return mn + sc; } exports.default = { getOfflineContext: getOfflineContext, cloneBuffer: cloneBuffer, reverseBuffer: reverseBuffer, ramp: ramp, getFrequency: getFrequency, timeCode: timeCode };