float adsr(float t, vec4 v, float s) { v.xyw = max(vec3(2.2e-05), v.xyw); float ta = t/v.x; float td = max(s, 1.0-(t-v.x)*(1.0-s)/v.y); float tr = (1.0 - max(0.0,t-(v.x+v.y+v.z))/v.w); return max(0.0, min(ta, tr*td)); } void main () { float l = 0., r = 0.; vec2 uv = gl_FragCoord.xy / resolution; //vec4 content = texture(pFrameSynth, vec2(uv.x + cos(globalTime / 8000.), uv.y)); vec4 content = texture(pFrameSynth, vec2(uv.x-0.0000451475, uv.y)); float attenuation_constant = 0.7295; const float harmonics = 64.; for (int k = 0; k < 256; k += 2) { vec4 data = keyboard[k]; float kfrq = data.x; // frequency float kvel = data.y; // velocity float ktim = data.z; // elapsed time float kchn = data.w; // channel if (kfrq == 0.) { break; } if (uv.x < 0.25 && kchn == 1.) { float increment = 1. + abs(cos(round(mod(ktim / 4., 3.1415 / 16.) * 3.)) / 3.1415); for (float i = 1.; i < harmonics; i += increment) { for (float j = 1.; j < 4.; j += 1.) { float dktim = ktim - ((j - 1.) / 2.); float dktiml = ktim - ((j - 1.) / 1.95); float dktimr = ktim - ((j - 1.) / 1.25); float envl = adsr(dktiml, vec4(0.00075 * (i * mod(i, 4.2588665 - (i / 8.))), 0.5 * (i - 2.), 0., 0.175), 0.75); float envr = adsr(dktimr, vec4(0.00075 * (i * mod(i, 3.588665 - (i / 16.))), 0.5 * (i - 1.), 0., 0.175), 0.75); float harmo = 1. + abs(cos(round(mod(ktim * 2., 3.1415 / 2.) * 2.)) / 3.1415)/1.; float a = 1. / pow(i+0.15, attenuation_constant + ((i * mod(i, 0.1994588665 + (i / 2.012941542621 + harmo*0.0135))) * (mod(uv.x * 8.2575 + ((uv.x*.125 + (0.00841525 * cos(dktim * 2. + (i * 8.+1. * uv.y * 3.1415 * 2.)/i/3.1415) / 8.)) + (uv.x * 8. - dktim * 1.0825)) + dktim * 8.5575, 1.) * 18.)-0.76)); float stereol = 1.+(cos(2.+i + uv.x + dktim * 8.) / 3.1415 / 2.); float stereor = 1.+(sin(1.+i + uv.x + dktim * 16.) / 3.1415 / 2.); l += fline(kfrq * i) * a * kvel * envl * stereol; r += fline(kfrq * i) * a * kvel * envr * stereor; } } } else if (uv.x > 0.25 && uv.x < 0.5 && kchn == 0.) { for (float i = 1.; i < harmonics; i += 1.) { float envl = adsr(ktim, vec4(0.00075 * (i * mod(i, 1.588665 + (i / 2.))), 0.05 * (i - 8.), 0., 1.175), 0.75); float envr = adsr(ktim, vec4(0.00075 * (i * mod(i, 1.588665 + (i / 4.))), 0.05 * (i - 8.), 0., 1.175), 0.75); float a = 1. / pow(i+0.15, attenuation_constant + ((i * mod(i, 0.4588665 + (i / 0.02621))) * (mod(uv.x * 18. - ((uv.y * (0.005 * cos(ktim / 3. + (i * 2.+1. * uv.y * 3.1415 * 1.)*i/3.1415) / 8.)) + ((uv.x + 0.25) + ktim / 24.)) + ktim / 20., 1.) * 1.)-0.76)); float stereol = 1.+(cos(2.+i + uv.x + ktim * 8.) / 3.1415 / 2.); float stereor = 1.+(sin(1.+i + uv.x + ktim * 16.) / 3.1415 / 2.); l += fline(kfrq * i) * a * kvel * envl * stereol; r += fline(kfrq * i) * a * kvel * envr * stereor; } } } synthOutput = vec4(l, r, 0.28039415461395 - abs(cos(globalTime / 2.) / 3.1415 / 40.), mod(globalTime / 4.+0.05 * uv.y, 0.99* uv.y)) + vec4(content.r, content.g, 0., 0.) * 0.949495; // WebGL 2 only (gl_FragColor otherwise) gl_FragColor = vec4(l, r, 0., 1.) + vec4(content.r, content.g, 0., 0.) * 0.999495; }