2014-04-06 20:51:30 +00:00
|
|
|
define(["Tone/core/Tone"], function(Tone){
|
2014-09-04 04:41:40 +00:00
|
|
|
|
|
|
|
"use strict";
|
2014-06-19 02:35:31 +00:00
|
|
|
|
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}
|
|
|
|
*/
|
2014-09-11 17:00:59 +00:00
|
|
|
Tone.Master = function(){
|
2014-04-05 22:05:42 +00:00
|
|
|
Tone.call(this);
|
2014-10-01 18:47:45 +00:00
|
|
|
|
2014-12-19 21:32:59 +00:00
|
|
|
//connections
|
|
|
|
this.input.chain(this.output, this.context.destination);
|
2014-06-18 19:39:10 +00:00
|
|
|
};
|
2014-04-05 22:05:42 +00:00
|
|
|
|
2014-09-11 17:00:59 +00:00
|
|
|
Tone.extend(Tone.Master);
|
2014-04-05 22:05:42 +00:00
|
|
|
|
2014-06-19 02:35:31 +00:00
|
|
|
/**
|
|
|
|
* mute the output
|
|
|
|
* @param {boolean} muted
|
|
|
|
*/
|
2014-09-11 17:00:59 +00:00
|
|
|
Tone.Master.prototype.mute = function(muted){
|
2014-06-19 02:35:31 +00:00
|
|
|
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-12-02 06:42:08 +00:00
|
|
|
* @param {Tone.Time=} fadeTime time it takes to reach the value
|
2014-06-21 17:06:37 +00:00
|
|
|
*/
|
2014-09-11 17:00:59 +00:00
|
|
|
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-12-19 21:32:59 +00:00
|
|
|
/**
|
|
|
|
* route the master signal to the node's input.
|
|
|
|
* NOTE: this will disconnect the previously connected node
|
|
|
|
* @param {AudioNode|Tone} node the node to use as the entry
|
|
|
|
* point to the master chain
|
|
|
|
*/
|
|
|
|
Tone.Master.prototype.send = function(node){
|
|
|
|
//disconnect the previous node
|
|
|
|
this.input.disconnect();
|
|
|
|
this.input.connect(node);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* the master effects chain return point
|
|
|
|
* @param {AudioNode|Tone} node the node to connect
|
|
|
|
*/
|
|
|
|
Tone.Master.prototype.receive = function(node){
|
|
|
|
node.connect(this.output);
|
|
|
|
};
|
|
|
|
|
2014-04-05 22:05:42 +00:00
|
|
|
///////////////////////////////////////////////////////////////////////////
|
2014-06-18 19:39:10 +00:00
|
|
|
// AUGMENT TONE's PROTOTYPE
|
2014-04-05 22:05:42 +00:00
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2014-06-18 19:39:10 +00:00
|
|
|
/**
|
|
|
|
* connect 'this' to the master output
|
2014-09-25 03:43:10 +00:00
|
|
|
* defined in "Tone/core/Master"
|
2014-06-18 19:39:10 +00:00
|
|
|
*/
|
2014-04-05 22:05:42 +00:00
|
|
|
Tone.prototype.toMaster = function(){
|
|
|
|
this.connect(Tone.Master);
|
2014-06-18 19:39:10 +00:00
|
|
|
};
|
2014-04-05 22:05:42 +00:00
|
|
|
|
2014-06-18 19:39:10 +00:00
|
|
|
/**
|
|
|
|
* Also augment AudioNode's prototype to include toMaster
|
|
|
|
* as a convenience
|
|
|
|
*/
|
2014-04-05 22:05:42 +00:00
|
|
|
AudioNode.prototype.toMaster = function(){
|
|
|
|
this.connect(Tone.Master);
|
2014-06-18 19:39:10 +00:00
|
|
|
};
|
2014-04-05 22:05:42 +00:00
|
|
|
|
2014-09-11 17:00:59 +00:00
|
|
|
var MasterConstructor = Tone.Master;
|
|
|
|
|
2014-06-19 02:35:31 +00:00
|
|
|
/**
|
2014-07-30 17:55:24 +00:00
|
|
|
* initialize the module and listen for new audio contexts
|
2014-06-19 02:35:31 +00:00
|
|
|
*/
|
2014-07-30 17:55:24 +00:00
|
|
|
Tone._initAudioContext(function(){
|
2014-10-16 04:49:31 +00:00
|
|
|
//a single master output
|
|
|
|
if (!Tone.prototype.isUndef(Tone.Master)){
|
2014-10-19 20:08:40 +00:00
|
|
|
Tone.Master = new MasterConstructor();
|
2014-10-16 04:49:31 +00:00
|
|
|
} else {
|
2014-12-19 21:32:59 +00:00
|
|
|
MasterConstructor.prototype.dispose.call(Tone.Master);
|
2014-10-16 04:49:31 +00:00
|
|
|
MasterConstructor.call(Tone.Master);
|
|
|
|
}
|
2014-07-30 17:55:24 +00:00
|
|
|
});
|
2014-04-11 23:17:01 +00:00
|
|
|
|
2014-04-05 22:05:42 +00:00
|
|
|
return Tone.Master;
|
2014-06-18 19:46:31 +00:00
|
|
|
});
|