TKaraokeProcessor.cpp
上传用户:anhe341234
上传日期:2021-04-11
资源大小:398k
文件大小:3k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. #include "TKaraokeProcessor.h"
  4. //---------------------------------------------------------------------------
  5. #pragma package(smart_init)
  6. //DONE: fix samplefreq
  7. TKaraokeProcessor::TKaraokeProcessor()
  8. {
  9.   HighFilter.SetSampleFreq(44100);
  10.   HighFilter.SetOrder(8);
  11.   BassFilter.SetSampleFreq(44100);
  12.   BassFilter.SetOrder(8);
  13.   HighOn = false;
  14.   BassOn = false;
  15.   VocalPosition = 128;
  16. }
  17. //---------------------------------------------------------------------------
  18. void TKaraokeProcessor::SetBassPassThrough(int cutoff)
  19. {
  20.   if (cutoff) //cutoff > 0
  21.   {
  22.     BassFilter.SetCutOff(cutoff);
  23.     BassOn = true;
  24.   }
  25.   else BassOn = false;
  26. }
  27. //---------------------------------------------------------------------------
  28. void TKaraokeProcessor::SetHighPassThrough(int cutoff)
  29. {
  30.   if (cutoff && cutoff < 22050) //cutoff > 0
  31.   {
  32.     HighFilter.SetCutOff(cutoff);
  33.     HighOn = true;
  34.   }
  35.   else HighOn = false;
  36. }
  37. //---------------------------------------------------------------------------
  38. void TKaraokeProcessor::ProcessAudio(SampleData* sd, int nSamples)
  39. {
  40.   SampleData* Filtered, *FilteredHi;
  41.   if (BassOn)
  42.   {
  43.    Filtered = new SampleData[nSamples];
  44.    BassFilter.Filter((char*)sd,(char*)Filtered,nSamples);
  45.   }
  46.   if(HighOn)
  47.   {
  48.    FilteredHi = new SampleData[nSamples];
  49.    HighFilter.Filter((char*)sd,(char*)FilteredHi,nSamples);
  50.   }
  51.   if(BassOn && HighOn)
  52.   {
  53.     for(int i = 0;i < nSamples;++i)
  54.     {
  55.       int kardata = (int)sd[i].Channel1*(256-VocalPosition)
  56.         - (int)sd[i].Channel2*VocalPosition;
  57.       kardata /= 512;
  58.       sd[i].Channel1 = kardata + Filtered[i].Channel1/2+FilteredHi[i].Channel1/2;
  59.       sd[i].Channel2 = kardata + Filtered[i].Channel2/2+FilteredHi[i].Channel2/2;
  60.     }
  61.     delete Filtered;
  62.     delete FilteredHi;
  63.   }
  64.   else
  65.     if(BassOn)
  66.     {
  67.       for(int i = 0;i < nSamples;++i)
  68.       {
  69.         int kardata = (int)sd[i].Channel1*(256-VocalPosition)
  70.           - (int)sd[i].Channel2*VocalPosition;
  71.         kardata /= 512;
  72.         sd[i].Channel1 = kardata + Filtered[i].Channel1/2;
  73.         sd[i].Channel2 = kardata + Filtered[i].Channel2/2;
  74.       }
  75.       delete Filtered;
  76.     }
  77.     else
  78.       if(HighOn)
  79.       {
  80.         for(int i = 0;i < nSamples;++i)
  81.         {
  82.           int kardata = (int)sd[i].Channel1*(256-VocalPosition)
  83.             - (int)sd[i].Channel2*VocalPosition;
  84.           kardata /= 512;
  85.           sd[i].Channel1 = kardata + FilteredHi[i].Channel1/2;
  86.           sd[i].Channel2 = kardata + FilteredHi[i].Channel2/2;
  87.         }
  88.         delete FilteredHi;
  89.       }
  90.       else
  91.         for(int i = 0;i < nSamples;++i)
  92.         {
  93.           int kardata = (int)sd[i].Channel1*(256-VocalPosition)
  94.             - (int)sd[i].Channel2*VocalPosition;
  95.           kardata /= 512;
  96.           sd[i].Channel1 = kardata;
  97.           sd[i].Channel2 = kardata;
  98.         }
  99.       
  100. }
  101. //---------------------------------------------------------------------------
  102. void TKaraokeProcessor::SetSampleFreq(int sf)
  103. {
  104.   BassFilter.SetSampleFreq(sf);
  105.   HighFilter.SetSampleFreq(sf);
  106. };