尝试在 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 播放多采样乐器,控制 ADSR 包络