Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % matlab playing "Penguins of The Apocalypse" by FearofDark
- % written by ed <tripflag at gmail>
- % protected by GPLv2 and stallmans beard
- % frequency(note) = f0 * a^n
- % f0 = base frequency, A4=440Hz
- % n = steps from base frequency
- % a = 2^(1/12)
- x = @(quarters) zeros(1, quarters * 0.25 * 0.25 * 44100);
- freq = @(octave,steps) 440.00 * (2^(1/12)) ^ (steps + (octave*12)-36);
- size = @(quarters) (1/44100) * (1:quarters * 0.25 * 0.25 * 44100);
- zise = @(quarters) quarters * 0.25 * 0.25 * 44100;
- % calculate the frequency of each note
- mc = @(octave, quarters) 2 * pi * freq(octave, -9) * size(quarters);
- mcs = @(octave, quarters) 2 * pi * freq(octave, -8) * size(quarters);
- md = @(octave, quarters) 2 * pi * freq(octave, -7) * size(quarters);
- mds = @(octave, quarters) 2 * pi * freq(octave, -6) * size(quarters);
- me = @(octave, quarters) 2 * pi * freq(octave, -5) * size(quarters);
- mf = @(octave, quarters) 2 * pi * freq(octave, -4) * size(quarters);
- mfs = @(octave, quarters) 2 * pi * freq(octave, -3) * size(quarters);
- mg = @(octave, quarters) 2 * pi * freq(octave, -2) * size(quarters);
- mgs = @(octave, quarters) 2 * pi * freq(octave, -1) * size(quarters);
- ma = @(octave, quarters) 2 * pi * freq(octave, 0) * size(quarters);
- mas = @(octave, quarters) 2 * pi * freq(octave, 1) * size(quarters);
- mb = @(octave, quarters) 2 * pi * freq(octave, 2) * size(quarters);
- % generate "squarewave" notes
- c = @(o,q) sin( mc(o,q)) + sin( mc(o,q) *3)/3 + sin( mc(o,q) *5)/5 + sin( mc(o,q) *7)/7 + sin( mc(o,q) *9)/9 + sin( mc(o,q) *11)/11;
- cs = @(o,q) sin(mcs(o,q)) + sin(mcs(o,q) *3)/3 + sin(mcs(o,q) *5)/5 + sin(mcs(o,q) *7)/7 + sin(mcs(o,q) *9)/9 + sin(mcs(o,q) *11)/11;
- d = @(o,q) sin( md(o,q)) + sin( md(o,q) *3)/3 + sin( md(o,q) *5)/5 + sin( md(o,q) *7)/7 + sin( md(o,q) *9)/9 + sin( md(o,q) *11)/11;
- ds = @(o,q) sin(mds(o,q)) + sin(mds(o,q) *3)/3 + sin(mds(o,q) *5)/5 + sin(mds(o,q) *7)/7 + sin(mds(o,q) *9)/9 + sin(mds(o,q) *11)/11;
- e = @(o,q) sin( me(o,q)) + sin( me(o,q) *3)/3 + sin( me(o,q) *5)/5 + sin( me(o,q) *7)/7 + sin( me(o,q) *9)/9 + sin( me(o,q) *11)/11;
- f = @(o,q) sin( mf(o,q)) + sin( mf(o,q) *3)/3 + sin( mf(o,q) *5)/5 + sin( mf(o,q) *7)/7 + sin( mf(o,q) *9)/9 + sin( mf(o,q) *11)/11;
- fs = @(o,q) sin(mfs(o,q)) + sin(mfs(o,q) *3)/3 + sin(mfs(o,q) *5)/5 + sin(mfs(o,q) *7)/7 + sin(mfs(o,q) *9)/9 + sin(mfs(o,q) *11)/11;
- g = @(o,q) sin( mg(o,q)) + sin( mg(o,q) *3)/3 + sin( mg(o,q) *5)/5 + sin( mg(o,q) *7)/7 + sin( mg(o,q) *9)/9 + sin( mg(o,q) *11)/11;
- gs = @(o,q) sin(mgs(o,q)) + sin(mgs(o,q) *3)/3 + sin(mgs(o,q) *5)/5 + sin(mgs(o,q) *7)/7 + sin(mgs(o,q) *9)/9 + sin(mgs(o,q) *11)/11;
- a = @(o,q) sin( ma(o,q)) + sin( ma(o,q) *3)/3 + sin( ma(o,q) *5)/5 + sin( ma(o,q) *7)/7 + sin( ma(o,q) *9)/9 + sin( ma(o,q) *11)/11;
- as = @(o,q) sin(mas(o,q)) + sin(mas(o,q) *3)/3 + sin(mas(o,q) *5)/5 + sin(mas(o,q) *7)/7 + sin(mas(o,q) *9)/9 + sin(mas(o,q) *11)/11;
- b = @(o,q) sin( mb(o,q)) + sin( mb(o,q) *3)/3 + sin( mb(o,q) *5)/5 + sin( mb(o,q) *7)/7 + sin( mb(o,q) *9)/9 + sin( mb(o,q) *11)/11;
- % generate clean sinewave notes
- oc = @(octave, quarters) sin( mc(octave, quarters));
- ocs = @(octave, quarters) sin(mcs(octave, quarters));
- od = @(octave, quarters) sin( md(octave, quarters));
- ods = @(octave, quarters) sin(mds(octave, quarters));
- oe = @(octave, quarters) sin( me(octave, quarters));
- of = @(octave, quarters) sin( mf(octave, quarters));
- ofs = @(octave, quarters) sin(mfs(octave, quarters));
- og = @(octave, quarters) sin( mg(octave, quarters));
- ogs = @(octave, quarters) sin(mgs(octave, quarters));
- oa = @(octave, quarters) sin( ma(octave, quarters));
- oas = @(octave, quarters) sin(mas(octave, quarters));
- ob = @(octave, quarters) sin( mb(octave, quarters));
- % generate sawtooth notes holy shit why am I doing this
- % ret = zeros(1, size(quarters)) prepares empty array of correct size
- % per = 1/freq(octave,steps) results in samples per period
- % ret(a) = 1 - 2(mod(a,per)/per); <- sawtooth
- % ...just need to figure out how to implement this [spoiler];_;[/spoiler]
- % NEVERMIND HERE WE GO LOL
- sc = @(octave, quarters) saw( 1/freq(octave,-9), zise(quarters));
- scs = @(octave, quarters) saw( 1/freq(octave,-8), zise(quarters));
- sd = @(octave, quarters) saw( 1/freq(octave,-7), zise(quarters));
- sds = @(octave, quarters) saw( 1/freq(octave,-6), zise(quarters));
- se = @(octave, quarters) saw( 1/freq(octave,-5), zise(quarters));
- sf = @(octave, quarters) saw( 1/freq(octave,-4), zise(quarters));
- sfs = @(octave, quarters) saw( 1/freq(octave,-3), zise(quarters));
- sg = @(octave, quarters) saw( 1/freq(octave,-2), zise(quarters));
- sgs = @(octave, quarters) saw( 1/freq(octave,-1), zise(quarters));
- sa = @(octave, quarters) saw( 1/freq(octave, 0), zise(quarters));
- sas = @(octave, quarters) saw( 1/freq(octave, 1), zise(quarters));
- sb = @(octave, quarters) saw( 1/freq(octave, 2), zise(quarters));
- % Drums up this shit
- rand('state', sum(100 * clock)); % seed that shit
- % KICK
- kick = randn(1, 5512); % gaussian noise
- kick = kick / max(abs(kick)); % normalize <-1 .. +1>
- global A;
- A = 1;
- while A < 5512
- kick(A) = kick(A) * ((5512-A) / 5512);
- A = A + 1;
- end
- % CRASH
- white = randn(1, 5512);
- white = white / max(abs(white));
- crash = zeros(1, 5512);
- RANGE = 128;
- A = 1;
- MAX = 0;
- while A < 5512-RANGE
- RANGE = 0.0232*A;
- AVG = 0;
- B = 1;
- while B < RANGE;
- AVG = AVG + white(A+B);
- B = B + 1;
- end
- crash(A) = (AVG/RANGE) * ((5512-A)/1000);
- MAX = max(MAX, crash(A));
- A = A + 1;
- end
- A = 1;
- while A < 5512-RANGE
- crash(A) = crash(A) * (4-MAX);
- A = A + 1;
- end
- % DERP
- derp = zeros(1, 5512);
- RANGE = 128;
- A = 1;
- MAX = 0;
- while A < 5512-RANGE
- AVG = 0;
- B = 1;
- while B < RANGE;
- AVG = AVG + white(A+B);
- B = B + 1;
- end
- derp(A) = (AVG/RANGE) * ((5512-A)/5512);
- MAX = max(MAX, derp(A));
- A = A + 1;
- end
- A = 1;
- while A < 5512-RANGE
- derp(A) = derp(A) * (30-MAX);
- A = A + 1;
- end
- % a scale, for testan purposes
- scale1 = [ c(0,4), x(1), d(0,4), x(1), e(0,4), x(1), f(0,4), x(1), g(0,4), x(1), a(0,4), x(1), b(0,4), x(1), c(1,8) ];
- scale2 = [ c(1,4), x(1), d(1,4), x(1), e(1,4), x(1), f(1,4), x(1), g(1,4), x(1), a(1,4), x(1), b(1,4), x(1), c(2,8) ];
- scale3 = [ sc(2,4), x(1), sd(2,4), x(1), se(2,4), x(1), sf(2,4), x(1), sg(2,4), x(1), sa(2,4), x(1), sb(2,4), x(1), sc(3,8) ];
- scale4 = [ c(3,4), x(1), d(3,4), x(1), e(3,4), x(1), f(3,4), x(1), g(3,4), x(1), a(3,4), x(1), b(3,4), x(1), c(4,8) ];
- %scale = [ scale1 * 0.2 + scale2 * 0.2 + scale3 * 0.2 + scale4 * 0.2 ];
- % the lead
- L1 = [ x(4), cs(4,1), ds(4,3), cs(4,4), as(3,4), cs(4,4), as(3,2), x(2), gs(3,2), fs(3,2), x(2), gs(3,6) ]; %36
- L2 = [ as(3,2), x(2), gs(3,2), fs(3,2), ds(3,2), gs(3,6), as(3,4), gs(3,2), fs(3,2), ds(3,2), cs(3,2) ]; %28
- L3 = [ as(3,2), x(2), gs(3,2), fs(3,2), ds(3,2), gs(3,18) ]; %28
- L4 = [ as(3,2), x(2), gs(3,2), fs(3,2), ds(3,2), cs(3,4), fs(3,2), x(2), fs(3,2), x(4), f(3,4) fs(3,4) ]; %32+4
- % 36 + 28 + 36 + 28 + 36 + 28 + 36 + 28 = 256... +4 = 260
- % the bass
- B1 = [ sgs(1,4), sgs(1,1), x(1), sgs(2,4), sgs(1,1), x(1), sfs(1,6), x(2), sfs(2,2), x(2), sfs(1,4), sfs(2,2), sfs(1,2) ]; %32
- B2 = [ sb(0,4), sb(0,1), x(1), sb(1,4), sb(0,1), x(1), sds(1,6), x(2), sds(2,2), x(2), sds(1,4), sds(2,1), x(1), sds(1,1), x(1) ]; %32
- B3 = [ sgs(1,3), x(1), sgs(1,1), x(1), sgs(2,4), sgs(1,1), x(1), sfs(1,6), x(2), sfs(2,2), x(2), sfs(1,4), sfs(2,2), sfs(1,2) ]; %32
- B4 = [ sds(1,4), sds(2,1) x(1), sds(1,4), sds(2,1), x(1), scs(2,6), x(2), scs(3,2), x(2), sds(3,2), scs(3,2), sgs(2,2), scs(2,2) ]; %32+4
- % preparations for...
- v0 = 0.0;
- v1 = 1.0/15.0;
- v2 = 2.0/15.0;
- v3 = 3.0/15.0;
- v4 = 4.0/15.0;
- v5 = 5.0/15.0;
- v6 = 6.0/15.0;
- v7 = 7.0/15.0;
- v8 = 8.0/15.0;
- v9 = 9.0/15.0;
- vA = 10.0/15.0;
- vB = 11.0/15.0;
- vC = 12.0/15.0;
- vD = 13.0/15.0;
- vE = 14.0/15.0;
- vF = 15.0/15.0;
- % arpeggiated awesomeness
- A1 = [ ogs(2,2)*vA, oas(2,1)*vC, ogs(2,1)*v5, ob(2,1)*vC, oas(2,1)*v5, ocs(3,1)*v8, ob(2,1)*v5, ...
- ofs(3,1)*v8, ocs(3,1)*v5, oas(3,1)*v6, ofs(3,1)*v3, ocs(4,1)*v6, oas(3,1)*v3, ofs(3,1)*v6, ocs(4,1)*v3 ];
- A2 = [ ogs(4,1)*v6, ofs(4,1)*v3, oas(4,1)*v8, ogs(4,1)*v5, ocs(5,1)*v8, oas(4,1)*v5, ods(5,1)*v8, ocs(5,1)*v5, ...
- ofs(5,1)*v8, ods(5,1)*v5, oas(5,1)*v6, ofs(5,1)*v3, ob(5,1)*v6, oas(5,1)*v3, ocs(6,1)*v6, ob(5,1)*v3 ];
- A3 = [ ofs(6,1)*v8, ocs(6,1)*v5, ocs(6,1)*v8, ofs(6,1)*v5, ob(5,1)*v8, ocs(6,1)*v5, oas(5,1)*v8, ob(5,1)*v5, ...
- ofs(5,1)*v6, oas(5,1)*v3, ods(5,1)*v6, ofs(5,1)*v3, ocs(5,1)*v6, ods(5,1)*v3, oas(4,1)*v8, ocs(5,1)*v5 ];
- A4 = [ ofs(4,1)*v8, oas(4,1)*v5, ods(4,1)*v8, ofs(4,1)*v5, ocs(4,1)*v8, ods(4,1)*v5, ob(3,1)*v8, ocs(4,1)*v6, ...
- oas(3,1)*v6, ob(3,1)*v3, ofs(3,1)*v6, oas(3,1)*v3, ods(3,1)*v6, ofs(3,1)*v3, ocs(3,1)*v6, ods(3,1)*v3 ];
- % ITT: it's mergan tiem
- lead = [ L1, L2, L1, L3, L1, L2, L1, L4 ];
- bass = [ B1, B2, B3, B4, B1, B2, B3, B4, sfs(1,4), zeros(1, 3) ];
- arps = [ A1, A2, A3, A4, A1, A2, A3, A4 ];
- arps = [ arps, arps, ogs(2,2)*v1, zeros(1,5544) ];
- % >three samples difference
- % >doesn't compile
- % >add three dummy samples
- % >everything's fine
- % MEETHLEEEEEEB
- %wavwrite(lead*0.33,44100,'penguin1.wav');
- %wavwrite(bass*0.33,44100,'penguin2.wav');
- %drums = [ crash, x(1), kick, x(1), kick, kick, kick, ];
- drums = [ derp, kick*0.4, kick*1.2, kick*0.4, crash, kick*0.4, kick*1.2, kick*0.4 ];
- drums = [ drums, drums, drums, drums ];
- drums = [ drums, drums, drums, drums, crash, zeros(1,5544) ];
- song = bass * 0.2 + lead * 0.2 + drums * 0.4 + arps * 0.3;
- %wavwrite(bass, 44100, 'a1.wav');
- %wavwrite(lead, 44100, 'a2.wav');
- %song = bass * 0.33;
- wavwrite(bass, 44100, '1.wav');
- wavwrite(lead, 44100, '2.wav');
- wavwrite(arps, 44100, '3.wav');
- wavwrite(drums, 44100, '4.wav');
- wavwrite(song, 44100, 'matlabs-of-the-derpocalypse.wav');
- %song = scale;
- sound(song, 44100);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement