在Flash中生成聲波時,我遇到以下問題。 這是發電機部分:刪除AS3中生成的聲音中未激發的點擊
const SAMPLING_RATE:int = 44100;
const TWO_PI:Number = 2 * Math.PI;
const TWO_PI_OVER_SR:Number = TWO_PI/SAMPLING_RATE;
const SAMPLE_SIZE:int = 8192/4;
function generateSine(fq:Number):ByteArray
{
var bytes:ByteArray = new ByteArray();
var sample:Number;
var amp:Number = 1;
for (var i:int=0; i<SAMPLE_SIZE; i++)
{
sample = amp* Math.sin(i * TWO_PI_OVER_SR * fq );
bytes.writeFloat(sample);
}
bytes.position = 0;
return bytes;
}
,這是播放部分:
function playbackSampleHandler(event:SampleDataEvent):void
{
var sample:Number;
for (var i:int = 0; i < SAMPLE_SIZE && soundData.bytesAvailable; i++)
{
sample = soundData.readFloat();
event.data.writeFloat(sample);
event.data.writeFloat(sample);
}
}
function onClickPlay(e:MouseEvent)
{
soundData= new ByteArray();
var sound:ByteArray= new ByteArray();
sound=generateSine(440);
soundData.writeBytes(sound,0,sound.length);
soundData.position = 0;
morphedSound.addEventListener(SampleDataEvent.SAMPLE_DATA, playbackSampleHandler);
soundChannel = morphedSound.play();
}
快速解釋: 我基本上寫爲正弦函數到ByteArray和比再現處理程序的值讀出該陣列並播放聲音。我只寫了一個8192/4採樣緩衝區。
問題: 我的問題是,當你這樣做時,在聲音結束時出現令人討厭的點擊,這是正弦波被非0值切割的僞像。所以我的問題是如何避免這種情況?
Bonus: 我也想知道如何在Flash中的緩衝區非常嚴格時(例如從2048到8192)生成正弦波100毫秒的正弦波?
鏈接: 如果它幫助我的代碼是基於本教程 http://www.bit-101.com/blog/?p=2669 和我自己的探索。
我注意到downvote,我不介意,但我不知道爲什麼有人低估了這個,因爲問題是非常詳細的包括代碼,它顯示了研究工作?如果有人指出如何更好地提出這個問題,或者如果它是重複的,請發表評論。 – PSIXO