home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / package_16-january-2001.zip / Effects / Noise.cpp < prev    next >
C/C++ Source or Header  |  2000-11-23  |  6KB  |  316 lines

  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <math.h>
  5. #include "MachineInterface.h"
  6.  
  7. CMachineParameter const paraLDelay = 
  8.     pt_word,                                        // Type
  9.     "Left Delay",                                    // Short Description
  10.     "Left Delay (Ticks/16)",                        // Long Description
  11.     0x0001,                                            // MinValue    
  12.     0x0400,                                            // MaxValue
  13.     0x0401,                                            // NoValue
  14.     MPF_STATE,                                        // Flags
  15.     96,                                                // Default Value
  16. };
  17.  
  18. CMachineParameter const paraLFB = 
  19. {
  20.     pt_word,
  21.     "L Feedback",
  22.     "Left Feedback",
  23.     0x0000,
  24.     0x0190,
  25.     0x0191,
  26.     MPF_STATE,
  27.     0x00fa,
  28. };
  29.  
  30. CMachineParameter const paraRDelay = 
  31.     pt_word,                                        // Type
  32.     "Right Delay",                                    // Short Description
  33.     "Right Delay (Ticks/16)",                        // Long Description
  34.     0x0001,                                            // MinValue    
  35.     0x0400,                                            // MaxValue
  36.     0x0401,                                            // NoValue
  37.     MPF_STATE,                                        // Flags
  38.     96,                                                // Default Value
  39. };
  40.  
  41. CMachineParameter const paraRFB = 
  42. {
  43.     pt_word,
  44.     "R Feedback",
  45.     "Right Feedback",
  46.     0x0000,
  47.     0x0190,
  48.     0x0191,
  49.     MPF_STATE,
  50.     0x00fa,
  51. };
  52.  
  53. CMachineParameter const paraDryAmt = 
  54. {
  55.     pt_byte,
  56.     "Dry Thru",
  57.     "Dry Through Amount",
  58.     0,
  59.     200,
  60.     201,
  61.     MPF_STATE,
  62.     100,
  63. };
  64.  
  65. CMachineParameter const paraXOver = 
  66. {
  67.     pt_word,
  68.     "X-Delay Amt",
  69.     "Cross Over Amount",
  70.     0,
  71.     400,
  72.     401,
  73.     MPF_STATE,
  74.     250,
  75. };
  76.  
  77. CMachineParameter const paraLIn = 
  78. {
  79.     pt_word,
  80.     "Left In",
  81.     "Left Input Amount",
  82.     0,
  83.     400,
  84.     401,
  85.     MPF_STATE,
  86.     250,
  87. };
  88.  
  89. CMachineParameter const paraRIn = 
  90. {
  91.     pt_word,
  92.     "Right In",
  93.     "Right Input Amount",
  94.     0,
  95.     400,
  96.     401,
  97.     MPF_STATE,
  98.     250,
  99. };
  100.  
  101. CMachineParameter const *pParameters[] =            // Array of Parameters
  102.     ¶LDelay,
  103.     ¶LFB,
  104.     ¶RDelay,
  105.     ¶RFB,
  106.     ¶DryAmt,
  107.     ¶XOver,
  108.     ¶LIn,
  109.     ¶RIn,
  110. };
  111.  
  112. #pragma pack(1)                                        // Place to retrieve parameters    
  113.  
  114. class gvals
  115. {
  116. public:
  117.     word ldelay;
  118.     word lfb;
  119.     word rdelay;
  120.     word rfb;
  121.     byte dry;
  122.     word xover;
  123.     word lin;
  124.     word rin;
  125. };
  126.  
  127. #pragma pack()
  128.  
  129. CMachineInfo const MacInfo = 
  130. {
  131.     MT_EFFECT,                                // type
  132.     MI_VERSION,                                // always
  133.     MIF_MONO_TO_STEREO,                        // flags (MIF_MONO_TO_STEREO, MIF_PLAYS_WAVES)
  134.     0,                                        // min tracks
  135.     0,                                        // max tracks
  136.     8,                                        // numGlobalParameters
  137.     0,                                        // numTrackParameters
  138.     pParameters,                            // pointer to parameters
  139.     0,                                        // numAttributes            
  140.     NULL,                                    // pointer to attributes
  141.     "FUK O-Delay",                            // name
  142.     "O-Delay",                                // short name
  143.     "Frequency UnKnown",                    // author
  144.     NULL
  145. };
  146.  
  147.  
  148. class mi : public CMachineInterface
  149. {
  150. public:
  151.     mi();
  152.     virtual ~mi();
  153.  
  154.     virtual void Init(CMachineDataInput * const pi);
  155.     virtual void Tick();
  156.     virtual bool WorkMonoToStereo(float *pin, float *pout, int numsamples, int const mode);
  157.     char const* DescribeValue(int const param, int const value); 
  158.  
  159.  
  160.  
  161. private:
  162.     float dummy;
  163.     int count, rate;
  164.     float *lringbuff, *rringbuff;
  165.     int lrbpos, rrbpos;
  166.     int lrblen, rrblen;
  167.     float leftFB, rightFB;
  168.     float dryAmt;
  169.     float XOverAmt;
  170.     float leftIn, rightIn;
  171.  
  172.     gvals gval;
  173.  
  174. };
  175.  
  176.  
  177. DLL_EXPORTS
  178.  
  179.  
  180. mi::mi()
  181. {
  182.     GlobalVals = &gval;
  183.     AttrVals = NULL;
  184.     TrackVals = NULL;
  185. }
  186.  
  187.  
  188. mi::~mi()
  189. {
  190.     // Deallocate stuff
  191. }
  192.  
  193.  
  194. void mi::Init(CMachineDataInput * const pi)
  195. {
  196.     rate = pMasterInfo->SamplesPerSec;
  197.     lringbuff = new float[44100];
  198.     lrbpos = 0;
  199.     lrblen = 44100;
  200.     rringbuff = new float[44100];
  201.     rrbpos = 0;
  202.     rrblen = 44100;
  203. }
  204.  
  205.  
  206. void mi::Tick()
  207. {
  208.     if (gval.ldelay != paraLDelay.NoValue)
  209.     {
  210.         lrblen = gval.ldelay / 16.0 * pMasterInfo->SamplesPerTick;
  211.         lringbuff = new float[lrblen];
  212.         lrbpos = 0;
  213.     }
  214.  
  215.     if (gval.lfb != paraLFB.NoValue)
  216.         leftFB = (gval.lfb - 200) / 100.0;
  217.  
  218.     if (gval.rdelay != paraRDelay.NoValue)
  219.     {
  220.         rrblen = gval.rdelay / 16.0 * pMasterInfo->SamplesPerTick;
  221.         rringbuff = new float[rrblen];
  222.         rrbpos = 0;
  223.     }
  224.  
  225.     if (gval.rfb != paraRFB.NoValue)
  226.         rightFB = (gval.rfb - 200) / 100.0;
  227.  
  228.     if (gval.dry != paraDryAmt.NoValue)
  229.         dryAmt = gval.dry / 100.0;
  230.  
  231.     if (gval.xover != paraXOver.NoValue)
  232.         XOverAmt = (gval.xover - 200) / 100.0;
  233.  
  234.     if (gval.lin != paraLIn.NoValue)
  235.     leftIn = (gval.lin - 200) / 100.0;
  236.  
  237.     if (gval.rin != paraRIn.NoValue)
  238.     rightIn = (gval.rin - 200) / 100.0;
  239.  
  240. }
  241.  
  242.  
  243. bool mi::WorkMonoToStereo(float *pin, float *pout, int numsamples, int const mode)
  244. {
  245.     if (mode == WM_NOIO)
  246.     {
  247.         return false;
  248.     }
  249.  
  250.     if (mode == WM_READ || mode == WM_WRITE)
  251.     {    
  252.         do
  253.         {
  254.             lringbuff[(lrbpos + lrblen - 1) % lrblen] = rringbuff[rrbpos] * XOverAmt + lringbuff[lrbpos] * leftFB;
  255.             *pout = lringbuff[lrbpos];
  256.             pout++;
  257.             rringbuff[(rrbpos + rrblen - 1) % rrblen] = lringbuff[lrbpos] * XOverAmt + rringbuff[rrbpos] * rightFB;
  258.             *pout = rringbuff[rrbpos];
  259.             pout++;
  260.             pin++;
  261.             lrbpos = (++lrbpos) % lrblen;
  262.             rrbpos = (++rrbpos) % rrblen;
  263.         }
  264.         while (--numsamples);
  265.     }
  266.  
  267.     if (mode == WM_READWRITE)
  268.     {
  269.         do
  270.         {
  271.             lringbuff[(lrbpos + lrblen - 1) % lrblen] = rringbuff[rrbpos] * XOverAmt + lringbuff[lrbpos] * leftFB + *pin * leftIn;
  272.             *pout = lringbuff[lrbpos] + dryAmt * *pin;
  273.             pout++;
  274.             rringbuff[(rrbpos + rrblen - 1) % rrblen] = lringbuff[lrbpos] * XOverAmt + rringbuff[rrbpos] * rightFB + *pin * rightIn;
  275.             *pout = rringbuff[rrbpos] + dryAmt * *pin;
  276.             pout++;
  277.             pin++;
  278.             lrbpos = (++lrbpos) % lrblen;
  279.             rrbpos = (++rrbpos) % rrblen;
  280.         }
  281.         while (--numsamples);
  282.     }
  283.  
  284.     return true;
  285. }
  286.  
  287. char const* mi::DescribeValue(int const param, int const value)
  288. {
  289.     static char str[12];
  290.     int temp1, temp2;
  291.  
  292.     if (param == 0 || param == 2)
  293.     {
  294.         temp1 = value/16;
  295.         temp2 = value%16;
  296.         sprintf (str,"%d %d/16 ticks", temp1, temp2);
  297.     }
  298.  
  299.     if (param == 1 || param == 3 || param == 5 || param == 6 ||
  300.         param == 7)
  301.     {
  302.         sprintf (str, "%d%%", value - 200);
  303.     }
  304.  
  305.     if (param == 4)
  306.     {
  307.         sprintf (str, "%d%%", value);
  308.     }
  309.  
  310.     return str;
  311. }
  312.  
  313.