AudioKit - 使用音序器在特定位置播放声音文件
AudioKit - Play sound files at specific position using sequencer
我想使用 AudioKit 框架生成一些高音和低音的小声音序列。
所以我开始的消息可能看起来像这样:“1100011010
”
--> 每一列都应该循环,如果它的值为 "1"
AudioKit 应该播放一个(短)high frequency
声音,如果不是,它应该播放一个(短)lower frequency
声音.
因为 简单的定时器循环每 0.15 秒触发一次 .play()
函数 运行 发出 0.1 秒的声音( high/low) 似乎不是很准确 我决定使用 *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()
?
您可以创建两个音轨,每个音轨都有一个 AKMIDISampler。一个播放 'low' 样本,另一个播放 'high' 样本。将高音分配给高音轨,将低音音符分配给低音轨。
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)))
}
}
(我没有 运行 代码,但这样的东西应该可以工作)
我想使用 AudioKit 框架生成一些高音和低音的小声音序列。
所以我开始的消息可能看起来像这样:“1100011010
”
--> 每一列都应该循环,如果它的值为 "1"
AudioKit 应该播放一个(短)high frequency
声音,如果不是,它应该播放一个(短)lower frequency
声音.
因为 简单的定时器循环每 0.15 秒触发一次 .play()
函数 运行 发出 0.1 秒的声音( high/low) 似乎不是很准确 我决定使用 *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()
?
您可以创建两个音轨,每个音轨都有一个 AKMIDISampler。一个播放 'low' 样本,另一个播放 'high' 样本。将高音分配给高音轨,将低音音符分配给低音轨。
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)))
}
}
(我没有 运行 代码,但这样的东西应该可以工作)