我已经使用coreMIDI和AudioToolBox创建了音乐序列,现在想在UI中显示循环序列的当前节拍位置。如果循环只有四个节拍,我希望显示屏在1,2,3,4之间切换,并在顺序循环中返回1(非常类似于Logic Pro之类的程序的传输)。我制作了一个函数,使用MusicSequenceGetBeatsForSeconds()根据自按下播放以来经过的时间量(使用CFAbsoluteTimeGetCurrent())来计算节拍,但这会使值线性增加(在下一个显示的节拍上显示为“5.0“)。如何读取序列的当前节拍?

最佳答案

跳过跟踪消息的结尾;你不能依靠它。

而是创建一个MusicSequenceUserCallback。然后将一条轨道添加到包含用户事件的序列中。事件中的实际数据无关紧要。

var event = MusicEventUserData(length: 1, data: (0xAA))
let status = MusicTrackNewUserEvent(markerTrack, endBeat, &event)

然后在回调中查找此任意数据值,然后执行您想做的事情。
let d = eventData.memory
if d.data == 0xAA {

在Swift 2.2中,回调不能为闭包。因此,使其成为全局函数。

关于ios - 在MusicSequence中显示当前节拍位置(coreMIDI/Swift),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37061518/

10-13 04:12