4

继上一期之后,我停止使用AKSampler,转而使用AKMIDISampler. 让我的循环再次工作(在此Google Groups 帖子的帮助下),但我正在播放正弦波(当 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()
4

4 回答 4

2

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

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

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

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

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

于 2017-11-17T22:01:59.270 回答
1

这有点猜测,但将音频文件放在采样器喜欢的位置是一个非常常见的问题。尝试将音频文件放在 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

于 2017-11-16T18:01:04.330 回答
1

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

AudioKit.output = sampler

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

于 2018-03-11T06:23:23.240 回答
0

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

//   try session.setPreferredSampleRate(preferredSampleRate)

在 AppDelegate for Audio Session 中...而不是在 AudioKit AKSettings 中设置它,它将产生神秘的正弦波 midi 合成器...

于 2018-06-12T01:11:11.273 回答