// 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); }
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; }