core-audio.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /**
  2. * Copyright (C) 2018 Luis Bergmann, https://luisbergmann.com/
  3. */
  4. var CoreAudio = new function() {
  5. // notes and octaves
  6. var notes = [0, 2, 3, 5, 7, 10];
  7. var octaves = [0, 12, 24, 36];
  8. // sound chain
  9. // it can get cpu intensive with the reverb
  10. var reverb = T("reverb", {room:0.7, damp:0.2, mix:0.3}).play();
  11. //organism sound chain
  12. var orgOsc = T("pulse");
  13. var orgEnv = T("perc", {a:1, r:30});
  14. var orgOscEnv1 = T("OscGen", {osc:orgOsc, env:orgEnv, mul:0.1});
  15. reverb.append(orgOscEnv1);
  16. var orgOsc2 = T("sin");
  17. var orgEnv2 = T("perc", {a:10, r:500});
  18. var orgOscEnv2 = T("OscGen", {osc:orgOsc2, env:orgEnv2, mul:0.2});
  19. reverb.append(orgOscEnv2);
  20. //shield sound chain
  21. var shieldNoiseOsc = T("fnoise", {freq:50, mul:0.1});
  22. var shieldOsc = T("pulse", {freq:50, mul:0.1});
  23. var shieldEnv = T("perc", {a:10, r:100}, shieldNoiseOsc, shieldOsc).play();
  24. // play synth note every time a organism is created
  25. this.playSynth = function(objPos) {
  26. //choose and play synth note
  27. var midicps = T("midicps");
  28. var note = notes[Math.random() * 5 | 0];
  29. var octave = octaves[Math.random() * 3 | 0];
  30. if (Math.random() < 0.7) {
  31. // for saving cpu not every time there's a organism a oscillator plays
  32. var playOsc = T("sin", {freq:midicps.at(60 + note + octave), mul:0.2});
  33. var playEnv = T("perc", {r:3000}, playOsc).bang();
  34. var eq = T("eq", {params:{hpf:[200, 1], lpf:[2000, 1]}}, playEnv);
  35. var tremParam = T("param", {value:1}).to(Math.random()*5 + 5, 3000);
  36. var tremOsc = T("sin", {freq:tremParam, mul:.6});
  37. var trem = T("*", eq, tremOsc);
  38. var panParam = T("param", {value:objPos}).expTo(0.5, 3000);
  39. var pan = T("pan", {pos:panParam}, trem).play();
  40. var interval = T("timeout", {timeout:3000}).on('ended', function () {
  41. tremOsc.pause();
  42. trem.pause();
  43. pan.pause();
  44. }).start();
  45. }
  46. }
  47. this.organismDead = function () {
  48. var midicps = T("midicps");
  49. var note = notes[Math.random() * 5 | 0];
  50. var octave = octaves[Math.random() * 3 | 0];
  51. orgOscEnv1.noteOn((180 + note + octave), 80);
  52. orgOscEnv2.noteOn((60 + note + octave), 80);
  53. //low sound
  54. var lowOsc = T("sin", {freq:Math.random()*50+50, mul:0.6});
  55. var losOscEq = T("eq", {params:{hpf:[150, 1]}}, lowOsc);
  56. var lowPscEnv= T("perc", {a:70, r:100}, losOscEq).bang().play();
  57. }
  58. this.playShield = function () {
  59. shieldEnv.bang();
  60. }
  61. this.playGameOver = function () {
  62. // var downer = T("param", {value:10000}).to(50, 2000);
  63. var osc = T('fnoise', {freq:400, mul:0.1});
  64. var env = T('perc', {a:10, r:2000}, osc).bang().play();
  65. }
  66. this.energyUp = function () {
  67. var energyFreq = T("param", {value:80}).to(Math.random()*500+500, "1sec");
  68. var osc1 = T('sin', {freq:energyFreq, mul:0.6});
  69. var osc1Eq = T("eq", {params:{hpf:[150, 1]}}, osc1);
  70. var env = T("perc", {a:50, r:500}, osc1Eq).bang().play();
  71. }
  72. this.energyDown = function () {
  73. //sine osc with tremolo
  74. var downer2 = T("param", {value:(Math.random()*100 + 100)}).to(10, 1000);
  75. var osc2 = T('sin', {freq:downer2, mul:0.1});
  76. var osc2Eq = T("eq", {params:{hpf:[150, 1]}}, osc2);
  77. var downer3 = T("param", {value:(Math.random()*50 + 50)}).to(30, 1000);
  78. var osc3 = T('pulse', {freq:downer3, mul:0.1});
  79. var osc3Eq = T("eq", {params:{hpf:[150, 1]}}, osc3);
  80. var env2 = T("perc", {r:800}, osc2Eq, osc3Eq).bang();
  81. var trem2param = T("param", {value:Math.random()*5+1}).to(1, 1000);
  82. var trem2 = T("sin", {freq:trem2param, mul:.7})
  83. var oscTrem2 = T("*", env2, trem2).play();
  84. }
  85. }