English: Bell-like tone generated by additive synthesis. The synethesis uses 21 inharmonic constant-frequency partials ranging from 201Hz to 3700Hz. Generated by the following C++ source code (compiled with GNU g++ version 4.5.2 with libsndfile 1.0.23.)
#include <sndfile.h>
#include <cmath>
using namespace std;
const double twopi=8*atan(1);
const int K=21;
double freqs[K]={201,337,437,453,479,501,678,885,1093, 1234, 550, 1401, 1690, 1780, 2002, 2449, 2651, 2889, 3002, 3250, 3700};
double wobbleAmt[K]={0,1,.1,.1,.1,1,.1,.2,.2, 0,0,0,0,0,0,0,0,0,0,0,0};
double wobbleFreq[K]={0,2.8,9.2,9.5,10,4.8,9,8.8,7.1, 0,0,0,0,0,0,0,0,0,0,0,0};
double wobblePhase[K]={0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0};
double ampScale[K]={-32,-34.5,-39.8,-50.2,-45.6,-35.6,-35.7,-36.3,-38.4, -45,-45,-45,-45,-45,-45,-45,-45,-50,-50,-50,-50};
double decayRate[K]={.85,.8,1,1,1,1,1.25,1.5,1.5, 4,3.5,4,4,4,4,4,5,3.5,5,6,6};
double Amplitude(int k, double t)
{
double amp=pow(2.0,ampScale[k]/6.0);
amp*=sin(wobblePhase[k])*wobbleAmt[k]+(1-wobbleAmt[k]);
amp*=exp(-t*decayRate[k]);
if (t<1) amp*=1-exp(-t*1000);
return 8*amp;
}
int main()
{
double sr=44100;
int nFrames=int(sr)*10;
double *buf = new double[nFrames];
double t=0, dt=1.0/sr;
for (int n=0; n<nFrames; n++)
{
buf[n]=0;
for (int k=0; k<K; k++)
{
wobblePhase[k]+=twopi*wobbleFreq[k]*dt;
buf[n]+=Amplitude(k,t)*sin(t*twopi*2*freqs[k]);
پ
t+=dt;
}
SF_INFO sfinfo;
sfinfo.samplerate=sr;
sfinfo.channels=1;
sfinfo.format=SF_FORMAT_WAV|SF_FORMAT_PCM_16;
SNDFILE *out = sf_open("bell.wav", SFM_WRITE, &sfinfo);
sf_writef_double(out, buf, nFrames);
sf_close(out);
delete [] buf;
return 0;
}