零位的BASS_MIDI_StreamEvent

时间:2012-01-19 08:57:27

标签: iphone audio midi bass

我在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

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

P.S。抱歉英语不好。

1 个答案:

答案 0 :(得分:0)

答案是建立在特殊的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文件的值。