mirror of
https://github.com/FMS-Cat/condition.git
synced 2025-08-08 15:06:28 +02:00
feature: automaton neurofunk????
This commit is contained in:
46
src/Music.ts
46
src/Music.ts
@@ -5,6 +5,9 @@ import musicVert from './shaders/music.vert';
|
|||||||
import { gl, glCat } from './globals/canvas';
|
import { gl, glCat } from './globals/canvas';
|
||||||
import samplesOpus from './samples.opus';
|
import samplesOpus from './samples.opus';
|
||||||
import { randomTextureStatic } from './globals/randomTexture';
|
import { randomTextureStatic } from './globals/randomTexture';
|
||||||
|
import { automaton } from './globals/automaton';
|
||||||
|
import { automatonMusicParamMap } from './automatonMusicParamMap';
|
||||||
|
import type { AutomatonWithGUI } from '@fms-cat/automaton-with-gui';
|
||||||
|
|
||||||
const discardFrag = '#version 300 es\nvoid main(){discard;}';
|
const discardFrag = '#version 300 es\nvoid main(){discard;}';
|
||||||
|
|
||||||
@@ -13,7 +16,6 @@ export class Music {
|
|||||||
public time: number;
|
public time: number;
|
||||||
public deltaTime: number;
|
public deltaTime: number;
|
||||||
public audio: AudioContext;
|
public audio: AudioContext;
|
||||||
public samples?: GLCatTexture;
|
|
||||||
|
|
||||||
private __program: GLCatProgram;
|
private __program: GLCatProgram;
|
||||||
private __bufferOff: GLCatBuffer;
|
private __bufferOff: GLCatBuffer;
|
||||||
@@ -25,6 +27,8 @@ export class Music {
|
|||||||
private __prevAudioTime: number;
|
private __prevAudioTime: number;
|
||||||
private __bufferPool: Pool<AudioBuffer>;
|
private __bufferPool: Pool<AudioBuffer>;
|
||||||
private __prevBufferSource: AudioBufferSourceNode | null = null;
|
private __prevBufferSource: AudioBufferSourceNode | null = null;
|
||||||
|
private __samples?: GLCatTexture;
|
||||||
|
private __textureAutomaton: GLCatTexture;
|
||||||
|
|
||||||
constructor( glCat: GLCat, audio: AudioContext ) {
|
constructor( glCat: GLCat, audio: AudioContext ) {
|
||||||
this.audio = audio;
|
this.audio = audio;
|
||||||
@@ -55,6 +59,9 @@ export class Music {
|
|||||||
this.__transformFeedback.bindBuffer( 0, this.__bufferTransformFeedbacks[ 0 ] );
|
this.__transformFeedback.bindBuffer( 0, this.__bufferTransformFeedbacks[ 0 ] );
|
||||||
this.__transformFeedback.bindBuffer( 1, this.__bufferTransformFeedbacks[ 1 ] );
|
this.__transformFeedback.bindBuffer( 1, this.__bufferTransformFeedbacks[ 1 ] );
|
||||||
|
|
||||||
|
this.__textureAutomaton = glCat.createTexture();
|
||||||
|
this.__textureAutomaton.textureFilter( gl.NEAREST );
|
||||||
|
|
||||||
// == program ==================================================================================
|
// == program ==================================================================================
|
||||||
this.__program = glCat.lazyProgram(
|
this.__program = glCat.lazyProgram(
|
||||||
musicVert,
|
musicVert,
|
||||||
@@ -116,6 +123,7 @@ export class Music {
|
|||||||
const buffer = this.__bufferPool.next();
|
const buffer = this.__bufferPool.next();
|
||||||
|
|
||||||
if ( this.__program ) {
|
if ( this.__program ) {
|
||||||
|
this.__updateAutomatonTexture();
|
||||||
this.__prepareBuffer( buffer );
|
this.__prepareBuffer( buffer );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,7 +168,35 @@ export class Music {
|
|||||||
);
|
);
|
||||||
texture.textureFilter( gl.LINEAR );
|
texture.textureFilter( gl.LINEAR );
|
||||||
|
|
||||||
this.samples = texture;
|
this.__samples = texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
private __updateAutomatonTexture(): void {
|
||||||
|
const buffer = new Float32Array( MUSIC_BUFFER_LENGTH * 256 );
|
||||||
|
|
||||||
|
for ( const [ iChannel, channelName ] of automatonMusicParamMap.entries() ) {
|
||||||
|
let channel = automaton.mapNameToChannel.get( channelName )!;
|
||||||
|
|
||||||
|
if ( process.env.DEV && !channel ) {
|
||||||
|
channel = ( automaton as AutomatonWithGUI ).createChannel( channelName );
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( let iSample = 0; iSample < MUSIC_BUFFER_LENGTH; iSample ++ ) {
|
||||||
|
const t = this.time + iSample / this.audio.sampleRate;
|
||||||
|
buffer[ MUSIC_BUFFER_LENGTH * iChannel + iSample ] = channel.getValue( t );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.__textureAutomaton.setTextureFromArray(
|
||||||
|
MUSIC_BUFFER_LENGTH,
|
||||||
|
256,
|
||||||
|
buffer,
|
||||||
|
{
|
||||||
|
internalformat: gl.R32F,
|
||||||
|
format: gl.RED,
|
||||||
|
type: gl.FLOAT,
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private __prepareBuffer( buffer: AudioBuffer ): void {
|
private __prepareBuffer( buffer: AudioBuffer ): void {
|
||||||
@@ -173,6 +209,7 @@ export class Music {
|
|||||||
|
|
||||||
program.attribute( 'off', this.__bufferOff, 1 );
|
program.attribute( 'off', this.__bufferOff, 1 );
|
||||||
program.uniform1f( 'bpm', MUSIC_BPM );
|
program.uniform1f( 'bpm', MUSIC_BPM );
|
||||||
|
program.uniform1f( 'bufferLength', MUSIC_BUFFER_LENGTH );
|
||||||
program.uniform1f( '_deltaSample', 1.0 / this.audio.sampleRate );
|
program.uniform1f( '_deltaSample', 1.0 / this.audio.sampleRate );
|
||||||
program.uniform4f(
|
program.uniform4f(
|
||||||
'timeLength',
|
'timeLength',
|
||||||
@@ -190,9 +227,10 @@ export class Music {
|
|||||||
);
|
);
|
||||||
|
|
||||||
program.uniformTexture( 'samplerRandom', randomTextureStatic.texture );
|
program.uniformTexture( 'samplerRandom', randomTextureStatic.texture );
|
||||||
|
program.uniformTexture( 'samplerAutomaton', this.__textureAutomaton );
|
||||||
|
|
||||||
if ( this.samples ) {
|
if ( this.__samples ) {
|
||||||
program.uniformTexture( 'samplerSamples', this.samples );
|
program.uniformTexture( 'samplerSamples', this.__samples );
|
||||||
}
|
}
|
||||||
|
|
||||||
glCat.useProgram( program, () => {
|
glCat.useProgram( program, () => {
|
||||||
|
@@ -1 +1 @@
|
|||||||
{"version":"4.1.1","resolution":100,"curves":[{"nodes":[[0,1,0,0,0.16140350877192983],[1,0,-0.47719298245614045]]},{"nodes":[[0,0,0,0,0.1],[0.3747555183012014,1,-0.1,0,0.1],[1.3333333333333333,0,-0.1]]}],"channels":[["Glitch/amp",{"items":[{},{"time":10.666666666666666,"length":1,"curve":0},{"time":256}]}],["PixelSorter/amp",{"items":[{},{"time":15.666666666666666,"length":1.666666666666666,"curve":1}]}]],"labels":{"zero":0},"guiSettings":{"snapTimeActive":true,"snapTimeInterval":0.1,"snapValueActive":true,"snapValueInterval":0.1,"snapBeatActive":true,"bpm":180,"beatOffset":0,"useBeatInGUI":true,"minimizedPrecisionTime":3,"minimizedPrecisionValue":3}}
|
{"version":"4.1.1","resolution":100,"curves":[{"nodes":[[0,1,0,0,0.16140350877192983],[1,0,-0.47719298245614045]]},{"nodes":[[0,0,0,0,0.1],[0.3747555183012014,1,-0.1,0,0.1],[1.3333333333333333,0,-0.1]]},{"nodes":[[],[0.6666666666666666,1,-0.5266666666666666]]},{"nodes":[[0,0,0,0,0.2355866843161978],[1.3333333333333333,1.2000000000000002,-0.1]]},{"nodes":[[0,0,0,0,0.12284595300261082,0.061764705882352944],[0.6666666666666666,0.4,-0.1]]},{"nodes":[[0,0,0,0,0.10333333333333335],[1,1]]}],"channels":[["Glitch/amp",{"items":[{},{"time":10.666666666666666,"length":1,"curve":0},{"time":256}]}],["PixelSorter/amp",{"items":[{},{"time":15.666666666666666,"length":1.666666666666666,"curve":1}]}],["Music/neuro/t",{"items":[{"time":42.666666666666664,"length":0.6666666666666643,"curve":2},{"time":43.33333333333333,"length":1.3333333333333357,"curve":3},{"time":44.666666666666664,"length":0.6666666666666643,"curve":5,"speed":1.5000000000000056,"amp":0.5}]}],["Music/neuro/det",{"items":[{"time":42.666666666666664,"length":0.6666666666666643,"curve":4},{"time":43.33333333333333,"length":1.3333333333333357,"value":0.17000000000000004},{"time":44.666666666666664,"length":0.6666666666666643,"value":0.5}]}],["Music/neuro/radius",{"items":[]}]],"labels":{"zero":0},"guiSettings":{"snapTimeActive":true,"snapTimeInterval":0.1,"snapValueActive":true,"snapValueInterval":0.1,"snapBeatActive":true,"bpm":180,"beatOffset":0,"useBeatInGUI":true,"minimizedPrecisionTime":3,"minimizedPrecisionValue":3}}
|
6
src/automatonMusicParamMap.ts
Normal file
6
src/automatonMusicParamMap.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
export const automatonMusicParamMap = [
|
||||||
|
'Music/neuro/t',
|
||||||
|
'Music/neuro/det',
|
||||||
|
'Music/neuro/wubIntensity',
|
||||||
|
'Music/neuro/wubFreq',
|
||||||
|
];
|
@@ -5,4 +5,4 @@ export const
|
|||||||
AO_RESOLUTION_RATIO = 1.0,
|
AO_RESOLUTION_RATIO = 1.0,
|
||||||
RESOLUTION = [ 1280, 720 ],
|
RESOLUTION = [ 1280, 720 ],
|
||||||
MUSIC_BPM = 180,
|
MUSIC_BPM = 180,
|
||||||
MUSIC_BUFFER_LENGTH = 16384;
|
MUSIC_BUFFER_LENGTH = 4096;
|
||||||
|
@@ -9,15 +9,16 @@ const float TAU = 6.28318530718;
|
|||||||
const float BPM = 180.0;
|
const float BPM = 180.0;
|
||||||
const float BEAT = 60.0 / BPM;
|
const float BEAT = 60.0 / BPM;
|
||||||
const float SECTION_BEGIN = 0.0 * BEAT;
|
const float SECTION_BEGIN = 0.0 * BEAT;
|
||||||
const float SECTION_PORTER_FUCKING_ROBINSON = 128.0 * BEAT;
|
const float SECTION_NEURO = 128.0 * BEAT;
|
||||||
const float SECTION_AAAA = 192.0 * BEAT;
|
const float SECTION_PORTER_FUCKING_ROBINSON = 256.0 * BEAT;
|
||||||
const float SECTION_PSY = 256.0 * BEAT;
|
const float SECTION_AAAA = 320.0 * BEAT;
|
||||||
|
const float SECTION_PSY = 384.0 * BEAT;
|
||||||
|
|
||||||
#define saturate(i) clamp(i, 0.,1.)
|
#define saturate(i) clamp(i, 0.,1.)
|
||||||
#define aSaturate(i) clamp((i),-1.,1.)
|
#define aSaturate(i) clamp((i),-1.,1.)
|
||||||
#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a)))
|
#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a)))
|
||||||
#define n2r(n) (pow(2.,((n)-1.)/12.))
|
#define n2r(n) (pow(2.,((n)-1.)/12.))
|
||||||
#define n2f(n) (n2r(n)*440.)
|
#define n2f(n) (n2r(float(n))*440.)
|
||||||
#define lofi(i,j) (floor((i)/(j))*(j))
|
#define lofi(i,j) (floor((i)/(j))*(j))
|
||||||
#define saw(p) (2.*fract(p)-1.)
|
#define saw(p) (2.*fract(p)-1.)
|
||||||
#define pwm(x,d) (step(fract(x),(d))*2.0-1.0)
|
#define pwm(x,d) (step(fract(x),(d))*2.0-1.0)
|
||||||
@@ -26,21 +27,38 @@ const float SECTION_PSY = 256.0 * BEAT;
|
|||||||
|
|
||||||
uniform float bpm;
|
uniform float bpm;
|
||||||
uniform float sampleRate;
|
uniform float sampleRate;
|
||||||
|
uniform float bufferLength;
|
||||||
uniform float _deltaSample;
|
uniform float _deltaSample;
|
||||||
uniform vec4 timeLength;
|
uniform vec4 timeLength;
|
||||||
uniform vec4 _timeHead;
|
uniform vec4 _timeHead;
|
||||||
uniform sampler2D samplerRandom;
|
uniform sampler2D samplerRandom;
|
||||||
uniform sampler2D samplerSamples;
|
uniform sampler2D samplerSamples;
|
||||||
|
uniform sampler2D samplerAutomaton;
|
||||||
|
|
||||||
in float off;
|
in float off;
|
||||||
|
|
||||||
out float outL;
|
out float outL;
|
||||||
out float outR;
|
out float outR;
|
||||||
|
|
||||||
|
float auto( int index ) {
|
||||||
|
return texture( samplerAutomaton, vec2( off / bufferLength, ( float( index ) + 0.5 ) / 256.0 ) ).x;
|
||||||
|
}
|
||||||
|
|
||||||
float fs( float s ) {
|
float fs( float s ) {
|
||||||
return fract( sin( s * 114.514 ) * 1919.810 );
|
return fract( sin( s * 114.514 ) * 1919.810 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec2 fbm( vec2 p ) {
|
||||||
|
vec2 sum = vec2( 0.0 );
|
||||||
|
|
||||||
|
sum += 0.5 * texture( samplerRandom, p * 0.0625 ).xy;
|
||||||
|
sum += 0.25 * texture( samplerRandom, p * 0.125 ).xy;
|
||||||
|
sum += 0.125 * texture( samplerRandom, p * 0.25 ).xy;
|
||||||
|
sum += 0.0625 * texture( samplerRandom, p * 0.5 ).xy;
|
||||||
|
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
bool inRange( float t, float a, float b ) {
|
bool inRange( float t, float a, float b ) {
|
||||||
return ( a < t && t < b );
|
return ( a < t && t < b );
|
||||||
}
|
}
|
||||||
@@ -61,9 +79,9 @@ float inRangeInteg( float t, float a, float b, float k ) {
|
|||||||
: ( b - a + ( 2.0 - exp( k * ( b - t ) ) ) / k );
|
: ( b - a + ( 2.0 - exp( k * ( b - t ) ) ) / k );
|
||||||
}
|
}
|
||||||
|
|
||||||
vec2 wavetable( float phase, float radius, vec2 offset ) {
|
vec2 wavetable( float phase, vec2 radius, vec2 offset ) {
|
||||||
float p = TAU * phase;
|
float p = TAU * phase;
|
||||||
return 1.0 - 2.0 * texture( samplerRandom, radius * vec2( sin( p ), cos( p ) ) + offset ).xy;
|
return 1.0 - 2.0 * fbm( radius * vec2( sin( p ), cos( p ) ) + offset ).xy;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec2 filterSaw( vec2 time, float freq, float cutoff, float resonance ) {
|
vec2 filterSaw( vec2 time, float freq, float cutoff, float resonance ) {
|
||||||
@@ -92,15 +110,15 @@ float kick( float t, float attackRatio ) {
|
|||||||
vec2 deepkick( float t ) {
|
vec2 deepkick( float t ) {
|
||||||
if ( t < 0.0 ) { return vec2( 0.0 ); }
|
if ( t < 0.0 ) { return vec2( 0.0 ); }
|
||||||
|
|
||||||
vec2 tt = t + 0.01 * wavetable( inRangeInteg( t, 3.0, 1E9, 1.0 ), 0.02, vec2( 0.5 ) );
|
vec2 tt = t + 0.04 * wavetable( inRangeInteg( t, 3.0, 1E9, 1.0 ), vec2( 0.2 ), vec2( 0.0 ) );
|
||||||
vec2 phase = 50.0 * tt - 4.0 * exp( -200.0 * tt ) - 9.4 * exp( -50.0 * tt );
|
vec2 phase = 50.0 * tt - 4.0 * exp( -200.0 * tt ) - 9.4 * exp( -50.0 * tt );
|
||||||
return exp( -1.0 * tt ) * sin( TAU * phase );
|
return exp( -1.0 * tt ) * sin( TAU * phase );
|
||||||
}
|
}
|
||||||
|
|
||||||
vec2 longclap( float t ) {
|
vec2 longclap( float t, float tg ) {
|
||||||
if ( t < 0.0 ) { return vec2( 0.0 ); }
|
if ( t < 0.0 ) { return vec2( 0.0 ); }
|
||||||
|
|
||||||
vec2 tt = t + lofi( exp( -1.0 * t ) * 0.004 * wavetable( t, 0.07, vec2( 0.5 ) ), 0.0003 );
|
vec2 tt = t + lofi( exp( -1.0 * t ) * 0.008 * wavetable( tg, vec2( 0.3 ), vec2( 0.0 ) ), 0.0003 );
|
||||||
return aSaturate( (
|
return aSaturate( (
|
||||||
sin( tt * 3000.0 * vec2( 1.005, 0.995 ) - exp( -tt * 300.0 ) * 50.0 ) * mix( exp( -tt * 30.0 ), exp( -1.0 * tt ), 0.04 ) * 2.0
|
sin( tt * 3000.0 * vec2( 1.005, 0.995 ) - exp( -tt * 300.0 ) * 50.0 ) * mix( exp( -tt * 30.0 ), exp( -1.0 * tt ), 0.04 ) * 2.0
|
||||||
) * 4.0 );
|
) * 4.0 );
|
||||||
@@ -126,15 +144,15 @@ vec2 snare909( float t ) {
|
|||||||
) * 2.0 * exp( -t * 10.0 ) );
|
) * 2.0 * exp( -t * 10.0 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// vec2 snare( float t ) {
|
vec2 snare( float t ) {
|
||||||
// if ( t < 0.0 ) { return vec2( 0.0 ); }
|
if ( t < 0.0 ) { return vec2( 0.0 ); }
|
||||||
|
|
||||||
// vec2 fm = exp( -t * 100.0 ) * 1.2 * sin( t * vec2( 2080.0, 2090.0 ) );
|
vec2 fm = exp( -t * 100.0 ) * 1.2 * sin( t * vec2( 2080.0, 2090.0 ) );
|
||||||
// return aSaturate( (
|
return aSaturate( (
|
||||||
// ( 1.0 - 2.0 * texture( samplerRandom, vec2( t ) / vec2( 0.127, 0.124 ) ).xy ) * exp( -t * 20.0 ) +
|
( 1.0 - 2.0 * texture( samplerRandom, vec2( t ) / vec2( 0.127, 0.124 ) ).xy ) * exp( -t * 20.0 ) +
|
||||||
// sin( t * 4500.0 * vec2( 1.005, 0.995 ) - exp( -t * 500.0 ) * 50.0 + fm ) * exp( -t * 50.0 ) * 2.0
|
sin( t * 4500.0 * vec2( 1.005, 0.995 ) - exp( -t * 500.0 ) * 50.0 + fm ) * exp( -t * 50.0 ) * 2.0
|
||||||
// ) * 4.0 );
|
) * 4.0 );
|
||||||
// }
|
}
|
||||||
|
|
||||||
vec2 hihat( float t, float decay ) {
|
vec2 hihat( float t, float decay ) {
|
||||||
if ( t < 0.0 ) { return vec2( 0.0 ); }
|
if ( t < 0.0 ) { return vec2( 0.0 ); }
|
||||||
@@ -231,7 +249,7 @@ vec2 mainAudio( vec4 time ) {
|
|||||||
|
|
||||||
const int chordsB[48] = int[](
|
const int chordsB[48] = int[](
|
||||||
-4, 0, 3, 5, 10, 19,
|
-4, 0, 3, 5, 10, 19,
|
||||||
-5, -3, 0, 5, 10, 17,
|
-5, 2, 9, 10, 12, 17,
|
||||||
0, 5, 7, 14, 15, 22,
|
0, 5, 7, 14, 15, 22,
|
||||||
-3, 0, 2, 5, 12, 19,
|
-3, 0, 2, 5, 12, 19,
|
||||||
-4, 0, 5, 7, 14, 19,
|
-4, 0, 5, 7, 14, 19,
|
||||||
@@ -244,50 +262,67 @@ vec2 mainAudio( vec4 time ) {
|
|||||||
? 6 * ( int( time.w / ( 8.0 * BEAT ) ) % 8 )
|
? 6 * ( int( time.w / ( 8.0 * BEAT ) ) % 8 )
|
||||||
: 36;
|
: 36;
|
||||||
|
|
||||||
|
float bassfreq = n2f( 0.0 );
|
||||||
|
|
||||||
float sidechain = 1.0;
|
float sidechain = 1.0;
|
||||||
|
|
||||||
// -- kick ---------------------------------------------------------------------------------------
|
// -- kick ---------------------------------------------------------------------------------------
|
||||||
if ( inRange( time.w, 64.0 * BEAT, 120.0 * BEAT ) ) {
|
if ( inRange( time.w, 64.0 * BEAT, SECTION_NEURO - 16.0 * BEAT ) ) {
|
||||||
float ph = linearstep( 64.0 * BEAT, SECTION_PORTER_FUCKING_ROBINSON, time.w );
|
float ph = linearstep( 64.0 * BEAT, SECTION_PORTER_FUCKING_ROBINSON, time.w );
|
||||||
float t = mod( mod( time.z - 1.5 * BEAT, 4.0 * BEAT ), 2.5 * BEAT );
|
float t = mod( mod( time.z - 1.5 * BEAT, 4.0 * BEAT ), 2.5 * BEAT );
|
||||||
sidechain = smoothstep( 0.0, 0.7 * BEAT, t );
|
sidechain = smoothstep( 0.0, 0.7 * BEAT, t );
|
||||||
dest += 0.25 * kick( t, ph * ph );
|
dest += 0.25 * kick( t, 0.2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( inRange( time.w, 120.0 * BEAT, 128.0 * BEAT ) ) {
|
if ( inRange( time.w, SECTION_NEURO - 16.0 * BEAT, SECTION_NEURO ) ) {
|
||||||
dest += 0.25 * kick( mod( time.z - 120.0 * BEAT, 64.0 * BEAT ), 1.0 );
|
dest += 0.25 * kick( mod( time.z - ( SECTION_NEURO - 16.0 * BEAT ), 64.0 * BEAT ), 0.2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- click --------------------------------------------------------------------------------------
|
||||||
|
if ( inRange( time.w, 64.0 * BEAT, SECTION_NEURO - 16.0 * BEAT ) ) {
|
||||||
|
float t = mod( time.x, 0.25 * BEAT );
|
||||||
|
vec2 w = fbm( vec2( time.w ) ) * 2.0 - 1.0;
|
||||||
|
dest += 0.3 * exp( -500.0 * t ) * mix( 0.3, 1.0, sidechain ) * w;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- hihat --------------------------------------------------------------------------------------
|
||||||
|
if (
|
||||||
|
inRange( time.w, 64.0 * BEAT, SECTION_NEURO )
|
||||||
|
) {
|
||||||
|
float t = mod( time.x, 0.5 * BEAT );
|
||||||
|
dest += 0.03 * mix( 0.3, 1.0, sidechain ) * hihat2( 2.0 * t, 50.0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
// -- longclap -----------------------------------------------------------------------------------
|
// -- longclap -----------------------------------------------------------------------------------
|
||||||
if ( inRange( time.w, 67.0 * BEAT, 119.0 * BEAT ) ) {
|
if ( inRange( time.w, 67.0 * BEAT, SECTION_NEURO - 17.0 * BEAT ) ) {
|
||||||
float t = mod( time.y - 3.0 * BEAT, 4.0 * BEAT );
|
float t = mod( time.y - 3.0 * BEAT, 4.0 * BEAT );
|
||||||
// float t = mod( time.z - 2.0 * BEAT, 4.0 * BEAT );
|
// float t = mod( time.z - 2.0 * BEAT, 4.0 * BEAT );
|
||||||
dest += 0.1 * longclap( t );
|
dest += 0.1 * longclap( t, time.w );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( inRange( time.w, 119.0 * BEAT, 128.0 * BEAT ) ) {
|
if ( inRange( time.w, SECTION_NEURO - 17.0 * BEAT, SECTION_NEURO ) ) {
|
||||||
dest += 0.1 * longclap( mod( time.z - 119.0 * BEAT, 64.0 * BEAT ) );
|
dest += 0.1 * longclap( mod( time.z - ( SECTION_NEURO - 17.0 * BEAT ), 64.0 * BEAT ), time.w );
|
||||||
}
|
}
|
||||||
|
|
||||||
// -- pad ----------------------------------------------------------------------------------------
|
// -- pad ----------------------------------------------------------------------------------------
|
||||||
if ( inRange( time.w, 0.0, SECTION_PORTER_FUCKING_ROBINSON ) ) {
|
if ( inRange( time.w, 0.0, SECTION_NEURO ) ) {
|
||||||
vec2 sum = vec2( 0.0 );
|
vec2 sum = vec2( 0.0 );
|
||||||
|
|
||||||
float ph = lofi( time.w, 0.5 * BEAT ) / SECTION_PORTER_FUCKING_ROBINSON;
|
float ph = lofi( time.w, 0.5 * BEAT ) / SECTION_NEURO;
|
||||||
float tb = lofi( time.z, 0.5 * BEAT );
|
float tb = lofi( time.z, 0.5 * BEAT );
|
||||||
float t = time.z - tb;
|
float t = time.z - tb;
|
||||||
float rev = 0.001 * exp( -8.0 * t );
|
float rev = 0.02 * exp( -8.0 * t );
|
||||||
rev += 0.001 * fs( floor( time.z / ( 0.5 * BEAT ) ) );
|
rev += 0.02 * fs( floor( time.z / ( 0.5 * BEAT ) ) );
|
||||||
float radius = exp( 4.0 * ( ph - 1.0 ) );
|
vec2 radius = vec2( exp( 4.0 * ( ph - 1.0 ) ) );
|
||||||
|
|
||||||
for ( int i = 0; i < 21; i ++ ) {
|
for ( int i = 0; i < 21; i ++ ) {
|
||||||
float freq = n2f( float( chordsA[ ( i % 8 ) ] ) ) * 0.25;
|
float freq = n2f( chordsA[ ( i % 8 ) ] ) * 0.25;
|
||||||
freq *= 1.0 + 0.01 * ( 0.5 - fs( float( i ) ) );
|
freq *= 1.0 + 0.01 * ( 0.5 - fs( float( i ) ) );
|
||||||
float phase = tri( time.w * freq ) * rev;
|
float phase = tri( time.w * freq ) * rev;
|
||||||
sum += 0.1 * inRangeSmooth( t, 0.0, 0.48 * BEAT, 1E3 ) * wavetable( phase, radius, vec2( 0.3 * float( i ) ) );
|
sum += 0.1 * inRangeSmooth( t, 0.0, 0.48 * BEAT, 1E3 ) * wavetable( phase, radius, vec2( 0.3 * float( i ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( inRange( time.w, 64.0 * BEAT, SECTION_PORTER_FUCKING_ROBINSON ) ) {
|
if ( inRange( time.w, 64.0 * BEAT, SECTION_NEURO ) ) {
|
||||||
for ( int i = 0; i < 7; i ++ ) {
|
for ( int i = 0; i < 7; i ++ ) {
|
||||||
float rate = n2r( float( chordsA[ i ] ) ) * 0.5;
|
float rate = n2r( float( chordsA[ i ] ) ) * 0.5;
|
||||||
sum += 0.1 * choir( ( time.w - 64.0 * BEAT ) * rate * 0.5 );
|
sum += 0.1 * choir( ( time.w - 64.0 * BEAT ) * rate * 0.5 );
|
||||||
@@ -305,13 +340,13 @@ vec2 mainAudio( vec4 time ) {
|
|||||||
|
|
||||||
vec2 sum = vec2( 0.0 );
|
vec2 sum = vec2( 0.0 );
|
||||||
|
|
||||||
float radius = 0.00002;
|
vec2 radius = vec2( 0.00002 );
|
||||||
float tb = lofi( time.z, 0.5 * BEAT );
|
float tb = lofi( time.z, 0.5 * BEAT );
|
||||||
float t = time.z - tb;
|
float t = time.z - tb;
|
||||||
|
|
||||||
for ( int i = 0; i < 21; i ++ ) {
|
for ( int i = 0; i < 21; i ++ ) {
|
||||||
int note = notes[ int( time.z / ( 0.5 * BEAT ) ) % 7 ];
|
int note = notes[ int( time.z / ( 0.5 * BEAT ) ) % 7 ];
|
||||||
float freq = n2f( float( note ) ) * 0.25;
|
float freq = n2f( note ) * 0.25;
|
||||||
freq *= 1.0 + 0.01 * ( 0.5 - fs( float( i ) ) );
|
freq *= 1.0 + 0.01 * ( 0.5 - fs( float( i ) ) );
|
||||||
float phase = 2.0 * tri( time.w * freq );
|
float phase = 2.0 * tri( time.w * freq );
|
||||||
sum += 0.1 * inRangeSmooth( t, 0.0, 0.5 * BEAT, 1E3 ) * wavetable( phase, radius, vec2( 0.3 * float( i ) ) );
|
sum += 0.1 * inRangeSmooth( t, 0.0, 0.5 * BEAT, 1E3 ) * wavetable( phase, radius, vec2( 0.3 * float( i ) ) );
|
||||||
@@ -320,6 +355,53 @@ vec2 mainAudio( vec4 time ) {
|
|||||||
//dest += 0.14 * aSaturate( sum );
|
//dest += 0.14 * aSaturate( sum );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -- kick ---------------------------------------------------------------------------------------
|
||||||
|
if ( inRange( time.w, SECTION_NEURO, SECTION_PORTER_FUCKING_ROBINSON ) ) {
|
||||||
|
float t = mod( mod( mod( time.y, 4.0 * BEAT ), 3.25 * BEAT ), 1.75 * BEAT );
|
||||||
|
sidechain = smoothstep( 0.0, 0.7 * BEAT, t );
|
||||||
|
dest += 0.25 * kick( t, 1.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- hihat --------------------------------------------------------------------------------------
|
||||||
|
if ( inRange( time.w, SECTION_NEURO, SECTION_PORTER_FUCKING_ROBINSON ) ) {
|
||||||
|
float t = mod( time.x, 0.25 * BEAT );
|
||||||
|
float decay = mix( 40.0, 100.0, fs( floor( time.z / ( 0.25 * BEAT ) ) ) );
|
||||||
|
dest += 0.1 * mix( 0.3, 1.0, sidechain ) * hihat2( t, decay );
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- snare --------------------------------------------------------------------------------------
|
||||||
|
if ( inRange( time.w, SECTION_NEURO, SECTION_PORTER_FUCKING_ROBINSON ) ) {
|
||||||
|
float t = mod( time.y - 2.0 * BEAT, 4.0 * BEAT );
|
||||||
|
// float t = mod( time.z - 2.0 * BEAT, 4.0 * BEAT );
|
||||||
|
dest += 0.12 * snare( t );
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- neuro bass ---------------------------------------------------------------------------------
|
||||||
|
if ( inRange( time.w, SECTION_NEURO, SECTION_PORTER_FUCKING_ROBINSON ) ) {
|
||||||
|
vec2 sum = vec2( 0.0 );
|
||||||
|
|
||||||
|
float t = auto( 0 );
|
||||||
|
float det = 0.01 * auto( 1 );
|
||||||
|
float wubIntensity = auto( 2 );
|
||||||
|
float wubFreq = auto( 3 );
|
||||||
|
|
||||||
|
for ( int i = 0; i < 5; i ++ ) {
|
||||||
|
float fi = float( i );
|
||||||
|
|
||||||
|
float tt = t + det * fi * sin( 0.7 * fi + 1.0 * t );
|
||||||
|
|
||||||
|
float radius = 0.2 + 0.1 * wubIntensity * fbm( 0.1 * vec2( tri( n2f( -36.0 ) * wubFreq * tt ) ) ).x;
|
||||||
|
|
||||||
|
float phase = 0.2 * tri( n2f( -36.0 ) * tt );
|
||||||
|
vec2 uv = radius * vec2( sin( phase ), cos( phase ) ) + 0.4;
|
||||||
|
|
||||||
|
sum += 0.3 * ( 2.0 * fbm( uv ) - 1.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
dest += mix( 0.0, 1.0, sidechain ) * 0.2 * aSaturate( sum );
|
||||||
|
dest += mix( 0.0, 1.0, sidechain ) * 0.2 * sin( n2f( -36.0 ) * TAU * t );
|
||||||
|
}
|
||||||
|
|
||||||
// -- kick ---------------------------------------------------------------------------------------
|
// -- kick ---------------------------------------------------------------------------------------
|
||||||
// float tKick = mod( mod( time.y, 2.25 * BEAT ), 1.75 * BEAT );
|
// float tKick = mod( mod( time.y, 2.25 * BEAT ), 1.75 * BEAT );
|
||||||
// float tKick = mod( mod( time.y, 4.0 * BEAT ), 2.5 * BEAT );
|
// float tKick = mod( mod( time.y, 4.0 * BEAT ), 2.5 * BEAT );
|
||||||
@@ -342,13 +424,6 @@ vec2 mainAudio( vec4 time ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -- hihat --------------------------------------------------------------------------------------
|
// -- hihat --------------------------------------------------------------------------------------
|
||||||
if (
|
|
||||||
inRange( time.w, 64.0 * BEAT, SECTION_PORTER_FUCKING_ROBINSON )
|
|
||||||
) {
|
|
||||||
float t = mod( time.x, 0.5 * BEAT );
|
|
||||||
dest += 0.03 * mix( 0.3, 1.0, sidechain ) * hihat2( 2.0 * t, 50.0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
inRange( time.w, SECTION_AAAA, SECTION_PSY )
|
inRange( time.w, SECTION_AAAA, SECTION_PSY )
|
||||||
) {
|
) {
|
||||||
@@ -432,7 +507,7 @@ vec2 mainAudio( vec4 time ) {
|
|||||||
float decay = exp( -50.0 * t );
|
float decay = exp( -50.0 * t );
|
||||||
float cutoff = mix( 100.0, 2000.0, decay );
|
float cutoff = mix( 100.0, 2000.0, decay );
|
||||||
float noteI = 0.0;
|
float noteI = 0.0;
|
||||||
float freq = n2f( -36.0 );
|
float freq = n2f( -36 );
|
||||||
float fm = -0.009 * exp( -6.0 * t ) * sin( TAU * 1.0 * freq * t );
|
float fm = -0.009 * exp( -6.0 * t ) * sin( TAU * 1.0 * freq * t );
|
||||||
vec2 wave = ( 1.0 - exp( -t * 400.0 ) ) * filterSaw( vec2( t ) + fm, freq, cutoff, 0.0 );
|
vec2 wave = ( 1.0 - exp( -t * 400.0 ) ) * filterSaw( vec2( t ) + fm, freq, cutoff, 0.0 );
|
||||||
dest += 0.12 * sidechain * wave * exp( -max( 0.0, t - 0.22 * BEAT ) * 400.0 );
|
dest += 0.12 * sidechain * wave * exp( -max( 0.0, t - 0.22 * BEAT ) * 400.0 );
|
||||||
@@ -442,42 +517,21 @@ vec2 mainAudio( vec4 time ) {
|
|||||||
if ( inRange( time.w, SECTION_PORTER_FUCKING_ROBINSON, SECTION_AAAA ) ) {
|
if ( inRange( time.w, SECTION_PORTER_FUCKING_ROBINSON, SECTION_AAAA ) ) {
|
||||||
float t = mod( time.z, 8.0 * BEAT );
|
float t = mod( time.z, 8.0 * BEAT );
|
||||||
t += 1.0 * inRangeInteg( time.z, 28.0 * BEAT, 31.75 * BEAT, 50.0 );
|
t += 1.0 * inRangeInteg( time.z, 28.0 * BEAT, 31.75 * BEAT, 50.0 );
|
||||||
float freq = n2f( float( chordsB[ progB ] ) ) * 0.125;
|
float freq = n2f( chordsB[ progB ] ) * 0.125;
|
||||||
float fadetime = max( 0.0, time.w - SECTION_AAAA + 8.0 * BEAT );
|
float fadetime = max( 0.0, time.w - SECTION_AAAA + 8.0 * BEAT );
|
||||||
dest += 0.1 * exp( -1.0 * fadetime ) * mix( 0.1, 1.0, sidechain ) * superbass( t, freq, exp( -2.0 * fadetime ) );
|
dest += 0.1 * exp( -1.0 * fadetime ) * mix( 0.1, 1.0, sidechain ) * superbass( t, freq, exp( -2.0 * fadetime ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// -- cv bass ------------------------------------------------------------------------------------
|
|
||||||
if ( inRange( time.w, 0.0, SECTION_PORTER_FUCKING_ROBINSON ) ) {
|
|
||||||
vec2 sum = vec2( 0.0 );
|
|
||||||
|
|
||||||
float t = mod( time.z, 8.0 * BEAT );
|
|
||||||
t += 3.7 * inRangeInteg( mod( time.z, 8.0 * BEAT ), 1.05 * BEAT, 1.8 * BEAT, 100.0 );
|
|
||||||
float freq = 51.0;
|
|
||||||
float fm = -0.2 * sin( 15.0 * TAU * t * freq );
|
|
||||||
float radius = 0.005 * sin( 0.5 * TAU * t * freq );
|
|
||||||
float rev = 0.3 + fm;
|
|
||||||
sum += sin( TAU * freq * t );
|
|
||||||
|
|
||||||
for ( int i = 0; i < 5; i ++ ) {
|
|
||||||
freq *= 1.0 + 0.001 * ( 0.5 - fs( float( i ) ) );
|
|
||||||
float phase = tri( 7.5 * t * freq ) * rev;
|
|
||||||
sum += 0.4 * wavetable( phase, radius, vec2( 0.5 + float( i ) * 0.01 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// dest += mix( 0.0, 1.0, sidechain ) * 0.2 * aSaturate( sum );
|
|
||||||
}
|
|
||||||
|
|
||||||
// -- choir --------------------------------------------------------------------------------------
|
// -- choir --------------------------------------------------------------------------------------
|
||||||
if ( inRange( time.w, SECTION_PORTER_FUCKING_ROBINSON, SECTION_AAAA - 8.0 * BEAT ) ) {
|
if ( inRange( time.w, SECTION_PORTER_FUCKING_ROBINSON, SECTION_AAAA - 8.0 * BEAT ) ) {
|
||||||
vec2 sum = vec2( 0.0 );
|
vec2 sum = vec2( 0.0 );
|
||||||
|
|
||||||
float t = mod( time.z, 8.0 * BEAT );
|
float t = mod( time.z, 8.0 * BEAT );
|
||||||
float radius = 0.001 + 0.003 * ( 1.0 - exp( -t ) );
|
vec2 radius = vec2( 0.01 + 0.03 * ( 1.0 - exp( -t ) ) );
|
||||||
float rev = 0.3;
|
float rev = 0.3;
|
||||||
|
|
||||||
for ( int i = 0; i < 18; i ++ ) {
|
for ( int i = 0; i < 18; i ++ ) {
|
||||||
float freq = n2f( float( chordsB[ ( i % 6 ) + progB ] ) ) * ( 0.25 + 0.25 * float( i % 2 ) );
|
float freq = n2f( chordsB[ ( i % 6 ) + progB ] ) * ( 0.25 + 0.25 * float( i % 2 ) );
|
||||||
freq *= 1.0 + 0.03 * ( 0.5 - fs( float( i ) ) );
|
freq *= 1.0 + 0.03 * ( 0.5 - fs( float( i ) ) );
|
||||||
float phase = saw( t * freq ) * rev;
|
float phase = saw( t * freq ) * rev;
|
||||||
sum += 0.2 * mix( 0.2, 1.0, sidechain ) * wavetable( phase, radius, vec2( 0.2 + 0.03 * float( i ) ) );
|
sum += 0.2 * mix( 0.2, 1.0, sidechain ) * wavetable( phase, radius, vec2( 0.2 + 0.03 * float( i ) ) );
|
||||||
@@ -529,13 +583,13 @@ vec2 mainAudio( vec4 time ) {
|
|||||||
int progPrev = int( mod( ( time.z - 0.5 * BEAT ) / ( 0.5 * BEAT ), 4.0 ) );
|
int progPrev = int( mod( ( time.z - 0.5 * BEAT ) / ( 0.5 * BEAT ), 4.0 ) );
|
||||||
progPrev += int( mod( ( time.z - 0.5 * BEAT ) / ( 8.0 * BEAT ), 4.0 ) );
|
progPrev += int( mod( ( time.z - 0.5 * BEAT ) / ( 8.0 * BEAT ), 4.0 ) );
|
||||||
|
|
||||||
float note = float( notes[ prog ] );
|
int note = notes[ prog ];
|
||||||
float prevNote = float( notes[ progPrev ] );
|
int prevNote = notes[ progPrev ];
|
||||||
note += ( note - prevNote ) * exp( -200.0 * t );
|
float notef = float( note ) + float( note - prevNote ) * exp( -200.0 * t );
|
||||||
|
|
||||||
for ( int i = 0; i < 16; i ++ ) {
|
for ( int i = 0; i < 16; i ++ ) {
|
||||||
float fi = float( i );
|
float fi = float( i );
|
||||||
vec2 freq = n2f( note ) * vec2( 0.5 );
|
vec2 freq = n2f( notef ) * vec2( 0.5 );
|
||||||
vec2 vib = freq * exp( -3.0 * t ) * 0.002 * sin( 20.0 * time.z + 6.0 * vec2( fs( fi ), fs( fi + 1.89 ) ) );
|
vec2 vib = freq * exp( -3.0 * t ) * 0.002 * sin( 20.0 * time.z + 6.0 * vec2( fs( fi ), fs( fi + 1.89 ) ) );
|
||||||
vec2 phase = saw( t * freq + vib );
|
vec2 phase = saw( t * freq + vib );
|
||||||
sum += 0.1 * mix( 0.2, 1.0, sidechain ) * phase;
|
sum += 0.1 * mix( 0.2, 1.0, sidechain ) * phase;
|
||||||
@@ -546,17 +600,17 @@ vec2 mainAudio( vec4 time ) {
|
|||||||
|
|
||||||
// -- deepkick -----------------------------------------------------------------------------------
|
// -- deepkick -----------------------------------------------------------------------------------
|
||||||
if ( inRange( time.w, SECTION_BEGIN, SECTION_BEGIN + 16.0 * BEAT ) ) {
|
if ( inRange( time.w, SECTION_BEGIN, SECTION_BEGIN + 16.0 * BEAT ) ) {
|
||||||
dest += 0.3 * deepkick( mod( time.z, 16.0 * BEAT ) );
|
dest += 0.4 * deepkick( mod( time.z, 16.0 * BEAT ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( inRange( time.w, SECTION_AAAA - 8.0 * BEAT, SECTION_AAAA ) ) {
|
if ( inRange( time.w, SECTION_AAAA - 8.0 * BEAT, SECTION_AAAA ) ) {
|
||||||
dest += 0.3 * deepkick( mod( time.z, 8.0 * BEAT ) );
|
dest += 0.4 * deepkick( mod( time.z, 8.0 * BEAT ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// -- buildup ------------------------------------------------------------------------------------
|
// -- buildup ------------------------------------------------------------------------------------
|
||||||
if ( inRange( time.w, SECTION_AAAA + 32.0 * BEAT, SECTION_PSY ) ) {
|
if ( inRange( time.w, SECTION_AAAA + 32.0 * BEAT, SECTION_PSY ) ) {
|
||||||
float ph = linearstep( SECTION_AAAA + 32.0 * BEAT, SECTION_PSY, time.w );
|
float ph = linearstep( SECTION_AAAA + 32.0 * BEAT, SECTION_PSY, time.w );
|
||||||
float radius = 0.003 * ( 1.0 + ph + sin( ph * 3000.0 ) );
|
vec2 radius = vec2( 0.03 * ( 1.0 + ph + sin( ph * 3000.0 ) ) );
|
||||||
dest += 0.12 * ph * wavetable( ph * ( 0.5 + ph ) * 8000.0, radius, vec2( 0.4 ) );
|
dest += 0.12 * ph * wavetable( ph * ( 0.5 + ph ) * 8000.0, radius, vec2( 0.4 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -23,13 +23,13 @@ uniform float time;
|
|||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
#ifdef FORWARD
|
#ifdef FORWARD
|
||||||
fragColor = vec4( 8.0 * vec3( 0.2, 0.9, 0.5 ), 1.0 );
|
fragColor = vec4( 8.0 * vec3( 0.9, 0.02, 0.1 ), 1.0 );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEFERRED
|
#ifdef DEFERRED
|
||||||
fragPosition = vPosition;
|
fragPosition = vPosition;
|
||||||
fragNormal = vec4( normalize( vNormal ), 1.0 );
|
fragNormal = vec4( normalize( vNormal ), 1.0 );
|
||||||
fragColor = vec4( 0.2, 0.9, 0.5, 1.0 );
|
fragColor = vec4( 0.9, 0.02, 0.1, 1.0 );
|
||||||
fragWTF = vec4( vec3( 0.2, 0.2, 4.0 ), MTL_PBR );
|
fragWTF = vec4( vec3( 0.2, 0.2, 8.0 ), MTL_PBR );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user