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

Posted

技术标签:

【中文标题】尝试在 Audiokit 中使用 AKMIDISampler 调试神秘的正弦波【英文标题】:Trying to debug mystery sinewave using AKMIDISampler in Audiokit 【发布时间】:2017-11-07 14:18:50 【问题描述】:

从previous issue 开始,我停止使用AKSampler 转而使用AKMIDISampler 中使用的功能。让我的循环再次工作(在此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()

【问题讨论】:

我发现了另一种情况,即 AVAudioUnitSampler 播放正弦波(在 ios 上)。如果您没有为背景音频设置 plist,采样器将成功加载您的样本,但仍会播放默认的正弦波。 感谢 Eric 的输入。我已经启用了背景音乐:Required background modes: App plays audio or streams audio/video using AirPlay 这是我假设的设置。我现在要调查 AVAudioUnitSampler 作为可能的来源???? 会不会来自你在***.com/questions/47335779/…中描述的节奏轨道? 感谢 Mahal,您的建议使我最终发现了这里的问题,见下文... ???? 【参考方案1】:

我找到了这个问题的原因。当我给它指定数量的 MIDI 音轨时,我了解到 MIDI 音序器正在创建一个额外的音轨。对于我的 midi 文件中的四个轨道,音序器给了我五个。这个额外的轨道是用于节奏的(如discovered here)。

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

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

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

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

【讨论】:

【参考方案2】:

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

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

或者我认为 Sounds 或“Sampler Instruments”文件夹与 Sampler Demo 中的效果一样好:

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

【讨论】:

我会试试这个以防万一。所有 mp3 实际上都在按预期加载和播放,除了它尝试的第一个(看起来像是在控制台中加载,但无法触发)...【参考方案3】:

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

AudioKit.output = sampler

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

【讨论】:

【参考方案4】:

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

//   try session.setPreferredSampleRate(preferredSampleRate)

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

【讨论】:

以上是关于尝试在 Audiokit 中使用 AKMIDISampler 调试神秘的正弦波的主要内容,如果未能解决你的问题,请参考以下文章

使用 AudioKit 从 MIDI 文件中读取音符

使用 AudioKit 播放多采样乐器,控制 ADSR 包络

有没有办法在 watchOS 上运行 AudioKit?

试图了解 AudioKit 中 AKFFTTap 的输出

Audiokit 似乎只接收前三个 sysex MIDI 消息

#AudioKit 播放音序器音频 mp3