Last active
September 23, 2024 13:42
-
-
Save spencersalazar/9ca24355fcdda5fc582162684f94fb45 to your computer and use it in GitHub Desktop.
Final Fantasy prelude
This file contains hidden or 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
164 => float bpm; | |
(60/bpm)::second => dur quarter; | |
quarter/2 => dur eighth; | |
[0.0, 2, 4, 7] @=> float maj[]; | |
[0.0, 3, 8, 10] @=> float majInv[]; | |
[0.0, 2, 3, 7] @=> float min[]; | |
[0.0, 4, 7, 11] @=> float mod[]; | |
cat([inc(maj,48), inc(maj,60), inc(maj,72), inc(maj,84), [96.0], | |
rev(inc(maj,84)), rev(inc(maj,72)), rev(inc(maj,60)), hold(rev(inc(maj,48)))]) | |
@=> float arp1[]; | |
cat([inc(min,45), inc(min,57), inc(min,69), inc(min,81), [93.0], | |
rev(inc(min,81)), rev(inc(min,69)), rev(inc(min,57)), hold(rev(inc(min,45)))]) | |
@=> float arp2[]; | |
cat([inc(majInv,45), inc(majInv,57), inc(majInv,69), inc(majInv,81), [93.0], | |
rev(inc(majInv,81)), rev(inc(majInv,69)), rev(inc(majInv,57)), hold(rev(inc(majInv,45)))]) | |
@=> float arp3[]; | |
cat([inc(majInv,47), inc(majInv,59), inc(majInv,71), inc(majInv,83), [95.0], | |
rev(inc(majInv,83)), rev(inc(majInv,71)), rev(inc(majInv,59)), hold(rev(inc(majInv,47)))]) | |
@=> float arp4[]; | |
cat([inc(mod,44), inc(mod,56), inc(mod,68), inc(mod,80), [92.0], | |
rev(inc(mod,80)), rev(inc(mod,68)), rev(inc(mod,56)), hold(rev(inc(mod,44)))]) | |
@=> float arp5[]; | |
cat([inc(mod,46), inc(mod,58), inc(mod,70), inc(mod,82), [94.0], | |
rev(inc(mod,82)), rev(inc(mod,70)), rev(inc(mod,58)), hold(rev(inc(mod,46)))]) | |
@=> float arp6[]; | |
Gain fb => NRev reberb => dac; | |
fb => Delay delay => fb; | |
0.35 => delay.gain; | |
eighth*1.15 => delay.max => delay.delay; | |
0.03 => reberb.mix; | |
fun void playNote(float pitch, dur duration) | |
{ | |
BlitSquare sqr => LPF filter => ADSR env => fb; | |
BlitSaw saw => filter; | |
0.3 => sqr.gain; | |
//0.5 => sqr.width; | |
0.7 => saw.gain; | |
0.25 => filter.Q; | |
env.set(25::ms, 25::ms, 0.4, 250::ms); | |
pitch => Std.mtof => sqr.freq; | |
sqr.freq() => saw.freq; | |
700+sqr.freq()*2 => filter.freq; | |
1 => env.keyOn; | |
duration => now; | |
1 => env.keyOff; | |
env.releaseTime()*1.1 => now; | |
} | |
fun void seq(float chord[]) | |
{ | |
0::second => dur makeup; | |
for(0 => int i; i < chord.size(); i++) | |
{ | |
spork ~ playNote(chord[i], eighth); | |
eighth => now; | |
} | |
} | |
while(true) | |
{ | |
seq(arp1); | |
seq(arp2); | |
seq(arp1); | |
seq(arp2); | |
seq(arp3); | |
seq(arp4); | |
seq(arp5); | |
seq(arp6); | |
} | |
fun float[] rev(float f[]) | |
{ | |
float f2[f.size()]; | |
for(0 => int i; i < f.size(); i++) | |
f[i] => f2[f.size()-1-i]; | |
return f2; | |
} | |
fun float[] cat(float f[][]) | |
{ | |
0 => int size; | |
for(0 => int i; i < f.size(); i++) | |
f[i].size() +=> size; | |
float fx[size]; | |
int offset; | |
for(0 => int i; i < f.size(); i++) | |
{ | |
for(0 => int j; j < f[i].size(); j++) | |
f[i][j] => fx[offset+j]; | |
f[i].size() +=> offset; | |
} | |
return fx; | |
} | |
fun float[] cat(float f1[], float f2[]) | |
{ | |
return cat([f1, f2]); | |
} | |
fun float[] inc(float f[], float s) | |
{ | |
float f2[f.size()]; | |
for(0 => int i; i < f.size(); i++) | |
f[i]+s => f2[i]; | |
return f2; | |
} | |
fun float[] hold(float f[]) | |
{ | |
float f2[f.size()-1]; | |
for(0 => int i; i < f.size()-1; i++) | |
f[i] => f2[i]; | |
return f2; | |
} | |
That would be awesome!
ChucK as a Service (CKaaS)
What if that service... were GitHub
It's alive... WebChucK
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
We need to make a service that lets you code in ChucK on a webpage and it outputs audio.