【问题标题】:Deleting tempo events from AKSequencer从 AKSequencer 中删除速度事件
【发布时间】:2018-08-25 17:44:18
【问题描述】:

我需要从 AKSequencer 实例中删除所有速度事件,但我找不到执行此操作的方法。

我尝试使用如下所示的 clearRange() 方法,但我不确定它是否正确,因为它不起作用:

var sequencer = AKSequencer()

// successfully adding a few tempo events with addTempoEventAt(tempo bpm: Double, position: AKDuration)

...

// trying to remove them

let sequenceLength = sequencer.length
sequencer.clearRange(start: AKDuration(beats: 0.0), duration: sequenceLength)

我有什么遗漏吗?

【问题讨论】:

  • 你得到了什么行为,你真正期待什么行为?
  • 我需要按顺序重新排列具有不同速度和拍号的小节,所以我要做的是删除所有速度事件并以新顺序重新添加它们。但是,正如@c_booth 所说,使用 clearRange() 实际上不会删除速度事件,所以我最终得到了旧的速度事件和新的速度事件。

标签: audiokit aksequencer


【解决方案1】:

不幸的是,clearRange() 删除了音符事件和元事件,但是,正如您所观察到的,它确实删除了速度事件(下一版本的文档将明确说明这一点 - 感谢您了解这一点) . AKSequencer 有一个私有的clearTempoEvents 方法,由setTempo() 方法内部调用,因此您可以使用setTempo() 清除所有现有的速度事件。当然,在移除现有的速度事件后,这也会在序列的开头添加一个新的速度事件,其中包含您作为参数包含的速度。

所以它不会完全给你一个没有节奏事件的序列——但是一个序列需要一个节奏并且没有节奏事件它会默认为 120——所以强迫你明确说明起始节奏并不是这样的坏事。无论如何,除非你真的需要绝对没有速度事件,否则setTempo() 应该可以清除序列中所有现有的速度事件。

【讨论】:

  • 谢谢,这正是我一直在寻找的,但现在我在想:如果您只需要删除序列中间的一个速度事件怎么办?唯一的方法是删除所有速度事件并重新添加它们而不是不需要的?
  • 基本正确,除非您想直接开始使用 CoreMIDI 的 C API。如果需要,您可以提出关于删除单个事件的功能请求 - 但实现它的最简洁方法仍然可能涉及 1) 遍历速度轨道以获取当前速度事件的记录 2) 清除现有事件,3 ) 重新插入旧事件,过滤掉不需要的事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2011-10-18
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
相关资源
最近更新 更多