Skip to content

Instantly share code, notes, and snippets.

@phi16

phi16/1008.glsl Secret

Created October 7, 2020 17:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phi16/8aa0c4b8d6b6ebf84144e4012c746e9c to your computer and use it in GitHub Desktop.
Save phi16/8aa0c4b8d6b6ebf84144e4012c746e9c to your computer and use it in GitHub Desktop.
#define tau (3.1415926535*2.)
float rand(vec2 co){
return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);
}
float noise0(float t, float s) {
float r = floor(t);
float f = fract(t);
f = smoothstep(0., 1., f);
float u0 = rand(vec2(r+0.,s)) - 0.5;
float u1 = rand(vec2(r+1.,s)) - 0.5;
return mix(u0, u1, f);
}
float noise1(float t, float s) {
float r = floor(t);
float f = fract(t);
f = smoothstep(0., 1., f);
float v0 = rand(vec2(r+0.,s));
float v1 = rand(vec2(r+1.,s));
float v2 = rand(vec2(r+2.,s));
float u0 = v1 - v0;
float u1 = v2 - v1;
return mix(u0, u1, f);
}
float noise2(float t, float s) {
float r = floor(t);
float f = fract(t);
f = smoothstep(0., 1., f);
float w0 = rand(vec2(r+0.,s));
float w1 = rand(vec2(r+1.,s));
float w2 = rand(vec2(r+2.,s));
float w3 = rand(vec2(r+3.,s));
float v0 = w1 - w0;
float v1 = w2 - w1;
float v2 = w3 - w2;
float u0 = v1 - v0;
float u1 = v2 - v1;
return mix(u0, u1, f);
}
float noiseR0(float t, float p) {
t += noise0(t, 0.) * p;
return noise0(t, 1.);
}
float noiseR1(float t, float p) {
t += noise0(t, 0.) * p;
return noise1(t, 1.);
}
float chirp(float sf, float df, float rate, float t) {
// integrate sf+df*exp(-rate*t) = sf*t-df*exp(-rate*t)/rate
float v = sf*t - df*exp(-rate*t)/rate;
return sin(v*tau) + sin(v*1.5*tau)*0.5;
}
float ev(float s, float e, float t) {
return (1.-exp(-s*t)) * exp(-e*t);
}
float b(float t) {
return chirp(10., 500., 100., t);
}
float y(float t) {
return noiseR1(t*60000., 1.) * 1.2;
}
float h(float t) {
return noise2(t*18000., 0.) * 1.5;
}
vec2 mainSound(float time){
vec2 v = vec2(0.);
float t = time;
float bpm = 120.;
float spb = 60./bpm;
float et = fract(t/spb);
v *= 1. - ev(0.5, 4., et) * 8.;
v += b(et) * (ev(100., 8., et) + ev(100., 2., et)*0.5) * 2.;
float bt = fract(et+0.5);
v += y(bt) * ev(100., 8., bt) * 1.5;
float ht = fract(et*4.)/4.;
v += h(ht) * ev(100., 16., ht) * 0.8;
return v*0.1;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment