Chrome은 Web Audio API 지원을 지속적으로 조용히 개선해 왔습니다. Chrome 49 (2016년 2월 현재 베타 버전이며 2016년 3월에 안정화 버전으로 출시될 예정)에서는 사양을 추적하기 위해 여러 기능을 업데이트하고 새 노드 하나를 추가했습니다.
decodeAudioData()가 이제 프로미스를 반환합니다.
이제 AudioContext
의 decodeAudioData() 메서드가 Promise
를 반환하므로 Promise 기반 비동기 패턴 처리가 가능합니다. decodeAudioData()
메서드는 항상 성공 및 오류 콜백 함수를 매개변수로 사용했습니다.
context.decodeAudioData( arraybufferData, onSuccess, onError);
하지만 이제 표준 Promise 메서드를 사용하여 오디오 데이터 디코딩의 비동기 특성을 대신 처리할 수 있습니다.
context.decodeAudioData( arraybufferData ).then(
(buffer) => { /* store the buffer */ },
(reason) => { console.log("decode failed! " + reason) });
단일 예시에서는 더 장황해 보이지만 프라미스를 사용하면 비동기 프로그래밍이 더 쉽고 일관되게 됩니다. 호환성을 위해 사양에 따라 성공 및 오류 콜백 함수가 계속 지원됩니다.
이제 OfflineAudioContext에서 suspend() 및 resume()를 지원합니다.
OfflineAudioContext에서 suspend()를 사용하는 것이 이상하게 보일 수 있습니다.
결국 suspend()
는 오디오 하드웨어를 대기 모드로 전환할 수 있도록 AudioContext
에 추가되었으며, 이는 버퍼에 렌더링하는 시나리오에서는 의미가 없어 보입니다 (물론 OfflineAudioContext
의 용도).
그러나 이 기능의 핵심은 메모리 사용량을 최소화하기 위해 한 번에 '점수'의 일부만 구성할 수 있다는 것입니다. 렌더링 중간에 일시중지된 상태에서 노드를 더 만들 수 있습니다.
예를 들어 베토벤의 달빛 소나타에는 약 6,500개의 음표가 포함되어 있습니다.
각 '음표'는 적어도 두 개의 오디오 그래프 노드(예: AudioBuffer 및 Gain 노드)로 분해될 수 있습니다. OfflineAudioContext
를 사용하여 7분 30초 전체를 버퍼에 렌더링하려는 경우 이러한 노드를 모두 한 번에 만들지는 않을 것입니다. 대신 일정 기간 동안 생성할 수 있습니다.
var context = new OfflineAudioContext(2, length, sampleRate);
scheduleNextBlock();
context.startRendering().then( (buffer) => { /* store the buffer */ } );
function scheduleNextBlock() {
// create any notes for the next blockSize number of seconds here
// ...
// make sure to tell the context to suspend again after this block;
context.suspend(context.currentTime + blockSize).then( scheduleNextBlock );
context.resume();
}
이렇게 하면 렌더링 시작 시 사전 생성해야 하는 노드 수를 최소화하고 메모리 요구사항을 줄일 수 있습니다.
IIRFilterNode
사양에 정확하게 지정된 자체 무한 임펄스 응답을 만들려는 오디오 애호가를 위한 노드인 IIRFilterNode가 추가되었습니다.
이 필터는 BiquadFilterNode를 보완하지만 유형, 주파수, Q 등에 관한 BiquadFilterNode
의 사용하기 쉬운 AudioParams
가 아닌 필터 응답 매개변수를 완전히 지정할 수 있습니다. IIRFilterNode
를 사용하면 단일 순서 필터와 같이 이전에 만들 수 없었던 필터를 정확하게 지정할 수 있습니다. 그러나 IIRFilterNode를 사용하려면 IIR 필터의 작동 방식에 대한 심층적인 지식이 필요하며 BiquadFilterNode와 같이 예약할 수도 없습니다.
이전 변경사항
이전에 적용된 몇 가지 개선사항도 언급하고자 합니다. Chrome 48에서는 BiquadFilter
노드 자동화가 오디오 속도로 실행되기 시작했습니다. 이를 위해 API는 전혀 변경되지 않았지만 필터 스윕이 더 부드럽게 들릴 것입니다. 또한 Chrome 48에서는 연결할 노드를 반환하여 AudioNode.connect()
메서드에 체이닝을 추가했습니다. 이렇게 하면 다음 예와 같이 노드 체인을 더 쉽게 만들 수 있습니다.
sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);
오늘은 여기까지입니다. 좋은 하루 보내세요.