Skip to content

Instantly share code, notes, and snippets.

@rngtm
Last active November 23, 2021 09:46
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 rngtm/d20e5bfdf7837a664150757694348b66 to your computer and use it in GitHub Desktop.
Save rngtm/d20e5bfdf7837a664150757694348b66 to your computer and use it in GitHub Desktop.
GLSL Sound 02
#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