示例#1
0
        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);
        }
示例#2
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);
        }