我想通过在actionscript 3中编写代码来生成声音。我只知道我必须使用数组并将声音数据存储在其中,但我不知道我应该怎么做!
答案 0 :(得分:1)
Adobe在这里做了相当不错的工作,看起来很复杂,但事实并非如此。 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;
}
}