sono
Version:
A simple yet powerful JavaScript library for working with Web Audio
127 lines (104 loc) • 3.72 kB
JavaScript
;
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
};