Exemple #1
0
        // Return: Ture if end.
        public bool Update(float[] aSoundBuffer, int aChannels, int aSampleRate)
        {
            SoundTime PositionPre = Position;

            Position += GetOneSample(aSampleRate);
            Elapsed  += GetOneSample(aSampleRate);

            if (isLoop == true)
            {
                if (loop.length.sample > 0)
                {
                    if (PositionPre.sample < loop.end.sample + 1 && Position.sample >= loop.end.sample + 1)
                    {
                        Position = new SoundTime(PositionPre.sampleRate, Position.sample - (loop.end.sample + 1 - loop.start.sample));
                    }
                    else if (Position.sample >= waveform.format.samples)
                    {
                        Position = new SoundTime(Position.sampleRate, Position.sample - waveform.format.samples);
                    }
                }
                else
                {
                    if (Position.sample >= waveform.format.samples)
                    {
                        Position = new SoundTime(Position.sampleRate, PositionPre.sample - waveform.format.samples);
                    }
                }
            }

            if (Position.sample + 1 < waveform.format.samples)
            {
                for (int i = 0; i < aChannels; i++)
                {
                    aSoundBuffer[i] = MeanInterpolation.Calculate(waveform, i, Position.sample);
                }
            }
            else if (Position.sample < waveform.format.samples)
            {
                for (int i = 0; i < aChannels; i++)
                {
                    if (loop.length.sample > 0)
                    {
                        aSoundBuffer[i] = MeanInterpolation.Calculate(waveform, i, Position.sample, loop.start.sample);
                    }
                    else
                    {
                        aSoundBuffer[i] = waveform.reader.GetSample(i, ( int )Position.sample);
                    }
                }
            }
            else             // End position.
            {
                return(true);
            }

            return(false);
        }
Exemple #2
0
        public void GetEnvelope(double[] aBufer, double aAddSamples, ref GeneratorEnvelope aGeneratorEnvelope)
        {
            if (( int )aGeneratorEnvelope.samplePosition + 1 < aGeneratorEnvelope.waveform.format.samples)
            {
                aBufer[0] = MeanInterpolation.Calculate(aGeneratorEnvelope.waveform, aGeneratorEnvelope.samplePosition, 0);
                aBufer[1] = MeanInterpolation.Calculate(aGeneratorEnvelope.waveform, aGeneratorEnvelope.samplePosition, 1);
            }
            // To Be Commented.
            // ループエンドまでは再生する。
            else if (( int )aGeneratorEnvelope.samplePosition >= aGeneratorEnvelope.soundfont.soundinfo.loopEnd && aGeneratorEnvelope.soundfont.soundinfo.loopMode == true)
            {
                // To Be Commented.
                // なぜ"loopStart + 1"になるのか確認する.
                aBufer[0] = MeanInterpolation.Calculate(aGeneratorEnvelope.waveform, aGeneratorEnvelope.samplePosition, aGeneratorEnvelope.soundfont.soundinfo.loopStart + 1, 0);
                aBufer[1] = MeanInterpolation.Calculate(aGeneratorEnvelope.waveform, aGeneratorEnvelope.samplePosition, aGeneratorEnvelope.soundfont.soundinfo.loopStart + 1, 1);
            }

            AddSamplePoint(aAddSamples, ref aGeneratorEnvelope);
        }
        public void Update(float[] aSoundBuffer, int aChannels, int aSampleRate)
        {
            LoopInformation lLoop = music.Loop[loopNumber1][loopNumber2];

            if (lLoop.start.sample != 0 && lLoop.end.sample != 0 && ( int )timePosition.sample > lLoop.end.sample)
            {
                Logger.LogDebug("Start:" + lLoop.start.sample + ", End:" + lLoop.end.sample);

                double diff = timePosition.sample % 1.0d;
                timePosition.sample = ( int )lLoop.start.sample + diff;
            }

            if (( int )timePosition.sample + 1 < music.SampleLength)
            {
                for (int i = 0; i < aChannels; i++)
                {
                    aSoundBuffer[i] = MeanInterpolation.Calculate(music, i, timePosition.sample);
                }
            }
            else if (( int )timePosition.sample < music.SampleLength)
            {
                for (int i = 0; i < aChannels; i++)
                {
                    aSoundBuffer[i] = MeanInterpolation.Calculate(music, i, timePosition.sample, ( int )lLoop.start.sample);
                }
            }
            else
            {
                timePosition.sample = 0.0d;
            }

            if (timePosition.sample == 1)
            {
                Logger.LogDebug("Start:" + aSoundBuffer[0]);
            }

            timePosition.sample += ( double )music.SampleRate / ( double )aSampleRate;
            timeElapsed.sample  += ( double )music.SampleRate / ( double )aSampleRate;
        }