← DEVLOG
인터랙티브2025.12.235 min read

Space Soundscape — 우주의 소리를 합성하다

8가지 우주 현상을 소리로 합성하고 자유롭게 믹싱하는 앰비언트 경험 — Web Audio 8채널 합성, 리액티브 Canvas 비주얼

web-audiocanvasambientsoundscapenoise-synthesis

시작 — 우주는 정말 조용할까

우주는 진공이므로 소리가 없습니다. 적어도 물리학적으로는 그렇습니다.

그런데 NASA가 블랙홀의 음향 데이터를 가청 주파수로 변환해 공개했을 때, 사람들은 깊이 매료되었습니다. 페르세우스 은하단의 블랙홀이 내는 57옥타브 아래의 B♭ — 어떤 악기로도 연주할 수 없는 주파수지만, 변환된 소리는 기묘하게 아름다웠습니다.

이 페이지는 그런 호기심에서 시작했습니다. 우주 현상들이 소리를 낼 수 있다면, 그것은 어떤 소리일까? 그리고 그 소리들을 자유롭게 섞을 수 있다면?


8개의 레이어

각 레이어는 하나의 우주 현상을 소리로 번역한 것입니다. 모든 소리는 외부 샘플 없이 Web Audio API만으로 합성합니다.

레이어음원 구성의미
펄서sine 440Hz, 짧은 burst중성자별의 규칙적 전파 펄스
태양풍핑크노이즈 + BPF 500Hz + LFO 0.02Hz태양 입자 흐름
블랙홀sine 35Hz + 50.3Hz, LPF 150Hz사건의 지평선 근처 저주파 진동
성운sine 220/221.5/330Hz가스 구름 속 화음
중력파sine chirp 35→260Hz (3s)LIGO가 감지한 주파수 상승
자기권백색노이즈 burst + BPF + 랜덤 스케줄지구 자기장 교란
우주배경복사백색노이즈 LPF 200Hz빅뱅의 잔향
우주선sawtooth 60Hz + 핑크노이즈 LPF 300Hz선실 엔진 험

블랙홀의 35Hz와 50.3Hz를 동시에 재생하면 15.3Hz의 맥놀이가 발생합니다. 이 초저주파 진동이 사건의 지평선 부근의 시공간 왜곡을 연상시킵니다.

// 블랙홀: 두 근접 저주파의 간섭
_blackHoleOsc1 = ctx.createOscillator();
_blackHoleOsc1.frequency.value = 35; // ~B0

_blackHoleOsc2 = ctx.createOscillator();
_blackHoleOsc2.frequency.value = 50.3; // ~A♭1 (15.3Hz beating)

const lpf = ctx.createBiquadFilter();
lpf.frequency.value = 150; // 저주파만 통과

중력파 처프

LIGO가 감지한 중력파의 가장 극적인 특징은 주파수 상승입니다. 두 블랙홀이 서로 접근하며 공전 속도가 빨라지고, 중력파의 주파수도 따라서 올라갑니다. 이것을 '처프(chirp)'라고 부릅니다.

function scheduleChirp() {
  const dur = 3.0;
  osc.frequency.setValueAtTime(35, now);
  osc.frequency.exponentialRampToValueAtTime(260, now + dur);

  env.gain.setValueAtTime(0, now);
  env.gain.linearRampToValueAtTime(0.3, now + dur * 0.7);
  env.gain.linearRampToValueAtTime(0, now + dur);
  // 8~15초 간격으로 반복
}

35Hz에서 260Hz까지 3초에 걸쳐 올라가는 소리. 볼륨은 70% 지점에서 피크를 찍고 사라집니다. 두 블랙홀이 병합하는 순간의 시간 압축을 표현합니다.


프리셋 — 네 가지 우주

8개의 슬라이더를 직접 조절할 수도 있지만, 4가지 프리셋으로 빠르게 분위기를 전환할 수 있습니다.

  • Deep Space — 블랙홀과 성운 중심. 깊고 고요한 심우주.
  • Orbit — 우주선과 자기권 중심. 궤도 비행 중의 선실.
  • Storm — 태양풍과 자기권 강조. 격렬한 우주 기상.
  • Zen — 성운 패드 중심. 부드러운 명상 배경.

각 프리셋은 8개 볼륨의 조합일 뿐이지만, 어떤 레이어를 강조하느냐에 따라 공간의 성격이 완전히 바뀝니다.


Drift — 유기적 변화

프리셋을 선택한 뒤 가만히 두면 소리가 고정됩니다. 하지만 실제 우주는 고정된 것이 없습니다. Drift 모드는 각 레이어에 독립적인 느린 LFO를 걸어 볼륨을 서서히 변화시킵니다.

// Drift: 레이어마다 다른 주기로 볼륨 변조
const DRIFT_PERIODS = [23, 31, 37, 29, 19, 41, 47, 33]; // 초
const DRIFT_AMPLITUDE = 0.15;

const lfo = Math.sin((now * Math.PI * 2) / DRIFT_PERIODS[i]) * DRIFT_AMPLITUDE;
driftedVolume = Math.max(0, Math.min(1, baseVolume + lfo));

23초, 31초, 37초 — 모두 소수(prime number)입니다. 소수 주기를 사용하면 LFO 간의 위상이 오랫동안 겹치지 않아, 반복 패턴 없이 계속 새로운 조합이 만들어집니다.


소리가 보입니다

8개 레이어 각각에 대응하는 비주얼이 실시간으로 반응합니다. 볼륨을 올리면 비주얼이 강해지고, 내리면 사라집니다.

펄서는 화면 중앙에서 방사형으로 퍼지는 짧은 섬광, 태양풍은 왼쪽에서 오른쪽으로 흐르는 입자 스트림, 블랙홀은 중앙의 어두운 원 주위로 빛이 왜곡되는 효과.

function drawSoundscapeScene(ctx, cw, ch, volumes, tick) {
  ctx.drawImage(ensureStars(cw, ch), 0, 0); // 별 배경
  drawCMB(ctx, cw, ch, volumes[6]); // 우주배경복사
  drawNebula(ctx, cw, ch, volumes[3], min); // 성운
  drawBlackHole(ctx, cw, ch, volumes[2], tick); // 블랙홀
  drawSolarWind(ctx, cw, ch, volumes[1], tick); // 태양풍
  drawPulsar(ctx, cw, ch, volumes[0], tick); // 펄서
  // ...
}

소리를 시각화한 것이 아니라, 소리와 같은 현상을 다른 감각으로 표현한 것입니다. 볼륨 슬라이더 하나가 청각과 시각 양쪽을 동시에 제어합니다.


마치며

우주는 조용합니다. 하지만 조용하다는 것이 아무것도 없다는 뜻은 아닙니다.

펄서는 초당 수백 번 회전하고, 블랙홀 주위의 가스는 빛의 속도 가까이로 움직이며, 빅뱅의 잔향은 지금도 온 우주에 퍼져 있습니다. 단지 우리 귀에 닿지 않을 뿐입니다.

이 페이지는 그 닿지 않는 것들을 가청 주파수로 끌어와 하나의 공간에 담은 시도입니다. 블랙홀의 진동 위에 성운의 화음을 얹고, 중력파의 처프를 배경으로 펼쳐놓을 때 — 우주가 사실은 얼마나 시끄러운 곳인지 상상하게 됩니다.

슬라이더를 움직여 보시기 바랍니다. 자신만의 우주를 만들 수 있습니다.

이 포스트와 연결된 콘텐츠

직접 체험하기