AS3中的动态声音生成

时间:2014-07-15 03:18:15

标签: actionscript-3

我想通过在actionscript 3中编写代码来生成声音。我只知道我必须使用数组并将声音数据存储在其中,但我不知道我应该怎么做!

1 个答案:

答案 0 :(得分:1)

Adob​​e在这里做了相当不错的工作,看起来很复杂,但事实并非如此。 http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WSE523B839-C626-4983-B9C0-07CF1A087ED7.html

如果你想生成一个确切的音符,这段代码会这样做,noteFreq变量将是你想要播放的音符的频率,你可以在这里查看http://www.phy.mtu.edu/~suits/notefreqs.html 在这个例子中261.63 =笔记中间C. 只需根据需要调整该变量,它就会生成该注释

var noteFreq:Number = 261.63;
var generatedSound:Sound = new Sound();
generatedSound.addEventListener(SampleDataEvent.SAMPLE_DATA, sineWaveGenerator);
generatedSound.play();
function sineWaveGenerator(e:SampleDataEvent):void
{
     for (var i:int = 0; i < 8192; i++) 
     { 
          var n:Number = Math.sin((i+e.position)*noteFreq*2.0*Math.PI/44100.0);
          e.data.writeFloat(n);
     }
}

编辑: 至于你所说的数组,你可以将这些频率存储在一个数组中,然后使用相同的方法循环回数组。这个例子将播放马里奥兄弟主题曲

var generatedSound:Sound = new Sound();
var songArray:Array = [164.81,164.81,164.81,130.81,164.81,196.00,98.00];
var songIndex:int = 0;
generatedSound.addEventListener(SampleDataEvent.SAMPLE_DATA, playSong); 
generatedSound.play();

function playSong(e:SampleDataEvent):void
{
       for (var i:int = 0; i < 8192; i++) 
       {
           var n:Number = Math.sin((i+e.position)*songArray[songIndex]*2.0*Math.PI/44100.0);
           e.data.writeFloat(n); 
       }
       songIndex++;
       if(songIndex == songArray.length)
       {
           songIndex = 0;
       }
}