00001
00002 #include "Synth.h"
00003 #include <cmath>
00004 #include <algorithm>
00005
00006 using namespace std;
00007
00008 #define PI 3.1415926535897932384626433832795
00009
00010 CSynthBuffer::CSynthBuffer() : m_nSampleRate(0)
00011 {
00012 }
00013
00014 CSynthBuffer::CSynthBuffer(int nSampleRate, int nSamples)
00015 {
00016 CreateBuffer(nSampleRate, nSamples);
00017 }
00018
00019 CSynthBuffer::CSynthBuffer(const CSynthBuffer* toMix, int nCount)
00020 {
00021 double dMul = 1.0 / (double)nCount;
00022 m_samples.resize(toMix[0].m_samples.size(), 0.0);
00023 m_nSampleRate = toMix[0].m_nSampleRate;
00024
00025 int nSize = m_samples.size();
00026 for (int i = 0; i < nSize; ++i)
00027 for (int j = 0; j < nCount; ++j)
00028 m_samples[i] += toMix[j].m_samples[i] * dMul;
00029 }
00030
00031 void CSynthBuffer::CreateBuffer(int nSampleRate, int nSamples)
00032 {
00033 m_samples.resize(nSamples, 0.0);
00034 m_nSampleRate = nSampleRate;
00035 }
00036
00037 void CSynthBuffer::FillDB(int nStart, int nCount, double dDB)
00038 {
00039 double dAbs = pow(2, dDB/6.0);
00040 FillAbs(nStart, nCount, dAbs);
00041 }
00042
00043 void CSynthBuffer::FillAbs(int nStart, int nCount, double dAbs)
00044 {
00045 fill(m_samples.begin() + nStart,
00046 m_samples.begin() + nStart + nCount,
00047 dAbs);
00048 }
00049
00050 void CSynthBuffer::Sinus(int nStart, int nCount,
00051 double dStartFreq, double dEndFreq,
00052 double dDB)
00053 {
00054 double dMul = pow(2, dDB/6.0);
00055 double dRange = (double)nCount / double(m_nSampleRate);
00056 for (int i = nStart; i < nStart + nCount; ++i)
00057 {
00058 double x = (double)(i-nStart) / (double)m_nSampleRate;
00059 double freq = dStartFreq + (dEndFreq-dStartFreq)/(2*dRange) * x;
00060 double y = sin(freq * 2 * PI * x) * dMul;
00061 m_samples[i] *= y;
00062 }
00063 }
00064
00065 void CSynthBuffer::SinusSqr(int nStart, int nCount,
00066 double dStartFreq, double dEndFreq,
00067 double dDB)
00068 {
00069 double dMul = pow(2, dDB/6.0);
00070 double dRange = (double)nCount / double(m_nSampleRate);
00071 for (int i = nStart; i < nStart + nCount; ++i)
00072 {
00073 double x = (double)(i-nStart) / (double)m_nSampleRate;
00074 double freq = dStartFreq + (dEndFreq-dStartFreq)/(2*dRange) * x;
00075 double y = sin(freq * 2 * PI * x) * dMul;
00076 y *= y;
00077 m_samples[i] *= y;
00078 }
00079 }
00080
00081 void CSynthBuffer::Saw(int nStart, int nCount,
00082 double dStartFreq, double dEndFreq,
00083 double dDB)
00084 {
00085 double dMul = pow(2, dDB/6.0);
00086 double dRange = (double)nCount / double(m_nSampleRate);
00087 for (int i = nStart; i < nStart + nCount; ++i)
00088 {
00089 double x = (double)(i-nStart) / (double)m_nSampleRate;
00090 double freq = dStartFreq + (dEndFreq-dStartFreq)/(2*dRange) * x;
00091 double y = (fmod(2*freq*x + 1.0, 2.0) - 1) * dMul;
00092 m_samples[i] *= y;
00093 }
00094 }