Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
187 changes: 187 additions & 0 deletions examples/bandlimited/index.htm
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Bandlimited Synthesis</title>
<!-- Production -->
<!--
<script src="../../src/mootools/mootools-core-1.3-full-nocompat-yc.js"></script>
<script src="../../src/audiolet/Audiolet.min.js"></script>
-->

<!-- Development -->
<script src="../../src/mootools/mootools-core-1.3-full-nocompat.js"></script>
<script src="../../src/audiolet/Audiolet.js"></script>
<script src="../../src/core/ValueViewer.js"></script>
<script src="../../src/dsp/InteractiveEnvelope.js"></script>
<script src="../../src/dsp/Bandlimited.js"></script>
<script src="../../src/dsp/FixedBiquadFilter.js"></script>
<script src="../../src/core/Oscilloscope.js"></script>

<!-- Common -->
<script src="../../src/audiofile/audiofile.js"></script>
<script src="js/audiolet_app.js"></script>
<link rel="stylesheet" href="css/main.css" />
<style type='text/css'>
.whitekey {
width:30px;
background-color:#eee;
}
.graykey {
width:30px;
background-color:#bbb;
}
.blackkey {
width:30px;
background-color:#777;
}
</style>
</head>
<body>
This example demonstrates how to interact with audiolet. For now, it emulates
a musical keyboard on your computer keyboard.
<p/>
<table>
<tr>
<td></td>
<td class='graykey' colspan=2>
1
</td>
<td class='blackkey' colspan=2>
2
</td>
<td class='blackkey' colspan=2>
3
</td>
<td class='graykey' colspan=2>
4
</td>
<td class='blackkey' colspan=2>
5
</td>
<td class='blackkey' colspan=2>
6
</td>
<td class='blackkey' colspan=2>
7
</td>
<td class='graykey' colspan=2>
8
</td>
<td class='graykey' colspan=2>
9
</td>
<td class='graykey' colspan=2>
0
</td>
</tr>
<tr>
<td colspan=2>higher octave</td>
<td class='whitekey' colspan=2>
Q
</td>
<td class='whitekey' colspan=2>
W
</td>
<td class='whitekey' colspan=2>
E
</td>
<td class='whitekey' colspan=2>
R
</td>
<td class='whitekey' colspan=2>
T
</td>
<td class='whitekey' colspan=2>
Z
</td>
<td class='whitekey' colspan=2>
U
</td>
<td class='graykey' colspan=2>
I
</td>
<td class='graykey' colspan=2>
O
</td>
<td class='graykey' colspan=2>
P
</td>
</tr>
<tr>
<td colspan=3>&nbsp;</td>
<td class='graykey' colspan=2>
A
</td>
<td class='blackkey' colspan=2>
S
</td>
<td class='blackkey' colspan=2>
D
</td>
<td class='graykey' colspan=2>
F
</td>
<td class='blackkey' colspan=2>
G
</td>
<td class='blackkey' colspan=2>
H
</td>
<td class='blackkey' colspan=2>
J
</td>
<td class='graykey' colspan=2>
K
</td>
<td class='graykey' colspan=2>
L
</td>
</tr>
<tr>
<td colspan=4>lower octave</td>
<td class='whitekey' colspan=2>
Y
</td>
<td class='whitekey' colspan=2>
X
</td>
<td class='whitekey' colspan=2>
C
</td>
<td class='whitekey' colspan=2>
V
</td>
<td class='whitekey' colspan=2>
B
</td>
<td class='whitekey' colspan=2>
N
</td>
<td class='whitekey' colspan=2>
M
</td>
<td class='graykey' colspan=2>
;
</td>
<td class='graykey' colspan=2>
:
</td>
</tr>
</table>
<select id='octave'>
<option>+3</option>
<option>+2</option>
<option>+1</option>
<option selected>+0</option>
<option>-1</option>
<option>-2</option>
<option>-3</option>
</select>
<canvas id='scope' style='border:1px solid black' width=1000>

</canvas>
</body>
</html>


76 changes: 76 additions & 0 deletions examples/bandlimited/js/audiolet_app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
window.onload = function() {

this.audiolet = new Audiolet();

var play=function(f,canvas) {
var X=new Object();
X.square = new BandlimitedSquare(this.audiolet,f);
X.saw = new BandlimitedSaw(this.audiolet,f);
X.tri = new BandlimitedTriangle(this.audiolet,f);

X.amplitude = new Multiply(this.audiolet, 1);
// X.square.connect(X.amplitude);
// X.saw.connect(X.amplitude);
X.tri.connect(X.amplitude);

X.envelope = new InteractiveEnvelope(this.audiolet,0.5,1e-10,function () { X.amplitude.remove(); delete X; }); // Don't have a clue if this is sufficient to prevent mem leaks

X.envelope.connect(X.amplitude,0,1);

if (canvas) {
X.osci = new Oscilloscope(this.audiolet,undefined,canvas);
X.amplitude.connect(X.osci);
X.osci.connect(this.audiolet.output);
X.osci.raf=function () { window.mozRequestAnimationFrame(function () {X.osci.paint();},canvas); };
// window.setTimeout(X.osci.raf,300);
X.osci.paint();

} else {
X.amplitude.connect(this.audiolet.output);
}
X.envelope.newTarget(0.002,1e-5);

return X;
}

// x=play(220,document.getElementById('scope'));
// window.setTimeout(function () { x.envelope.newTarget(0,2e-2); },200);

function keyboard() {
var keyboard_scale=[89,83,88,68,67,86,71,66,72,78,74,77,
81,50,87,51,69,82,53,84,54,90,55,85];

var f=220;
var keyboard=Array();
for (k in keyboard_scale) {
keyboard[keyboard_scale[k]]=f;
f*=Math.pow(2,1/12);
}
return keyboard;
}

this.keyboard=keyboard();

this.playing_notes=Array();

window.onkeydown=function(e) {
if ((f=this.keyboard[e.keyCode])!=null) {
if (playing_notes[e.keyCode]==null) {
f*=Math.pow(2,document.getElementById('octave').value);
var p=new Object();
p.play=play(f);
playing_notes[e.keyCode]=p;
var kc=e.keyCode;
p.marker=kc;
p.switchOff=function() { p.play.envelope.newTarget(0,2e-4); playing_notes[kc]=null;}
}
}
}
window.onkeyup=function(e) {
var kc=e.keyCode;
if ((f=this.playing_notes[kc])!=null) {
this.playing_notes[kc].switchOff();
}
}

};
Empty file.
Loading