void ProcessNormal(float[] buffer, int samplesPerBuffer, ProcArgs pargs) { float GetSample(int position) { position += sample.GetOffset(); return((sample.bUnsigned ? ROM.Instance.Reader.ReadByte(position) - 0x80 : ROM.Instance.Reader.ReadSByte(position)) / (float)0x80); } int bufPos = 0; do { float baseSamp = GetSample(pos); float deltaSamp; if (pos + 1 >= sample.Length) { deltaSamp = sample.bLoop ? GetSample(sample.LoopPoint) - baseSamp : 0; } else { deltaSamp = GetSample(pos + 1) - baseSamp; } float finalSamp = baseSamp + deltaSamp * interPos; buffer[bufPos++] += finalSamp * pargs.LeftVol; buffer[bufPos++] += finalSamp * pargs.RightVol; pargs.LeftVol += pargs.LeftVolStep; pargs.RightVol += pargs.RightVolStep; interPos += pargs.InterStep; int posDelta = (int)interPos; interPos -= posDelta; pos += posDelta; if (pos >= sample.Length) { if (sample.bLoop) { pos = sample.LoopPoint; } else { Stop(); break; } } } while (--samplesPerBuffer > 0); }
public void Init(byte ownerIdx, Note note, ADSR adsr, WrappedSample sample, byte vol, sbyte pan, int pitch, bool bFixed) { State = ADSRState.Initializing; pos = 0; processStep = 0; interPos = 0; OwnerIdx = ownerIdx; Note = note; this.adsr = adsr; this.sample = sample; this.bFixed = bFixed; bGoldenSun = (ROM.Instance.Game.Engine.HasGoldenSunSynths && sample.bLoop && sample.LoopPoint == 0 && sample.Length == 0); if (bGoldenSun) { gsPSG = ROM.Instance.Reader.ReadObject <GoldenSunPSG>(sample.GetOffset()); } SetVolume(vol, pan); SetPitch(pitch); }