【问题标题】:AKSequencer Count in for one or two barsAKSequencer 计数一到两小节
【发布时间】:2018-05-05 16:01:14
【问题描述】:

在当前序列开始播放之前,需要播放 1 或 2 个小节以进行计数。只是为了播放点击计数。

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

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

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

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

【问题讨论】:

    标签: audiokit


    【解决方案1】:

    已编辑:最初我认为您可以简单地将小节中的计数添加到现有序列的末尾,然后使用 AKCallbackInstrument 重置为适当的长度,并在零拍处发生事件,但事实证明它涉及更多。

    在调用setLength() 之后,您必须调用enableLooping() 以重新建立循环行为。在底层,这涉及为底层MusicSequence 中的每个轨道调用MusicTrackSetPropertykSequenceTrackProperty_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 基于序列器。)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 2013-10-21
      • 1970-01-01
      相关资源
      最近更新 更多