470 lines
17 KiB
Plaintext
470 lines
17 KiB
Plaintext
|
2010-??-?? Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 1.0 released.
|
|||
|
|
|||
|
* configure.ac: Updated to current autoconf/automake standards.
|
|||
|
New option --enable-arch for gcc architecture specific
|
|||
|
optimizations, including vectorization. New option
|
|||
|
--enable-branch-hints for branch prediction optimizations.
|
|||
|
|
|||
|
* Makefile.am, samp2src.pl: Generate header files instead of
|
|||
|
source files for waveform samples. Added dac.h, dac.cc.
|
|||
|
|
|||
|
* siddefs.h.in: Sampling method names now better reflect their
|
|||
|
operation (SAMPLE_RESAMPLE_INTERPOLATE -> SAMPLE_RESAMPLE,
|
|||
|
SAMPLE_RESAMPLE_FAST -> SAMPLE_RESAMPLE_FASTMEM).
|
|||
|
New macros for branch prediction: likely / unlikely.
|
|||
|
|
|||
|
* dac.h: New file; accurate emulation of non-monotonic MOS 6581
|
|||
|
D/A converters.
|
|||
|
|
|||
|
* dac.cc: New file; accurate emulation of non-monotonic MOS 6581
|
|||
|
D/A converters.
|
|||
|
|
|||
|
* envelope.h (EnvelopeGenerator::clock): Emulation of one cycle
|
|||
|
pipeline delay in the exponential frequency divider.
|
|||
|
(EnvelopeGenerator::output): Emulation of non-ideal DAC output.
|
|||
|
(EnvelopeGenerator::set_chip_model): New function; for emulation
|
|||
|
of DAC imperfections.
|
|||
|
(EnvelopeGenerator::set_exponential_counter): New function;
|
|||
|
modularization of exponential counter update.
|
|||
|
|
|||
|
* envelope.cc (EnvelopeGenerator::EnvelopeGenerator):
|
|||
|
Initialization of DAC lookup tables.
|
|||
|
(EnvelopeGenerator::readENV): Return envelope_counter directly, in
|
|||
|
order to allow EnvelopeGenerator::output to emulate DAC
|
|||
|
imperfections.
|
|||
|
(EnvelopeGenerator::reset): Initialization of new
|
|||
|
variables.
|
|||
|
(EnvelopeGenerator::set_chip_model): New function; for emulation
|
|||
|
of DAC imperfections.
|
|||
|
(EnvelopeGenerator::writeCONTROL_REG): Flush of exponential
|
|||
|
frequency divider pipeline on attack.
|
|||
|
|
|||
|
* extfilt.h (ExternalFilter::clock): Cutoff frequency fixed point
|
|||
|
accuracy is traded off for for vastly improved filter signal
|
|||
|
fixed point accuracy.
|
|||
|
(ExternalFilter::output): Output range reduced from 20 to 16
|
|||
|
bits.
|
|||
|
|
|||
|
* extfilt.cc (ExternalFilter::ExternalFilter): Assumes audio
|
|||
|
equipment impedance of 10kOhm, yielding a high-pass 3-dB frequency
|
|||
|
of 1.6Hz (changed from 16Hz). Cutoff frequency fixed point accuracy
|
|||
|
is traded off for for vastly improved filter signal fixed point
|
|||
|
accuracy.
|
|||
|
(ExternalFilter::set_chip_model): Removed. Remaining DC levels can
|
|||
|
only be canceled by enabling the external filter (or by similar
|
|||
|
post processing).
|
|||
|
|
|||
|
* filter.h: Major rewrite implementing an accurate model of the
|
|||
|
actual filter and output stage topology, including models for
|
|||
|
op-amps, input and feedback NMOS FET "resistors", and voltage
|
|||
|
controlled resistors (VCRs).
|
|||
|
(Filter::input): New interface to set external input level.
|
|||
|
(Filter::output): Output range reduced from 20 to 16 bits.
|
|||
|
(Filter::set_voice_mask): New function. Emulation of physical
|
|||
|
connection of EXT IN, and voice muting for test purposes.
|
|||
|
(Filter::solve_gain): New function; iterative solver using
|
|||
|
Newton-Raphson and bisection to calculate gain for SID op-amp
|
|||
|
gains and summers using NMOS FETs as input and feedback "resistors".
|
|||
|
(Filter::solve_integrate): New function; one-step fixpoint solver
|
|||
|
to calculate output from SID op-amp integrators using VCRs built
|
|||
|
from four NMOS FETs as inputs.
|
|||
|
|
|||
|
* filter.cc: Major rewrite implementing an accurate model of the
|
|||
|
actual filter and output stage topology, including models for
|
|||
|
op-amps, input and feedback NMOS FET "resistors", and voltage
|
|||
|
controlled resistors (VCRs).
|
|||
|
(Filter::set_voice_mask): New function. Emulation of physical
|
|||
|
connection of EXT IN, and voice muting for test purposes.
|
|||
|
|
|||
|
* sid.h: Resampling constants declared in enum.
|
|||
|
(SID::State): Added voice_mask, shift_register_reset,
|
|||
|
shift_pipeline, pulse_output, floating_output_ttl,
|
|||
|
envelope_pipeline.
|
|||
|
(SID::output): 16 bit output range only, n-bit interface
|
|||
|
removed.
|
|||
|
(SID::clock_resample): Renamed from
|
|||
|
SID::clock_resample_interpolate.
|
|||
|
(SID::clock_resample_fastmem): Renamed from
|
|||
|
SID::clock_resample_fast.
|
|||
|
|
|||
|
* sid.cc (SID::clock): Emulation of one cycle pipeline write delay
|
|||
|
for the MOS8580.
|
|||
|
(SID::clock_resample): Renamed from SID::clock_resample_interpolate.
|
|||
|
Corrected bug in FIR table wraparound, courtesy of Antti Lankila.
|
|||
|
(SID::clock_resample_fastmem): Renamed from
|
|||
|
SID::clock_resample_fast.
|
|||
|
(SID::input): Hand off all processing of the external input to the
|
|||
|
filter.
|
|||
|
(SID::output): 16 bit output range only, n-bit output interface
|
|||
|
removed.
|
|||
|
(SID::read): Aging time for bus value increased from 0x2000 to
|
|||
|
0x4000 cycles.
|
|||
|
(SID::read_state, SID::write_state): Added voice_mask,
|
|||
|
shift_register_reset, shift_pipeline, pulse_output,
|
|||
|
floating_output_ttl, envelope_pipeline.
|
|||
|
(SID::set_voice_mask): New function. Emulation of physical
|
|||
|
connection of EXT IN, and voice muting for test purposes.
|
|||
|
(SID::write): Emulation of one cycle pipeline write delay for the
|
|||
|
MOS8580.
|
|||
|
(SID::write_pipeline): New function. Emulation of one cycle
|
|||
|
pipeline write delay for the MOS8580.
|
|||
|
|
|||
|
* spline.h (PointPlotter::operator()): Rounding to nearest
|
|||
|
integer.
|
|||
|
|
|||
|
* voice.h (Voice::output): Handling of DC for waveform "zero"
|
|||
|
level moved to Filter::clock.
|
|||
|
|
|||
|
* voice.cc (Voice::set_chip_model): Call set_chip_model for
|
|||
|
envelope generator. Handling of DC for "zero" level moved to
|
|||
|
Filter::set_chip_model.
|
|||
|
|
|||
|
* wave.h (WaveformGenerator::clock): Corrected shift register
|
|||
|
model. Emulation of reset time for the shift register. Emulation
|
|||
|
of two cycle pipeline delay for accumulator bit 19 to shift the
|
|||
|
shift register.
|
|||
|
(WaveformGenerator::clock_shift_register)
|
|||
|
(WaveformGenerator::write_shift_register)
|
|||
|
(WaveformGenerator::reset_shift_register)
|
|||
|
(WaveformGenerator::set_noise_output): New functions. Emulation
|
|||
|
of writes to the shift register by combined waveforms.
|
|||
|
(WaveformGenerator::set_waveform_output): New function. Emulation
|
|||
|
of floating DAC input with aging. Emulation of one cycle pipeline
|
|||
|
delay for the pulse width comparator to change the pulse
|
|||
|
level. Emulation of writes to the shift register by combined
|
|||
|
waveforms. Highly optimized waveform calculation using nearly
|
|||
|
branch-free table lookup for all waveforms; replaces 16 previous
|
|||
|
waveform functions named WaveformGenerator::outputXXXX.
|
|||
|
(WaveformGenerator::output): Emulation of non-ideal DAC output.
|
|||
|
|
|||
|
* wave.cc (WaveformGenerator::WaveformGenerator): Initialization
|
|||
|
of lookup tables for basic waveforms and DACs.
|
|||
|
(WaveformGenerator::readOSC): Return waveform_output directly, in
|
|||
|
order to allow WaveformGenerator::output to emulate DAC
|
|||
|
imperfections.
|
|||
|
(WaveformGenerator::set_chip_model): Update pointer to current
|
|||
|
waveform table.
|
|||
|
(WaveformGenerator::writePW_LO, WaveformGenerator::writePW_HI):
|
|||
|
Push next pulse level into pulse level pipeline.
|
|||
|
(WaveformGenerator::writeCONTROL_REG): Emulation of the effects of
|
|||
|
the test bit on the shift register (shifting, reset time).
|
|||
|
Emulation of fading time for floating DAC input (waveform 0).
|
|||
|
Update pointer to current waveform table.
|
|||
|
(WaveformGenerator::reset): Initialization of new variables.
|
|||
|
|
|||
|
2004-06-11 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.16 released.
|
|||
|
|
|||
|
* envelope.h (EnvelopeGenerator::clock): Corrected off-by-one
|
|||
|
error in check for ADSR delay bug in delta_t cycle interface.
|
|||
|
|
|||
|
* filter.cc (Filter::set_chip_model): Initialize filter cutoff
|
|||
|
mappings before call to set_chip_model.
|
|||
|
|
|||
|
* sid.cc (SID::set_sampling_parameters): Build shifted FIR tables
|
|||
|
with samples according to the sampling frequency.
|
|||
|
(SID::clock_resample_interpolate): New function; factorized linear
|
|||
|
interpolation out from filter convolutions, and made convolutions
|
|||
|
vectorizable.
|
|||
|
(SID::clock_resample_fast): New function; single convolution, same
|
|||
|
accuracy as with interpolation by using more filter tables.
|
|||
|
(SID::State, SID::read_state, SID::write_state): Read and write
|
|||
|
rate_counter_period and exponential_counter_period. Read sustain
|
|||
|
value.
|
|||
|
|
|||
|
2003-10-20 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.15 released.
|
|||
|
|
|||
|
* envelope.h (EnvelopeGenerator): Added public State enum.
|
|||
|
(EnvelopeGenerator::clock): Rate counter is 15 bits, count
|
|||
|
rate_period - 1 after wrapping from 0x8000 to 0 in ADSR delay bug.
|
|||
|
|
|||
|
* sid.cc, sid.h (SID::State): Added envelope_state.
|
|||
|
(SID::State::write_state): Restore register 0x18.
|
|||
|
(SID::set_sampling_parameters): Scale resampling filter to avoid
|
|||
|
clipping.
|
|||
|
(SID::clock_resample): Saturated arithmetics to avoid clipping.
|
|||
|
|
|||
|
2002-12-31 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.14 released.
|
|||
|
|
|||
|
* envelope.h (EnvelopeGenerator::clock): Corrected one cycle error
|
|||
|
in ADSR delay bug. Only load the exponential counter period at the
|
|||
|
envelope counter values 255, 93, 54, 26, 14, 6, 0.
|
|||
|
|
|||
|
* filter.cc (Filter::set_chip_model): Call set_w0() and set_Q() to
|
|||
|
update filter settings.
|
|||
|
(Filter::set_w0): Limit cutoff frequency for both 1 cycle and
|
|||
|
delta_t cycle filter.
|
|||
|
|
|||
|
* filter.h (Filter::clock): Mix in external audio input.
|
|||
|
|
|||
|
* sid.cc, sid.h (SID::input): New function; accepts external audio
|
|||
|
input sample.
|
|||
|
|
|||
|
* spline.h (PointPlotter::operator ()): Clamp negative values to
|
|||
|
zero.
|
|||
|
|
|||
|
* voice.cc, voice.h: Changed misleading name wave_DC to wave_zero.
|
|||
|
|
|||
|
* wave.h (WaveformGenerator::clock): Corrected bug in check for
|
|||
|
accumulator bit 19 in noise register shift.
|
|||
|
|
|||
|
2002-01-19 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.13 released.
|
|||
|
|
|||
|
* configure.in: Replaced AC_TRY_COMPILER with AC_TRY_COMPILE,
|
|||
|
removed AC_PROG_RANLIB.
|
|||
|
|
|||
|
* envelope.h (EnvelopeGenerator::clock): Reset rate_step on state
|
|||
|
change.
|
|||
|
|
|||
|
* extfilt.cc (ExternalFilter::set_chip_model): New calculation of
|
|||
|
maximum mixer DC level.
|
|||
|
|
|||
|
* filter.cc (Filter::set_chip_model): Moved calculation of
|
|||
|
voice_DC to voice.cc, corrected calculation of mixer_DC.
|
|||
|
|
|||
|
* filter.h (Filter::output): Mixer output is not inverted.
|
|||
|
|
|||
|
* sid.cc (SID::set_chip_model): Call voice.set_chip_model instead
|
|||
|
of voice.wave.set_chip_model.
|
|||
|
|
|||
|
* voice.cc (Voice::Voice): Call set_chip_model.
|
|||
|
(Voice::set_chip_model): New function; model both waveform D/A
|
|||
|
converter and envelope multiplying D/A converter DC offsets.
|
|||
|
|
|||
|
* voice.h (Voice::output): Add both waveform D/A converter and
|
|||
|
envelope multiplying D/A converter DC offsets.
|
|||
|
|
|||
|
* wave.h (WaveformGenerator::output____): Reverted to output
|
|||
|
minimum wave level when no waveform is selected. The maximum and
|
|||
|
minimum wave output levels are interchanged in C= Hacking Issue #20.
|
|||
|
|
|||
|
2001-10-20 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.12 released.
|
|||
|
|
|||
|
* envelope.cc, envelope.h, filter.cc, filter.h, wave.cc, wave.h:
|
|||
|
Removed bool usage. This avoids unnecessary conversion to 1/0.
|
|||
|
|
|||
|
* filter.cc (Filter::set_chip_model): New function; selects voice
|
|||
|
and mixer DC offsets and mapping from the FC registers to filter
|
|||
|
cutoff frequency. The voice and mixer DC offsets for the MOS6581 are
|
|||
|
calculated from measurements made by H<>rsfalvi, Levente in
|
|||
|
C= Hacking Issue #20.
|
|||
|
(Filter::Filter): Call set_chip_model.
|
|||
|
(Filter::f0_6581, Filter::f0_8580): Separate FC mapping tables.
|
|||
|
(Filter::f0_points_6581, Filter::f0_points_8580): Separate FC mapping
|
|||
|
points.
|
|||
|
|
|||
|
* extfilt.cc, extfilt.h (ExternalFilter::set_chip_model): New
|
|||
|
function supporting separate DC correction for MOS6581 and MOS8580.
|
|||
|
|
|||
|
* sid.cc, sid.h (SID::adjust_sampling_frequency): New function for
|
|||
|
on-the-fly adjustment of sampling frequency.
|
|||
|
(SID::clock_fast): Corrected sample calculation.
|
|||
|
(SID::set_chip_model): Set filter chip model.
|
|||
|
(SID::output): Added audio clipping.
|
|||
|
(SID::clock, SID::clock_fast, SID::clock_interpolate,
|
|||
|
SID::clock_resample): Added sample interleaving.
|
|||
|
|
|||
|
* spline.h (interpolate): Generalized to accept repeated points to
|
|||
|
introduce points of non-differentiability and discontinuity.
|
|||
|
|
|||
|
* wave.h (WaveformGenerator::output____): No selected waveform
|
|||
|
yields maximum wave output level. This was found by H<>rsfalvi,
|
|||
|
Levente in C= Hacking Issue #20.
|
|||
|
(WaveformGenerator::clock): Optimized for speed (no division).
|
|||
|
|
|||
|
2001-03-10 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.11 released.
|
|||
|
|
|||
|
* configure.in: Disable building of shared library by default.
|
|||
|
Control inlining with RESID_INLINING (0 or 1) and RESID_INLINE
|
|||
|
(blank or "inline").
|
|||
|
|
|||
|
* envelope.h, extfilt.h, filter.h, voice.h, wave.h: inline keyword
|
|||
|
in both function declarations and function definitions.
|
|||
|
|
|||
|
* samp2src.pl: Beautified Perl code.
|
|||
|
|
|||
|
* sid.h, sid.cc: Replaced voice variables with array. Removed
|
|||
|
filter variables from SID::State.
|
|||
|
(SID::clock): New audio sample generating interface. Three
|
|||
|
clocking methods are available; clocking at output sample
|
|||
|
frequency, clocking at cycle frequency with linear sample
|
|||
|
interpolation, and clocking at cycle frequency with audio
|
|||
|
resampling.
|
|||
|
(SID::clock_fast, SID::clock_interpolate, SID::clock_resample):
|
|||
|
New functions called by SID::clock.
|
|||
|
(SID::set_sampling_parameters): New function to set up SID for
|
|||
|
sample generation. The FIR table used in SID::clock_resample is
|
|||
|
calculated here.
|
|||
|
(SID::I0): 0th order modified Bessel function to calculate Kaiser
|
|||
|
window.
|
|||
|
|
|||
|
* siddefs.h: Control inlining with RESID_INLINING (0 or 1) and
|
|||
|
RESID_INLINE (blank or "inline"). Added enum sampling_method.
|
|||
|
|
|||
|
* voice.h, voice.cc (Voice::set_sync_source): Moved setting of
|
|||
|
sync source from constructor.
|
|||
|
|
|||
|
* wave.h, wave.cc (WaveformGenerator::set_sync_source): Moved
|
|||
|
setting of sync source from constructor.
|
|||
|
|
|||
|
2000-11-22 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.10 released.
|
|||
|
|
|||
|
* configure.in, Makefile.am: Use libtool to build library. The
|
|||
|
hack to "disable" install is removed.
|
|||
|
|
|||
|
* extfilt.h, filter.h: Moved filter stability code from sid.cc.
|
|||
|
|
|||
|
* sid.cc (SID::clock): Moved filter stability code to
|
|||
|
extfilt.h/filter.h. Don't clock the rest of the chip more
|
|||
|
frequently than necessary.
|
|||
|
|
|||
|
* wave.cc: Typecast for pedantic (and probably incorrect)
|
|||
|
compilers.
|
|||
|
|
|||
|
2000-05-18 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.9 released.
|
|||
|
|
|||
|
* filter.h (Filter::output): The sum of the filter outputs is no
|
|||
|
longer weighted.
|
|||
|
|
|||
|
1999-06-24 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.8 released.
|
|||
|
|
|||
|
* filter.h, filter.cc, wave.h, wave.cc: Typecasts for pedantic
|
|||
|
compilers.
|
|||
|
|
|||
|
* filter.h (Filter::clock): Voice 3 is only silenced by voice3off
|
|||
|
if it is not routed through the filter.
|
|||
|
|
|||
|
* sid.cc (SID::State): Added constructor for proper initalization.
|
|||
|
|
|||
|
* spline.h: Inlined template functions to avoid problems at link
|
|||
|
time with certain compilers.
|
|||
|
|
|||
|
1999-02-25 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.7 released.
|
|||
|
|
|||
|
* configure.in: Check whether compiler supports bool.
|
|||
|
|
|||
|
* extfilt.h, extfilt.cc: Implementation of C64 filter, external to
|
|||
|
the SID chip.
|
|||
|
|
|||
|
* filter.h (Filter::clock): Optimized filter routing using a switch.
|
|||
|
(Filter::output): Optimized filter mixing using a switch, avoiding
|
|||
|
integer division. Corrected sign of filtered output, which is
|
|||
|
inverted compared to unfiltered output.
|
|||
|
|
|||
|
* filter.cc (Filter::set_w0): Removed use of M_PI and math.h
|
|||
|
functions. Use spline table to map fc to w0.
|
|||
|
(Filter::fc_default): Return array of FC spline interpolation points.
|
|||
|
(Filter::fc_plotter): Return FC spline plotter object.
|
|||
|
|
|||
|
* sid.h (SID::enable_external_filter): Enable/disable external
|
|||
|
filter.
|
|||
|
(SID::fc_default): Return array of FC spline interpolation points.
|
|||
|
(SID::fc_plotter): Return FC spline plotter object.
|
|||
|
(SID::State, SID::read_state, SID::write_state): Read and write
|
|||
|
complete SID state.
|
|||
|
|
|||
|
* sid.cc (SID::clock): Age bus value. Clock external filter.
|
|||
|
(SID::enable_external_filter): Enable/disable external filter.
|
|||
|
|
|||
|
* spline.h: Spline implementation. Used to specify mapping from
|
|||
|
the FC register to filter cutoff frequency.
|
|||
|
|
|||
|
1998-11-14 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.6 released.
|
|||
|
|
|||
|
* configure.in: Allow compilation in a separate directory.
|
|||
|
|
|||
|
* wave.h (WaveformGenerator::synchronize): Handle special case when a
|
|||
|
sync source is synced itself on the same cycle as its MSB is set
|
|||
|
high.
|
|||
|
|
|||
|
* sid.cc (SID::clock): Only clock on MSB on/off for hard sync.
|
|||
|
|
|||
|
1998-09-06 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.5 released.
|
|||
|
|
|||
|
* version.cc (resid_version_string): Version string with C linkage.
|
|||
|
|
|||
|
* wave.cc (WaveformGenerator::set_chip_model): Emulation of MOS8580
|
|||
|
combined waveforms.
|
|||
|
|
|||
|
1998-08-28 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.4 released.
|
|||
|
|
|||
|
* envelope.h (EnvelopeGenerator::clock): Count up to rate_period twice
|
|||
|
during ADSR delay bug, and add one extra rate counter step.
|
|||
|
|
|||
|
* filter.cc (Filter::bsd_copysign): Renamed copysign function for
|
|||
|
compilation on platforms where copysign is implemented as a macro.
|
|||
|
|
|||
|
1998-08-23 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.3 released.
|
|||
|
|
|||
|
* envelope.h (EnvelopeGenerator::clock): Handle ADSR boundary bug.
|
|||
|
|
|||
|
* envelope.cc (EnvelopeGenerator::rate_counter_period,
|
|||
|
EnvelopeGenerator::exponential_counter_period): Corrected counter
|
|||
|
periods.
|
|||
|
|
|||
|
* filter.h (Filter::clock): Optimized for speed (division by shifting).
|
|||
|
|
|||
|
* sid.h (SID::clock): New one-cycle optimized overload of the clock()
|
|||
|
function.
|
|||
|
|
|||
|
* wave.h (WaveformGenerator::output_P_T): Combined waveform
|
|||
|
pulse+triangle indexing corrected.
|
|||
|
(WaveformGenerator::output_P__): Check for test bit to handle
|
|||
|
pulse+test bit samples.
|
|||
|
(WaveformGenerator::output): Optimized for speed (inlining).
|
|||
|
|
|||
|
1998-07-28 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.2 released.
|
|||
|
|
|||
|
* envelope.h (EnvelopeGenerator::clock): Start decay cycle immediately
|
|||
|
at envelope counter 0xff. New sustain value is zero if the sustain
|
|||
|
level is raised above the current envelope counter value.
|
|||
|
(EnvelopeGenerator::step_envelope): Handle ADSR delay bug.
|
|||
|
|
|||
|
* envelope.cc (EnvelopeGenerator::rate_counter_period,
|
|||
|
EnvelopeGenerator::exponential_counter_period): Corrected counter
|
|||
|
periods.
|
|||
|
(EnvelopeGenerator::writeCONTROL_REG): Do not modify rate counter.
|
|||
|
|
|||
|
* filter.cc (Filter::set_Q): Constrain Q to keep filter stable.
|
|||
|
|
|||
|
* sid.h (SID::read, SID::write, SID::bypass_filter): Simplified API
|
|||
|
routing register access through the SID class.
|
|||
|
|
|||
|
* sid.cc (SID::output): Corrected variable-bit audio output return.
|
|||
|
(SID::read, SID::write): Allow read of write only registers.
|
|||
|
|
|||
|
1998-06-09 Dag Lem <resid@nimrod.no>
|
|||
|
|
|||
|
* Version 0.1 released.
|