Swift(스위프트): 오디오 라이브러리 AudioKit 프레임워크 소개
AudioKit 란?
iOS, macOS 및 tvOS용 Swift 오디오 합성, 처리 및 분석 플랫폼
개요
AudioKit은 코드 저장소, 패키지, 라이브러리, 알고리즘, 애플리케이션, 플레이그라운드, 테스트, 스크립트로 구성된 전체 오디오 개발 생태계(audio development ecosystem)로, 오디오 프로그래머, 앱 개발자, 엔지니어, 연구원, 과학자, 음악가, 게이머 및 프로그래밍을 처음 접하는 사람들의 커뮤니티에 의해 구축되고 사용되는 프레임워크입니다.
AudioKit은 개발 동기를 부여하는 몇 가지 기본 목표를 가지고 있습니다.
- 첫째, AudioKit을 배우는 것이 누구에게나 쉽기를 바랍니다. 사람들이 시작할 수 있도록 Swift Playgrounds, 데모 애플리케이션 및 지원하는 AudioKit 전문가의 Discord 그룹에 대한 액세스를 제공합니다.
- 다음으로, 우리는 AudioKit이 확장성이 있어 더 많은 고급 개발자들이 AudioKit 위에 구축된 자신만의 사용자 지정 앱과 라이브러리를 만들 수 있기를 바랍니다. AudioKit의 일부였던 대부분의 파트가 AudioKit이 확장 가능하도록 하고 개발자들에게 AudioKit의 확장에 대한 여러 가지 접근법의 예를 제공하기 위해 별도의 패키지로 이동되었습니다.
- AudioKit의 중요한 목표는 소수의 자원 봉사자가 성장하고 유지 관리할 수 있도록 하는 것입니다. 이러한 이유로 AudioKit 코드 저장소가 변경될 때마다 실행되는 광범위한 테스트가 있습니다. 우리는 AudioKit을 지원하는 데 많은 시간을 할애하는 사람들에 대한 Github 후원(sponsorship)을 수락하고 권장합니다.
- 우리는 차세대 오디오 앱 개발자들에게 영감을 주며, 오디오킷 기반 앱을 강조하고 세계에서 가장 많이 다운로드된 신디사이저 앱인 “AuidoKit SynthOne“를 비롯한 다른 앱들을 포함하는 “AudioKit Pro” 브랜드를 내세웁니다.
패키지 목록 / 레이어 다이어그램
AudioKit 레이어 자체에는 import 할 수 있는 세 가지 프레임워크가 포함되어 있습니다.
- AudioKit
- AudioKit의 Swift 전용(Swft-only base) 레이어
- Swift Playgoriunds app에서 이용할 수 있음
- AudioKitEX
- C++로 작성된 AudioKit 확장을 위한 API
- CAudioKitEX
AudioKitEX의 기능을 지원하는 DSP(Digital Signal Processor) 및 기타 Low Level 코드
Cookbook Demo App 계층은 이 다이어그램에서 실행 가능한 앱이 있는 위치의 예입니다. 이 계층은 그 아래에 있는 패키지의 하위 집합에 따라 달라질 수 있습니다.
패키지는 다른 패키지에 의존할 수 있으며 SoundpipeAudioKit에 의존하는 SporthAudioKit의 예(윗부분에 있는 것이 아래 부분에 의존함)가 표시되어 있습니다.
위 레이어 다이어그램의 AAAAudioKit…ZZZAudioKit 블록은 AudioKit을 확장하는 다양한 패키지의 플레이스홀더(placeholder)입니다. 아래 목록은 다양한 패키지의 몇 가지 예입니다.
- AudioKitUI
- 파형 시각화(waverform visualization) 및 UI 구성 요소
- DevLoop AudioKit
- 기타(Guitar) 프로세서
- Dunne AudioKit
- 코러스(Chorus), 플랜저(Flanger). 샘플러(Sampler), 스테레오 딜레이(Stereo Delay), 신디사이저(Synth)
- SoundPipe AudioKit
- 오실레이터(Oscillators), 이펙트(Effects), 필터(Filters) 등
- Sporth AudioKit
- 간단한 문법으로 복잡한 DSP 작업을 처리
- STK AudioKit
- Stanford Synthesis Toolkit physical models
AudioKit.io
설치 방법
설명법 링크 - https://github.com/AudioKit/AudioKit/
- (Xcode의 프로젝트에서)
File -> Add Packages...를 선택합니다. - 왼쪽 컬렉션 사이드바의 왼쪽 하단에 있는
+아이콘을 클릭합니다.
- 팝업 메뉴에서
Add Package Collection를 선택합니다. - 패키지 컬렉션 추가 대화 상자에서 https://swiftpackageindex.com/AudioKit/collection.json 을 URL로 입력하고
Load버튼을 클릭합니다. - 만약 컬렉션이 서명되지 않았음을 경고한다면 “서명되지 않은 컬렉션 추가”를 클릭하십시오.
- 이제 패키지 목록에서 필요한 AudioKit Swift 패키지를 추가하고 Xcode 내에서 바로 그 기능을 불러올 수 있습니다.
목표 (Targets)
- AudioKit
- AVFoundation Effects에 대한 래퍼(Wrapper)
- 언어: Swift
- AudioKitEX
- Nodes, Parameters, Automation, Sequencing
- 언어: Swift
- CAudioKitEX
- AudioKitEX 기능을 지원하는 DSP 및 기타 Low Level 코드
- 언어: Objective-C++
예제
AudioKit 예제의 기본 소스는 AudioKit Cookbook에 있습니다. 이 앱에는 AudioKit의 사용법에 대한 모든 미니 예제가 포함되어 있습니다.
포맷 변환기 (Format Converter)
FormatConverter는 보다 복잡한 AVFoundation 및 CoreAudio 오디오 변환을 사용하기 쉬운 형식으로 래핑합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import AudioKit
// viewDidLoad나 SwiftUI의 onAppear 등 실행 가능한 영역
.onAppear {
var options = FormatConverter.Options()
// any options left nil will assume the value of the input file
options.format = .wav
options.sampleRate = 48000
options.bitDepth = 24
let oldURL = Bundle.main.url(forResource: "file_example_MP3_5MG", withExtension: "mp3")!
let documentDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
// document 폴더 위치 표시
print("docuDIR:", documentDir)
let newURL = documentDir.appending(component: "output - \(Date()).wav")
let converter = FormatConverter(inputURL: oldURL, outputURL: newURL, options: options)
converter.start { error in
// check to see if error isn't nil, otherwise you're good
if let error = error {
print("Error:", error)
}
print("good")
}
}
미디 (MIDI)
AudioKit MIDI는 MIDI 신호의 생성과 응답을 단순화하기 위해 사용되는 CoreMIDI의 구현(implementations)입니다.
다음과 같은 MIDI 리스너(MIDIListener)를 추가합니다.
1
2
3
var midi = MIDI()
midi.openInput()
midi.addListener(someClass)
someClass는 MIDIListener 프로토콜을 준수(conform)해야 합니다.
그런 다음 MIDILlistener에서 필요한 메서드 등을 구현하고 필요한 방법으로 데이터를 사용합니다.
테이블 (Tables)
테이블은 Float 데이터의 배열일 뿐입니다. 파형 데이터를 저장하는 데 가장 많이 사용되며 가장 일반적인 경우에는 몇 가지 기본값이 있습니다.
- sine wave (사인파)
- triangle wave (삼각파)
- square wave (사각파)
- sawtooth wave (톱니파)
- reverse sawtooth wave (역톱니파)
- positive sine (양의 사인파)
- positive triangle (양의 삼각파)
- positive square (양의 사각파)
- positive sawtooth (양의 톱니파)
- positive reverse sawtooth (양의 역톱니파)
테이블은 오디오 또는 제어 데이터를 저장하는 것도 됩니다.
시퀀싱 (Sequencing)
AppleSequencer는 검증된(tried-and-true) CoreAudio/MIDI 시퀀스를 기반으로 합니다.
Taps
탭은 신호 체인에 노드를 삽입하지 않고도 신호 체인의 특정 지점에서 오디오 스트림에 액세스할 수 있는 방법입니다. 오디오를 “탭핑”하여 데이터를 추출하고 해당 지점에서 스트림을 플로팅하거나 분석하는 것과 같은 부수적인 목적으로 사용합니다.
주제별 링크 (Topics)
Articles
About Us
AudioKit은 다수의 프로그래머와 음악가들이 함께 만들어낸 프로젝트입니다.
Contributing Code
업데이트, 버그 수정, 기능 추가 또는 문서 개선에 관한 안내입니다.
Migration Guide
Nodes
노드는 오디오 스트림과 함께 동작하는 상호 연결 가능한 구성 요소입니다. 노드가 동작하려면 오디오가 그 노드를 통해 끌어와져야 합니다. 그리고 오디오가 노드를 통과하려면, 해당 노드를 포함한 오디오 신호 체인이 결국 출력까지 이어져야 합니다.
Samplers
“샘플러”라는 용어는 약간 오해의 소지가 있습니다. 원래는 사운드를 녹음(“샘플링”)하고 키보드로 다시 재생할 수 있는 하드웨어 장치를 의미했습니다. 실제로는 녹음 기능보다 재생 기능이 훨씬 더 널리 사용되었고, 오늘날에는 두 기능이 거의 완전히 분리되어 있습니다. 우리가 오늘날 “샘플러”라고 부르는 것은 단순히 미리 준비된 사운드(“샘플”)를 재생하는 시스템입니다.
Classes
class AmplitudeTap
어떤 노드든 진폭 분석을 수행하기 위한 탭입니다. start()는 탭을 추가하고 stop()은 제거합니다.
class AppleSampler
샘플러 오디오 생성기입니다.
class AppleSequencer
CoreAudio/MIDI 기반의 검증된 시퀀서를 기반으로 합니다.
class AudioEngine
AudioKit의 AVAudioEngine 래퍼입니다.
class AudioPlayer
단순화된 API를 제공하는 AVAudioPlayerNode 래퍼입니다. 플레이어는 메모리 기반(isBuffered) 또는 디스크 스트리밍 기반 두 모드를 상호 변경하며 사용할 수 있습니다. 긴 파일은 디스크에서 재생하는 것을 권장합니다. 완전히 매끄러운 루프를 원한다면 버퍼링하세요. 디스크에서도 루프는 가능하지만 완전한 무봉제(seamless)는 아닙니다.
class BandPassFilter
Apple의 BandPassFilter Audio Unit의 AudioKit 버전입니다.
class BaseTap
AVAudioEngine installTap을 사용하는 AudioKit 탭의 기본 클래스입니다.
class Compressor
Apple의 Compressor Audio Unit의 AudioKit 버전입니다.
class Decimator
Apple의 Decimator Audio Unit의 AudioKit 버전입니다.
class Delay
Apple의 Delay Audio Unit의 AudioKit 버전입니다.
class Distortion
Apple의 Distortion Audio Unit의 AudioKit 버전입니다.
class DynamicsProcessor
Apple의 DynamicsProcessor Audio Unit의 AudioKit 버전입니다.
class Expander
Apple의 Expander Audio Unit의 AudioKit 버전입니다.
class FFTTap
어떤 노드에서든 FFT 계산을 수행합니다.
class FormatConverter
복잡한 AVFoundation 및 CoreAudio 변환 작업을 간단하게 감싸는 래퍼입니다.
class HighPassFilter
Apple의 HighPassFilter Audio Unit의 AudioKit 버전입니다.
class HighShelfFilter
Apple의 HighShelfFilter Audio Unit의 AudioKit 버전입니다.
class LowPassFilter
Apple의 LowPassFilter Audio Unit의 AudioKit 버전입니다.
class LowShelfFilter
Apple의 LowShelfFilter Audio Unit의 AudioKit 버전입니다.
class MIDI
MIDI 입·출력 핸들러입니다.
class MIDICallbackInstrument
MIDI 노트 온/오프 명령 시 함수를 트리거하는 MIDI 악기입니다. 주로 AppleSequencer가 MIDIEndpointRef에 보낼 때 사용됩니다. CallbackInstrument라는 또 다른 콜백 악기도 있습니다. 이 기능을 사용하려면 프로젝트에서 “Background Modes - Audio”를 활성화해야 합니다.
class MIDIClockListener
MIDI 클럭 이벤트를 세고 24 펄스(4분음표 1개)마다 옵저버에게 알립니다.
class MIDIFileTrackNoteMap
MIDI 파일의 특정 트랙 안에서 발생하는 MIDI 이벤트를 가져옵니다. 많은 계산이 필요하므로 가능하면 한 번만 초기화해야 합니다.
class MIDIHelper
MIDI 관련 유틸리티 함수 모음입니다.
class MIDIInstrument
MIDI로 트리거하거나 시퀀서에서 재생할 수 있는 악기용 Instrument 버전입니다.
class MIDIMonoPolyListener
상태 변경을 알릴 수 있도록 옵저버 지원이 필요할 수 있습니다.
class MIDINoteDuration
MIDI 노트 길이를 저장하는 데 유용한 타입입니다.
class MIDIOMNIListener
상태 변경 알림을 위해 옵저버 지원이 필요할 수 있습니다.
class MIDIPlayer
Apple의 AVAudioSequencer 기반의 단순 MIDI 플레이어이며 기능은 제한적입니다.
class MIDISampler
MIDI 신호를 받아 재생하는 샘플러입니다.
class MIDISystemRealTimeListener
SRT(Sytem Real Time) MIDI 메시지를 확인하는 MIDIListener입니다.
class MIDITempoListener
MIDI 클럭 메시지를 분석해 BPM을 계산하는 AudioKit MIDI 리스너입니다.
class MIDITimeout
작업 블록을 실행하고, 응답이 오지 않는 경우를 감지하기 위한 타이머를 시작하는 클래스입니다. 성공 조건은 호출자가 정의하며, succeed()를 호출해 타임아웃을 방지할 수 있습니다.
class MatrixMixer
class Mixer
Apple의 Mixer Node의 AudioKit 버전입니다. 여러 노드를 혼합합니다.
class MultiChannelInputNodeTap
AVAudioInputNode 또는 AVAudioEngine inputNode의 다중 채널 오디오를 처리하기 위한 탭입니다. 하드웨어 입력 채널에 따라 여러 개의 모노 파일로 각각 기록합니다.
class MultiSegmentAudioPlayer
여러 파일 구간을 스케줄하여 재생할 수 있는 오디오 플레이어입니다.
class MusicTrackManager
Apple의 내부 MusicTrack에 대한 래퍼입니다.
class NodeParameter
AUParameter를 더 사용하기 쉬운 인터페이스로 감싸고 AudioKit 기능을 추가한 요소입니다. Parameter property wrapper용 신규 버전입니다.
class NodeRecorder
간단한 오디오 레코더 클래스이며 최소 버퍼 길이 128 샘플(.short)이 필요합니다.
class ParametricEQ
Apple의 ParametricEQ Audio Unit의 AudioKit 버전입니다.
class PeakLimiter
Apple의 PeakLimiter Audio Unit의 AudioKit 버전입니다.
class PlaygroundNoiseGenerator
Pure Swift 기반 노이즈 생성기입니다.
class PlaygroundOscillator
Pure Swift 기반 오실레이터입니다.
class PresetBuilder
Apple Sampler가 읽을 수 있는 프리셋을 생성합니다.
class RawDataTap
어떤 노드든 원시(raw) 데이터를 가져옵니다.
class RawDataTap2
class Reverb
Apple의 Reverb Audio Unit의 AudioKit 버전입니다.
class RingModulator
Apple의 RingModulator Audio Unit의 AudioKit 버전입니다.
class Settings
AudioKit 전역 설정입니다.
class Table
파형 또는 조회용으로 사용할 수 있는 값 테이블입니다.
class ThreadLockedAccessor
값에 대한 lock 기반 원자적 접근을 보장하는 property wrapper입니다.
class TimePitch
Apple의 TimePitch Audio Unit의 AudioKit 버전입니다.
class VariSpeed
Apple의 VariSpeed Audio Unit의 AudioKit 버전입니다.
class WaveformDataRequest
오디오 파일에서 데이터를 가져오기 위한 요청입니다.
Protocols
protocol DynamicWaveformNode
주로 SoundpipeAudioKit의 DynamicOscillator를 위한 프로토콜이며, 다른 곳에서도 사용될 수 있습니다.
protocol HasAudioEngine
오디오 “엔진”을 보유해야 함을 명시하는 프로토콜입니다.
protocol HasInternalConnections
protocol MIDIBeatObserver
클라이언트가 비트 이벤트를 관찰할 수 있도록 하는 프로토콜입니다.
protocol MIDIFileChunk
MIDI 파일 청크 프로토콜입니다.
protocol MIDIListener
MIDI 리스너 프로토콜입니다.
protocol MIDIMessage
MIDI 메시지 프로토콜입니다.
protocol MIDISystemRealTimeObserver
MIDI 시스템 실시간(SRT) 메시지 옵저버입니다.
protocol MIDITempoObserver
MIDI 템포 옵저버입니다.
protocol MIDITransformer
MIDI 이벤트 배열을 다른 배열로 변환하는 변환기입니다.
protocol MultiChannelInputNodeTapDelegate
다중 채널 Input Node Tap의 델리게이트입니다.
protocol NamedNode
디버깅용 연결 정보를 보기 좋게 출력하도록 돕는 프로토콜입니다.
protocol Node
오디오 그래프의 노드입니다.
protocol NodeParameterType
@Parameter가 지원하는 타입의 기본 프로토콜입니다.
protocol ObserverProtocol
옵저버 프로토콜입니다.
protocol Occupiable
값을 담을 수 있는 타입(strings, arrays 등)입니다.
protocol ProcessesPlayerInput
오디오 “플레이어” 입력을 처리하는 타입임을 명시하는 프로토콜입니다.
protocol StreamableAudioSegment
protocol Tap
Structures
struct AppleMIDIEvent
Apple MIDI 이벤트입니다.
struct Device
오디오 디바이스 선택을 위한 래퍼입니다.
struct Duration
시퀀싱에서 시간 개념을 위한 컨테이너입니다.
struct EndpointInfo
MIDI Endpoint 정보입니다.
struct MIDICustomMetaEvent
MIDI 커스텀 메타 이벤트입니다.
struct MIDIEvent
MIDI 이벤트를 정의하는 값의 컨테이너입니다.
struct MIDIFile
MIDI 파일입니다.
struct MIDIFileChunkEvent
MIDI 파일 청크 이벤트입니다.
struct MIDIFileTempoTrack
MIDI 파일 템포 트랙입니다.
struct MIDIFileTrack
MIDI 파일 트랙입니다.
struct MIDIFileTrackChunk
MIDI 파일 트랙 청크입니다.
struct MIDINoteData
MusicTrackManager 노트 이벤트에 필요한 데이터를 담는 구조체입니다.
struct MIDIProgramChangeEvent
MIDI 프로그램 체인지 이벤트입니다.
struct MIDIStatus
MIDI 상태 메시지입니다.
struct MIDISysExMessage
MIDI 시스템 익스클루시브 메시지입니다.
struct MIDIVariableLengthQuantity
MIDI 가변 길이 수량 형식입니다.
struct NodeParameterDef
노드 파라미터의 정의/명세입니다.
struct Parameter
NodeParameter를 감싸 값을 쉽게 설정할 수 있게 합니다.
struct TimeSignature
박자표입니다.
Variables
let noteOffByte: MIDIByte
Note Off 단축 바이트입니다.
let noteOnByte: MIDIByte
Note On 단축 바이트입니다.
Functions
func CheckError(OSStatus)
func Log(...)
os_log 시스템의 래퍼입니다. 현재는 파일명·함수·라인 번호를 표시하지만 성능에 영향을 준다면 제거될 수 있습니다(Apple 권장 기준).
func ceil(Duration) -> Duration
비트 단위로 duration의 상한을 반환합니다.
func fourCC(String) -> UInt32
Audio Unit 코드 변환을 위한 도우미 함수입니다.
func loadAudioSignal(audioURL: URL) -> ...
URL에서 오디오 파일 정보를 읽어 float 배열, 샘플레이트, 프레임 수를 반환합니다.
연산자
func + (AVAudioTime, Int) -> AVAudioTime
덧셈
func + (AVAudioTime, Double) -> AVAudioTime
덧셈
func - (AVAudioTime, Double) -> AVAudioTime
뺄셈
func - (AVAudioTime, Int) -> AVAudioTime
뺄셈
타입 별칭
typealias AUValue
보통 AVFoundation 또는 AudioToolbox에서 설정되지만, 여기서 정의하여 사용자가 해당 프레임워크를 불러오지 않아도 됨
typealias BPM
템포를 나타내는 별칭, 분당 박자 단위(BPM)로 작업할 때 명확하게 표시
typealias BPMType
분당 박자 단위로 템포를 저장하는 타입
typealias CMIDICallback
C에서 호출 가능한 콜백 함수
typealias CVoidCallback
C에서 호출 가능한 콜백 함수
typealias DeviceID
macOS의 AudioDeviceID
typealias FloatChannelData
스테레오 오디오 데이터를 담은 2차원 배열
typealias MIDIByte
MIDI 관련 작업임을 명확히 하는 타입 별칭
typealias MIDICallback
MIDI 콜백용 함수 타입
typealias MIDIChannel
MIDI 관련 작업임을 명확히 하는 타입 별칭
typealias MIDINoteNumber
MIDI 관련 작업임을 명확히 하는 타입 별칭
typealias MIDIVelocity
MIDI 관련 작업임을 명확히 하는 타입 별칭
typealias MIDIWord
MIDI 관련 작업임을 명확히 하는 타입 별칭
typealias SampleIndex
샘플 작업임을 명확히 하는 타입 별칭
열거형
enum AnalysisMode
분석 유형
enum AudioFileFormat
enum DisconnectStrategy
노드를 다른 노드와 연결 해제하는 방법 설명
enum FFTValidBinCount
n이 정수일 때 2^n의 유효한 결과
enum MIDIControl
MIDIByte 기준 MIDI 컨트롤 번호의 일반적인 이름
enum MIDICustomMetaEventType
MIDI 커스텀 메타 이벤트 유형
enum MIDIFileChunkType
MIDI 파일 청크 유형
enum MIDIStatusType
가능한 MIDI 상태 메시지
enum MIDISystemCommand
MIDI 시스템 명령
enum MIDISystemCommandType
MIDI 시스템 명령 유형
enum MIDITimeFormat
MIDI 시간 형식
enum MusicalDuration
enum NodeStatus
노드 상태 추적
enum SampleTriggerMode
샘플 트리거 방식 유형
enum StereoMode
스테레오 신호 처리 방식
enum TableType
지원되는 기본 테이블 유형



