Tone.js/test/helper/BufferTest.js
2018-01-03 12:02:41 -05:00

158 lines
3.8 KiB
JavaScript

define(["Tone/core/Tone"], function(Tone) {
//augment the built in functions
return function(buffer){
buffer.isSilent = function(channelNum){
if (Tone.isUndef(channelNum)){
return buffer.toMono().isSilent(0);
} else {
var array = buffer.toArray(channelNum);
for (var i = 0; i < array.length; i++){
if (array[i] !== 0){
return false;
}
}
return true;
}
};
/**
* Get the RMS levels for the buffer, returned as an array
* @param {blockSize} [blockSize=512]
*/
buffer.getRMS = function(blockSize){
blockSize = blockSize || 512;
var rms = [];
var array = buffer.toMono().toArray();
for (var j = 0; j < array.length; j++){
var sum = 0;
if (j >= blockSize){
for (var k = j - blockSize; k < j; k++){
sum += array[k] * array[k];
}
rms.push(Math.sqrt(sum / blockSize));
}
}
return rms;
};
//get the rms at the given time
buffer.getRmsAtTime = function(time){
var rms = this.getRMS();
var sample = Math.floor(time * this.context.sampleRate);
return rms[sample];
};
//return the time when the buffer is no longer silent
buffer.getFirstSoundTime = function(channelNum){
if (Tone.isUndef(channelNum)){
return buffer.toMono().getFirstSoundTime(0);
} else {
var array = buffer.toArray(channelNum);
for (var i = 0; i < array.length; i++){
if (array[i] !== 0){
return i / buffer.context.sampleRate;
}
}
return -1;
}
};
//returns the value at the given time
buffer.getValueAtTime = function(time){
var ret = [];
var sample = Math.round(time * buffer.context.sampleRate);
for (var i = 0; i < buffer.numberOfChannels; i++){
ret[i] = buffer.getChannelData(i)[sample];
}
if (ret.length === 1){
return ret[0];
} else {
return ret;
}
};
//return the time when the buffer is silent to the remainer of the buffer
buffer.getLastSoundTime = function(channelNum){
if (Tone.isUndef(channelNum)){
return buffer.toMono().getLastSoundTime(0);
} else {
var array = buffer.toArray(channelNum);
for (var i = array.length - 1; i >= 0; i--){
if (array[i] !== 0){
return i / buffer.context.sampleRate;
}
}
return 0;
}
};
//stops and returns value if callback does
buffer.forEach = function(callback, start, end){
var i, ret;
start = start || 0;
end = end || buffer.duration;
start = Math.floor((start / buffer.duration) * buffer.length);
end = Math.floor((end / buffer.duration) * buffer.length);
if (buffer.numberOfChannels === 2){
var arrayL = buffer.toArray(0);
var arrayR = buffer.toArray(1);
for (i = start; i < end; i++){
ret = callback(arrayL[i], arrayR[i], (i/buffer.length) * buffer.duration);
if (typeof ret !== "undefined"){
return ret;
}
}
} else {
var array = buffer.toArray();
for (i = start; i < end; i++){
ret = callback(array[i], (i/array.length) * buffer.duration);
if (typeof ret !== "undefined"){
return ret;
}
}
}
};
/**
* Returns the max value in the buffer
* @return {Number}
*/
buffer.max = function(){
var max = -Infinity;
buffer.toMono().forEach(function(sample){
max = Math.max(sample, max);
});
return max;
};
/**
* Returns the min value in the buffer
* @return {Number}
*/
buffer.min = function(){
var min = Infinity;
buffer.toMono().forEach(function(sample){
min = Math.min(sample, min);
});
return min;
};
/**
* returns the value if there is a single value the entire buffer
*/
buffer.value = function(){
var val;
buffer.toMono().forEach(function(sample){
if (typeof val === "undefined"){
val = sample;
} else if (Math.abs(val - sample) > 0.0001){
throw new Error("multiple values in buffer");
}
});
return val;
};
};
});