소개

AudioKit에서 sf2 확장자 형식의 MIDI 사운드폰트를 프로젝트에 추가하고 연결하는 방법입니다.

 

방법

1) Capabilities > Background Modes에서 Audio 추가

 

2) 사운드폰트 파일을 프로젝트 내에 추가

 

3) 사운드 컨덕터(ObservableObject) 생성
class InstrumentSFZConductor: ObservableObject, HasAudioEngine {
    let engine = AudioEngine()
    var instrument = MIDISampler()
    
    func noteOn(pitch: Pitch, point _: CGPoint) {
        instrument.play(noteNumber: MIDINoteNumber(pitch.midiNoteNumber), velocity: 90, channel: 1)
    }

    func noteOff(pitch: Pitch) {
        instrument.stop(noteNumber: MIDINoteNumber(pitch.midiNoteNumber), channel: 1)
    }

    init() {
        do {
            if let fileURL = Bundle.main.url(forResource: "GeneralUser GS MuseScore v1.442", withExtension: "sf2") {
                try instrument.loadMelodicSoundFont(url: fileURL, preset: 5)
            } else {
                Log("Could not find file")
            }
            instrument.volume = 1
            
            engine.output = instrument
            try engine.start()
        } catch {
            Log("AudioKit did not start!")
        }
    }
}

ObservableObject인 이유는 SwiftUI에서 사용하기 위한 목적이지만 UIKit에서도 사용 가능합니다.

 

4) noteOn, noteOff 메서드로 소리 발생 및 중지

SwiftUI 프로젝트인 경우 AudioKit의 유틸리티인 Keyboard(SPM에서 설치 필요)를 이용하여 키보드를 누르면 해당 메서드가 실행되도록 할 수 있습니다.

import Keyboard

struct ContentView: View {
    @StateObject var conductor = InstrumentSFZConductor()
    
    var body: some View {
        VStack {
            // ... //
            Keyboard(
                layout: .piano(pitchRange: Pitch(36)...Pitch(59)),
                noteOn: conductor.noteOn(pitch:point:),
                noteOff: conductor.noteOff(pitch:)
            )
            .frame(minWidth: 100, minHeight: 100)
        }
    }
}

문의 | 코멘트 또는 yoonbumtae@gmail.com


카테고리: Swift


0개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다