Audiokit AKSampler как AKNode / AKPolyphonicNode в отдельном классе - PullRequest
1 голос
/ 07 мая 2020

Как я могу выделить AKSampler в класс? Например:

SoundEngine.swift

import AudioKit
import MySampler

final class SoundEngine : ObservableObject {
    static let shared = SoundEngine()
    let mySampler = MySampler()

    init() {
        mySampler.loadSamples('samples1')
        AudioKit.output = AKMixer(noise1, noise2, mySampler)
        try AudioKit.start()

        mySampler.play(note: 60, vel: 127)
    }

MySampler.swift

import Foundation
import AudioKit

class MySampler : AKPolyphonicNode {
    var mySampler1 = AKSampler()

    func play(note: MIDINoteNumber, vel: MIDIVelocity) {
        mySampler1.play(noteNumber: note, velocity: velocity)
    }

}

К сожалению, он не работает с обоими AKNode или AKPolyphonicNode подобными в примере выше: Terminating app due to uncaught exception ‘com.apple.coreaudio.avfaudio’, reason: ‘required condition is false: node != nil’

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

Для SoundEngine.swift:

import AudioKit

final class SoundEngine {

    static let shared = SoundEngine()

    // Create instance variables of the MySampler objects.
    // I renamed them from noise1, noise2, and mySampler1, so that they are descriptive and clear about the intended sounds from each MySampler object.
    var kick: MySampler
    var snare: MySampler
    var hiHat: MySampler

    var drumMixer: AKMixer

    init() {

        // Instantiate MySampler objects
        kick = MySampler()
        snare = MySampler()
        hiHat = MySampler()

        // These drum samples are royalty-free from Music Radar: https://www.musicradar.com/news/drums/1000-free-drum-samples
        kick.loadSample(filePath: "CYCdh_K2room_Kick-08")
        snare.loadSample(filePath: "CYCdh_K2room_Snr-05")
        hiHat.loadSample(filePath: "CYCdh_K2room_ClHat-06")

        // Initialize the AudioKit engine settings.
        AKSettings.bufferLength = .medium
        AKSettings.enableRouteChangeHandling = true
        AKSettings.playbackWhileMuted = true

        do {
            try AKSettings.setSession(category: .playAndRecord, with: [.defaultToSpeaker, .allowBluetooth, .mixWithOthers])
        } catch {
            AKLog("Could not set session category.")
        }

        // Combine the samples into a mixer, so that they can be played together in a single output.
        drumMixer = AKMixer(snare, kick, hiHat)
        AudioKit.output = drumMixer

        // Start the audio engine
        try! AudioKit.start()

    }

    // MARK: Sample Playback Triggers

    // The following functions can be triggered via the button actions from the ViewController.
    internal func playKick() {
        try! kick.play(noteNumber: 60, velocity: 127, channel: 0)
    }

    internal func playSmare() {
        try! snare.play(noteNumber: 60, velocity: 127, channel: 0)
    }

    internal func playHiHat() {
        try! hiHat.play(noteNumber: 60, velocity: 127, channel: 0)
    }

}

Для MySampler.swift:

import AudioKit

class MySampler: AKMIDISampler {

    internal func loadSample(filePath: String) {
        do {
            try self.loadWav(Constants.sampleDirectoryPath + filePath)
            // This will interpolate a string variable path like this: "Sounds/CYCdh_K2room_Kick-08"
        } catch {
            print("Could not locate the wav file.")
        }
    }
}

Я также добавил константу, чтобы вы могли просто указать имя аудиофайла и не обязательно указывать путь к каталогу.

Constants.swift:

struct Constants {

    static let sampleDirectoryPath = "Sounds/"

}

Я создал проект GitHub для вашей справки:

https://github.com/markjeschke/AudioKitSamplerClass

2 голосов
/ 08 мая 2020

Простой ответ на ваш «Что я делаю не так?» Это то, что вы инициировали второй семплер, который является частью вашего класса MySampler, который воспроизводится, но не подключен к цепочке сигналов. Конечно, его родительский элемент находится в AKMixer, но это не означает, что в нем будет какое-то случайное свойство. Возможно, какой-нибудь другой приятный человек опубликует проект GitHub с более подходящим примером.

...