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 |