コード例 #1
0
ファイル: HuC6280PSG.cs プロジェクト: ddugovic/RASuite
		public HuC6280PSG()
		{
			MaxVolume = short.MaxValue;
			Waves.InitWaves();
			for (int i = 0; i < 8; i++)
			{
				Channels[i] = new PSGChannel();
			}
		}
コード例 #2
0
 public HuC6280PSG(int spf)
 {
     _spf = spf;
     Waves.InitWaves();
     for (int i = 0; i < 8; i++)
     {
         Channels[i] = new PSGChannel();
     }
 }
コード例 #3
0
 public HuC6280PSG()
 {
     MaxVolume = short.MaxValue;
     Waves.InitWaves();
     for (int i = 0; i < 8; i++)
     {
         Channels[i] = new PSGChannel();
     }
 }
コード例 #4
0
ファイル: HuC6280PSG.cs プロジェクト: ddugovic/RASuite
		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;
			}
		}
コード例 #5
0
        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;
            }
        }