Code: Select all
private float GenerateSample(int channel)
{
var baseAddr = Memory.AudioRamStart + (channel * 4);
var freq = _mobo.ReadWord(baseAddr);
var control = _mobo.ReadByte(baseAddr + 3);
if (freq == 0)
return 0f;
var volume = ProcessEnvelope(channel, control);
if (volume = 6)
{
_noisePeriod[channel] = Math.Max(1, (int)(44100f / Math.Max(1, (int)freq)));
}
var delta = freq / 44100f;
_phases[channel] += delta;
if (_phases[channel] >= 1f)
{
_phases[channel] -= 1f;
}
var wave = channel switch
{
0 or 1 => Square(_phases[channel], delta),
2 or 3 => Triangle(_phases[channel]),
4 or 5 => Sawtooth(_phases[channel], delta),
_ => Noise(channel),
};
return wave * volume;
}
private float Noise(int channel)
{
if (--_noiseTimer[channel] > 1)) & 1);
_noiseLfsr[channel] = (ushort)((_noiseLfsr[channel] >> 1) | (bit
Mobile version