Борьба с ActionScript, вычисляющим спектр и обнаруживающим ритмы

Я пытаюсь понять значения, возвращаемые мне из метода calculateSpectrum. Я хочу работать с более низкими частотами, выделяя бас-барабан в треке. Числа, которые я получаю из byteArray, не имеют смысла. Например, он говорит, что значение равно 0, когда явно воспроизводится звук. Чего мне здесь не хватает... Я знаю, что обнаружение ударов не так просто, и я просмотрел большинство сообщений здесь по этому вопросу... Просто числа, которые мне возвращаются, не имеют смысла, может кто-нибудь объяснить их меня? Заранее спасибо.

Мой код:

import flash.display.Graphics;
import flash.events.Event;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
import flash.net.URLRequest;
import flash.display.MovieClip;

var snd: Sound = new Sound();
var req: URLRequest = new URLRequest("mySong.mp3");
snd.load(req);

var channel: SoundChannel;
channel = snd.play();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);

const CHANNEL_LENGTH: int = 256;
const BUFFER_LENGTH: int = 512;

var bytes:ByteArray = new ByteArray();

function onEnterFrame(event: Event): void 
{

  SoundMixer.computeSpectrum(bytes, true, 0);


  for (var i:int = 0; i < CHANNEL_LENGTH; i++) // channel_length = 256
  {


      var sampleValue:Number = bytes.readFloat() * 200;
      var byteArrayIndex = bytes.position;
      trace(byteArrayIndex, sampleValue);

  }
}

function onPlaybackComplete(e:Event):void
{
    removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}

person Joxer    schedule 16.12.2014    source источник
comment
Вы проверили значение SoundMixer.areSoundsInaccessible()?   -  person ptrk    schedule 16.12.2014
comment
Я сделаю это немедленно и отпишусь. Спасибо за ответ, я ценю помощь. Я пробовал это, и мои звуки дают мне значения. Я получаю значения из readFloat, но совсем не то, что я ожидал. Я пытаюсь уловить более низкие частоты воспроизводимого звука и работать с ними.. еще раз спасибо..   -  person Joxer    schedule 16.12.2014
comment
Для тестирования вы можете использовать звуки известной вам фиксированной частоты, скажем, 440 Гц (см. dr. -lex.be/software/testsounds.html) и разобраться, как работает спектр в actionscript.   -  person ptrk    schedule 16.12.2014
comment
Хорошо, я попробую это и отпишусь .. спасибо @ptrk.   -  person Joxer    schedule 16.12.2014


Ответы (1)


Приятно снова встретиться с вами, думаю, на этот раз я лучше вас понимаю.

Если вы собираетесь проверить, существует ли «бит» в определенное время песни; Я могу предложить этот метод для справки:

import flash.events.Event;

var snd: Sound = new Sound();
var req: URLRequest = new URLRequest("mySong.mp3");
snd.load(req);

var channel: SoundChannel;
channel = snd.play();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);


// I want to specify which region of byteData is passing to my check function.
// this two value help me to extract the sample I need.
var checkLength:int = 20; 
var checkStart:int = 0; 
var theshold:Number = 0.5; // How big the value should I determine it is the 'beat'.

const CHANNEL_LENGTH: int = 256;
const BUFFER_LENGTH: int = 512;

var myArray:Array;
var bytes:ByteArray = new ByteArray();

function onEnterFrame(event: Event): void 
{

    SoundMixer.computeSpectrum(bytes, true, 0);

    myArray = [];
   for (var i:int = checkStart; i < checkLength; i+=8) // extract the sample
   {
     var sampleValue:Number = bytes.readFloat();
       myArray.push(sampleValue);
   }
   if( CheckBeat( myArray ))
   {
       trace("here maybe a beat!!", getTimer());
   }
}

function CheckBeat(valueArray:Array):Boolean  // check the whether 'beat' exist
{
    var meanValue:Number = valueArray[0];
    for(var i:int = 1; i < valueArray.length; i++)
    {
        meanValue = (meanValue + valueArray[i])/2;
    }
    return meanValue > theshold;
}

function onPlaybackComplete(e:Event):void
{
    removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}

Но этот метод является всего лишь оценкой и совсем не точен.

person user3711105    schedule 17.12.2014