Ios 音频套件-使用音序器在特定位置播放声音文件

Ios 音频套件-使用音序器在特定位置播放声音文件,ios,swift,audio,audiokit,Ios,Swift,Audio,Audiokit,我想使用AudioKit框架生成一些高低声音的小声音序列 所以我首先要说的是这样的信息:1100011010“ -->每列都应循环播放,如果其值为“1”AudioKit应播放(短)高频声音,如果不是,则应播放(短)低频声音 因为一个简单的计时器循环每0.15秒触发一次.play()-函数来运行0.1秒的声音(高/低)似乎不是很准确,我决定使用*AudioKit Sequencer*: (o) 音频套件: enum Sequence: Int { case snareDrum } var

我想使用AudioKit框架生成一些高低声音的小声音序列

所以我首先要说的是这样的信息:
1100011010

-->每列都应循环播放,如果其值为“1”AudioKit应播放(短)
高频
声音,如果不是,则应播放(短)
低频
声音

因为一个简单的计时器循环每0.15秒触发一次
.play()
-函数来运行0.1秒的声音(高/低)似乎不是很准确,我决定使用
*AudioKit Sequencer*

(o) 音频套件:

enum Sequence: Int {
    case snareDrum
}
var snareDrum = AKSynthSnare()
var sequencer = AKSequencer()
var pumper: AKCompressor?
var mixer = AKMixer()

public init() {
    snareDrum >>> mixer
    pumper = AKCompressor(mixer)

    AudioKit.output = pumper
    AudioKit.start()
}

func setupTracks() {
    _ = sequencer.newTrack()
    sequencer.tracks[Sequence.snareDrum.rawValue].setMIDIOutput(snareDrum.midiIn)
    generateMessageSequence()

    sequencer.enableLooping()
    sequencer.setTempo(2000)
    sequencer.play()
}    

(o) 播放: var message=“1100011010” 变量计数器=0

for i in message {
  counter+=0.15
  if (i=="1") {
   // play high sound at specific position 
  }
  else {
   // play low sound at specific position
  } 
}

(o) 在特定位置播放低声:

 sequencer.tracks[Sequence.snareDrum.rawValue].add(noteNumber: 20,
                                                   velocity: 10,
                                                   position: AKDuration(beats: counter),
                                                   duration: AKDuration(beats: 1))


我的问题:如何使用
(位置:AKDuration(beats:counter))//上面的代码而不是像本例中那样使用默认乐器
AKSynthSnare()
,在特定位置播放本地声音文件

您可以创建两个轨迹,每个轨迹都有一个采样器。一个播放“低”样本,另一个播放“高”样本。将高音指定给高音,将低音指定给低音

let sequencer = AKSequencer()
let lowTrack = sequencer.newTrack()
let lowSampler = AKMIDISampler()
try! lowSampler.loadWav("myLowSoundFile")
lowTrack?.setMIDIOutput(lowSampler.midiIn)

let highTrack = sequencer.newTrack()
let highSampler = AKMIDISampler()
try! highSampler.loadWav("myHighSoundFile")
highTrack?.setMIDIOutput(highSampler.midiIn)

sequencer.setLength(AKDuration(beats: 4.0))
sequencer.enableLooping()
然后为每个音轨指定高音和低音

let message = "1100011010"
let dur = 4.0 / Double(message.count)
var position: Double = 0
for i in message {
  position += dur

  if (i == "1") {
   highTrack?.add(noteNumber: 60, velocity: 100, position: AKDuration(beats: position), duration: AKDuration(beats: dur * (2/3)))
  } else {
   lowTrack?.add(noteNumber: 60, velocity: 100, position: AKDuration(beats: position), duration: AKDuration(beats: dur * (2/34)))
  } 
}

(我还没有运行代码,但类似的东西应该可以工作)

感谢您的快速回答c_booth。您的代码看起来非常好且符合逻辑-但使用您的代码会产生以下错误消息:
[seq]1026:无效的节拍范围检查错误。swift:CheckError:78:错误:kmidiot允许:您是否在ios应用程序中启用了音频背景模式?
。您知道如何修复此问题吗?在项目的“功能”选项卡中的“背景模式”下启用背景音频。感谢Aurelius-kMIDI错误已成功删除,但我仍然收到此
[seq]1026:无效的节拍范围
错误。你知道为什么吗?每次你用sequencer制作新曲目时都会看到这条消息,但这不是错误消息,尽管如此,一切都应该正常工作。我想我在谷歌的AudioKit组中读到它来自CoreAudio的某个地方。好的,谢谢你提供的信息c_booth。稍后我将尝试再次运行代码,但当我在2小时前测试它时,我听不到任何声音。无论如何,谢谢你的帮助,我会在再次测试后将你的答案标记为正确的!:)