Skip to content

Project 5 #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
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
436 changes: 108 additions & 328 deletions README.md

Large diffs are not rendered by default.

Binary file added part1/09 Guardian Angel.ogg
Binary file not shown.
Binary file added part1/13 My Favorite Things.mp3
Binary file not shown.
Binary file added part1/13 My Favorite Things.ogg
Binary file not shown.
232 changes: 232 additions & 0 deletions part1/audio_visualizer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
// Based on Karl Gustavsgavan's implementation of an audio visualizer.
// http://wemadeyoulook.at/en/blog/webgl-webaudio-api-fun/
//
// Audio Visualizer

(function() {
"use strict";
/*global window,document,Float32Array,Uint16Array,mat4,vec3,snoise*/
/*global getShaderSource,createWebGLContext,createProgram*/

var NUM_WIDTH_PTS = 128;
var NUM_HEIGHT_PTS = 128;

var message = document.getElementById("message");
var canvas = document.getElementById("canvas");
var context = createWebGLContext(canvas, message);
if (!context) {
return;
}

///////////////////////////////////////////////////////////////////////////

context.viewport(0, 0, canvas.width, canvas.height);
context.clearColor(1.0, 1.0, 1.0, 1.0);
context.enable(context.DEPTH_TEST);

var persp = mat4.create();
mat4.perspective(45.0, 0.5, 0.1, 100.0, persp);

var eye = [2.0, 1.0, 3.0];
var center = [0.0, 0.0, 0.0];
var up = [0.0, 0.0, 1.0];
var view = mat4.create();
mat4.lookAt(eye, center, up, view);

var positionLocation = 0;
var heightLocation = 1;
var u_modelViewPerspectiveLocation;
var u_timeLocation;
var u_time = 0;

(function initializeShader() {
var program;
var vs = getShaderSource(document.getElementById("vs"));
var fs = getShaderSource(document.getElementById("fs"));

var program = createProgram(context, vs, fs, message);
context.bindAttribLocation(program, positionLocation, "position");
u_modelViewPerspectiveLocation = context.getUniformLocation(program,"u_modelViewPerspective");
u_timeLocation = context.getUniformLocation(program, "u_time");

context.useProgram(program);
})();

var heights;
var numberOfIndices;

(function initializeGrid() {
function uploadMesh(positions, heights, indices) {
// Positions
var positionsName = context.createBuffer();
context.bindBuffer(context.ARRAY_BUFFER, positionsName);
context.bufferData(context.ARRAY_BUFFER, positions, context.STATIC_DRAW);
context.vertexAttribPointer(positionLocation, 2, context.FLOAT, false, 0, 0);
context.enableVertexAttribArray(positionLocation);

if (heights)
{
// Heights
var heightsName = context.createBuffer();
context.bindBuffer(context.ARRAY_BUFFER, heightsName);
context.bufferData(context.ARRAY_BUFFER, heights.length * heights.BYTES_PER_ELEMENT, context.STREAM_DRAW);
context.vertexAttribPointer(heightLocation, 1, context.FLOAT, false, 0, 0);
context.enableVertexAttribArray(heightLocation);
}

// Indices
var indicesName = context.createBuffer();
context.bindBuffer(context.ELEMENT_ARRAY_BUFFER, indicesName);
context.bufferData(context.ELEMENT_ARRAY_BUFFER, indices, context.STATIC_DRAW);
}

var WIDTH_DIVISIONS = NUM_WIDTH_PTS - 1;
var HEIGHT_DIVISIONS = NUM_HEIGHT_PTS - 1;

var numberOfPositions = NUM_WIDTH_PTS * NUM_HEIGHT_PTS;

var positions = new Float32Array(2 * numberOfPositions);
var indices = new Uint16Array(2 * ((NUM_HEIGHT_PTS * (NUM_WIDTH_PTS - 1)) + (NUM_WIDTH_PTS * (NUM_HEIGHT_PTS - 1))));

var positionsIndex = 0;
var indicesIndex = 0;
var length;

for (var j = 0; j < NUM_WIDTH_PTS; ++j)
{
positions[positionsIndex++] = j /(NUM_WIDTH_PTS - 1);
positions[positionsIndex++] = 0.0;

if (j>=1)
{
length = positionsIndex / 2;
indices[indicesIndex++] = length - 2;
indices[indicesIndex++] = length - 1;
}
}

for (var i = 0; i < HEIGHT_DIVISIONS; ++i)
{
var v = (i + 1) / (NUM_HEIGHT_PTS - 1);
positions[positionsIndex++] = 0.0;
positions[positionsIndex++] = v;

length = (positionsIndex / 2);
indices[indicesIndex++] = length - 1;
indices[indicesIndex++] = length - 1 - NUM_WIDTH_PTS;

for (var k = 0; k < WIDTH_DIVISIONS; ++k)
{
positions[positionsIndex++] = (k + 1) / (NUM_WIDTH_PTS - 1);
positions[positionsIndex++] = v;

length = positionsIndex / 2;
var new_pt = length - 1;
indices[indicesIndex++] = new_pt - 1; // Previous side
indices[indicesIndex++] = new_pt;

indices[indicesIndex++] = new_pt - NUM_WIDTH_PTS; // Previous bottom
indices[indicesIndex++] = new_pt;
}
}

uploadMesh(positions, heights, indices);
numberOfIndices = indices.length;
})();


var aud_context;
var aud_buffer;
var aud_fft;
var aud_filter;
var aud_loaded;
var src;
var counter = 0;

(function initAudio(){
try{
console.log("initAudio()");
aud_context = new AudioContext();
loadAudio();
}catch(e){
alert("Browser does not support Web Audio API");
}
})();


function loadAudio(){
var req = new XMLHttpRequest();
req.open("GET", "13 My Favorite Things.ogg", true);
req.responseType = "arraybuffer";

src = aud_context.createBufferSource();
src.connect(aud_context.destination);
req.onload = function(){
aud_context.decodeAudioData(req.response, function onSuccess(aud_buffer){
src.buffer = aud_buffer;
play();
}, function onFailure(){
alert("Decoding failed");
});
};
req.send();
}

function play(){
// Fast Fourier Transform
aud_fft = aud_context.createAnalyser();
aud_fft.fftSize = 256;

aud_filter = aud_context.createBiquadFilter();
aud_filter.type = 0;
aud_filter.frequency.value = 220;

src.connect(aud_filter);
aud_filter.connect(aud_fft);
aud_fft.connect(aud_context.destination);

src.loop = true;
src.start(0);
aud_loaded = true;
//document.getElementById('loading').innerHTML='';
}

(function animate(){
///////////////////////////////////////////////////////////////////////////
// Update

u_time = u_time + .005;

var freqDomain = new Float32Array(aud_fft.frequencyBinCount);
aud_fft.getFloatFrequencyData(freqDomain);
for (var i = 0; i < aud_fft.frequencyBinCount; i++){
var value = freqDomain[i];
var percent = value / 256;
}

var model = mat4.create();
mat4.identity(model);
mat4.translate(model, [-0.5, -0.5, 0.0]);
var mv = mat4.create();
mat4.multiply(view, model, mv);
var mvp = mat4.create();
mat4.multiply(persp, mv, mvp);

///////////////////////////////////////////////////////////////////////////
// Render
context.clear(context.COLOR_BUFFER_BIT | context.DEPTH_BUFFER_BIT);

context.uniformMatrix4fv(u_modelViewPerspectiveLocation, false, mvp);
context.uniform1f(u_timeLocation, u_time);
context.drawElements(context.LINES, numberOfIndices, context.UNSIGNED_SHORT,0);

counter = counter + 1;

function(callback){
window.setTimeout(callback, 1000/60);
}

window.requestAnimFrame(animate);
})();
}());

