delay-testing.js (2022B)
1 let sampleRate = 44100.0; 2 3 let renderLengthSeconds = 4; 4 let delayTimeSeconds = 0.5; 5 let toneLengthSeconds = 2; 6 7 function createToneBuffer(context, frequency, numberOfCycles, sampleRate) { 8 let duration = numberOfCycles / frequency; 9 let sampleFrameLength = duration * sampleRate; 10 11 let audioBuffer = context.createBuffer(1, sampleFrameLength, sampleRate); 12 13 let n = audioBuffer.length; 14 let data = audioBuffer.getChannelData(0); 15 16 for (let i = 0; i < n; ++i) 17 data[i] = Math.sin(frequency * 2.0 * Math.PI * i / sampleRate); 18 19 return audioBuffer; 20 } 21 22 function checkDelayedResult(renderedBuffer, toneBuffer, should) { 23 let sourceData = toneBuffer.getChannelData(0); 24 let renderedData = renderedBuffer.getChannelData(0); 25 26 let delayTimeFrames = delayTimeSeconds * sampleRate; 27 let toneLengthFrames = toneLengthSeconds * sampleRate; 28 29 let success = true; 30 31 let n = renderedBuffer.length; 32 33 for (let i = 0; i < n; ++i) { 34 if (i < delayTimeFrames) { 35 // Check that initial portion is 0 (since signal is delayed). 36 if (renderedData[i] != 0) { 37 should( 38 renderedData[i], 'Initial portion expected to be 0 at frame ' + i) 39 .beEqualTo(0); 40 success = false; 41 break; 42 } 43 } else if (i >= delayTimeFrames && i < delayTimeFrames + toneLengthFrames) { 44 // Make sure that the tone data is delayed by exactly the expected number 45 // of frames. 46 let j = i - delayTimeFrames; 47 if (renderedData[i] != sourceData[j]) { 48 should(renderedData[i], 'Actual data at frame ' + i) 49 .beEqualTo(sourceData[j]); 50 success = false; 51 break; 52 } 53 } else { 54 // Make sure we have silence after the delayed tone. 55 if (renderedData[i] != 0) { 56 should(renderedData[j], 'Final portion at frame ' + i).beEqualTo(0); 57 success = false; 58 break; 59 } 60 } 61 } 62 63 should( 64 success, 'Delaying test signal by ' + delayTimeSeconds + ' sec was done') 65 .message('correctly', 'incorrectly') 66 }