123 public int Read(
float[] buffer,
int offset,
int count)
125 int framesRequested = count / 2;
126 int framesRendered = 0;
128 while (framesRendered < framesRequested)
130 int remaining = framesRequested - framesRendered;
131 int renderCount = Math.Min(remaining, _left.Length);
133 var leftSpan = _left.AsSpan(0, renderCount);
134 var rightSpan = _right.AsSpan(0, renderCount);
137 _sequencer.Render(leftSpan, rightSpan);
141 for (
int i = 0; i < renderCount; i++)
143 float left = leftSpan[i];
144 float right = rightSpan[i];
146 buffer[offset++] = left;
147 buffer[offset++] = right;
149 if (Math.Abs(left) > Tolerance || Math.Abs(right) > Tolerance)
153 framesRendered += renderCount;
159 _sequencer.Play(_midiFile, loop:
false);
168 return framesRendered * 2;
205 public void Seek(TimeSpan time)
207 _synthesizer.Reset();
209 _sequencer.Play(_midiFile, loop:
false);
211 int framesToSkip = (int)(time.TotalSeconds * _synthesizer.SampleRate);
213 while (framesToSkip > 0)
215 int chunk = Math.Min(framesToSkip, _seekLeft.Length);
218 _sequencer.Render(_seekLeft.AsSpan(0, chunk), _seekRight.AsSpan(0, chunk));
220 framesToSkip -= chunk;