【问题标题】:AudioKit - Play sound files at specific position using sequencerAudioKit - 使用音序器在特定位置播放声音文件
【发布时间】:2018-01-21 12:16:48
【问题描述】:

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

所以我开始的消息可能如下所示:“1100011010

--> 每一列都应该循环播放,如果它的值为"1",AudioKit 应该播放(短)high frequency 声音,如果不是,它应该播放(短)lower frequency 声音。

因为 每 0.15 秒触发一次的简单计时器循环,用于运行 0.1 秒声音(高/低).play()-函数似乎没有非常准确我决定使用*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) 播放: 变量消息="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))

我的问题:如何使用(position: AKDuration(beats: counter)) //the code from above 在特定位置播放本地声音文件,而不是像在这种情况下使用默认乐器AKSynthSnare()

【问题讨论】:

    标签: ios swift audio audiokit


    【解决方案1】:

    您可以创建两个轨道,每个轨道都带有一个 AKMIDISampler。一个播放“低”样本,另一个播放“高”样本。将高音分配到高音轨,将低音分配到低音轨。

    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: Invalid beat range CheckError.swift:CheckError:78:Error: kMIDINotPermitted: Have you enabled the audio background mode in your ios app?。你知道如何解决这个问题吗?
    • 在您项目的“功能”选项卡的“背景模式”下启用背景音频。
    • 感谢 Aurelius - kMIDI 错误已成功删除,但我仍然收到此 [seq] 1026: Invalid beat range 错误。你知道为什么吗?
    • 每次使用音序器制作新曲目时都会看到该消息,但这不是错误消息,尽管如此,一切都应该正常工作。我想我在 AudioKit Google Group 中读到它来自 CoreAudio 的某个地方。
    • 好的,感谢 c_booth 的信息。稍后我将尝试再次运行该代码,但是当我在 2 小时前对其进行测试时,我听不到任何声音。无论如何感谢您的帮助,我会在再次测试后将您的答案标记为正确! :)
    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 2020-12-28
    • 2018-10-27
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多