我使用coreMIDI和AudioToolBox创建了一个音乐序列,现在想要在UI中显示循环序列的当前节拍位置。如果循环只有四个节拍,我希望显示在1,2,3,4之间切换,并在序列循环时返回到1(就像传送程序这样的Logic Pro一样)。我已经创建了一个函数,使用MusicSequenceGetBeatsForSeconds()
来计算基于自按下游戏后经过的时间量(使用CFAbsoluteTimeGetCurrent()
)的节拍,但这会使值保持线性增加(在节拍上下一个测量显示“5.0”。如何读取序列的当前节拍?
答案 0 :(得分:2)
略过曲目结束消息;你不能依赖它。
而是创建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中,回调不能是一个闭包。所以让它成为一个全球性的功能。
答案 1 :(得分:1)
请查看MuscPlayer的MusicPlayerGetTime函数。
根据您的目的,您可以将虚拟目的地设置为MusicSequence的端点,并在其读取块中对事件进行响应。