0

我在 iPhone 开发中使用 BASS_MIDI。我从这样的文件创建 midiStream

midiStream = BASS_MIDI_StreamCreateFile(false, filePath, 0, 0, 0, 44100);

然后我播放/定位/暂停它,改变音量和速度。我在这样播放之前更改速度(用于播放速度控制)

BASS_MIDI_StreamEvent(midiStream, 0, MIDI_EVENT_TEMPO, currentTempo);//microseconds per quarter note
BASS_ChannelPlay(midiStream, false);

它工作得很好,但我有一个问题。如果 midistream 的位置为 0,则速度不会改变(音量和另一个 BASS_MIDI_StreamEvent 也不起作用)。如果像这样更改呼叫顺序

BASS_ChannelPlay(midiStream, false);
BASS_MIDI_StreamEvent(midiStream, 0, MIDI_EVENT_TEMPO, currentTempo);//microseconds per quarter note

然后我有一些延迟(播放以不正确的速度开始,它在半秒或更短的时间内改变。我该如何解决它?有没有办法在零位置播放之前调用事件?

PS对不起英语不好。

4

1 回答 1

0

Answer成立于官方BASS论坛。

问题在于您的事件被 MIDI 文件中的事件覆盖。为避免这种情况,您可以使用“mixtime”BASS_SYNC_MIDI_EVENT 同步来覆盖文件的事件。可以在 MIDITEST 示例中找到这方面的演示(从其他平台 BASSMIDI 包之一获取它)...

{ // override the initial tempo, and set a sync to override tempo events and another to override after seeking
    SetTempo(TRUE);
    BASS_ChannelSetSync(chan,BASS_SYNC_MIDI_EVENT|BASS_SYNC_MIXTIME,MIDI_EVENT_TEMPO,TempoSync,0);
    BASS_ChannelSetSync(chan,BASS_SYNC_SETPOS|BASS_SYNC_MIXTIME,0,TempoSync,0);
}

请注意,它还设置了 BASS_SYNC_SETPOS 同步,因为事件在搜索时也会重置为 MIDI 文件的值。

于 2012-01-26T09:21:34.213 回答