plugins/noise.cracked.js

  1. /**
  2. * noise parametrized noise node
  3. *
  4. * [See more noise examples](examples/noise.html)
  5. *
  6. * @plugin
  7. * @category Noise
  8. * @function
  9. * @memberof cracked
  10. * @name cracked#noise
  11. * @public
  12. * @param {Object} [params] map of optional values
  13. * @param {String} [params.type=white]
  14. */
  15. cracked.noise = function (params) {
  16. var userParams = params || {};
  17. if (userParams.type === "brown") {
  18. __.begin("noise", userParams).brown(userParams).end("noise");
  19. } else if (userParams.type === "pink") {
  20. __.begin("noise", userParams).pink(userParams).end("noise");
  21. } else {
  22. __.begin("noise", userParams).white(userParams).end("noise");
  23. }
  24. return cracked;
  25. };
  26. /**
  27. * Pink Noise
  28. *
  29. * [See more noise examples](examples/noise.html)
  30. *
  31. * @plugin
  32. * @category Noise
  33. * @function
  34. * @memberof cracked
  35. * @name cracked#pink
  36. * @public
  37. * @param {Object} [params] map of optional values
  38. * @param {Number} [params.channels=1]
  39. * @param {Number} [params.length=1]
  40. */
  41. cracked.pink = function (params) {
  42. //http://noisehack.com/generate-noise-web-audio-api/
  43. var userParams = params || {};
  44. var channels = userParams.channels || 1;
  45. var length = userParams.length || 1;
  46. __().begin("pink", userParams).buffer({
  47. fn: buildBuffer,
  48. loop: true
  49. }).end("pink");
  50. return cracked;
  51. function buildBuffer(audioContext) {
  52. var buf = audioContext.createBuffer(channels, (length * audioContext.sampleRate), audioContext.sampleRate);
  53. var buflen = buf.length;
  54. var bufNum = buf.numberOfChannels;
  55. var buffArr = []; //call only once and cache
  56. for (var k = 0; k < bufNum; k++) {
  57. buffArr.push(buf.getChannelData(k));
  58. }
  59. for (var i = 0; i < buflen; i++) {
  60. for (var j = 0; j < bufNum; j++) {
  61. buffArr[j][i] = Math.random() * 2 - 1;
  62. }
  63. }
  64. pinkify(buf, buffArr);
  65. function pinkify(buf, buffArr) {
  66. var buffer = buf,
  67. b = [0, 0, 0, 0, 0, 0, 0],
  68. channelData, white, i, j, pink = [],
  69. bufNum = buffer.numberOfChannels, buflen = buffer.length;
  70. for (i = 0; i < bufNum; i++) {
  71. pink[i] = new Float32Array(buflen);
  72. channelData = buffArr[i];
  73. for (j = 0; j < buflen; j++) {
  74. white = channelData[j];
  75. b[0] = 0.99886 * b[0] + white * 0.0555179;
  76. b[1] = 0.99332 * b[1] + white * 0.0750759;
  77. b[2] = 0.96900 * b[2] + white * 0.1538520;
  78. b[3] = 0.86650 * b[3] + white * 0.3104856;
  79. b[4] = 0.55000 * b[4] + white * 0.5329522;
  80. b[5] = -0.7616 * b[5] - white * 0.0168980;
  81. pink[i][j] = b[0] + b[1] + b[2] + b[3] + b[4] + b[5] + b[6] + white * 0.5362;
  82. pink[i][j] *= 0.11;
  83. b[6] = white * 0.115926;
  84. }
  85. b = [0, 0, 0, 0, 0, 0, 0];
  86. }
  87. for (i = 0; i < bufNum; i++) {
  88. for (j = 0; j < buflen; j++) {
  89. buffArr[i][j] = pink[i][j];
  90. }
  91. }
  92. }
  93. return buf;
  94. }
  95. };
  96. /**
  97. * White Noise
  98. *
  99. * [See more noise examples](examples/noise.html)
  100. *
  101. * @plugin
  102. * @category Noise
  103. * @function
  104. * @memberof cracked
  105. * @name cracked#white
  106. * @public
  107. * @param {Object} [params] map of optional values
  108. * @param {Number} [params.channels=1]
  109. * @param {Number} [params.length=1]
  110. */
  111. cracked.white = function (params) {
  112. //http://noisehack.com/generate-noise-web-audio-api/
  113. var userParams = params || {};
  114. var channels = userParams.channels || 1;
  115. var length = userParams.length || 1;
  116. __().begin("white", userParams).buffer({
  117. fn: buildBuffer,
  118. loop: true
  119. }).end("white");
  120. return cracked;
  121. function buildBuffer(audioContext) {
  122. var buffer = audioContext.createBuffer(channels, (length * audioContext.sampleRate), audioContext.sampleRate);
  123. var buflen = buffer.length;
  124. var bufNum = buffer.numberOfChannels;
  125. var buffArr = []; //call only once and cache
  126. for (var k = 0; k < bufNum; k++) {
  127. buffArr.push(buffer.getChannelData(k));
  128. }
  129. for (var i = 0; i < buflen; i++) {
  130. for (var j = 0; j < bufNum; j++) {
  131. buffArr[j][i] = (Math.random() * 2 - 1) * 0.44;
  132. }
  133. }
  134. return buffer;
  135. }
  136. };
  137. /**
  138. * Brown Noise
  139. *
  140. * [See more noise examples](examples/noise.html)
  141. *
  142. * @plugin
  143. * @category Noise
  144. * @function
  145. * @memberof cracked
  146. * @name cracked#brown
  147. * @public
  148. * @param {Object} [params] map of optional values
  149. * @param {Number} [params.channels=1]
  150. * @param {Number} [params.length=1]
  151. */
  152. cracked.brown = function (params) {
  153. //http://noisehack.com/generate-noise-web-audio-api/
  154. var userParams = params || {};
  155. var channels = userParams.channels || 1;
  156. var length = userParams.length || 1;
  157. __().begin("brown", userParams).buffer({
  158. fn: buildBuffer,
  159. loop: true
  160. }).end("brown");
  161. return cracked;
  162. function buildBuffer(audioContext) {
  163. var buffer = audioContext.createBuffer(channels, (length * audioContext.sampleRate), audioContext.sampleRate),
  164. lastOut = 0.0, bufLen = buffer.length, bufNum = buffer.numberOfChannels;
  165. var buffArr = []; //call only once and cache
  166. for (var k = 0; k < bufNum; k++) {
  167. buffArr.push(buffer.getChannelData(k));
  168. }
  169. for (var i = 0; i < bufLen; i++) {
  170. for (var j = 0; j < bufNum; j++) {
  171. var white = Math.random() * 2 - 1;
  172. buffArr[j][i] = (lastOut + (0.02 * white)) / 1.02;
  173. lastOut = buffArr[j][i];
  174. buffArr[j][i] *= 3.5; // (roughly) compensate for gain
  175. }
  176. }
  177. return buffer;
  178. }
  179. };