Commit d80bb324 authored by Daniel Clarke's avatar Daniel Clarke

ignoring old_stuff folder. Updated readme yet again

parent 7669964b
......@@ -4,4 +4,5 @@ Recordings/
maxiLib/maximilian_examples_web/load_sample_test.html
maxiLib/sed_addText.sh
maxiLib/sed_text_stuff/
maximilian_examples_cpp/
\ No newline at end of file
maximilian_examples_cpp/
old_stuff/
\ No newline at end of file
An implementation of maximilian in javascript using emscripten to compile code from C++ to javascript/asm.js.
To use: move the maxiLib.js file from the maxiLib folder to an appropriate location and include using the <script> tag.
To use: move the maxiLib.js file from the maxiLib folder to an appropriate location and include using the <script> tag right now.
If you want to use without webAudio API setup for you, include maxiLib_noWebAudio.js. You can still include the maxi_webAudio file (from the src/js folder) after this and all will function as usual.
Examples of usage are contained in maxiLib/maximilian_examples_web.
\ No newline at end of file
Examples are in maxiLib/maximilian_examples_web.
\ No newline at end of file
<!--
Copyright 2010, Google Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>
Javascript Audio Processing
</title>
<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?autoload=true&amp;skin=sunburst&amp;lang=css" defer="defer"></script>
<!-- <link rel="stylesheet" type="text/css" href="javascript-processing_files/simple.css"> -->
<script src="../maxiLib.js"></script>
<!-- Our javascript code -->
<script type="text/javascript">
var myCounter = new maximJs.maxiOsc();
var mySwitchableOsc = new maximJs.maxiOsc();
var myAutoPanner = new maximJs.maxiOsc();
var currentCount;
var myOscOutput, myFilteredOutput, myPanPosition;
var myStereoOutput = GetArrayAsVectorDbl([0,0]);// we need an output for each channel.
var myEnvelopeData = GetArrayAsVectorDbl([500,0,1000,500,0,500]);//this data will be used to make an envelope. Value and time to value in ms.
var myEnvelope = new maximJs.maxiEnvelope();
var myFilter = new maximJs.maxiFilter();
var myOutputs = new maximJs.maxiMix();
function setup(){
myEnvelope.amplitude=myEnvelopeData.get(0); //initialise the envelope
// change output to an array
// setNumOutputChannels(2);
OutputIsArray(true, 2);
}
function play(){
CurrentCount=Math.floor(myCounter.phasor(1, 1, 9));//phasor can take three arguments; frequency, start value and end value.
if (CurrentCount<5){//simple if statement
myOscOutput=mySwitchableOsc.square(CurrentCount*100);
}
else if (CurrentCount>=5){//and the 'else' bit.
myOscOutput=mySwitchableOsc.saw(CurrentCount*50);//one osc object can produce whichever waveform you want.
}
if (CurrentCount==1) {
myEnvelope.trigger(0,myEnvelopeData.get(0)); //trigger the envelope
}
myFilteredOutput=myFilter.lores(myOscOutput,(myEnvelope.line(6, myEnvelopeData)),10);//lores takes an audio input, a frequency and a resonance factor (1-100)
myPanPosition=myAutoPanner.sinewave(1);
myOutputs.stereo(myFilteredOutput,myStereoOutput,myPanPosition);//Stereo, Quad or 8 Channel. Specify the input to be mixed, the output[numberofchannels], and the pan (0-1,equal power).
output[0]=myStereoOutput.get(0);//When working with mixing, you need to specify the outputs explicityly
output[1]=myStereoOutput.get(1);//
}
</script>
</head>
<body>
<h1> Mixing Example </h1>
<p>
</p>
<pre class="prettyprint lang-js linenums:true" id="quine" style="border:4px solid #88c" >
var myCounter = new maximJs.maxiOsc();
var mySwitchableOsc = new maximJs.maxiOsc();
var myAutoPanner = new maximJs.maxiOsc();
var currentCount;
var myOscOutput, myFilteredOutput, myPanPosition;
var myStereoOutput = GetArrayAsVectorDbl([0,0]);// we need an output for each channel.
var myEnvelopeData = GetArrayAsVectorDbl([500,0,1000,500,0,500]);//this data will be used to make an envelope. Value and time to value in ms.
var myEnvelope = new maximJs.maxiEnvelope();
var myFilter = new maximJs.maxiFilter();
var myOutputs = new maximJs.maxiMix();
function setup(){
myEnvelope.amplitude=myEnvelopeData.get(0); //initialise the envelope
// change output to an array
// setNumOutputChannels(2);
OutputIsArray(true, 2);
}
function play(){
CurrentCount=Math.floor(myCounter.phasor(1, 1, 9));//phasor can take three arguments; frequency, start value and end value.
if (CurrentCount<5){//simple if statement
myOscOutput=mySwitchableOsc.square(CurrentCount*100);
}
else if (CurrentCount>=5){//and the 'else' bit.
myOscOutput=mySwitchableOsc.saw(CurrentCount*50);//one osc object can produce whichever waveform you want.
}
if (CurrentCount==1) {
myEnvelope.trigger(0,myEnvelopeData.get(0)); //trigger the envelope
}
myFilteredOutput=myFilter.lores(myOscOutput,(myEnvelope.line(6, myEnvelopeData)),10);//lores takes an audio input, a frequency and a resonance factor (1-100)
myPanPosition=myAutoPanner.sinewave(1);
myOutputs.stereo(myFilteredOutput,myStereoOutput,myPanPosition);//Stereo, Quad or 8 Channel. Specify the input to be mixed, the output[numberofchannels], and the pan (0-1,equal power).
output[0]=myStereoOutput.get(0);//When working with mixing, you need to specify the outputs explicityly
output[1]=myStereoOutput.get(1);//
}
</pre>
</body></html>
<!--
Copyright 2010, Google Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>
Javascript Audio Processing
</title>
<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?autoload=true&amp;skin=sunburst&amp;lang=css" defer="defer"></script>
<!-- <link rel="stylesheet" type="text/css" href="javascript-processing_files/simple.css"> -->
<script src="../maxiLib.js"></script>
<!-- <script src="../maxi_webAudio.js"></script> -->
<!-- Our javascript code -->
<script type="text/javascript">
// var outputs = new Array(2);
// var moreoutputs = new Array(2); //some track outputs
var outputs = new Module.VectorDouble();
var moreoutputs = new Module.VectorDouble();//this data will be used to make an envelope. Value and time to value in ms.
var filtered,patch1,patch2,tune,delayed,mixed,ramp,filtered2,noise,pan,more;//a bunch of patch cables
var beat,lastbeat, morebeats, morebeats2,lastmorebeats;//some rhythmic elemts
// var env = [200,0,0,50];//the kick drum pitch envelope data
var env = GetArrayAsVectorDbl([200,0,0,50]);
// var env2 = [10000,0,9000,5,0,5];//the hi hat pitch envelope dat
var env2 = GetArrayAsVectorDbl([10000,0,9000,5,0,5]);
var melody = [600,0,0,650,0,0,400,0,0,425,0,300,0,315,0,315, 0];//the melody data
var rhythm1 = [1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0];//another way of doing a rhythm
var a = new maximJs.maxiOsc();
var c = new maximJs.maxiOsc();
var d = new maximJs.maxiOsc();
var e = new maximJs.maxiOsc();
var g = new maximJs.maxiOsc();
var h = new maximJs.maxiOsc();
var i = new maximJs.maxiOsc();
var j = new maximJs.maxiOsc();
var squarewave = new maximJs.maxiOsc();//some oscillators maxiOsc...
var b = new maximJs.maxiEnvelope();
var f = new maximJs.maxiEnvelope();//two envelopers
var delay = new maximJs.maxiDelayline();//a delay line
var myfilter = new maximJs.maxiFilter();
var antia = new maximJs.maxiFilter();// a FAT filter
var mymix = new maximJs.maxiMix();
var bobbins = new maximJs.maxiMix();//some panning busses
var beats = new maximJs.maxiSample();
function setup() {//some inits
outputs.push_back(0);
outputs.push_back(0);
moreoutputs.push_back(0);
moreoutputs.push_back(0);
b.amplitude=env.get(0);//starting value for envelope b
f.amplitude=env2.get(0);//same for f
// beats.load("/Users/chris/src/Maximilian/beat2.wav");//put a path to a soundfile here. Wav format only.
loadSample("./beat2.wav", beats);
// printf("Summary:\n%s", beats.getSummary());//get info on samples if you like
OutputIsArray(true, 2);
}
function play() {//this is where the magic happens. Very slow magic.
if(beats.isReady()){
beat = Math.floor(c.phasor(8));//this oscillator is now a counter
morebeats = Math.floor(e.phasor(0.5,0,16));//so is this one
patch1 = b.line(4,env);//here's envelope b
patch2 = f.line(6,env2);//here's envelop f
tune=g.saw(melody[morebeats]*0.25);
if (lastbeat!=beat) {//this is a nice sample and hold routine for the kick drum
f.trigger(0, env2.get(0));//it runs off the hi hat.
if (rhythm1[morebeats]==1) {
b.trigger(0, env.get(0));//and gets played when it's time.
// console.log("B: " + morebeats);
}
}
lastbeat=beat;//let's start again. It's a loop
ramp=i.phasor(0.5,1,2048);//create a basic ramp
pan=j.phasor(0.25);//some panning from a phasor (object is equal power)
delayed=delay.dl(tune, ramp, 0.9)*0.125;//the delay line
//then it all gets mixed.
mixed=((a.sinewave(patch1)*0.5)+((d.saw(patch2))*0.125)+(delayed*0.3)*0.5);
//add some noise
noise=i.noise()*0.25;
filtered2=beats.play(1*(1.0/16.0),0,beats.getLength());
// filtered2=beats.play(-1);
more=squarewave.pulse(melody[morebeats],pan)*0.05;
//filter the noise! this lores takes values between 1 and 100 for res, and freq for cutoff.
filtered=myfilter.lores(filtered2, 1+(pan*10000), 10)*0.4;
//now we send the sounds to some stereo busses.
mymix.stereo(more+mixed+delayed, outputs, 1-pan);
bobbins.stereo(filtered, moreoutputs, pan);//invert the pan
// mixing
output[0]=outputs.get(0)+moreoutputs.get(0);//stick it in the out!!
output[1]=outputs.get(1)+moreoutputs.get(1);
}
}
</script>
</head>
<body>
<h1> Sequencing Example </h1>
<p>
</p>
<pre class="prettyprint lang-js linenums:true" id="quine" style="border:4px solid #88c" >
var outputs = new Module.VectorDouble();
var moreoutputs = new Module.VectorDouble();//this data will be used to make an envelope. Value and time to value in ms.
var filtered,patch1,patch2,tune,delayed,mixed,ramp,filtered2,noise,pan,more;//a bunch of patch cables
var beat,lastbeat, morebeats, morebeats2,lastmorebeats;//some rhythmic elemts
// var env = [200,0,0,50];//the kick drum pitch envelope data
var env = GetArrayAsVectorDbl([200,0,0,50]);
// var env2 = [10000,0,9000,5,0,5];//the hi hat pitch envelope dat
var env2 = GetArrayAsVectorDbl([10000,0,9000,5,0,5]);
var melody = [600,0,0,650,0,0,400,0,0,425,0,300,0,315,0,315, 0];//the melody data
var rhythm1 = [1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,0];//another way of doing a rhythm
var a = new maximJs.maxiOsc();
var c = new maximJs.maxiOsc();
var d = new maximJs.maxiOsc();
var e = new maximJs.maxiOsc();
var g = new maximJs.maxiOsc();
var h = new maximJs.maxiOsc();
var i = new maximJs.maxiOsc();
var j = new maximJs.maxiOsc();
var squarewave = new maximJs.maxiOsc();//some oscillators maxiOsc...
var b = new maximJs.maxiEnvelope();
var f = new maximJs.maxiEnvelope();//two envelopers
var delay = new maximJs.maxiDelayline();//a delay line
var myfilter = new maximJs.maxiFilter();
var antia = new maximJs.maxiFilter();// a FAT filter
var mymix = new maximJs.maxiMix();
var bobbins = new maximJs.maxiMix();//some panning busses
var beats = new maximJs.maxiSample();
function setup() {//some inits
outputs.push_back(0);
outputs.push_back(0);
moreoutputs.push_back(0);
moreoutputs.push_back(0);
b.amplitude=env.get(0);//starting value for envelope b
f.amplitude=env2.get(0);//same for f
// beats.load("/Users/chris/src/Maximilian/beat2.wav");//put a path to a soundfile here. Wav format only.
loadSample("./beat2.wav", beats);
// printf("Summary:\n%s", beats.getSummary());//get info on samples if you like
OutputIsArray(true, 2);
}
function play() {//this is where the magic happens. Very slow magic.
if(beats.isReady()){
beat = Math.floor(c.phasor(8));//this oscillator is now a counter
morebeats = Math.floor(e.phasor(0.5,0,16));//so is this one
patch1 = b.line(4,env);//here's envelope b
patch2 = f.line(6,env2);//here's envelop f
tune=g.saw(melody[morebeats]*0.25);
if (lastbeat!=beat) {//this is a nice sample and hold routine for the kick drum
f.trigger(0, env2.get(0));//it runs off the hi hat.
if (rhythm1[morebeats]==1) {
b.trigger(0, env.get(0));//and gets played when it's time.
// console.log("B: " + morebeats);
}
}
lastbeat=beat;//let's start again. It's a loop
ramp=i.phasor(0.5,1,2048);//create a basic ramp
pan=j.phasor(0.25);//some panning from a phasor (object is equal power)
delayed=delay.dl(tune, ramp, 0.9)*0.125;//the delay line
//then it all gets mixed.
mixed=((a.sinewave(patch1)*0.5)+((d.saw(patch2))*0.125)+(delayed*0.3)*0.5);
//add some noise
noise=i.noise()*0.25;
filtered2=beats.play(1*(1.0/16.0),0,beats.getLength());
// filtered2=beats.play(-1);
more=squarewave.pulse(melody[morebeats],pan)*0.05;
//filter the noise! this lores takes values between 1 and 100 for res, and freq for cutoff.
filtered=myfilter.lores(filtered2, 1+(pan*10000), 10)*0.4;
//now we send the sounds to some stereo busses.
mymix.stereo(more+mixed+delayed, outputs, 1-pan);
bobbins.stereo(filtered, moreoutputs, pan);//invert the pan
// mixing
output[0]=outputs.get(0)+moreoutputs.get(0);//stick it in the out!!
output[1]=outputs.get(1)+moreoutputs.get(1);
}
}
</pre>
</body></html>
<!--
Copyright 2010, Google Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>
Javascript Audio Processing
</title>
<!-- <link rel="stylesheet" type="text/css" href="javascript-processing_files/simple.css"> -->
<script src="../maxiLib.js"></script>
<!-- <script src="../maxi_webAudio.js"></script> -->
<!-- Our javascript code -->
<script type="text/javascript">
//This shows how to use maximilian to build a polyphonic synth.
var VCO_ArraySize = 6;
//These are the synthesiser bits
var VCO1 = [], VCO2 = [], LFO1 = [], LFO2 = [];
var VCF = [];
var ADSR = [];
//and these are some variables we can use to pass stuff around
var VCO1out = [], VCO2out = [], LFO1out = [],LFO2out = [], VCFout = [], ADSRout = [];
for(var i = 0; i < VCO_ArraySize; i++){
VCO1.push(new maximJs.maxiOsc());
VCO2.push(new maximJs.maxiOsc());
LFO1.push(new maximJs.maxiOsc());
LFO2.push(new maximJs.maxiOsc());
VCF.push(new maximJs.maxiFilter());
ADSR.push(new maximJs.maxiEnvelope());
VCO1out.push(0);
VCO2out.push(0);
LFO1out.push(0);
LFO2out.push(0);
VCFout.push(0);
ADSRout.push(0);
}
//These are the control values for the envelope
// var adsrEnvArray = [1,5,0.125,100,0.125,200,0,1000];
var adsrEnv = GetArrayAsVectorDbl([1,5,0.125,100,0.125,200,0,1000]);
//This is a bunch of control signals so that we can hear something
var timer = new maximJs.maxiOsc();//this is the metronome
var currentCount,lastCount, voice = 0;//these values are used to check if we have a new beat this sample
var mix;
var pitch = [1,2,3,4,5,6];
function setup(){
setNumChannels(true, 2);
}
function play(){
mix=0;//we're adding up the samples each update and it makes sense to clear them each time first.
//so this first bit is just a basic metronome so we can hear what we're doing.
currentCount = Math.floor(timer.phasor(8));//this sets up a metronome that ticks 8 times a second
if (lastCount!=currentCount) {//if we have a new timer int this sample, play the sound
if (voice>=6) {
voice=0;
}
ADSR[voice].trigger(0, adsrEnv.get(0));//trigger the envelope from the start
pitch[voice]=voice+1;
voice++;
lastCount=0;
}
//and this is where we build the synth
for (var i=0; i<6; i++) {
ADSRout[i]=ADSR[i].line(8,adsrEnv);//our ADSR env has 8 value/time pairs.
LFO1out[i]=LFO1[i].sinebuf(0.2);//this lfo is a sinewave at 0.2 hz
VCO1out[i]=VCO1[i].pulse(55*pitch[i],0.6);//here's VCO1. it's a pulse wave at 55 hz, with a pulse width of 0.6
VCO2out[i]=VCO2[i].pulse((110*pitch[i])+LFO1out[i],0.2);//here's VCO2. it's a pulse wave at 110hz with LFO modulation on the frequency, and width of 0.2
// some kind of NaN problem here !!!
VCFout[i]=VCF[i].lores((VCO1out[i]+VCO2out[i])*0.5, 250+((pitch[i]+LFO1out[i])*1000), 10);//now we stick the VCO's into the VCF, using the ADSR as the filter cutoff
mix+=VCFout[i]*ADSRout[i]/6;//finally we add the ADSR as an amplitude modulator
}
output[0]=mix*0.5;//left channel
output[1]=mix*0.5;//right channel
}
</script>
</head>
<body>
<h1> polysynth </h1>
<p>
This shows how to use maximilian to build a polyphonic synth.
</p>
</body></html>
<!--
Copyright 2010, Google Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>
Javascript Audio Processing
</title>
<!-- <link rel="stylesheet" type="text/css" href="javascript-processing_files/simple.css"> -->
<script src="maxiLib.js"></script>
<!-- Our javascript code -->
<script type="text/javascript">
// Temporary patch until all browsers support unprefixed context.
AudioContext = AudioContext || webkitAudioContext;
// init() once the page has finished loading.
window.onload = init;
var context;
var source = 0;
var jsProcessor = 0;
var analyser;
var analyserView1;
var phaseL = 0.0;
var phaseR = 0.0;
var kBaseFrequency = 440.0;
var phaseIncrL = 2.0 * Math.PI * 440.0 / 44100.0;
var phaseIncrR = 2.0 * Math.PI * (kBaseFrequency * 1.1) / 44100.0; // modulate slightly different on right channel
var kTwoPi = 2.0 * Math.PI;
var pitchRate = 1.0;
var mySine = new Module.maxiOsc();
var osc2 = new Module.maxiOsc();
var osc3 = new Module.maxiOsc();
// var filt = new Module.maxiFilter();
var passFreq = 880;
var m = 10;
function process(event) {
// Get left/right input and output arrays
// var inputArrayL = event.inputBuffer.getChannelData(0);
// var inputArrayR = event.inputBuffer.getChannelData(1);
var outputArrayL = event.outputBuffer.getChannelData(0);
var outputArrayR = event.outputBuffer.getChannelData(1);
var n = outputArrayL.length;
if(passFreq < 220 || passFreq > 1020){
m = -m;
}
passFreq-=m;
for (var i = 0; i < n; ++i) {
// var sampleL = Math.sin(phaseL);
// var sampleR = Math.sin(phaseR);
// phaseL += pitchRate * phaseIncrL;
// phaseR += pitchRate * phaseIncrR;
// if (phaseL > kTwoPi) phaseL -= kTwoPi;
// if (phaseR > kTwoPi) phaseR -= kTwoPi;
// Amplitude modulation effect
// outputArrayL[i] = inputArrayL[i] * sampleL;
// outputArrayR[i] = inputArrayR[i] * sampleR;
var output = mySine.sinewave(440);
// outputArrayL[i] = Math.random();
// outputArrayR[i] = Math.random();
outputArrayL[i] = output;
outputArrayR[i] = output;
}
}
// function loadSample(url) {
// // Load asynchronously
// var request = new XMLHttpRequest();
// request.open("GET", url, true);
// request.responseType = "arraybuffer";
// request.onload = function() {
// context.decodeAudioData(
// request.response,
// function(buffer) {
// source.buffer = buffer;
// source.loop = true;
// source.start(0);
// draw();
// },
// function(buffer) {
// console.log("Error decoding source!");
// }
// );
// }
// request.send();
// }
// if ( !window.requestAnimationFrame ) {
// window.requestAnimationFrame = ( function() {
// return window.webkitRequestAnimationFrame ||
// window.mozRequestAnimationFrame || // comment out if FF4 is slow (it caps framerate at ~30fps: https://bugzilla.mozilla.org/show_bug.cgi?id=630127)
// window.oRequestAnimationFrame ||
// window.msRequestAnimationFrame ||
// function( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element ) {
// window.setTimeout( callback, 1000 / 60 );
// };
// } )();
// }