home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / goattracker_2.68.zip / src / resid-fp / voice.cpp < prev    next >
C/C++ Source or Header  |  2009-01-03  |  4KB  |  103 lines

  1. //  ---------------------------------------------------------------------------
  2. //  This file is part of reSID, a MOS6581 SID emulator engine.
  3. //  Copyright (C) 2004  Dag Lem <resid@nimrod.no>
  4. //
  5. //  This program is free software; you can redistribute it and/or modify
  6. //  it under the terms of the GNU General Public License as published by
  7. //  the Free Software Foundation; either version 2 of the License, or
  8. //  (at your option) any later version.
  9. //
  10. //  This program is distributed in the hope that it will be useful,
  11. //  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. //  GNU General Public License for more details.
  14. //
  15. //  You should have received a copy of the GNU General Public License
  16. //  along with this program; if not, write to the Free Software
  17. //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18. //  ---------------------------------------------------------------------------
  19.  
  20. #define __VOICE_CC__
  21. #include "voice.h"
  22. #include "sid.h"
  23.  
  24. // ----------------------------------------------------------------------------
  25. // Constructor.
  26. // ----------------------------------------------------------------------------
  27. VoiceFP::VoiceFP()
  28. {
  29.   nonlinearity = 1.f;
  30.   set_chip_model(MOS6581FP);
  31. }
  32.  
  33. /* Keep this at 1.f for 8580, there are no 6581-only codepaths in this file! */
  34. void VoiceFP::set_nonlinearity(float nl)
  35. {
  36.     nonlinearity = nl;
  37.     calculate_dac_tables();
  38. }
  39.  
  40. // ----------------------------------------------------------------------------
  41. // Set chip model.
  42. // ----------------------------------------------------------------------------
  43. void VoiceFP::set_chip_model(chip_model model)
  44. {
  45.   wave.set_chip_model(model);
  46.  
  47.   if (model == MOS6581FP) {
  48.     /* there is some level from each voice even if the env is down and osc
  49.      * is stopped. You can hear this by routing a voice into filter (filter
  50.      * should be kept disabled for this) as the master level changes. This
  51.      * tunable affects the volume of digis. */
  52.     voice_DC = 0x800 * 0xff;
  53.     /* In 8580 the waveforms seem well centered, but on the 6581 there is some
  54.      * offset change as envelope grows, indicating that the waveforms are not
  55.      * perfectly centered. I estimate the value ~ 0x600 for my R4AR, and ReSID
  56.      * has used another measurement technique and got 0x380. */
  57.     wave_zero = 0x600;
  58.     calculate_dac_tables();
  59.   }
  60.   else {
  61.     /* 8580 is thought to be perfect, apart from small negative offset due to
  62.      * ext-in mixing, I think. */
  63.     voice_DC = 0;
  64.     wave_zero = 0x800;
  65.     calculate_dac_tables();
  66.   }
  67. }
  68.  
  69. void VoiceFP::calculate_dac_tables()
  70. {
  71.     int i;
  72.     for (i = 0; i < 256; i ++)
  73.         env_dac[i] = SIDFP::kinked_dac(i, nonlinearity, 8);
  74.     for (i = 0; i < 4096; i ++)
  75.         voice_dac[i] = SIDFP::kinked_dac(i, nonlinearity, 12) - wave_zero;
  76. }
  77.  
  78. // ----------------------------------------------------------------------------
  79. // Set sync source.
  80. // ----------------------------------------------------------------------------
  81. void VoiceFP::set_sync_source(VoiceFP* source)
  82. {
  83.   wave.set_sync_source(&source->wave);
  84. }
  85.  
  86. // ----------------------------------------------------------------------------
  87. // Register functions.
  88. // ----------------------------------------------------------------------------
  89. void VoiceFP::writeCONTROL_REG(reg8 control)
  90. {
  91.   wave.writeCONTROL_REG(control);
  92.   envelope.writeCONTROL_REG(control);
  93. }
  94.  
  95. // ----------------------------------------------------------------------------
  96. // SID reset.
  97. // ----------------------------------------------------------------------------
  98. void VoiceFP::reset()
  99. {
  100.   wave.reset();
  101.   envelope.reset();
  102. }
  103.