| OLD | NEW | 
|---|
| 1 // Notes about generated waveforms: | 1 // Notes about generated waveforms: | 
| 2 // | 2 // | 
| 3 // QUESTION: Why does the wave shape not look like the exact shape (sharp edges)
    ? | 3 // QUESTION: Why does the wave shape not look like the exact shape (sharp edges)
    ? | 
| 4 // ANSWER: Because a shape with sharp edges has infinitely high frequency conten
    t. | 4 // ANSWER: Because a shape with sharp edges has infinitely high frequency conten
    t. | 
| 5 // Since a digital audio signal must be band-limited based on the nyquist freque
    ncy (half the sample-rate) | 5 // Since a digital audio signal must be band-limited based on the nyquist freque
    ncy (half the sample-rate) | 
| 6 // in order to avoid aliasing, this creates more rounded edges and "ringing" in 
    the | 6 // in order to avoid aliasing, this creates more rounded edges and "ringing" in 
    the | 
| 7 // appearance of the waveform.  See Nyquist-Shannon sampling theorem: | 7 // appearance of the waveform.  See Nyquist-Shannon sampling theorem: | 
| 8 // http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem | 8 // http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem | 
| 9 // | 9 // | 
| 10 // QUESTION: Why does the very end of the generated signal appear to get slightl
    y weaker? | 10 // QUESTION: Why does the very end of the generated signal appear to get slightl
    y weaker? | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 28 function generateExponentialOscillatorSweep(oscillatorType) { | 28 function generateExponentialOscillatorSweep(oscillatorType) { | 
| 29     // Create offline audio context. | 29     // Create offline audio context. | 
| 30     context = new webkitOfflineAudioContext(1, sampleRate * lengthInSeconds, sam
    pleRate); | 30     context = new webkitOfflineAudioContext(1, sampleRate * lengthInSeconds, sam
    pleRate); | 
| 31 | 31 | 
| 32     var osc = context.createOscillator(); | 32     var osc = context.createOscillator(); | 
| 33     if (oscillatorType == OSC.CUSTOM) { | 33     if (oscillatorType == OSC.CUSTOM) { | 
| 34         // Create a simple waveform with three Fourier coefficients. | 34         // Create a simple waveform with three Fourier coefficients. | 
| 35         // Note the first values are expected to be zero (DC for coeffA and Nyqu
    ist for coeffB). | 35         // Note the first values are expected to be zero (DC for coeffA and Nyqu
    ist for coeffB). | 
| 36         var coeffA = new Float32Array([0, 1, 0.5]); | 36         var coeffA = new Float32Array([0, 1, 0.5]); | 
| 37         var coeffB = new Float32Array([0, 0, 0]); | 37         var coeffB = new Float32Array([0, 0, 0]); | 
| 38         var wavetable = context.createWaveTable(coeffA, coeffB); | 38         var wave = context.createPeriodicWave(coeffA, coeffB); | 
| 39         osc.setWaveTable(wavetable); | 39         osc.setPeriodicWave(wave); | 
| 40     } else { | 40     } else { | 
| 41         osc.type = oscillatorType; | 41         osc.type = oscillatorType; | 
| 42     } | 42     } | 
| 43 | 43 | 
| 44     // Scale by 1/2 to better visualize the waveform and to avoid clipping past 
    full scale. | 44     // Scale by 1/2 to better visualize the waveform and to avoid clipping past 
    full scale. | 
| 45     var gainNode = context.createGainNode(); | 45     var gainNode = context.createGainNode(); | 
| 46     gainNode.gain.value = 0.5; | 46     gainNode.gain.value = 0.5; | 
| 47     osc.connect(gainNode); | 47     osc.connect(gainNode); | 
| 48     gainNode.connect(context.destination); | 48     gainNode.connect(context.destination); | 
| 49 | 49 | 
| 50     osc.start(0); | 50     osc.start(0); | 
| 51 | 51 | 
| 52     var nyquist = 0.5 * sampleRate; | 52     var nyquist = 0.5 * sampleRate; | 
| 53     osc.frequency.setValueAtTime(10, 0); | 53     osc.frequency.setValueAtTime(10, 0); | 
| 54     osc.frequency.exponentialRampToValueAtTime(highFrequency, lengthInSeconds); | 54     osc.frequency.exponentialRampToValueAtTime(highFrequency, lengthInSeconds); | 
| 55 | 55 | 
| 56     context.oncomplete = finishAudioTest; | 56     context.oncomplete = finishAudioTest; | 
| 57     context.startRendering(); | 57     context.startRendering(); | 
| 58 | 58 | 
| 59     testRunner.waitUntilDone(); | 59     testRunner.waitUntilDone(); | 
| 60 } | 60 } | 
| OLD | NEW | 
|---|