BASS_MIDI_StreamEvent в нулевой позиции - PullRequest
0 голосов
/ 19 января 2012

Я использую BASS_MIDI при разработке iPhone. Я создаю 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);

Работает хорошо, но у меня есть одна проблема. Если положение среднего потока равно 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 голосов
/ 26 января 2012

Ответ основан на официальном форуме BASS.

Проблема в том, что ваши события переопределяются событиями в файле MIDI. Чтобы избежать этого, вы можете использовать синхронизацию BASS_SYNC_MIDI_EVENT «mixtime» для переопределения событий файла. Демонстрацию этого можно найти в примере 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.

...