我只是尝试使用naudio根据http://www.cs.princeton.edu/courses/archive/fall07/cos126/assignments/guitar.html使用Karplus-Strong算法实现吉他拨弦。
现在我有了Read方法:
public override int Read(byte[] buffer, int offset, int count)
{
int samples = (int)(SamplingRate / Frequency);
for (int i = 0; i < samples; i++)
{
var arr = _ringBuffer.ToArray();
buffer[i] = (byte)((short)((Math.Pow(2, 15) - 1) * arr[i]) & 0x00ff);
}
Tic();
return samples;
}
这对于Tic方法:
private void Tic()
{
var newLastValue = ENERGY_DECAY_FACTOR * ((1 / 2) * (_ringBuffer.Dequeue() + _ringBuffer.Peek()));
_ringBuffer.Enqueue((float)newLastValue);
}
我能听到的声音实际上没有吉他声。它就像金属的东西:)。有没有办法更好地做到这一点?我做错了什么?有什么想法吗?
答案 0 :(得分:0)
看起来你正在将16位样本截断为8位样本(无法看到你正在使用的WaveFormat)。我建议创建一个继承自ISampleProvider的类,允许您提供浮点样本(其中1.0f是满量程)。
此外,您完全忽略了Read函数的count方法。这表示需要多少字节。对于ISampleProvider,它是样本数。