50 changes: 50 additions & 0 deletions part1/index_audio.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<html>
<head>
<title>Audio Visualizer</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="chrome=1">
</head>

<div id="message" style="position:absolute;top:100px"></div> <!-- Pixel offset to avoid FPS counter -->
<canvas id="canvas" style="border: none;" width="1024" height="768" tabindex="1"></canvas>

<script id="vs" type="x-shader/x-vertex">
attribute vec2 position;
varying vec3 color;

uniform sampler2D u_freqData;
uniform mat4 u_modelViewPerspective;
uniform float u_time;
uniform float offset;

void main(void)
{
float y = position.y >= offset ? position.y - offset : 256.0 + (position.y - offset);
float height = texture2D(u_freqData, vec2(position.x, y)).r;
gl_Position = u_modelViewPerspective * vec4(vec3(position, height), 1.0);

vec3 green = vec3(.6117, 1.0, .8824);
vec3 pink = vec3(.99, .65, .65);
color = mix(pink, green, height);
}
</script>

<script id="fs" type="x-shader/x-fragment">
precision mediump float;

varying vec3 color;

void main(void)
{
gl_FragColor = vec4(color, 1.0);
}
</script>



<body>
<script src="gl-matrix.js" type="text/javascript"></script>
<script src="webGLUtility.js" type="text/javascript"></script>
<script src="audio_visualizer.js" type="text/javascript"></script>
</body>
</html>
39 changes: 39 additions & 0 deletions part1/index_simplex.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
vec3 permute(vec3 x) {
x = ((x*34.0)+1.0)*x;
return x - floor(x * (1.0 / 289.0)) * 289.0;
}

float simplexNoise(vec2 v)
{
const vec4 C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439);

vec2 i = floor(v + dot(v, C.yy) );
vec2 x0 = v - i + dot(i, C.xx);

vec2 i1;
i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);

vec4 x12 = x0.xyxy + C.xxzz;
x12.xy -= i1;

i = i - floor(i * (1.0 / 289.0)) * 289.0;

vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 ))
+ i.x + vec3(0.0, i1.x, 1.0 ));

vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0);
m = m*m ;
m = m*m ;

vec3 x = 2.0 * fract(p * C.www) - 1.0;
vec3 h = abs(x) - 0.5;
vec3 ox = floor(x + 0.5);
vec3 a0 = x - ox;

m *= inversesqrt( a0*a0 + h*h );

vec3 g;
g.x = a0.x * x0.x + h.x * x0.y;
g.yz = a0.yz * x12.xz + h.yz * x12.yw;
return 130.0 * dot(m, g);
}
Loading