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

Posted

技术标签:

【中文标题】AudioKit - 使用音序器在特定位置播放声音文件【英文标题】:AudioKit - Play sound files at specific position using sequencer 【发布时间】: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()

【问题讨论】:

【参考方案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 小时前对其进行测试时,我听不到任何声音。无论如何感谢您的帮助,我会在再次测试后将您的答案标记为正确! :)

以上是关于AudioKit - 使用音序器在特定位置播放声音文件的主要内容,如果未能解决你的问题,请参考以下文章

Audiokit:(V5)音序器无法在轨道的同一位置同时播放音符

是否可以在播放 AudioKit 音序器时修改 MusicSequnce

Swift - 带有振荡器的 AudioKit 音序器(AKOscillatorBank).频率不会在更高的范围内播放(MidiNote 120+)

AudioKit 音序器时钟

AudioKit iOS - 收到MIDINoteOn 功能

如何使用Audiokit可视化当前的AKSequencer位置?