|
| 1 | +<html> |
| 2 | + <head> |
| 3 | + <script language="javascript" src="js/processing.js"></script> |
| 4 | + <script language="javascript" src="js/init.js"></script> |
| 5 | + <script language="javascript" src="../dsp.js"></script> |
| 6 | + </head> |
| 7 | + <body> |
| 8 | + <style> |
| 9 | + body { background: black; margin:0; padding:0;} |
| 10 | + </style> |
| 11 | + |
| 12 | + <script> |
| 13 | + var frameBufferSize = 4096; |
| 14 | + var bufferSize = frameBufferSize/2; |
| 15 | + |
| 16 | + var signal = new Float32Array(bufferSize); |
| 17 | + var peak = new Float32Array(bufferSize); |
| 18 | + |
| 19 | + var fft = new RFFT(bufferSize, 44100); |
| 20 | + |
| 21 | + function loadedMetaData(event) { |
| 22 | + var audio = document.getElementById('input'); |
| 23 | + audio.mozFrameBufferLength = frameBufferSize; |
| 24 | + audio.addEventListener("MozAudioAvailable", audioAvailable, false); |
| 25 | + } |
| 26 | + |
| 27 | + function audioAvailable(event) { |
| 28 | + // deinterleave and mix down to mono |
| 29 | + signal = DSP.getChannel(DSP.MIX, event.frameBuffer); |
| 30 | + |
| 31 | + // perform forward transform |
| 32 | + fft.forward(signal); |
| 33 | + |
| 34 | + // calculate peak values |
| 35 | + for ( var i = 0; i < bufferSize; i++ ) { |
| 36 | + fft.spectrum[i] *= -1 * Math.log((fft.bufferSize/2 - i) * (0.5/fft.bufferSize/2)) * fft.bufferSize; // equalize, attenuates low freqs and boosts highs |
| 37 | + |
| 38 | + if ( peak[i] < fft.spectrum[i] ) { |
| 39 | + peak[i] = fft.spectrum[i]; |
| 40 | + } else { |
| 41 | + peak[i] *= 0.99; // peak slowly falls until a new peak is found |
| 42 | + } |
| 43 | + } |
| 44 | + } |
| 45 | + </script> |
| 46 | + |
| 47 | + <script target="#fft" type="application/processing"> |
| 48 | + void setup() { |
| 49 | + size(1400, 600); |
| 50 | + colorMode(HSB, 360, 100, 100); |
| 51 | + strokeWeight(3); |
| 52 | + frameRate(60); |
| 53 | + //strokeCap(SQUARE); |
| 54 | + } |
| 55 | + |
| 56 | + void draw() { |
| 57 | + background(0); |
| 58 | + //fill(0, 60); |
| 59 | + //rect(0, 0, width, height); |
| 60 | + for ( int i = 0; i < fft.spectrum.length/2; i += 3 ) { |
| 61 | + if (3 * i > width) { break; } |
| 62 | + var magnitude = fft.spectrum[i]; |
| 63 | + |
| 64 | + // draw magnitudes |
| 65 | + stroke((i) % 360, 60, constrain(magnitude * 6, 20, 100)); |
| 66 | + line(3*i, height, 3*i, height - magnitude * 16); |
| 67 | + |
| 68 | + // draw peak indicators |
| 69 | + stroke((i) % 360, 60, constrain(magnitude * 100, 50, 100)); |
| 70 | + line(3*i, height - peak[i] * 16 - 1, 3*i, height - peak[i] * 16); |
| 71 | + } |
| 72 | + /* |
| 73 | + if (frameCount % 100 == 0 ) { |
| 74 | + println(FRAME_RATE); |
| 75 | + } |
| 76 | + */ |
| 77 | + } |
| 78 | + </script> |
| 79 | + |
| 80 | + <audio id="input" src="audio/corban-peddle.ogg" controls="true" onloadedmetadata="loadedMetaData(event);"></audio><br /> |
| 81 | + |
| 82 | + <div><canvas id="fft"></canvas></div> |
| 83 | + </body> |
| 84 | +</html> |
0 commit comments