【发布时间】:2012-08-10 00:39:55
【问题描述】:
我正在通过MusicPlayer 播放一个 MIDI 序列,我从一个 MIDI 文件加载它,我想在播放时将序列更改为另一个序列。
当我尝试这个时:
MusicPlayerSetSequence(_player, sequence);
MusicSequenceSetAUGraph(sequence, _processingGraph);
它会停止播放。所以我重新开始并设置时间
MusicPlayerSetTime(_player, currentTime);
所以它会在前一个序列停止的地方再次播放,但会有一点延迟。
我尝试将时间间隔添加到currentTime,这是通过获取停止前和重新开始后的时间得到的。但仍有延迟。
我想知道是否有替代停止 -> 更改顺序 -> 重新开始。
【问题讨论】:
-
嘿——你放弃了合并音轨的方法吗?我终于找到了一些时间让它工作。你的文件有点躲闪——不知道为什么。这是一个示例,其中一个 midi 文件/sf2 + 我周围的一个随机 midi/sf2 (dl.dropbox.com/u/34715839/MusicPlayerTracksFromFiles.zip) - 干杯
-
哦 - 在设置轨道循环时,该文件中有一个错误:使用的
trackLen值来自 sourceTrack。在设置循环长度之前,应从目标轨道重新计算此值。此外,发现 simpletest.mid 文件的奇怪之处在于它有 2 个轨道 - 第一个是空的 - 所以复制该轨道 == 静音。 -
不,我没有,我已经为自己找到了解决方案,并在那里做出了另一个答案 (stackoverflow.com/questions/11706042)。但无论如何,谢谢,我相信你的代码会帮助我优化我的。我仍在试图弄清楚你是如何循环序列的,因为它没有在正确的时间循环。我愿意 -
if (time >=trackLen) MusicPlayerSetTime(_player, 0); -
没关系,我明白了:你设置了属性
kSequenceTrackProperty_LoopInfo。但这对我不起作用,因为 midi 长度总是像 3.89 或 5.92,所以我实际上是if (time >=ceil(trackLen)) -
所以设置轨道节点只有在为序列设置 AUGraph 之后才有效 - 有意义。 @looping - 你可能发现了这一点,但每个轨道都是独立循环的。如果所有曲目的长度相同,这不是问题,但如果不是,事情可能会不同步。在最长的轨道上使用 NSTimer 是可行的——听起来你正在这样做。 - 干杯。
标签: objective-c ios xcode core-audio coremidi