AKSequencer 计算一两小节
AKSequencer Count in for one or two bars
在当前序列开始播放之前需要播放 1 或 2 小节进行计数。只是为了播放点击计数。
如果能做类似...的事情会很酷
player.sequencer.setTime(MusicTimeStamp(-4))
它把时间设置为0,不起作用。
使用 AKSequencer 进行计数的方法是什么?
已编辑:最初我认为您可以简单地将以小节为单位的计数添加到现有序列的末尾,然后使用 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()
,然后播放头将跳到 16 拍,在新的循环行为下,它实际上是 0 拍。时间并不完美,但也不错(有大约 3 毫秒的延迟,但如果你我已经在使用基于 MusicSequence
的音序器。)
这不是一个很好的解决方案,但我可以确认它有效。
在当前序列开始播放之前需要播放 1 或 2 小节进行计数。只是为了播放点击计数。
如果能做类似...的事情会很酷
player.sequencer.setTime(MusicTimeStamp(-4))
它把时间设置为0,不起作用。
使用 AKSequencer 进行计数的方法是什么?
已编辑:最初我认为您可以简单地将以小节为单位的计数添加到现有序列的末尾,然后使用 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()
,然后播放头将跳到 16 拍,在新的循环行为下,它实际上是 0 拍。时间并不完美,但也不错(有大约 3 毫秒的延迟,但如果你我已经在使用基于 MusicSequence
的音序器。)
这不是一个很好的解决方案,但我可以确认它有效。