Learning
레슨 6 / 8·20분

사운드와 인터랙션

p5.sound 라이브러리

p5.sound는 p5.js의 사운드 라이브러리로, 오디오 파일 재생, 마이크 입력, FFT 분석, 오실레이터 생성 등 오디오 관련 기능을 제공합니다. 사운드 데이터를 시각화하면 음악에 반응하는 인터랙티브 비주얼을 만들 수 있습니다.

javascript
let song;
let fft;
let amplitude;

function preload() {
  song = loadSound('music.mp3');
}

function setup() {
  createCanvas(800, 600);

  // FFT 분석기 (주파수 분석)
  fft = new p5.FFT(0.8, 128); // smoothing, bins

  // 진폭 분석기
  amplitude = new p5.Amplitude();
}

function draw() {
  background(10);

  // 주파수 스펙트럼 시각화
  let spectrum = fft.analyze();
  noStroke();

  for (let i = 0; i < spectrum.length; i++) {
    let x = map(i, 0, spectrum.length, 0, width);
    let h = map(spectrum[i], 0, 255, 0, height);

    colorMode(HSB, 360, 100, 100);
    fill(map(i, 0, spectrum.length, 0, 360), 80, 90);
    rect(x, height - h, width / spectrum.length, h);
  }

  // 전체 볼륨 표시
  let vol = amplitude.getLevel();
  fill(255);
  ellipse(width / 2, height / 2, vol * 500);
}

function mousePressed() {
  if (song.isPlaying()) {
    song.pause();
  } else {
    song.play();
  }
}

마이크 입력과 오실레이터

javascript
let mic;
let osc;

function setup() {
  createCanvas(800, 600);

  // 마이크 입력
  mic = new p5.AudioIn();
  mic.start();

  // 오실레이터 (사인파 생성)
  osc = new p5.Oscillator('sine');
  osc.freq(440); // 주파수 440Hz (라 음)
  osc.amp(0);    // 초기 볼륨 0
  osc.start();
}

function draw() {
  background(10, 20, 30);

  // 마이크 볼륨 시각화
  let vol = mic.getLevel();
  let size = map(vol, 0, 1, 10, 400);

  noStroke();
  fill(100, 200, 255, 200);
  ellipse(width / 2, height / 2, size);

  // 마이크 파형 시각화
  stroke(255, 100, 150);
  noFill();
  beginShape();
  let waveform = fft.waveform();
  for (let i = 0; i < waveform.length; i++) {
    let x = map(i, 0, waveform.length, 0, width);
    let y = map(waveform[i], -1, 1, 0, height);
    vertex(x, y);
  }
  endShape();
}

// 마우스 Y 위치로 오실레이터 주파수 제어
function mouseMoved() {
  let freq = map(mouseY, 0, height, 880, 110);
  osc.freq(freq);
}

function mousePressed() {
  osc.amp(0.3, 0.05); // 볼륨 올리기
}

function mouseReleased() {
  osc.amp(0, 0.5); // 볼륨 내리기
}
  • loadSound(url) — 오디오 파일 로드 (mp3, wav, ogg)
  • p5.FFT — 주파수 분석, analyze()로 스펙트럼, waveform()으로 파형
  • p5.Amplitude — 전체 볼륨(진폭) 측정
  • p5.AudioIn — 마이크 입력 캡처
  • p5.Oscillator — 사인/사각/삼각/톱니파 생성
💡

p5.sound는 별도 스크립트로 로드해야 합니다. CDN에서 p5.sound.min.js를 추가하세요. 마이크 접근은 HTTPS 환경에서만 가능하며, 사용자 허가가 필요합니다.