Conflicts:
	Tone/source/Player.js
This commit is contained in:
Yotam Mann 2014-06-18 17:04:59 -04:00
commit 410814505c
7 changed files with 101 additions and 21 deletions

View file

@ -1,11 +1,13 @@
///////////////////////////////////////////////////////////////////////////////
//
// AUDIO PLAYER
//
///////////////////////////////////////////////////////////////////////////////
define(["Tone/core/Tone"], function(Tone){
/**
* Audio Player
*
* Audio file player with start, loop, stop.
*
* @constructor
* @extends {Tone.Source}
* @param {string} url
*/
Tone.Player = function(url){
//extend Unit
Tone.call(this);
@ -22,7 +24,11 @@ define(["Tone/core/Tone"], function(Tone){
/**
* makes an xhr reqest for the selected url
* @param {function(Tone.Player)=} callback invoked when the sample is loaded
* Load the audio file as an audio buffer.
* Decodes the audio asynchronously and invokes
* the callback once the audio buffer loads.
*
* @param {function(Tone.Player)} callback
*/
Tone.Player.prototype.load = function(callback){
if (!this.buffer){
@ -61,18 +67,26 @@ define(["Tone/core/Tone"], function(Tone){
startTime = this.defaultArg(startTime, this.now());
offset = this.defaultArg(offset, 0);
duration = this.defaultArg(duration, this.buffer.duration - offset);
volume = this.defaultArg(volume, 1);
//make the source
this.source = this.context.createBufferSource();
this.source.buffer = this.buffer;
this.source.loop = false;
this.source.start(this.toSeconds(startTime), this.toSeconds(offset), this.toSeconds(duration));
this.source.onended = this._onended.bind(this);
this.chain(this.source, gain, this.output);
this.chain(this.source, this.output);
}
};
//play the buffer from start to finish at a time
/**
* Loop the buffer from start to finish at a time
*
* @param {Tone.Time} startTime
* @param {Tone.Time} loopStart
* @param {Tone.Time} loopEnd
* @param {Tone.Time} offset
* @param {Tone.Time} duration
* @param {Tone.Time} volume
*/
Tone.Player.prototype.loop = function(startTime, loopStart, loopEnd, offset, duration, volume){
if (this.buffer){
//default args
@ -90,8 +104,9 @@ define(["Tone/core/Tone"], function(Tone){
};
/**
* stop the playback of the sample
* @param {Tone.Time} stopTime
* Stop playback.
*
* @param {Tone.Time} stopTime
*/
Tone.Player.prototype.stop = function(stopTime){
if (this.buffer && this.source){

View file

@ -7,8 +7,15 @@
</head>
<body>
<input type='range'>
<form action="" id="noise">
Noise Type:
<input type="radio" name="noise" value="brown" checked>brown</input>
<input type="radio" name="noise" value="pink">pink</input>
<input type="radio" name="noise" value="white">white</input>
</form>
<script type="text/javascript">
//extend effect
var NoiseEffect = function(){
//call the super class
@ -16,9 +23,13 @@
//components
this.noise = new Tone.Noise("brown");
this.crush = new Tone.BitCrusher(5);
// make the noise quieter
this.noise.setVolume(.1);
//connections
this.connectEffect(this.noise);
this.connectEffect(this.crush);
}
//extend effect
Tone.extend(NoiseEffect, Tone.Effect);
@ -27,14 +38,29 @@
var noiseEffect = new NoiseEffect();
noiseEffect.toMaster();
// play a sound and connect it to the effect?
var player = new Tone.Player("../audio/casio/A1.mp3");
player.load(doLoop);
function doLoop() {
player.loop(0., .1, .31);
player.connect(noiseEffect);
}
//INTERFACE//
var range = document.querySelector("input");
range.onchange = function(){
var val = range.value;
range.oninput = function(e){
var val = e.target.value;
noiseEffect.setDry(val / 50 - 1);
}
var noiseType = document.getElementById("noise");
noiseType.onchange = function(e){
noiseEffect.noise.setType(e.target.value);
}
</script>
</body>
</html>

View file

@ -47,11 +47,17 @@
var range = document.querySelector("input");
range.onchange = function(){
var val = range.value;
range.oninput = function(e){
var val = e.target.value;
pan.setPan(val/100, "+.1");
}
var mouseX, mouseY;
window.onmousemove = function(e) {
mouseX = e.x;
mouseY = e.y;
};
</script>
</body>
</html>
</html>

View file

@ -17,13 +17,13 @@
var dryMeter = new Tone.Meter();
signal.connect(dryMeter);
//the adder
var adder = new Tone.Add(100);
var addMeter = new Tone.Meter();
adder.connect(addMeter);
signal.connect(adder);
//the scaler
var scaler = new Tone.Scale(99, 101, 5, 10);
var scaleMeter = new Tone.Meter();

View file

@ -12,7 +12,7 @@ require.config({
}
});
require(["tests/Timing", "tests/Signal", "tests/Math", "tests/Transport"], function(){
require(["tests/Timing", "tests/Signal", "tests/Math", "tests/Transport", "tests/Sources"], function(){
if (window.mochaPhantomJS) {
mochaPhantomJS.run();
} else {

BIN
test/testAudio/kick.mp3 Normal file

Binary file not shown.

33
test/tests/Sources.js Normal file
View file

@ -0,0 +1,33 @@
define(["chai", "Tone/source/Player"], function(chai, Player){
var expect = chai.expect;
describe("Tone.Player", function(){
this.timeout(100);
var player = new Player("./testAudio/kick.mp3");
it("loads a file", function(done){
player.load(function(){
done();
});
});
it("returns correct file duration", function(){
expect(player.getDuration()).to.equal(0.2361678034067154);
});
it("plays a file", function(){
var ended = false;
player._onended = function(){
ended = true;
};
expect(ended).to.equal(false);
player.start();
setTimeout(function(){
expect(ended).to.equal(true);
}, 0.5);
});
});
});