我正在编写一个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
标签:pcm,gameboy,cscore,audio,c
来源: https://codeday.me/bug/20191119/2035559.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。