Ios 如何在AudioKit中呈现和导出音频?

Ios 如何在AudioKit中呈现和导出音频?,ios,swift,audio,export,audiokit,Ios,Swift,Audio,Export,Audiokit,我正在建立一个关于音乐的项目,我正在使用AudioKit框架。 AudioKit非常有用,但我现在需要导出应用程序中创建的声音 我用AKSequencer按顺序播放音符,我还对声音应用了一些过滤器,比如混响 我找到了一个从另一个音频文件导出音频的示例代码,但这不是我需要的。实际上,我需要呈现notes序列,包括过滤器,并将其导出给用户 我的代码: class Sequencer { let oscBank = AKOscillatorBank(waveform: AKTable(AKT

我正在建立一个关于音乐的项目,我正在使用AudioKit框架。 AudioKit非常有用,但我现在需要导出应用程序中创建的声音

我用AKSequencer按顺序播放音符,我还对声音应用了一些过滤器,比如混响

我找到了一个从另一个音频文件导出音频的示例代码,但这不是我需要的。实际上,我需要呈现notes序列,包括过滤器,并将其导出给用户

我的代码:

class Sequencer {

    let oscBank = AKOscillatorBank(waveform: AKTable(AKTableType.positiveReverseSawtooth))//1
    let sequencer = AKSequencer()

    init() {
        setup()
    }

    func setup() {

        // I instantiate a MIDI node with the oscillator bank to put it in the track output.
        // It makes the oscillator's filters are recognized in the track output.
        let midiNode = AKMIDINode(node: oscBank)
        _ = sequencer.newTrack()
        sequencer.tracks[0].setMIDIOutput(midiNode.midiIn)

        generateSequence()

        // Here I'm applying some filter, a reverb in this case.
        let reverb = AKReverb(oscBank)
        reverb.loadFactoryPreset(.plate)

        // The Audiokit's output may be the last filter applyed. It is working to play.
        AudioKit.output = AKMixer(reverb)
        try? AudioKit.start()
    }

    func play() {
        sequencer.play()
    }

    func stop() {
        sequencer.stop()
    }


    /// Generates some melody (Sweet Child of Mine)
    func generateSequence() {
        for _ in 0..<2 {
            sequencer.tracks[0].add(noteNumber: 62, velocity: 127, position: AKDuration(beats: 0), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 74, velocity: 127, position: AKDuration(beats: 0.5), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 69, velocity: 127, position: AKDuration(beats: 1), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 67, velocity: 127, position: AKDuration(beats: 1.5), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 79, velocity: 127, position: AKDuration(beats: 2), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 69, velocity: 127, position: AKDuration(beats: 2.5), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 78, velocity: 127, position: AKDuration(beats: 3), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 69, velocity: 127, position: AKDuration(beats: 3.5), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 62, velocity: 127, position: AKDuration(beats: 4), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 74, velocity: 127, position: AKDuration(beats: 4.5), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 69, velocity: 127, position: AKDuration(beats: 5), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 67, velocity: 127, position: AKDuration(beats: 5.5), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 79, velocity: 127, position: AKDuration(beats: 6), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 69, velocity: 127, position: AKDuration(beats: 6.5), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 78, velocity: 127, position: AKDuration(beats: 7), duration: AKDuration(beats: 0.5))
            sequencer.tracks[0].add(noteNumber: 69, velocity: 127, position: AKDuration(beats: 7.5), duration: AKDuration(beats: 0.5))
        }
    }


    // Here is my problem. I want to get the song and export it with the .wav extension exactly as it was played.
    // This code is just one of my many attempts and it also does not works.
    func saveFile() {
        guard let auxiliarPlayer = try? AKAudioPlayer(file: AKAudioFile(readFileName: "bass.wav")) else { return }
        guard let outputURL = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("audio_file.m4a") else { return }
        guard let output = try? AKAudioFile(forWriting: outputURL, settings: auxiliarPlayer.audioFile.fileFormat.settings) else { return }

        try? AudioKit.renderToFile(output, seconds: sequencer.tracks[0].length, prerender: {
            self.sequencer.play()
        })
    }
}
类序列器{
设oscBank=AKOscillatorBank(波形:AKTable(AKTableType.positiveReversesawtouth))//1
让sequencer=AKSequencer()
init(){
设置()
}
函数设置(){
//我用振荡器组实例化了一个MIDI节点,将其放入曲目输出中。
//它使振荡器的滤波器在轨道输出中被识别。
设midiNode=AKMIDINode(节点:oscBank)
_=sequencer.newTrack()
sequencer.tracks[0]。setMIDIOutput(midiNode.midiIn)
生成序列()
//这里我使用了一些滤波器,在这种情况下是混响。
让混响=AK混响(oscBank)
混响加载工厂预设(.plate)
//音频套件的输出可能是应用的最后一个过滤器。它正在工作以播放。
AudioKit.output=AKMixer(混响)
试试?AudioKit.start()
}
func play(){
音序器播放()
}
函数停止(){
sequencer.stop()
}
///产生一些旋律(我可爱的孩子)
func generateSequence(){

就我所知,由于时间问题,脱机渲染不适用于MIDI。基本上,只能渲染处理音频的东西,而不能渲染依赖MIDI的东西。我相信这与MIDI时钟保持不变和不能“加速”有关要匹配音频渲染速度。

Aurelius,您建议我们怎么做?此功能在我们的项目中是必不可少的。您没有任何建议吗?必须有人创建一个基于音频样本而不是midi时间戳的音序器才能工作。此问题是否仍未解决?我们需要在中脱机渲染midi序列我们的项目也是如此。