2015-12-02 115 views
3

我正在編程一個C#模擬器,並決定使用CScore輸出PCM。 當樣本大小(對於每個通道)是一個字節時,聲音輸出正確,但是當我將樣本大小增加到16位時,聲音非常嘈雜。CScore輸出PCM大於一個字節

一個相關的問題,這一問題是如何將這些2個字節解釋(是他們簽下高位在前?)

這大約是我在做什麼:

首先,我產生的樣品一樣

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 

我敢肯定有一些明顯的我失蹤,但我一直在調試這一段時間並且似乎沒有明確指出問題所在。

謝謝

回答

3

走在這裏的恥辱。 問題是我沒有考慮到現在我需要生成一半的樣本量(CScore要求的是字節數量,而不是樣本數量)。 在我的示例中,我必須將sampleCount變量除以sampleSize以生成正確數量的聲音。

這個噪音是因爲我沒有將額外的樣本與來自CScore的下一個Read調用同步(我正在生成聲音,而不是預先緩衝它,這樣我就沒有延遲引入,因爲額外的樣本)。

我發現了看這個問題:SampleToPcm16.cs

+0

感謝分享。你可以將自己的答案標記爲正確答案;-) – GabrielOshiro

相關問題