Post

AudioKit의 MultiTapDelay

AudioKit의 MultiTapDelay

Multi Tap Delay

MultiTapDelayConductor 클래스는 AudioKit을 사용하여 멀티탭 딜레이(Multi-Tap Delay) 효과를 구현하는 Swift 클래스입니다. 여러 개의 지연된 복사본을 입력 신호에 섞어 리듬감 있는 반복 효과나 리버브와 유사한 풍부한 공간감을 만들어냅니다.


📌 클래스 설명

class MultiTapDelayConductor: ObservableObject, ProcessesPlayerInput

  • ObservableObject: SwiftUI 뷰와 데이터를 바인딩하기 위해 사용됩니다. 슬라이더를 통해 딜레이 시간 및 게인 값이 바뀌면 뷰가 자동으로 업데이트됩니다.
  • ProcessesPlayerInput: 오디오 재생 처리를 담당하는 AudioKit Cookbook의 프로토콜입니다.

🔧 주요 변수

변수 이름 설명
engine AudioKit의 오디오 엔진
player AudioPlayer: 오디오 파일을 반복 재생합니다.
buffer 오디오 파일을 메모리에 로드한 버퍼. 음원 데이터 저장
defaultSource 초기 재생할 오디오 파일. 여기서는 .femaleVoice
delays VariableDelay 배열. 각 탭의 지연 요소입니다.
faders Fader 배열. 각 탭의 게인 조절기입니다.
times 슬라이더로 조절할 각 탭의 딜레이 시간 ([0.1, 0.2, 0.4]초)
gains 각 탭의 출력 음량 ([0.5, 2.0, 0.5])

🎛️ init()

  • player.buffer에 오디오 데이터를 세팅하고 반복 재생을 설정합니다.
  • engine.outputmultiTapDelay(player, times: times, gains: gains)을 설정하여 엔진 출력에 멀티탭 딜레이 효과를 적용합니다.

🧩 multiTapDelay(_ input: Node, times: [AUValue], gains: [AUValue]) -> Mixer

  • **입력 노드(input)**의 신호를 딜레이 + 게인 조절해서 믹서에 추가합니다.
  • 딜레이와 게인은 슬라이더로 개별 조정 가능.
  • Mixer에 원본 입력도 함께 포함되어 Dry/Wet 믹싱 효과가 생깁니다.
1
2
3
4
5
for (i, (time, gain)) in zip(times, gains).enumerated() {
  delays.append(VariableDelay(input, time: time))
  faders.append(Fader(delays[i], gain: gain))
  mix.addInput(faders[i])
}

즉, VariableDelayFaderMixer 순으로 체인 구성합니다.


🔄 updateDelays()

  • 슬라이더 값이 변경될 때마다 호출되어 딜레이 및 게인 값을 실시간 반영합니다.
1
2
delays[i].time = times[i]
faders[i].gain = gains[i]

✅ 요약

구성 요소 설명
🎧 딜레이 타임 [0.1, 0.2, 0.4]초로 지정된 여러 지점에서 입력 신호를 지연
🎚 게인 각 딜레이된 신호의 볼륨을 개별 조절
🎼 사용 효과 리듬감 있는 에코, 다층적인 반향, 리버브 유사 환경
🔁 슬라이더 연동 @Published 값이 변할 때 updateDelays() 호출로 실시간 반영

📊 오디오 체인 구성도

1
2
3
4
5
6
player
  │
  ├──▶ VariableDelay(time: 0.1) ─▶ Fader(gain: 0.5) ─┐
  ├──▶ VariableDelay(time: 0.2) ─▶ Fader(gain: 2.0) ─┤
  ├──▶ VariableDelay(time: 0.4) ─▶ Fader(gain: 0.5) ─┤
  └──────────────────────────────────────────────────▶ Mixer (최종 출력)

이 구조는 동일한 소스에서 여러 딜레이 시점을 만든 다음, 볼륨 조절 후 믹싱하는 구조로, 공간감 있고 풍부한 사운드를 만드는 데 매우 유용합니다.

This post is licensed under CC BY 4.0 by the author.