Точный прослушиватель событий BPM в AS3 - PullRequest
2 голосов
/ 07 декабря 2009

Я пытаюсь синхронизировать анимацию с музыкой на конкретном BPM. Я пытался использовать таймер, но он не точен при работе с небольшими интервалами в миллисекундах. Я немного почитал и нашел альтернативный метод, который использует небольшой аудиофайл и событие SOUND_COMPLETE в качестве таймера.

Я использовал звуковой файл длиной 167 мс с этим кодом.

package
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.net.URLRequest;

    public class BetterTimer extends EventDispatcher
    {
        private var silentSound:Sound;

        public function BetterTimer(silentSoundUrl:String):void {
            super();
            silentSound = new Sound( new URLRequest(silentSoundUrl) );
            silentSound.addEventListener(Event.COMPLETE, start);
        }
        public function start():void {
            this.timerFired( new Event("start") );
        }
        private function timerFired(e:Event):void {
            dispatchEvent( new Event("fire") );
            var channel:SoundChannel = silentSound.play();
            channel.addEventListener(Event.SOUND_COMPLETE, timerFired, false, 0, true);
        }
    }
}

Это все еще не остается в ударе. Способен ли Flash Player воспроизводить звук со звуком?

Ответы [ 5 ]

5 голосов
/ 07 декабря 2009

Вы также можете использовать новый Sound API с SampleDataEvent и в основном воспроизводить свой MP3 вручную с помощью Sound.extract (). В этом случае вы заранее знаете задержку и можете даже сосчитать до выборки, когда должно произойти ваше (отложенное) событие.

Это то, что мы делаем в AudioTool , и оно работает очень хорошо.

2 голосов
/ 07 декабря 2009

Это очень сложно, чтобы получить право! Есть небольшая библиотека под названием BeatTimer , которая пытается это сделать. Я сам не пробовал этот код, но если он делает то, что утверждает, он должен быть именно тем, что вам нужно.

1 голос
/ 15 февраля 2014

Я ответил на аналогичный вопрос, развернув собственный класс Metronome. Проверьте это здесь: Лучшая синхронизация во Flash (actioncript 3)

1 голос
/ 07 декабря 2009

Может помочь установка частоты кадров так, чтобы интервал событий, кратный частоте кадров (например, 167 мс равняется 6 к / с; тогда 12, 18, 24 и т. Д. Тоже в порядке).

Если я правильно понял, лучшим решением было бы использование события enterframe. Вместо определения положения анимации путем подсчета событий рассчитайте ее, используя истекшее время (getTimer или позиция звука). Это также заставит анимацию работать на медленных компьютерах с задержкой.

0 голосов
/ 14 января 2010

Я просматривал AudioBuffer библиотеки popforge и попытался использовать один из подходов. Это создать звук синхронизации. Вот что я сделал.

var syncSamples:ByteArray = new ByteArray(); 
syncSamples.length = (2646000 / _bpm) << 1; /*44100*60=2646000*/
SoundFactory.fromByteArray(syncSamples, Audio.MONO, Audio.BIT16, Audio.RATE44100, soundInit);

Задержка мс довольно близка, например: при 120 ударов в минуту она составляет от 509 до 512 мс. Вопрос в том, иду ли я в правильном направлении?

...