Main Page   Namespace List   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   Related Pages  

synth.cpp

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 }

Generated on Sat Sep 25 14:06:38 2004 for ac3 by doxygen1.2.18