在 MusicSequence 中显示当前节拍位置 (coreMIDI/Swift)
Display current beat position in MusicSequence (coreMIDI/Swift)
我使用 coreMIDI 和 AudioToolBox 创建了一个音乐序列,现在想在 UI 中显示循环序列的当前节拍位置。如果循环只有四拍,我希望显示在序列循环时在 1、2、3、4 和 return 之间切换到 1(很像在 Logic Pro 等程序的传输中)。我创建了一个函数,它使用 MusicSequenceGetBeatsForSeconds()
来根据按下播放后经过的时间量(使用 CFAbsoluteTimeGetCurrent()
)计算节拍,但这会使值保持线性增长(在节拍上下一次测量的读数显示为“5.0”)。如何读取序列的当前节拍?
改为查看 MuscPlayer 的 MusicPlayerGetTime 函数。
根据您想执行的操作,您可以将虚拟目标设置为 MusicSequence 的端点,并在其读取块中响应事件发生。
跳过曲目消息的结尾;你不能依赖它。
而是创建一个 MusicSequenceUserCallback
。然后向保存用户事件的序列添加一个轨道。事件中的实际数据并不重要。
var event = MusicEventUserData(length: 1, data: (0xAA))
let status = MusicTrackNewUserEvent(markerTrack, endBeat, &event)
然后在回调中寻找这个任意数据值并做你想做的事。
let d = eventData.memory
if d.data == 0xAA {
在Swift2.2中,回调不能是闭包。所以让它成为一个全局函数。
我使用 coreMIDI 和 AudioToolBox 创建了一个音乐序列,现在想在 UI 中显示循环序列的当前节拍位置。如果循环只有四拍,我希望显示在序列循环时在 1、2、3、4 和 return 之间切换到 1(很像在 Logic Pro 等程序的传输中)。我创建了一个函数,它使用 MusicSequenceGetBeatsForSeconds()
来根据按下播放后经过的时间量(使用 CFAbsoluteTimeGetCurrent()
)计算节拍,但这会使值保持线性增长(在节拍上下一次测量的读数显示为“5.0”)。如何读取序列的当前节拍?
改为查看 MuscPlayer 的 MusicPlayerGetTime 函数。
根据您想执行的操作,您可以将虚拟目标设置为 MusicSequence 的端点,并在其读取块中响应事件发生。
跳过曲目消息的结尾;你不能依赖它。
而是创建一个 MusicSequenceUserCallback
。然后向保存用户事件的序列添加一个轨道。事件中的实际数据并不重要。
var event = MusicEventUserData(length: 1, data: (0xAA))
let status = MusicTrackNewUserEvent(markerTrack, endBeat, &event)
然后在回调中寻找这个任意数据值并做你想做的事。
let d = eventData.memory
if d.data == 0xAA {
在Swift2.2中,回调不能是闭包。所以让它成为一个全局函数。