在MusicSequence中显示当前节拍位置(coreMIDI / Swift)

时间:2016-05-05 22:46:45

标签: ios swift audiotoolbox coremidi

我使用coreMIDI和AudioToolBox创建了一个音乐序列,现在想要在UI中显示循环序列的当前节拍位置。如果循环只有四个节拍,我希望显示在1,2,3,4之间切换,并在序列循环时返回到1(就像传送程序这样的Logic Pro一样)。我已经创建了一个函数,使用MusicSequenceGetBeatsForSeconds()来计算基于自按下游戏后经过的时间量(使用CFAbsoluteTimeGetCurrent())的节拍,但这会使值保持线性增加(在节拍上下一个测量显示“5.0”。如何读取序列的当前节拍?

2 个答案:

答案 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的端点,并在其读取块中对事件进行响应。