----- Nicolas Pomarède wrote:
Hi
as discussed here
http://atari-forum.com/viewtopic.php?f=16&t=29615&p=299270#p299270 the
STE DMA sound samples can't be heard when using an output freq < 50066
Hz in Hatari (for example, try "salamander : planet latis")
At 50066 Hz you hear the samples, but at 48 kHz you don't hear them
anymore. This is because 50066 explicitely turn DMA low pass filter OFF
in the code path.
David, do you think it would be possible to increase the gain in
DmaSnd_LowPassFilter to hear the samples even when using < 50 kHz output
freq ?
Note that in this music demo, samples already have a low volume (if you
just listen to the wav file with Audacity for example), so maybe the
fact that the sample don't use the full 8 bit range is fooling the
filter and you get an even lower volume in the end ?
Nicolas
Hi,
I will look into this later today. Note that 55 KHz has no filter so
that one can re-sample it with their own filter, thus, 55 KHz
samples should be sharper than a real STE.
The low pass filter Hatari uses filters high frequencies a little
too much.
see /****** return (in * 3) << 3; */ below. Which refers to
hatari/src/dmaSnd.c
This will increase the gain by approx 3dB
Experiment until you like it. Note that low frequencies will
be boosted also. Note that just increasing the cutoff
frequency will require an expensive filter.
/**
* LowPass Filter Left
*/
static Sint16 DmaSnd_LowPassFilterLeft(Sint16 in)
{
static Sint16 lowPassFilter[2] = { 0, 0 };
static Sint16 out = 0;
if (DmaSnd_LowPass)
{
out = lowPassFilter[0] + (lowPassFilter[1]<<1) + in;
lowPassFilter[0] = lowPassFilter[1];
lowPassFilter[1] = in;
return out; /* Filter Gain = 4 */ /****** return (in * 3) << 1; */
}else
{
return in << 2; /****** return (in * 3) << 3; */
}
}
/**
* LowPass Filter Right
*/
static Sint16 DmaSnd_LowPassFilterRight(Sint16 in)
{
static Sint16 lowPassFilter[2] = { 0, 0 };
static Sint16 out = 0;
if (DmaSnd_LowPass)
{
out = lowPassFilter[0] + (lowPassFilter[1]<<1) + in;
lowPassFilter[0] = lowPassFilter[1];
lowPassFilter[1] = in;
return out; /* Filter Gain = 4 */ /****** return (in * 3) << 1; */
}else
{
return in << 2; /****** return (in * 3) << 3; */
}
}