started renaming process

This commit is contained in:
Yotam Mann 2014-03-12 16:29:43 -04:00
parent e739f8d811
commit 26a85abc9b
5 changed files with 241 additions and 97 deletions

View file

@ -5,6 +5,7 @@
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
<script type="text/javascript" src="../src/core/WebAudio.js"></script>
<script type="text/javascript" src="../src/core/Unit.js"></script>
<script type="text/javascript" src="../src/core/AudioUnit.js"></script>
<script type="text/javascript" src="../src/components/Player.js"></script>
<script type="text/javascript" src="../src/components/Meter.js"></script>
<script type="text/javascript" src="../src/components/Envelope.js"></script>
@ -27,15 +28,16 @@
<div id='Instructions'>Press 'e'</div>
<div id='meter'></div>
<script type="text/javascript">
var player = new WebAudio.Player("../audio/A3.mp3");
var player = new AudioUnit.Player("../audio/A3.mp3");
var meter = new WebAudio.Meter(2);
var env = new WebAudio.Envelope(.01, .05, 0, 0);
var lfo = new WebAudio.LFO(undefined, 1, .5, 1);
var noise = new WebAudio.Noise();
var feedbackDelay = new WebAudio.PingPongDelay(.25);
var meterGui = new WebAudio.GUI.Meter($("#meter")[0], meter);
// var meterGui = new WebAudio.GUI.Meter($("#meter")[0], meter);
noise.connect(env);
//player.connect(env);
player.toSpeakers();
env.connect(feedbackDelay);
feedbackDelay.setFeedback(.5);
// lfo.connect(feedbackDelay);

5
src/GUI/GUI.Bars.js Normal file
View file

@ -0,0 +1,5 @@
AudioUnit.GUI.Bars = function(){
AudioUnit.GUI.call(this);
}
AudioUnit.extend(AudioUnit.GUI, AudioUnit.GUI.Bars);

View file

