창의개인연구 ⑤ 보행자·자동차가 움직이는 공간 음향 시뮬레이터
창의개인연구 시리즈. 인터페이스를 시뮬레이터로 확장해 다수의 위험 단서를 한꺼번에 다루는 단계.
다음 단계: 한 개에서 여러 개로
④ 글까지는 음원이 한 개뿐이었다. 실제로 보조 장치가 마주할 도시 공간은 그렇지 않다. 옆으로 지나가는 보행자, 뒤에서 다가오는 자동차, 길가의 벽이 동시에 존재한다. 진짜 문제는 "여러 위험 단서를 동시에 어떻게 청각으로 인지시키는가"이고, 이 질문을 다루려면 시뮬레이터가 필요했다.
이 단계의 목표 두 가지.
- 씬 안에 보행자·자동차 같은 객체를 추가하고, 각자가 정해진 경로나 무작위 경로를 따라 움직이게 한다.
- 각 객체에 별도의
PannerNode와GainNode를 두어, 가까워지면 소리가 커지고 멀어지면 자연스럽게 줄어드는 거리 단서를 만든다.
객체와 경로 시스템
씬에 들어가는 객체 종류를 둘로 시작했다.
- 보행자(Pedestrian) — 작고 느린 캡슐 형태.
- 자동차(Car) — 길고 더 빠른 직육면체 형태.
각 객체는 두 가지 이동 모드 중 하나를 가진다.
- Random — 매 프레임마다 작은 무작위 변위를 더해 부유한다. 군중처럼 보이는 효과.
- Path — 사용자가 마우스로 바닥면을 찍어 만든 폴리라인을 따라 일정 속도로 움직인다. 차선을 따라 달리는 차량 같은 표현에 적합.
Sim speed 슬라이더로 전체 시뮬레이션의 시간 배속을 바꿀 수 있다. 청감 실험은 천천히 진행해야 단서가 잘 들리고, 시각 디버깅은 빠르게 돌려야 패턴이 보이는 식이라, 같은 데모에서 두 모드를 빠르게 전환할 수 있는 게 의외로 컸다.
객체마다 따로 도는 오디오 그래프
각 객체에 다음을 묶었다.
source (Oscillator/Buffer/Noise)
→ filter (low/high/band)
→ gain (객체 개별 볼륨)
→ panner (객체 위치)
→ master gain → destination
객체별로 PannerNode를 따로 두면 한 씬 안에서 서로 다른 음색이 서로 다른 위치에서 들린다. 청자(원점)와의 거리가 달라질 때, 각 객체의 게인 변화가 독립적으로 들리는지를 확인했다.
거리 단서를 좀 더 분명히 만들기 위해, 객체 종류마다 음색을 다르게 설계했다.
- 보행자 — 짧은 노이즈 버스트로 발걸음을 흉내냈다.
BufferSource로 짧은 흰소리를 만들고, 객체 속도에 맞춰 200~400ms 간격으로 트리거. 발자국이 "또각또각" 들리는 인상에 가깝다. - 자동차 — 톱니파를
BiquadFilter의 lowpass(컷오프 약 600Hz)에 통과시켜 엔진음을 만들었다. 가까이 올수록 게인이 커지고, 멀어질수록 잔잔한 부유로 사라진다.
이 두 음색만으로도 "사람이 옆을 지나간다"는 느낌과 "차가 멀리서 다가온다"는 느낌이 청감으로 분리되어 들렸다.
청감으로 얻은 인상
- 시각과 청각이 거의 완벽히 일치한다. 화면에서 객체가 왼쪽으로 스쳐 지나갈 때, 헤드폰의 좌측에서 또렷한 발걸음 또는 엔진음이 함께 흐른다.
- 경로 그리기 + 객체 달리기 조합이 청감 실험에 의외로 유용했다. 길을 직접 그어 객체를 그 위로 달리게 하면, 거리·각도 변화가 청감에 어떻게 매핑되는지를 단일 변수로 관찰할 수 있다.
- HRTF의 한계인 전후 혼동은 여전히 남았지만, 객체 종류에 따라 음색을 다르게 두니까 그 약점이 어느 정도 가려졌다. "어디서 들리는지 정확히는 모르지만, 적어도 무엇이 다가오는지는 안다"는 상태.
부담: 동시에 도는 PannerNode가 늘어날 때
객체 수가 늘어나니 CPU와 오디오 업데이트가 조금씩 부담을 주기 시작했다. 특히 매 프레임마다 모든 객체의 panner.positionX/Y/Z를 갱신하는 비용이 작지 않다. 단순한 최적화로,
- 청자에서 일정 거리 이상 떨어진 객체는 게인을 0으로 끄고 위치 업데이트를 건너뛰었다.
- 발걸음 노이즈는 매번 새 버퍼를 만들지 않고 풀에서 재활용했다.
근본적인 최적화는 AudioWorklet으로 옮기는 것이지만, 시뮬레이터 단계에서는 우선순위를 두지 않았다.
1년치 흐름 정리
다섯 편을 통해 이 연구가 지난 길은 이렇게 정리된다.
- 이론 정립 — 왜 공간 음향이고, 왜 2채널 + HRTF인가.
- 첫 데모 — 작동하는 가장 단순한 형태로 청감 검증.
- 2D 가지치기 — 디테일(거리 모델·팝 노이즈)을 다듬는 단계.
- 3D 인터페이스 — 직접 잡고 끄는 직관성, X·Y·Z 3축.
- 시뮬레이터 — 다수의 객체, 음색 분리, 위험 단서 청각화.
앞으로의 숙제
- 가상 장애물 기반 감지 실험. 화면 상에 벽을 두고, 그 거리/각도 정보를 자동으로 소리로 변환하는 파이프라인을 만들 예정이다. 실제 센서를 붙이기 전 마지막 추상 단계.
- 음향 패턴 다듬기. 발걸음 템포, 엔진의 RPM 변화를 거리·속도에 자연스럽게 연동.
- 위험거리·감지 범위 시각화. 빨강·노랑·초록 단계로 화면에 함께 표시해, 청감 실험 결과를 눈으로도 검증할 수 있게.
- 하드웨어 연동. 시뮬레이터가 안정화되면 초음파 센서나 라이다 입력을 받아, 실제 거리 인식 데이터를 같은 공간 음향 엔진으로 흘려보낸다.
여기까지가 1년 차의 결말이다. 다음 학기에 시뮬레이터를 그대로 두고, 그 위에 실제 센서를 올리는 작업으로 이어가려고 한다.