Last active
November 23, 2021 09:46
-
-
Save rngtm/d20e5bfdf7837a664150757694348b66 to your computer and use it in GitHub Desktop.
GLSL Sound 02
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define PI acos(-1.0) | |
struct Note | |
{ | |
float freq; | |
}; | |
Note GetNote(int index) | |
{ | |
Note n; | |
n.freq = 440.0 * exp2(float(index)/12.0); | |
return n; | |
} | |
float SawWave(float time, float freq) | |
{ | |
return fract(time * freq); | |
} | |
float SineWave(float time, float freq) | |
{ | |
return sin(time * freq * 2.0 * PI); | |
} | |
float KickWave(float time, float freq) | |
{ | |
// float s = SineWave(time, freq); | |
float s = smoothstep(0.0, 0.1, fract(time * freq)); | |
// float th = 0.2; | |
// s = s / th; | |
// s = clamp(s, -1.0, 1.0); | |
return s; | |
// return SineWave(time, freq); | |
} | |
float SuperSawWave(float time, float freq) | |
{ | |
float wave; | |
float vol = 1.0; | |
int n = 10; | |
for (int i = 0; i < n; i++) | |
{ | |
float saw = SawWave(time, freq); | |
saw = pow(saw, 4.0); | |
// wave += SawWave(time, freq) * vol; | |
wave += saw * vol; | |
time += 0.1; | |
freq *= 1.007; | |
vol *= 0.73; | |
} | |
wave /= 8.0; | |
return wave; | |
} | |
float Wave(float time, float freq) | |
{ | |
float wave; | |
float vol = 1.0; | |
// freq *= 1.0 + 0.05 * SineWave(time, 1.0); | |
for (int i = 0; i < 7; i++) | |
{ | |
wave += SawWave(time, freq) * vol; | |
time += 0.1; | |
freq *= 1.007; | |
vol *= 0.73; | |
} | |
wave /= 7.0; | |
return wave; | |
} | |
float HighHat(float time) | |
{ | |
// if (time <= 0.5) return 0.0; | |
time += 0.5; | |
float amp = fract(-time*2.); | |
amp = pow(amp, 16.0); | |
return (fract(sin(time*1e3)*1e6)-.5) * amp; | |
} | |
float SquareWave(float time, float freq, float rate) | |
{ | |
return step(fract(time * freq), rate); | |
} | |
float TriangleWave(float time, float freq, float a) | |
{ | |
float t = fract(time*freq); | |
return min(t / a, (1.0-t)/(1.0 - a)); | |
} | |
float SuperSquareWave(float time, float freq, float rate) | |
{ | |
float wave; | |
float vol = 1.0; | |
int n = 10; | |
for (int i = 0; i < n; i++) | |
{ | |
float saw = SquareWave(time, freq, rate); | |
saw = pow(saw, 4.0); | |
// wave += SawWave(time, freq) * vol; | |
wave += saw * vol; | |
time += 0.1; | |
freq *= 1.007; | |
vol *= 0.73; | |
} | |
wave /= 8.0; | |
return wave; | |
} | |
float Wave1(float time) | |
{ | |
float tempo = 0.5; | |
int noteCount = 4; | |
float waveTime = time; | |
time *= tempo; | |
//float amp = exp(-3.0 * fract(time)); | |
int noteIndex = int(time / 2.0); | |
noteIndex = noteIndex % noteCount; | |
int key = -8-12; | |
Note[] notes1 = Note[] | |
( | |
GetNote(0), | |
GetNote(-2+12), | |
GetNote(-4), | |
GetNote(-7) | |
); | |
Note[] notes2 = Note[] | |
( | |
GetNote(3), | |
GetNote(0), | |
GetNote(-2+12), | |
GetNote(-2) | |
); | |
Note[] notes3 = Note[] | |
( | |
GetNote(5), | |
GetNote(3), | |
GetNote(3), | |
GetNote(0+12) | |
); | |
Note n1 = notes1[noteIndex]; | |
Note n2 = notes2[noteIndex]; | |
Note n3 = notes3[noteIndex]; | |
int ampIndex = int(fract(time)) % 4; | |
#define PLUCK pow(1.0 - fract(time * 8.0), 0.7) | |
float amp = | |
pow(fract(mod(-time* 16., 8.)/3.), 0.3) | |
* mix(0.1, 1.0, PLUCK); | |
float freqRange = 4.0; | |
float wave = | |
SuperSawWave(waveTime, (n1.freq) * exp2(float(key)/12.0)) + | |
SuperSawWave(waveTime, (n2.freq) * exp2(float(key)/12.0)) + | |
SuperSawWave(waveTime, (n3.freq) * exp2(float(key)/12.0)) | |
; | |
return wave * amp; | |
} | |
float Wave2(float time) | |
{ | |
float tempo = 0.5; | |
int noteCount = 4; | |
float waveTime = time; | |
time *= tempo; | |
//float amp = exp(-3.0 * fract(time)); | |
int noteIndex = int(time*16.0); | |
int key = -8-24; | |
Note[] notes1 = Note[] | |
( | |
GetNote(0), | |
GetNote(5), | |
GetNote(8), | |
GetNote(10) | |
); | |
key += (noteIndex / 4 % 8) * 12; | |
Note n1 = notes1[noteIndex % noteCount]; | |
int ampIndex = int(fract(time)) % 4; | |
#define PLUCK pow(1.0 - fract(time * 8.0), 0.7) | |
float amp = | |
pow(fract(mod(-time* 16., 8.)/3.), 0.3) | |
* mix(0.1, 1.0, PLUCK) | |
// * exp(-6.0*float(noteIndex % noteCount) / float(noteCount)) | |
; | |
float freqRange = 4.0; | |
float s = | |
SineWave(waveTime, (n1.freq) * exp2(float(key)/12.0)) + | |
SineWave(waveTime, (n1.freq * 1.03 + 10.05) * exp2(float(key)/12.0)) * 0.1 | |
; | |
float th = 0.1; | |
s = s / th; | |
s = clamp(s, -1., 1.); | |
float wave = s; | |
return wave * amp; | |
} | |
float BaseWave(float time, float freq) | |
{ | |
float wave; | |
wave += SquareWave(time, freq, 0.2); | |
wave += SquareWave(time, freq * 2.0, 0.2) * 0.5; | |
wave += SquareWave(time, freq * 4.0, 0.2) * 0.15; | |
return wave / 2.0; | |
} | |
float Wave3(float time) | |
{ | |
time -= 1.0 / 4.0; | |
float wave = BaseWave(time, 440.0*exp2(-4.0)); | |
float amp = SquareWave(time - 0.5, 2.0, 0.5); | |
return wave * 0.1 * amp; | |
} | |
float Wave4(float time) | |
{ | |
int noteCount = 64; | |
float tempo = 2.0 ; | |
int key = -8-12; | |
Note[] notes = Note[] | |
( | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(3), | |
GetNote(3), | |
GetNote(3), | |
GetNote(3), | |
GetNote(3), | |
GetNote(3), | |
GetNote(0), | |
GetNote(0), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(0), | |
GetNote(-2), | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(0), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(3), | |
GetNote(3), | |
GetNote(3), | |
GetNote(3), | |
GetNote(3), | |
GetNote(3), | |
GetNote(0), | |
GetNote(0), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1), | |
GetNote(1) | |
); | |
int index = int(time * tempo) % noteCount; | |
float freq = notes[index].freq * exp2(float(key)/12.0) + SineWave(time, .0); | |
float wave; | |
float a = 0.5; | |
float amp = 1.0 - fract(time); | |
wave += SuperSquareWave(time, freq * 1.0, a) / 4.0; | |
wave += SuperSquareWave(time, freq * 2.0, a) / 2.0; | |
wave += SuperSquareWave(time, freq * 3.0, a); | |
// wave /= 3.0; | |
return wave * 0.2; | |
} | |
vec2 mainSound(float time){ | |
time = time * 1.2; | |
time = mod(time, 64.0); | |
float waveTime = time; | |
float kickVolume = pow(fract(-time*2.),4.); | |
// float kick = 3.0*sin(60.0 * PI *waveTime) * kickVolume * 0.8; | |
float kick = KickWave(waveTime, 30.0) * kickVolume * 0.5; | |
kickVolume = pow(kickVolume, 4.0); | |
float hat = HighHat(time); | |
// delay | |
float delay = 0.12; | |
float wave1; // トランスっぽい和音が入る | |
float sum; | |
{ | |
for (int i = 5; i >= 1; i--) | |
{ | |
wave1 += Wave1(waveTime - delay * float(i)); | |
wave1 *= 0.7; | |
sum += 0.7; | |
} | |
wave1 *= 0.5; | |
wave1 += Wave1(waveTime); | |
wave1 = wave1 / sum * 2.0; | |
wave1 = mix(wave1, kick, kickVolume); | |
wave1 += hat * 0.1; | |
} | |
float wave2; // ピコピコなってるアルペジオが入る | |
float wave3 = Wave3(time); // ベースが入る | |
float wave4; // メロディが入る | |
if (time > 32.0) | |
{ | |
// フェードイン | |
float amp = time - 32.0; | |
time /= 16.0; | |
amp = min(amp, 1.0); | |
amp = pow(amp, 0.1); | |
amp = mix(0.2, 1.0, amp); | |
for (int i = 5; i >= 1; i--) | |
{ | |
wave4 += Wave4(waveTime - delay * float(i)); | |
wave4 *= 0.5; | |
} | |
wave4 *= 0.3; | |
wave4 += Wave4(waveTime); | |
wave4 *= amp; | |
} | |
// else | |
{ | |
wave2 += Wave2(waveTime); | |
} | |
float wave = wave1 + wave2 * 0.02 + wave3 * 1.0 + wave4; | |
return vec2(wave * 1.0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment