音は、さまざまな周波数の無限の数の波として表すことができます
および振幅。 波は、ほぼすべての形状を持つことができます。
最も一般的で最も頻繁に使用されるもののうち、正弦波(正弦)、正方形(正方形)、のこぎり(のこぎり)、三角形(三角形)、ノイズ(ノイズ)の名前を付けることができます。 まず、波の基本的なパラメーターである周期と振幅を理解してみましょう。
周波数(ヘルツで測定)は、1秒あたりの周期数です。 たとえば、周波数が44100Hzの場合、周期の数は44100です。基本的な用語が研究されたので、波生成アルゴリズムに直接進みます。
1)サイン波
float samplerate; //
float wavefrequency; //
float wavevolume; //
float period=samplerate/wavefrequency/2; //
float pi=3.14; // pi
int n;
for(int a=0;a<samplelenght;a++) //
{
n=wavevolume*sin(a*pi/period); // sine-
buffer[a]=n; //
}
たとえば、周波数が1000Hzの16キロバイトの正弦波音を取得する必要があり、サンプル品質は44100Hzである必要があります。パラメーターは次の値になります。samplerate= 44100、wavefrequency = 1000、samplelenght = 16384。
wavevolumeパラメーターには特別な説明が必要です。 音質はそのビットレート(8ビット、16ビット、24ビットなど)に比例して依存することが長い間知られています。 8ビットの場合-0から255の値、16から0の場合... 65536、24から0の場合... 16777216 どちらを選ぶべきですか? それはあなたのタスクに依存しますが、16未満をお勧めしません(ただし、品質と引き換えにサンプルの量を減らす必要がある場合は例外があります)。
2)のこぎり波(のこぎり)
float sr_2m=samplerate/wavefrequency; //
int c=0; //
//
for(int a=0;a<samplelenght;a++) //
{
if(c>=sr_2m) c=0; // ,
buffer[a]=wavevolume*(c/period)-wavevolume; //
c++;
}
3)三角形(三角形)
float period=samplerate/wavefrequency/2; //
int c=period*2;
int c2=-1;
float sr_2m=period;
float sr=samplerate/wavefrequency/4;
for(int a=0;a<samplelenght;a++)
{
if(c>sr_2m) c=sr_2m,c2=-1;
if(c<0) c=0,c2=1;
buffer[a]=wavevolume*(c/sr)-wavevolume;
c+=c2;
}
4)ノイズ
srand(wavevolume);
s1=mv.samplerate/wor,psc=s1+1,wov>>=7;
if(tabcnt==0)
{
for(ps=0;ps<mv.samplelenght;ps++)
{
if(psc>s1)
{
psc-=s1;
n=256*((rand()%(wov+1))-wov/2);
}
buffer[ps]=n;
psc++;
}
}
ここでタスクを複雑にします-異なる周波数と振幅の2つの波を追加します。
...
char buffer[16384];
float tone1=65,tone2=131;
float samplerate=44100/2; //
int a,b,amp1=128,amp2=64;
for(a=0;a<16384;a++)
{
b=amp1*sin(a*pi/samplerate/tone1)+amp2*sin(a*pi/samplerate/tone2);
if(b>128) b=128;
if(b<-128) b=-128;
buffer[a]=b;
}
...
このようなサンプルを使用すると、すでにメロディを作成できます。 原則として、これは波の基礎です
任意のサウンドを作成できる合成。
最後に、いくつかのヒント:
1)より豊かなサウンドを得るには、異なる波を追加します
フォーム:サイン+スクエア、トライアングル+ソー、またはこのようなモンスター:ソー+スクエア+
三角形+のこぎり。
2)パーカッション(ハット)は、ノイズ+正弦波を追加することで最適に得られます。