@ -1,85 +1,19 @@
WebAudio.GUI = WebAudio.GUI || {};
WebAudio.GUI.Meter = function(container, meter, height){
this.meter = meter;
setInterval(this.update.bind(this), 200);
this.element = document.createElement("div");
container.appendChild(this.element);
//some light styling
this.element.style.fontFamily = "monospace";
this.element.style.whiteSpace = "pre";
AudioUnit.GUI = function(){
this._allGUIs.push(this);
this.hello = "hiHI";
}
WebAudio.GUI.Meter.prototype.update = function(){
var text = this.drawBars(this.meter.volume, 40);
// text += gainToDb(leftVol).toFixed(1);
// text += gainToDb(rightVol).toFixed(1);
this.element.textContent = text;
if (this.meter.isClipped()){
this.element.style.color = "red";
} else {
this.element.style.color = "inherit";
AudioUnit.GUI.prototype._allGUIs = [];
AudioUnit.GUI.prototype._doUpdate = function(){
requestAnimationFrame(this.doUpdate.bind(this));
for (var i = 0; i < this._allGUIs.length; i++){
}
}
WebAudio.GUI.Meter.prototype.slowUpdate = function(){
this.meterNumbers = "";
}
AudioUnit.GUI.prototype.dispose = function(){
//remove the element
WebAudio.GUI.Meter.prototype.drawBars = function(volumes, segments){
var text = [];
for (var channel = 0; channel < volumes.length; channel++){
text.push(" _____ ");
}
text.push("\n");
for (var i = 0; i < segments; i++){
text.push("|");
for (var channel = 0; channel < volumes.length; channel++){
var volume = Math.pow(1 - volumes[channel], 6);
var volumeSegments = Math.round(volume * segments);
if (i < volumeSegments){
text.push(" ");
} else {
if (volumeSegments === segments){
text.push("_____");
} else {
text.push("-----");
}
}
if (channel == volumes.length - 1){
text.push("|\n");
} else {
text.push(" ");
}
}
}
for (var channel = 0; channel < volumes.length; channel++){
var db = this.meter.getDb(channel);
if (isFinite(db)){
if (db > -10){
db = " "+db.toFixed(1)+" ";
} else {
db = " "+db.toFixed(1);
}
} else {
db = " -inf ";
}
text.push(db + " ");
}
text.push("\n");
// console.log(text);
return text.join("");
}
//@param {number} db
//@returns {number} gain
var dbToGain = function(db) {
return Math.pow(2, db / 6);
}
//@param {number} gain
//@returns {number} db
var gainToDb = function(gain) {
return 20 * (Math.log(gain) / Math.LN10);
}
//remove it from GUIs
}

View file

@ -4,9 +4,9 @@
//
///////////////////////////////////////////////////////////////////////////////
WebAudio.Player = function(url){
AudioUnit.Player = function(url){
//extend Unit
WebAudio.Unit.call(this);
AudioUnit.call(this);
//player vars
this.url = url;
@ -14,19 +14,19 @@ WebAudio.Player = function(url){
this.buffer = null;
}
WebAudio.extend(WebAudio.Player, WebAudio.Unit);
AudioUnit.extend(AudioUnit.Player, AudioUnit);
//makes an xhr for the buffer at the url
//invokes the callback at the end
//@param {function(WebAudio.Player)=} callback
WebAudio.Player.prototype.load = function(callback){
//@param {function(AudioUnit.Player)=} callback
AudioUnit.Player.prototype.load = function(callback){
var request = new XMLHttpRequest();
request.open('GET', this.url, true);
request.responseType = 'arraybuffer';
// decode asynchronously
var self = this;
request.onload = function() {
WebAudio.decodeAudioData(request.response, function(b) {
self.context.decodeAudioData(request.response, function(b) {
self.buffer = b;
if (callback){
callback(self);
@ -39,14 +39,14 @@ WebAudio.Player.prototype.load = function(callback){
}
//play the buffer from start to finish at a time
WebAudio.Player.prototype.start = function(startTime, offset, duration){
AudioUnit.Player.prototype.start = function(startTime, offset, duration){
if (this.buffer){
//default args
startTime = this.defaultArgument(startTime, WebAudio.now);
startTime = this.defaultArgument(startTime, AudioUnit.now());
offset = this.defaultArgument(offset, 0);
duration = this.defaultArgument(duration, this.buffer.duration - offset);
//make the source
this.source = WebAudio.createBufferSource();
this.source = this.context.createBufferSource();
this.source.buffer = this.buffer;
this.source.loop = false;
this.source.connect(this.output);
@ -55,16 +55,16 @@ WebAudio.Player.prototype.start = function(startTime, offset, duration){
}
//play the buffer from start to finish at a time
WebAudio.Player.prototype.loop = function(startTime, loopStart, loopEnd, offset, duration){
AudioUnit.Player.prototype.loop = function(startTime, loopStart, loopEnd, offset, duration){
if (this.buffer){
//default args
startTime = this.defaultArgument(startTime, WebAudio.now);
startTime = this.defaultArgument(startTime, this.now());
loopStart = this.defaultArgument(loopStart, 0);
loopEnd = this.defaultArgument(loopEnd, this.buffer.duration);
offset = this.defaultArgument(offset, loopStart);
duration = this.defaultArgument(duration, this.buffer.duration - offset);
//make/play the source
this.source = WebAudio.createBufferSource();
this.source = this.context.createBufferSource();
this.source.buffer = this.buffer;
this.source.loop = true;
this.source.loopStart = loopStart;
@ -75,15 +75,15 @@ WebAudio.Player.prototype.loop = function(startTime, loopStart, loopEnd, offset,
}
//stop playback
WebAudio.Player.prototype.stop = function(stopTime){
AudioUnit.Player.prototype.stop = function(stopTime){
if (this.buffer){
stopTime = this.defaultArgument(stopTime, WebAudio.now);
stopTime = this.defaultArgument(stopTime, this.now());
this.source.stop(stopTime);
}
}
//@returns {number} the buffer duration
WebAudio.Player.prototype.getDuration = function(){
AudioUnit.Player.prototype.getDuration = function(){
if (this.buffer){
this.buffer.duration;
} else {

203
src/core/AudioUnit.js Normal file
View file

@ -0,0 +1,203 @@
///////////////////////////////////////////////////////////////////////////////
//
// AUDIO UNIT
//
///////////////////////////////////////////////////////////////////////////////
(function(global){
//////////////////////////////////////////////////////////////////////////
// WEB AUDIO CONTEXT
///////////////////////////////////////////////////////////////////////////
//ALIAS
if (!global.AudioContext){
global.AudioContext = global.webkitAudioContext;
}
var audioContext;
if (global.AudioContext){
audioContext = new global.AudioContext();
}
//SHIMS////////////////////////////////////////////////////////////////////
if (typeof audioContext.createGain !== "function"){
audioContext.createGain = audioContext.createGainNode;
}
if (typeof audioContext.createDelay !== "function"){
audioContext.createDelay = audioContext.createDelayNode;
}
if (typeof AudioBufferSourceNode.prototype.start !== "function"){
AudioBufferSourceNode.prototype.start = AudioBufferSourceNode.prototype.noteGrainOn;
}
if (typeof AudioBufferSourceNode.prototype.stop !== "function"){
AudioBufferSourceNode.prototype.stop = AudioBufferSourceNode.prototype.noteOff;
}
if (typeof OscillatorNode.prototype.start !== "function"){
OscillatorNode.prototype.start = OscillatorNode.prototype.noteOn;
}
if (typeof OscillatorNode.prototype.stop !== "function"){
OscillatorNode.prototype.stop = OscillatorNode.prototype.noteOff;
}
///////////////////////////////////////////////////////////////////////////
//
// AUDIO UNIT
//
///////////////////////////////////////////////////////////////////////////
var AudioUnit = function(){
this.context = audioContext;
this.input = audioContext.createGain();
this.output = audioContext.createGain();
}
///////////////////////////////////////////////////////////////////////////
// STATIC VARS
///////////////////////////////////////////////////////////////////////////
AudioUnit.prototype.fadeTime = .001; //1ms
AudioUnit.prototype.bufferSize = 1024; //default buffer size
///////////////////////////////////////////////////////////////////////////
// CLASS METHODS
///////////////////////////////////////////////////////////////////////////
//@returns {number} the currentTime from the AudioContext
AudioUnit.prototype.now = function(){
return audioContext.currentTime;
}
//@param {AudioParam | AudioUnit} unit
AudioUnit.prototype.connect = function(unit){
if (unit.input && unit.input instanceof GainNode){
this.output.connect(unit.input);
} else {
this.output.connect(unit);
}
}
//connect together an array of units in series
//@param {...AudioParam | AudioUnit} units
AudioUnit.prototype.chain = function(){
if (arguments.length > 1){
var currentUnit = arguments[0];
for (var i = 1; i < arguments.length; i++){
var toUnit = arguments[i];
if (toUnit.input && toUnit.input instanceof GainNode){
currentUnit.connect(toUnit.input);
} else {
currentUnit.connect(toUnit);
}
currentUnit = toUnit;
}
}
}
//set the output volume
//@param {number} vol
AudioUnit.prototype.setVolume = function(vol){
this.output.gain.value = vol;
}
//fade the output volume
//@param {number} value
//@param {number=} duration (in seconds)
AudioUnit.prototype.fadeTo = function(value, duration){
this.defaultArgument(duration, this.fadeTime);
this.rampToValue(this.output.gain, value, duration);
}
//tear down a node
AudioUnit.prototype.tearDown = function(){
//go through all of the attributes, if any of them has a disconnect function, call it
}
///////////////////////////////////////////////////////////////////////////
// UTILITIES / HELPERS
///////////////////////////////////////////////////////////////////////////
//ramps to value linearly starting now
//@param {AudioParam} audioParam
//@param {number} value
//@param {number=} duration (in seconds)
AudioUnit.prototype.rampToValue = function(audioParam, value, duration){
var currentValue = audioParam.value;
var now = this.now();
duration = this.defaultArgument(duration, this.fadeTime);
audioParam.setValueAtTime(currentValue, now);
audioParam.linearRampToValueAtTime(value, now + duration);
}
//ramps to value exponentially starting now
//@param {AudioParam} audioParam
//@param {number} value
//@param {number=} duration (in seconds)
AudioUnit.prototype.exponentialRampToValue = function(audioParam, value, duration){
var currentValue = audioParam.value;
var now = this.now();
audioParam.setValueAtTime(currentValue, now);
audioParam.exponentialRampToValueAtTime(value, now + duration);
}
//if the given argument is undefined, go with the default
//@param {*} given
//@param {*} fallback
//@returns {*}
AudioUnit.prototype.defaultArgument = function(given, fallback){
return typeof(given) !== 'undefined' ? given : fallback;
}
//@param {number} percent (0-1)
//@returns {number} the equal power gain
//good for cross fades
AudioUnit.prototype.equalPowerGain = function(percent){
return Math.sin((percent) * 0.5*Math.PI);
}
//@param {number} db
//@returns {number} gain
AudioUnit.prototype.dbToGain = function(db) {
return Math.pow(2, db / 6);
}
//@param {number} gain
//@returns {number} db
AudioUnit.prototype.gainToDb = function(gain) {
return 20 * (Math.log(gain) / Math.LN10);
}
//@param {AudioParam|AudioUnit=} unit
AudioUnit.prototype.toSpeakers = function(unit){
unit = this.defaultArgument(unit, this.output);
unit.connect(audioContext.destination);
}
///////////////////////////////////////////////////////////////////////////
// STATIC METHODS
///////////////////////////////////////////////////////////////////////////
//A extends B
AudioUnit.extend = function(A, B){
A.prototype = new B();
A.prototype.constructor = A;
}
AudioUnit.muteAll = function(){
}
AudioUnit.unmuteAll = function(){
}
AudioUnit.setGlobalVolume = function(){
}
//make it global
global.AudioUnit = AudioUnit;
})(window);