尝试使用 Audiokit 中的 AKMIDISampler 调试神秘的正弦波

Trying to debug mystery sinewave using AKMIDISampler in Audiokit

, I stopped using AKSampler to move to the functionality used in AKMIDISampler. Got my loops working again (with help from this Google Groups post 开始),但我正在播放正弦波(当 MIDISampler 找不到它的源文件时会发生这种情况)。

这不是我定位的源文件的问题,因为它们都可以正常播放。正弦波在此过程中来自其他地方,但我看不到哪里...

请帮忙 8•)

(经过简化和编辑的代码仅显示相关详细信息 - 如有任何疑问,请联系我们)

var MIDISamplePlayer = AKMIDISampler()
var sequencer: AKSequencer?
var mixer: AKMixer!

// initialise the mixer
mixer = AKMixer()

do  {
        audiofile = try AKAudioFile(readFileName: SoundFilename as! String, 
        baseDir: .resources)
    } catch let error as NSError {
        print("There's an error: \(error)")
    }

do {
       try sprite.MIDISamplePlayer.loadAudioFile(audiofile)
    } catch let error as NSError {
       print("There's an error: \(error)")
    }

sprite.tracker = AKAmplitudeTracker(sprite.MIDISamplePlayer)
mixer.connect(to:sprite.tracker, bus: mixer.nextInput.bus)

sequencer = AKSequencer(filename: POPmidi)
sequencer?.enableLooping()

let midi = AKMIDI()

for i in 0..<popCount {
    gPOPs[i].MIDISamplePlayer.enableMIDI(midi.client, name: "MIDISample_\(i)")
    mixer.connect(gPOPs[i].MIDISamplePlayer)
    sequencer!.tracks[i].setMIDIOutput(gPOPs[i].MIDISamplePlayer.midiIn)
}

AudioKit.start()
sequencer!.play()

这是一个猜测,但将音频文件放在采样器喜欢的位置是一个非常常见的问题。尝试将音频文件放在 Samples/ 文件夹中,如下例所示:

http://audiokit.io/playgrounds/Playback/Sequencer/ http://audiokit.io/playgrounds/Playback/Sampler/

或者我认为 Sounds 或 "Sampler Instruments" 文件夹与采样器演示中的效果一样好:

https://github.com/AudioKit/AudioKit/tree/master/Examples/iOS/SamplerDemo/SamplerDemo/Sounds

我找到了这个问题的原因。当我给它一个特定数量的 MIDI 音轨时,我了解到 MIDI 音序器正在创建一个额外的音轨;对于我的 MIDI 文件中的四个轨道,音序器给了我五个。这个额外的曲目用于速度(如 )。

我还了解到我的第一首曲目在我的 .plist 中被忽略了(我在其中为不同的歌曲设置了词干)。

我假设第一条轨道用于速度轨道的假设已经过测试,当我在我的 .plist 中创建五个轨道以匹配音序器时,正弦波音调消失了。

这导致了一个变通办法。我通过复制我的 .plist 中的第一个样本来做到这一点,无论如何它都被忽略了,然后将代表这个声音的精灵隐藏在屏幕之外。这目前有效,但如果有人知道如何控制这个速度轨道及其在 AKSequencer 中的使用,我很想知道更多。

简而言之: 确保 MIDI 文件具有您要使用的确切轨道数。创建与 AKSequencer 中使用的相同数量的 AKMIDISampler 添加一个用于速度轨道。然后注意音序器中的第一条轨道是速度轨道,无法播放样本。

我的代码中也有一个神秘的正弦波。在我的情况下,事实证明我额外出现了以下代码:

AudioKit.output = sampler

所以我不小心指定了两次 AudioKit.output。去除多余的出现后,正弦波消失了。我不确定这是如何导致正弦波的,但我将这个答案留在这里以防它帮助其他可能有类似问题的人。

获得这个神秘正弦波的另一种方法是使用常规方法设置 preferredSampleRate

//   try session.setPreferredSampleRate(preferredSampleRate)

在用于音频会话的 AppDelegate 中... 而不是在 AudioKit AKSettings 中设置它,它会产生神秘的正弦波 midi 合成器...