Tone.js/Tone/component/Meter.js

101 lines
2.3 KiB
JavaScript
Raw Normal View History

define(["Tone/core/Tone", "Tone/component/Analyser", "Tone/core/AudioNode"], function(Tone){
2014-03-11 23:27:46 +00:00
"use strict";
2014-06-16 01:18:29 +00:00
/**
2018-05-17 15:40:59 +00:00
* @class Tone.Meter gets the [RMS](https://en.wikipedia.org/wiki/Root_mean_square)
* of an input signal. It can also get the raw
* value of the input signal.
2014-06-16 01:18:29 +00:00
*
* @constructor
* @param {Number} smoothing The amount of smoothing applied between frames.
2018-05-17 15:40:59 +00:00
* @extends {Tone.AudioNode}
2015-07-02 00:19:58 +00:00
* @example
* var meter = new Tone.Meter();
* var mic = new Tone.UserMedia().open();
2015-07-02 00:19:58 +00:00
* //connect mic to the meter
* mic.connect(meter);
* //the current level of the mic input in decibels
2018-05-17 15:40:59 +00:00
* var level = meter.getLevel();
2014-06-16 01:18:29 +00:00
*/
Tone.Meter = function(){
var options = Tone.defaults(arguments, ["smoothing"], Tone.Meter);
Tone.AudioNode.call(this);
2018-05-17 15:40:59 +00:00
/**
* A value from 0 -> 1 where 0 represents no time averaging with the last analysis frame.
* @type {Number}
*/
this.smoothing = options.smoothing;
/**
* The previous frame's value
* @type {Number}
* @private
*/
this._rms = 0;
/**
* The analyser node which computes the levels.
2014-06-16 01:18:29 +00:00
* @private
* @type {Tone.Analyser}
2014-06-16 01:18:29 +00:00
*/
this.input = this.output = this._analyser = new Tone.Analyser("waveform", 1024);
2014-06-15 22:19:05 +00:00
};
2014-03-11 23:27:46 +00:00
Tone.extend(Tone.Meter, Tone.AudioNode);
2014-03-11 23:27:46 +00:00
/**
* The defaults
* @type {Object}
* @static
* @const
*/
Tone.Meter.defaults = {
"smoothing" : 0.8,
};
/**
* Get the current decibel value of the incoming signal
* @returns {Decibels}
*/
Tone.Meter.prototype.getLevel = function(){
var values = this._analyser.getValue();
2018-05-17 15:40:59 +00:00
var totalSquared = 0;
for (var i = 0; i < values.length; i++){
var value = values[i];
totalSquared += value * value;
}
2018-05-17 15:40:59 +00:00
var rms = Math.sqrt(totalSquared / values.length);
//the rms can only fall at the rate of the smoothing
//but can jump up instantly
this._rms = Math.max(rms, this._rms * this.smoothing);
return Tone.gainToDb(this._rms);
};
2014-06-16 01:18:29 +00:00
/**
* Get the signal value of the incoming signal
* @returns {Number}
*/
Tone.Meter.prototype.getValue = function(){
var value = this._analyser.getValue();
return value[0];
};
/**
2015-06-20 23:25:49 +00:00
* Clean up.
* @returns {Tone.Meter} this
*/
Tone.Meter.prototype.dispose = function(){
Tone.AudioNode.prototype.dispose.call(this);
this._analyser.dispose();
this._analyser = null;
2015-02-02 17:49:13 +00:00
return this;
};
return Tone.Meter;
});