public HuC6280PSG() { MaxVolume = short.MaxValue; Waves.InitWaves(); for (int i = 0; i < 8; i++) { Channels[i] = new PSGChannel(); } }
public HuC6280PSG(int spf) { _spf = spf; Waves.InitWaves(); for (int i = 0; i < 8; i++) { Channels[i] = new PSGChannel(); } }
void MixChannel(short[] samples, int start, int len, PSGChannel channel) { if (channel.Enabled == false) return; if (channel.DDA == false && channel.Volume == 0) return; short[] wave = channel.Wave; int freq; if (channel.NoiseChannel) { wave = Waves.NoiseWave; freq = channel.NoiseFreq; } else if (channel.DDA) { freq = 0; } else { if (channel.Frequency <= 1) return; freq = PsgBase / (32 * ((int)channel.Frequency)); } int globalPanFactorLeft = VolumeReductionTable[MainVolumeLeft]; int globalPanFactorRight = VolumeReductionTable[MainVolumeRight]; int channelPanFactorLeft = VolumeReductionTable[channel.Panning >> 4]; int channelPanFactorRight = VolumeReductionTable[channel.Panning & 0xF]; int channelVolumeFactor = 0x1f - channel.Volume; int volumeLeft = 0x1F - globalPanFactorLeft - channelPanFactorLeft - channelVolumeFactor; if (volumeLeft < 0) volumeLeft = 0; int volumeRight = 0x1F - globalPanFactorRight - channelPanFactorRight - channelVolumeFactor; if (volumeRight < 0) volumeRight = 0; float adjustedWaveLengthInSamples = SampleRate / (channel.NoiseChannel ? freq / (float)(channel.Wave.Length * 128) : freq); float moveThroughWaveRate = wave.Length / adjustedWaveLengthInSamples; int end = start + len; for (int i = start; i < end; ) { channel.SampleOffset %= wave.Length; short value = channel.DDA ? channel.DDAValue : wave[(int)channel.SampleOffset]; samples[i++] += (short)(value * LogScale[volumeLeft] / 255f / 6f * MaxVolume / short.MaxValue); samples[i++] += (short)(value * LogScale[volumeRight] / 255f / 6f * MaxVolume / short.MaxValue); channel.SampleOffset += moveThroughWaveRate; channel.SampleOffset %= wave.Length; } }
private void MixChannel(short[] samples, int start, int len, PSGChannel channel) { if (channel.Enabled == false) { return; } if (channel.DDA == false && channel.Volume == 0) { return; } short[] wave = channel.Wave; int freq; if (channel.NoiseChannel) { wave = Waves.NoiseWave; freq = channel.NoiseFreq; } else if (channel.DDA) { freq = 0; } else { if (channel.Frequency <= 1) { return; } freq = PsgBase / (32 * ((int)channel.Frequency)); } int globalPanFactorLeft = VolumeReductionTable[MainVolumeLeft]; int globalPanFactorRight = VolumeReductionTable[MainVolumeRight]; int channelPanFactorLeft = VolumeReductionTable[channel.Panning >> 4]; int channelPanFactorRight = VolumeReductionTable[channel.Panning & 0xF]; int channelVolumeFactor = 0x1f - channel.Volume; int volumeLeft = 0x1F - globalPanFactorLeft - channelPanFactorLeft - channelVolumeFactor; if (volumeLeft < 0) { volumeLeft = 0; } int volumeRight = 0x1F - globalPanFactorRight - channelPanFactorRight - channelVolumeFactor; if (volumeRight < 0) { volumeRight = 0; } float adjustedWaveLengthInSamples = SampleRate / (channel.NoiseChannel ? freq / (float)(channel.Wave.Length * 128) : freq); float moveThroughWaveRate = wave.Length / adjustedWaveLengthInSamples; int end = start + len; for (int i = start; i < end;) { channel.SampleOffset %= wave.Length; short value = channel.DDA ? channel.DDAValue : wave[(int)channel.SampleOffset]; samples[i++] += (short)(value * LogScale[volumeLeft] / 255f / 6f * MaxVolume / short.MaxValue); samples[i++] += (short)(value * LogScale[volumeRight] / 255f / 6f * MaxVolume / short.MaxValue); channel.SampleOffset += moveThroughWaveRate; channel.SampleOffset %= wave.Length; } }