c#-CScore输出PCM大于一个字节

我正在编写一个C#仿真器,并决定使用CScore输出PCM.
当样本大小(每个通道)为一个字节时,声音会正确输出,但是当我将样本大小增加到16位时,声音会非常嘈杂.

与该问题相关的问题是如何解释这两个字节(它们是否带符号?高字节在前?)

这大致就是我在做什么:

首先,我这样生成样本

public void GenerateSamples(int sampleCount)
{
  while(sampleCount > 0)
  {
    --sampleCount;

    for(int c = 0; c < _numChannels; ++c)
    {
      _buffer[_sampleIndex++] = _outputValue;
    }

    // The amount of ticks in a sample
    _tickCounter -= APU.MinimumTickThreshold;
    if(_tickCounter < 0)
    {
      _tickCounter = _tickThreshold;
      _up = !_up;
      // Replicating signed behaviour
      _outputValue = (short)(_up ? 32767 : -32768);
    }
  }
}

这将生成一个简单的方波,其频率由_tickThreshold确定.如果_buffer是字节数组,则声音正确.
我想将其与短裤一起输出,因为它将使我能够使用带符号的样本,并只需添加多个通道即可对其进行混合.

这就是我输出声音的方式.

  for(int i = 0; i < sampleCount; ++i)
  {
    for(int c = 0; c < _numChannels; ++c)
    {
      short sample = _channel.Buffer[_channelSampleIndex++];
      // Outputting the samples the other way around doesn't output
      // sound for me
      _buffer[_sampleIndex++] = (byte)sample;
      _buffer[_sampleIndex++] = (byte)(sample >> 8);
    }
  }

我正在使用的WaveFormat是这样确定的:

  _waveFormat = new WaveFormat(_apu.SampleRate,      // 44000
                               _apu.SampleSize * 8,  // 16
                               _apu.NumChannels);    // 2

我很确定我确实缺少一些明显的东西,但是我已经调试了一段时间了,而且似乎无法查明问题出在哪里.

谢谢

解决方法:

在这里丢人.
问题是我没有考虑到现在我需要生成一半数量的样本(CScore要求字节数量,而不是样本数量).
在我的示例中,我必须将sampleCount变量除以sampleSize才能生成正确的声音量.

之所以产生噪音,是因为我没有将额外的样本与CScore的下一个Read调用进行同步(我正在动态生成声音,而不是对其进行预先缓冲.这样,由于额外的样本,我不会出现延迟).

我发现有关此问题的信息:SampleToPcm16.cs

上一篇:24位PCM采样数据转成16位算法,已实现PCM转WAV在线工具源码支持24bits、16bits、8bits


下一篇:win7中java编程工具安装 java环境变量设置