test_convolverNodeDelay.html (2293B)
1 <!DOCTYPE html> 2 <title>Test convolution to delay a triangle pulse</title> 3 <script src="/resources/testharness.js"></script> 4 <script src="/resources/testharnessreport.js"></script> 5 <script> 6 const sampleRate = 48000; 7 const LENGTH = 12800; 8 // tolerate 16-bit math. 9 const EPSILON = 1.0 / Math.pow(2, 15); 10 11 // Triangle pulse 12 var sourceBuffer = new OfflineAudioContext(1, 1, sampleRate). 13 createBuffer(1, 2 * 128, sampleRate); 14 var channelData = sourceBuffer.getChannelData(0); 15 for (var i = 0; i < 128; ++i) { 16 channelData[i] = i/128; 17 channelData[128 + i] = 1.0 - i/128; 18 } 19 20 function test_delay_index(delayIndex) { 21 22 var context = new OfflineAudioContext(2, LENGTH, sampleRate); 23 24 var merger = context.createChannelMerger(2); 25 merger.connect(context.destination); 26 27 var impulse = context.createBuffer(1, delayIndex + 1, sampleRate); 28 impulse.getChannelData(0)[delayIndex] = 1.0; 29 var convolver = context.createConvolver(); 30 convolver.normalize = false; 31 convolver.buffer = impulse; 32 convolver.connect(merger, 0, 0); 33 34 var delayTime = delayIndex/sampleRate; 35 var delay = context.createDelay(delayTime || 1/sampleRate); 36 delay.delayTime.value = delayTime; 37 delay.connect(merger, 0, 1); 38 39 var source = context.createBufferSource(); 40 source.buffer = sourceBuffer; 41 source.connect(convolver); 42 source.connect(delay); 43 source.start(0); 44 45 return context.startRendering(). 46 then((buffer) => { 47 var convolverOutput = buffer.getChannelData(0); 48 var delayOutput = buffer.getChannelData(1); 49 var maxDiff = 0.0; 50 var maxIndex = 0; 51 for (var i = 0; i < buffer.length; ++i) { 52 var diff = Math.abs(convolverOutput[i] - delayOutput[i]); 53 if (diff > maxDiff) { 54 maxDiff = diff; 55 maxIndex = i; 56 } 57 } 58 // The convolver should produce similar output to the delay. 59 assert_approx_equals(convolverOutput[maxIndex], delayOutput[maxIndex], 60 EPSILON, "output at " + maxIndex); 61 }); 62 } 63 64 // The 5/4 ratio provides sampling across a range of delays and offsets within 65 // blocks. 66 for (var delayIndex = 0; 67 delayIndex < LENGTH; 68 delayIndex = Math.floor((5 * (delayIndex + 1)) / 4)) { 69 promise_test(test_delay_index.bind(null, delayIndex), 70 "Delay " + delayIndex); 71 } 72 </script>