Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.61 KB | None | 0 0
  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4. var audio_context;
  5. var script_node;
  6. var sample_rate;
  7. var beats_per_second = 4.0;
  8. var samples_per_beat;
  9.  
  10. var note_choices = [ 36, 43, 48, 51, 55, 60, 63, 67, 70, 62, 65 ];
  11.  
  12. // middle A = 60;
  13. function note_to_freq(note) {
  14. return 440 * Math.pow(2, (note - 60) * (1.0 / 12.0));
  15. }
  16.  
  17. function choose_from_array(a) {
  18. return a[Math.floor(Math.random() * a.length)];
  19. }
  20.  
  21. window.onload = function() {
  22. audio_context = new AudioContext();
  23. sample_rate = audio_context.sampleRate;
  24. samples_per_beat = sample_rate / beats_per_second;
  25.  
  26. script_node = audio_context.createScriptProcessor(4096, 0, 2);
  27.  
  28. console.log("setting onaudioprocess");
  29.  
  30. var notes = [ choose_from_array(note_choices), choose_from_array(note_choices) ];
  31.  
  32. var elapsed_samples = 0;
  33.  
  34. script_node.onaudioprocess = function(audio_processing_event) {
  35. // console.log(".");
  36. var output_buffer = audio_processing_event.outputBuffer;
  37. var number_of_samples = output_buffer.length;
  38. var number_of_channels = output_buffer.numberOfChannels;
  39. var output_data = [null, null];
  40.  
  41. for (var channel = 0; channel < number_of_channels; ++channel) {
  42. output_data[channel] = output_buffer.getChannelData(channel);
  43. }
  44.  
  45. for (var sample = 0; sample < number_of_samples; ++sample) {
  46. var envelope = 0.5 * Math.exp(-5.0 * elapsed_samples / sample_rate);
  47. for (var channel = 0; channel < number_of_channels; ++channel) {
  48. output_data[channel][sample] = envelope * (Math.sin(Math.PI * 2 * note_to_freq(notes[channel]) * elapsed_samples / sample_rate));
  49. }
  50.  
  51. ++elapsed_samples;
  52. if (elapsed_samples > samples_per_beat) {
  53. elapsed_samples = elapsed_samples - samples_per_beat;
  54.  
  55. for (var channel = 0; channel < number_of_channels; ++channel) {
  56. notes[channel] = choose_from_array(note_choices);
  57. }
  58. }
  59. }
  60. }
  61.  
  62. console.log("making connection");
  63. script_node.connect(audio_context.destination);
  64. }
  65.  
  66. </script>
  67. </head>
  68. <body>
  69. <audio>
  70. No audio!
  71. </audio>
  72. </body>
  73. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement