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+)