karplus-strong吉他使用c#和naudio

时间:2014-09-01 18:46:33

标签: c# naudio

我只是尝试使用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);

}

我能听到的声音实际上没有吉他声。它就像金属的东西:)。有没有办法更好地做到这一点?我做错了什么?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

看起来你正在将16位样本截断为8位样本(无法看到你正在使用的WaveFormat)。我建议创建一个继承自ISampleProvider的类,允许您提供浮点样本(其中1.0f是满量程)。

此外,您完全忽略了Read函数的count方法。这表示需要多少字节。对于ISampleProvider,它是样本数。