1

我正在使用下面的代码在 ios 中播放 midi 文件,但是如何循环播放歌曲?有没有像 player.loop = true 的东西?

NewMusicSequence(&mySequence);
NSURL * midiFileURL = [NSURL fileURLWithPath:midPath];
MusicSequenceFileLoad(mySequence, (__bridge CFURLRef)midiFileURL, 0, kMusicSequenceLoadSMF_ChannelsToTracks);`

NewMusicPlayer(&player);
MusicPlayerSetSequence(player, mySequence);

MusicPlayerPreroll(player);
MusicPlayerStart(player);

提前致谢。

4

2 回答 2

2

我通过为每个轨道设置循环信息来解决它。

 UInt32 tracks;


if (MusicSequenceGetTrackCount(sequence, &tracks) != noErr)


    for (UInt32 i = 0; i < tracks; i++) {
        MusicTrack track = NULL;
        MusicTimeStamp trackLen = 0;

        UInt32 trackLenLen = sizeof(trackLen);

        MusicSequenceGetIndTrack(sequence, i, &track);

        MusicTrackGetProperty(track, kSequenceTrackProperty_TrackLength, &trackLen, &trackLenLen);
        MusicTrackLoopInfo loopInfo = { trackLen, 0 };
        MusicTrackSetProperty(track, kSequenceTrackProperty_LoopInfo, &loopInfo, sizeof(loopInfo));
        NSLog(@"track length is %f", trackLen);
    }
于 2012-09-28T07:51:47.297 回答
0

如果有人在循环音乐序列并遵循 Rick Li 的说明或此处的说明时遇到问题:https : //gist.github.com/genedelisa/7b440f128db96c3ba66f,我发现 MusicTrackLoopInfo 代码仅在我的曲目持续时间为实际上足够短,以至于我有耐心坐下来听它循环。例如,我尝试在开始时单击一下来循环播放曲目,以便每秒重复一次。但持续时间单个音符的时间实际上是 100 秒,所以即使我按照上面 Rick Li 的说明设置循环,我也必须等待近两分钟才能听到它循环。我希望这可以帮助那些因无法在 iOS/AudioToolbox 中循环播放音乐序列/MIDI 轨道而感到困惑或沮丧的人。确保调用 GetProperty kSequenceTrackProperty_TrackLength 并检查您的 trackLen 是否不是某个大值,即使您确信它是一个很小的值!

于 2020-03-03T23:47:06.890 回答