Tone.js/Tone/core/Master.js

93 lines
2.2 KiB
JavaScript
Raw Normal View History

2014-04-06 20:51:30 +00:00
define(["Tone/core/Tone"], function(Tone){
"use strict";
2014-06-18 19:39:10 +00:00
/**
2014-09-05 15:32:33 +00:00
* @class A single master output.
* adds toMaster to Tone
2014-06-18 19:39:10 +00:00
*
* @constructor
* @extends {Tone}
*/
Tone.Master = function(){
Tone.call(this);
2014-06-18 19:39:10 +00:00
/**
* put a hard limiter on the output so we don't blow any eardrums
*
* @type {DynamicsCompressorNode}
*/
this.limiter = this.context.createDynamicsCompressor();
this.limiter.threshold.value = 0;
this.limiter.ratio.value = 20;
2014-10-01 18:47:45 +00:00
2014-06-18 19:39:10 +00:00
//connect it up
this.chain(this.input, this.limiter, this.output, this.context.destination);
2014-06-18 19:39:10 +00:00
};
Tone.extend(Tone.Master);
/**
* mute the output
* @param {boolean} muted
*/
Tone.Master.prototype.mute = function(muted){
muted = this.defaultArg(muted, true);
if (muted){
this.output.gain.value = 0;
} else {
this.output.gain.value = 1;
}
};
2014-06-21 17:06:37 +00:00
/**
2014-09-06 19:36:59 +00:00
* @param {number} db volume in decibels
2014-06-21 17:06:37 +00:00
* @param {Tone.Time=} fadeTime (optional) time it takes to reach the value
*/
Tone.Master.prototype.setVolume = function(db, fadeTime){
2014-06-21 17:06:37 +00:00
var now = this.now();
2014-09-06 19:36:59 +00:00
var gain = this.dbToGain(db);
2014-06-21 17:06:37 +00:00
if (fadeTime){
var currentVolume = this.output.gain.value;
this.output.gain.cancelScheduledValues(now);
this.output.gain.setValueAtTime(currentVolume, now);
2014-09-06 19:36:59 +00:00
this.output.gain.linearRampToValueAtTime(gain, now + this.toSeconds(fadeTime));
2014-06-21 17:06:37 +00:00
} else {
2014-09-06 19:36:59 +00:00
this.output.gain.setValueAtTime(gain, now);
2014-06-21 17:06:37 +00:00
}
};
///////////////////////////////////////////////////////////////////////////
2014-06-18 19:39:10 +00:00
// AUGMENT TONE's PROTOTYPE
///////////////////////////////////////////////////////////////////////////
2014-06-18 19:39:10 +00:00
/**
* connect 'this' to the master output
* defined in "Tone/core/Master"
2014-06-18 19:39:10 +00:00
*/
Tone.prototype.toMaster = function(){
this.connect(Tone.Master);
2014-06-18 19:39:10 +00:00
};
2014-06-18 19:39:10 +00:00
/**
* Also augment AudioNode's prototype to include toMaster
* as a convenience
*/
AudioNode.prototype.toMaster = function(){
this.connect(Tone.Master);
2014-06-18 19:39:10 +00:00
};
var MasterConstructor = Tone.Master;
//a single master output
Tone.Master = new Tone.Master();
/**
2014-07-30 17:55:24 +00:00
* initialize the module and listen for new audio contexts
*/
2014-07-30 17:55:24 +00:00
Tone._initAudioContext(function(){
MasterConstructor.call(Tone.Master);
2014-07-30 17:55:24 +00:00
});
return Tone.Master;
2014-06-18 19:46:31 +00:00
});