AKSequencer计入一个或两个小节

时间:2018-05-05 16:01:15

标签: audiokit

在当前序列开始播放之前需要播放1或2个小节以进行计数。只需点击一下即可计入。

能够做类似......的事情会很酷。

 player.sequencer.setTime(MusicTimeStamp(-4))

它将时间设置为0,不起作用。

使用AKSequencer进行计数的方法是什么?

1 个答案:

答案 0 :(得分:4)

编辑:最初我认为你可以简单地在现有序列的末尾添加条形数,然后使用AKCallbackInstrument将事件重置为正确的长度,事件在零拍,但事实证明它更多涉及。

在对setLength()进行任何调用后,您必须致电enableLooping()以重新建立循环行为。在幕后,这涉及为基础MusicTrackSetProperty中的每个曲目调用kSequenceTrackProperty_LoopInfo MusicSequence。在音序器运行时调用此方法会产生奇怪的副作用,即将播放头重新定位到距离原始序列末尾的距离等于序列的新长度的位置。因此,例如,如果你有一个20拍的序列并且你想要将它动态地改为16拍序列,那么对enableLooping()的调用将把播放头重新定位到4(即20-16 = 4)。然后它将播放到击败16,然后按预期循环。幸运的是,在进行此跳转时,它不会过多地破坏时间。

然后解决方案是将序列的长度加倍并将计数放在最后。例如,如果你有一个16拍的序列,将长度设置为32次,并在节拍28的事件中开始计数。然后在节拍0,你可以拨打setLength(AKDuration(beats: 16.0))enableLooping(),然后播放头会跳到16,在新的循环行为下,有效地击败了0.时机并不完美,但也不错(延迟时间约为3毫秒,但这可能不是一个交易破坏者,如果你'已经使用基于MusicSequence的音序器。)

这不是一个好的解决方案,但我可以确认它有效。