Advertisement
Guest User

Untitled

a guest
May 30th, 2015
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.98 KB | None | 0 0
  1. var audioBuffer = audio.createBuffer(arrayBuffer, false), /* <- Input Audio */
  2. offlineContext = new webkitAudioContext(1, audioBuffer.duration * 44100, 44100);
  3.  
  4. offlineContext.oncomplete = function(event) {
  5.  
  6. var buffer = event.renderedBuffer;
  7. var UintWave = createWaveFileData(buffer);
  8. var base64 = btoa(uint8ToString(UintWave));
  9.  
  10. document.getElementById("audio").src = "data:audio/wav;base64," + base64;
  11.  
  12. };
  13.  
  14. var source = offlineContext.createBufferSource();
  15. source.buffer = audioBuffer;
  16. var gain = offlineContext.createGainNode();
  17. // Effects
  18. var filter1 = offlineContext.createBiquadFilter();
  19. filter1.type = 2;
  20. filter1.frequency.value = 4000;
  21. filter1.Q.value = 0.1;
  22. // Connect
  23. source.connect(filter1);
  24. filter1.connect(gain);
  25. gain.connect(offlineContext.destination);
  26.  
  27. source.noteOn(0);
  28. offlineContext.startRendering();
  29.  
  30. function createWaveFileData(audioBuffer) {
  31.  
  32. var frameLength = audioBuffer.length;
  33. var numberOfChannels = audioBuffer.numberOfChannels;
  34. var sampleRate = audioBuffer.sampleRate;
  35. var bitsPerSample = 16;
  36. var byteRate = sampleRate * numberOfChannels * bitsPerSample/8;
  37. var blockAlign = numberOfChannels * bitsPerSample/8;
  38. var wavDataByteLength = frameLength * numberOfChannels * 2; // 16-bit audio
  39. var headerByteLength = 44;
  40. var totalLength = headerByteLength + wavDataByteLength;
  41.  
  42. var waveFileData = new Uint8Array(totalLength);
  43.  
  44. var subChunk1Size = 16; // for linear PCM
  45. var subChunk2Size = wavDataByteLength;
  46. var chunkSize = 4 + (8 + subChunk1Size) + (8 + subChunk2Size);
  47.  
  48. writeString("RIFF", waveFileData, 0);
  49. writeInt32(chunkSize, waveFileData, 4);
  50. writeString("WAVE", waveFileData, 8);
  51. writeString("fmt ", waveFileData, 12);
  52.  
  53. writeInt32(subChunk1Size, waveFileData, 16); // SubChunk1Size (4)
  54. writeInt16(1, waveFileData, 20); // AudioFormat (2)
  55. writeInt16(numberOfChannels, waveFileData, 22); // NumChannels (2)
  56. writeInt32(sampleRate, waveFileData, 24); // SampleRate (4)
  57. writeInt32(byteRate, waveFileData, 28); // ByteRate (4)
  58. writeInt16(blockAlign, waveFileData, 32); // BlockAlign (2)
  59. writeInt32(bitsPerSample, waveFileData, 34); // BitsPerSample (4)
  60.  
  61. writeString("data", waveFileData, 36);
  62. writeInt32(subChunk2Size, waveFileData, 40); // SubChunk2Size (4)
  63.  
  64. // Write actual audio data starting at offset 44.
  65. writeAudioBuffer(audioBuffer, waveFileData, 44);
  66.  
  67. return waveFileData;
  68.  
  69. }
  70.  
  71. function writeString(s, a, offset) {
  72. for (var i = 0; i < s.length; ++i) {
  73. a[offset + i] = s.charCodeAt(i);
  74. }
  75. }
  76.  
  77. function writeInt16(n, a, offset) {
  78. n = Math.floor(n);
  79.  
  80. var b1 = n & 255;
  81. var b2 = (n >> 8) & 255;
  82.  
  83. a[offset + 0] = b1;
  84. a[offset + 1] = b2;
  85. }
  86.  
  87. function writeInt32(n, a, offset) {
  88. n = Math.floor(n);
  89. var b1 = n & 255;
  90. var b2 = (n >> 8) & 255;
  91. var b3 = (n >> 16) & 255;
  92. var b4 = (n >> 24) & 255;
  93.  
  94. a[offset + 0] = b1;
  95. a[offset + 1] = b2;
  96. a[offset + 2] = b3;
  97. a[offset + 3] = b4;
  98. }
  99.  
  100. function writeAudioBuffer(audioBuffer, a, offset) {
  101. var n = audioBuffer.length;
  102. var channels = audioBuffer.numberOfChannels;
  103.  
  104. for (var i = 0; i < n; ++i) {
  105. for (var k = 0; k < channels; ++k) {
  106. var buffer = audioBuffer.getChannelData(k);
  107. var sample = buffer[i] * 32768.0;
  108.  
  109. // Clip samples to the limitations of 16-bit.
  110. // If we don't do this then we'll get nasty wrap-around distortion.
  111. if (sample < -32768)
  112. sample = -32768;
  113. if (sample > 32767)
  114. sample = 32767;
  115.  
  116. writeInt16(sample, a, offset);
  117. offset += 2;
  118. }
  119. }
  120. }
  121.  
  122. function uint8ToString(buf) {
  123. var i, length, out = '';
  124. for (i = 0, length = buf.length; i < length; i += 1) {
  125. out += String.fromCharCode(buf[i]);
  126. }
  127. return out;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement