Я получаю ошибку во время выполнения AudioKit SamplerDeomo для iOS, которая говорит: «Поток 10: EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0)» - PullRequest
0 голосов
/ 20 марта 2019

Я получаю ошибку во время выполнения AudioKit SamplerDeomo для iOS, которая говорит: «Поток 10: EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0)».

Ошибка возникает в этой строке объявления в классе UIViewController:

let conductor = Conductor()

ViewController - это класс начального контроллера представления.

Вот код для класса Conductor:

import AudioKit

enum Synthesizer {
    case arpeggio, pad, bass
}

enum Instrument {
    case arpeggio, pad, bass, drum
}

enum Sound: String {
    case square, saw, pad, noisy
}

class Conductor {
    private var sequencer: AKSequencer!
    private var mixer = AKMixer()
    private var arpeggioSynthesizer = AKMIDISampler()
    private var padSynthesizer = AKMIDISampler()
    private var bassSynthesizer = AKMIDISampler()
    private var drumKit = AKMIDISampler()
    private var filter: AKMoogLadder?

    init() {
        mixer = AKMixer(arpeggioSynthesizer, padSynthesizer, bassSynthesizer, drumKit)

        filter = AKMoogLadder(mixer)
        filter?.cutoffFrequency = 20_000
        AudioKit.output = filter

        do {
            useSound(.square, synthesizer: .arpeggio)
            useSound(.saw, synthesizer: .pad)
            useSound(.saw, synthesizer: .bass)
            try drumKit.loadEXS24("Sounds/Sampler Instruments/drumSimp")
        } catch {
            AKLog("A file was not found.")
        }
        do {
            try AudioKit.start()
        } catch {
            AKLog("AudioKit did not start!")
        }

        sequencer = AKSequencer(filename: "seqDemo")
        sequencer.enableLooping()
        sequencer.tracks[1].setMIDIOutput(arpeggioSynthesizer.midiIn)
        sequencer.tracks[2].setMIDIOutput(bassSynthesizer.midiIn)
        sequencer.tracks[3].setMIDIOutput(padSynthesizer.midiIn)
        sequencer.tracks[4].setMIDIOutput(drumKit.midiIn)

        sequencer.play() // ERROR OCCURS HERE !!!
    }

    func adjustVolume(_ volume: Double, instrument: Instrument) {
        let vol = volume * 2.0 // useful for gain
        switch instrument {
        case .arpeggio:
            arpeggioSynthesizer.volume = vol
        case .pad:
            padSynthesizer.volume = vol
        case .bass:
            bassSynthesizer.volume = vol
        case .drum:
            drumKit.volume = vol
        }
    }

    func adjustFilterFrequency(_ frequency: Float) {
        let value = Double(frequency)
        filter?.cutoffFrequency = value.denormalized(to: 30 ... 20_000, taper: 3)
    }

    func playSequence() {
        sequencer.play()
    }

    func stopSequence() {
        sequencer.stop()
    }

    func rewindSequence() {
        sequencer.rewind()
    }

    func setLength(_ length: Double) {
        AKLog("Setting Length \(length)")
        sequencer.setLength(AKDuration(beats: 16))
        for track in sequencer.tracks {
            track.resetToInit()
        }
        sequencer.setLength(AKDuration(beats: length))
        sequencer.setLoopInfo(AKDuration(beats: length), numberOfLoops: 0)
        sequencer.rewind()
    }

    func useSound(_ sound: Sound, synthesizer: Synthesizer) {
        var path = "Sounds/Sampler Instruments/"
        switch sound {
        case .square:
            path += "sqrTone1"
        case .saw:
            path += "sawPiano1"
        case .pad:
            path += "sawPad1"
        case .noisy:
            path += "noisyRez"
        }

        do {
            switch synthesizer {
            case .arpeggio:
                try arpeggioSynthesizer.loadEXS24(path)
            case .pad:
                try padSynthesizer.loadEXS24(path)
            case .bass:
                try bassSynthesizer.loadEXS24(path)
            }
        } catch {
            AKLog("Could not load EXS24")
        }
    }

    func adjustTempo(_ tempo: Float) {
        sequencer?.setRate(Double(tempo))
    }
}

Ошибка возникает в методе init в самом конце, когда запускается строка "sequencer.play ()".

Вот скриншот Xcode, показывающий ошибку времени выполнения:

enter image description here

...