User:David.humphrey/Audio Data API 2: Difference between revisions

Line 313: Line 313:
   <body>
   <body>
     <input type="text" size="4" id="freq" value="440"><label for="hz">Hz</label>
     <input type="text" size="4" id="freq" value="440"><label for="hz">Hz</label>
    <button onclick="generateWaveform()">set</button>
     <button onclick="start()">play</button>
     <button onclick="start()">play</button>
     <button onclick="stop()">stop</button>
     <button onclick="stop()">stop</button>


     <script type="text/javascript">
     <script type="text/javascript">
       var sampledata = [];
       var sampleRate = 44100,
      var freq = 440;
          portionSize = sampleRate / 10,
      var interval = -1;
          prebufferSize = sampleRate / 2,
      var audio;
          freq = undefined; // no sound


       function writeData() {
       var audio = new Audio();
        var n = Math.ceil(freq / 100);
      audio.mozSetup(1, sampleRate, 1);
        for(var i=0;i<n;i++)
       var currentWritePosition = 0;
          audio.mozWriteAudio(sampledata);
       }


       function start() {
       function getSoundData(t, size) {
         audio = new Audio();
         var soundData = new Float32Array(size);
         audio.mozSetup(1, 44100, 1);
         if (freq) {
        interval = setInterval(writeData, 10);
          var k = 2* Math.PI * freq / sampleRate;
          for (var i=0; i<size; i++) {
            soundData[i] = Math.sin(k * (i + t));
          }
        }
        return soundData;
       }
       }


       function stop() {
       function writeData() {
         if (interval != -1) {
         while(audio.mozCurrentSampleOffset() + prebufferSize >= currentWritePosition) {
           clearInterval(interval);
           var soundData = getSoundData(currentWritePosition, portionSize);
           interval = -1;
          audio.mozWriteAudio(soundData);
           currentWritePosition += portionSize;
         }
         }
       }
       }


       function generateWaveform() {
      // initial write
      writeData();
      var writeInterval = Math.floor(1000 * portionSize / sampleRate);
      setInterval(writeData, writeInterval);
 
       function start() {
         freq = parseFloat(document.getElementById("freq").value);
         freq = parseFloat(document.getElementById("freq").value);
        // we're playing at 44.1kHz, so figure out how many samples
        // will give us one full period
        var samples = 44100 / freq;
        // Could use Array() here too, typed array is faster
        sampledata = Float32Array(Math.round(samples));
        for (var i=0; i<sampledata.length; i++) {
          sampledata[i] = Math.sin(2*Math.PI * (i / sampledata.length));
        }
       }
       }


       generateWaveform();
       function stop() {
        freq = undefined;
      }
   </script>
   </script>
   </body>
   </body>
Confirmed users
656

edits