【问题标题】:Struggling with Actionscript computeSpectrum and beat detection苦苦挣扎于 Actionscript computeSpectrum 和节拍检测
【发布时间】:2015-02-15 06:03:08
【问题描述】:

我试图了解从 computeSpectrum 方法返回给我的值。我想用较低的频率来挑选音轨的低音鼓。我从 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);
}

【问题讨论】:

  • 你检查过 SoundMixer.areSoundsInaccessible() 的值吗?
  • 我会立即这样做并回复。感谢您的回复,感谢您的帮助。我已经尝试过了,我的声音为我提供了价值。我确实从 readFloat 中得到了值,但根本不是我所期望的……我正在尝试捕捉正在播放的声音的较低频率并与它们一起工作……再次感谢……
  • 为了测试,你可能会使用一些你知道的固定频率的声音,比如 440Hz(参见dr-lex.be/software/testsounds.html),然后理清 actionscript 中的频谱是如何工作的。
  • 好的,我会尝试并回帖..谢谢@ptrk。

标签: actionscript-3 beat-detection


【解决方案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);
}

但这种方法只是一种估计,根本不够准确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2020-05-30
    • 2018-07-20
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多