【发布时间】:2018-05-05 16:01:14
【问题描述】:
在当前序列开始播放之前,需要播放 1 或 2 个小节以进行计数。只是为了播放点击计数。
能够做类似...的事情会很酷
player.sequencer.setTime(MusicTimeStamp(-4))
将时间设置为 0,不起作用。
使用 AKSequencer 进行计数的方法是什么?
【问题讨论】:
标签: audiokit
在当前序列开始播放之前,需要播放 1 或 2 个小节以进行计数。只是为了播放点击计数。
能够做类似...的事情会很酷
player.sequencer.setTime(MusicTimeStamp(-4))
将时间设置为 0,不起作用。
使用 AKSequencer 进行计数的方法是什么?
【问题讨论】:
标签: audiokit
已编辑:最初我认为您可以简单地将小节中的计数添加到现有序列的末尾,然后使用 AKCallbackInstrument 重置为适当的长度,并在零拍处发生事件,但事实证明它涉及更多。
在调用setLength() 之后,您必须调用enableLooping() 以重新建立循环行为。在底层,这涉及为底层MusicSequence 中的每个轨道调用MusicTrackSetProperty 和kSequenceTrackProperty_LoopInfo。在音序器运行时调用它会产生奇怪的副作用,即会将播放头重新定位到一个位置,该位置与原始序列末端的距离等于序列的新长度。例如,如果您有一个 20 拍序列并且您想将其动态更改为 16 拍序列,则对 enableLooping() 的调用会将播放头重新定位到第 4 拍(即 20 - 16 = 4)。然后它将播放到第 16 节,然后按预期循环。幸运的是,在进行此跳转时它不会过多地破坏时间。
然后解决方案是将序列的长度加倍并将计数放在最后。例如,如果您有一个 16 拍序列,将长度设置为 32 拍,并在第 28 拍开始计数。然后在第 0 拍,您可以调用setLength(AKDuration(beats: 16.0)) 和enableLooping(),播放头将跳转到beat 16,在新的循环行为下,实际上是 beat 0。时间并不完美,但也不错(有大约 3 毫秒的延迟,但如果你已经在使用MusicSequence 基于序列器。)
这不是一个好的解决方案,但我可以确认它有效。
【讨论】: