Advertisement
Guest User

Untitled

a guest
Feb 4th, 2018
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. RATE=44100,
  2. TEMPO=60/600,
  3. SEMITONE=1.059463094,
  4.  
  5. song=(t)=>(
  6.  
  7. // s = sustain/level (0-1)
  8. // d = decay (time)
  9. // n = note (semitones)
  10.  
  11. // sustain/decay multiplier
  12. decay=(s,d,t)=>max(s*(d-t)/d,0),
  13.  
  14. U=(n,t)=>t*220*pow(SEMITONE,n),
  15. // sine wave
  16. sw=(n,t)=>sin(U(n,t)*PI*4),
  17. // saw wave
  18. saw=(n,t)=>(u=U(n,t),u%1+u*.996%1-1),
  19. // square wave
  20. sq=(n,t)=>(U(n,t*4)|0)%2,
  21.  
  22. // sine w/ SDN
  23. f=(s,d,n,t)=>sw(n,t) * decay(s,d,t),
  24. fm=(modS,modD,modN, s,d,n,t)=>sw(n, t + f(modS,modD,n+modN,t)) * decay(s,d,t),
  25.  
  26. ts=t/44100,
  27. beat=floor(ts/TEMPO),
  28. bprg=ts%TEMPO,
  29. mp=beat%16,
  30. LENGTH=16,
  31. measure=floor(beat/LENGTH),
  32. mprg=ts%(TEMPO*16),
  33. m4=measure%4,
  34. m8=measure%8,
  35.  
  36. // 0100 1001 0010 1011
  37. bup=(mp%3&1)^(mp>11),
  38. bassnote=[4,4,0,2][m4]-(bup?28:40),
  39.  
  40. melnote=[0,3,12,8,0,3,8,3][m8]-12,
  41. meln2=[12,7,10,10,12,0,7,5][m8]-12,
  42.  
  43. mg=(v,l)=>measure>l&&v,
  44.  
  45. //     MS MD MN CS CD CN t
  46.     fm(-1e-3*bassnote-.017, .4, 0,  .5, .6, bassnote, bprg) + // bassline
  47.     mg(fm(9, 9, 0,  .04, .03, 0, bprg), 7) + // hats
  48.     mg(fm(0,1,0, !(mp&3)*.7, .5, -38, pow(bprg, .6)), -3) + // kick
  49.     mg(fm(.1,1,0, !((mp+4)&7)/4, .2, 0, pow(bprg, .7)), 7) + // snare
  50.     mg(
  51.         saw(m4==3?2:0, mprg) +
  52.         saw(m8==3?5:3, mprg) +
  53.         saw(m8==7?7:(m4<2?7:4+m4*2), mprg),
  54.         15
  55.     )*min(mprg, .4) * decay(.5,2,mprg) + // chords
  56.     mg(
  57.         fm(2e-3,2,0, .5,2,melnote, mprg) +
  58.         fm(2e-3,2,0, meln2&&.5,2,meln2, max(mprg-TEMPO*8,0)),
  59.         23
  60.     ) + // melody
  61.     0
  62. ),
  63.  
  64. //song(t) * 64 + 128;
  65.  
  66. echo=(t,k)=>(k?song(max(t-k*4200,0))*pow(.3,k)+echo(t,k-1):0),
  67. echo(t,4) * 128 + 128;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement