pcmData = new byte[dataSize];
bufferSize = fileStream.Read(pcmData, 0, pcmData.Length);
fileStream.Close();
double[] leftChannels = new double[stream.Length/4];
double[] rightChannels = new double[stream.Length / 4];
좌측 채널과 우측 채널은 2바이트당 하나의 샘플인데, 좌 우 채널 가각 동일한 길이의 샘플을 나타내야 하기 때문에, 2로 나눈 뒤 다시 채널 개수만큼 2로 나누면 총 4를 나눈 것 과 같다.
stream은 2칸 단위로 건너뛰면서 for문을 시행하되, for의 진행 값인 i에 대해 4를 나누어서 나머지가 0이라면 각각 0, 4, 8, 12 오프셋임을 나타낸다. 이의 경우는 left channel을 의미하기에 leftchanel에 담아주고, 그 외는 right channel에 담아준다. 특히 left channel이 시작, right channel이 한 상의 끝이기 때문에 right channel을 넣어준 뒤 내부 Index는 1 더해주어 차곡 차곡 쌓이게끔 탑재한다.
for(int i=0;i<stream.Length; i+=2)
{
int value = BitConverter.ToInt16(stream, i);
double realValue = ((double)value / (double)32767);
if (i % 4 == 0)
{
leftChannels[internalIndex] = realValue;
}
else
{
rightChannels[internalIndex] = realValue;
internalIndex += 1;
}
}
각각 두 개씩 가져와진 2 byte의 array 는 BitConverter 을 통해 Int16비트로 변환해준다.
double 값에 넣어주기 위해 32767 로 나누어 double 형으로 변환한다. 이 떄 주의할 점은, value와 32767은 기본적으로 int 형이기 때문에 double로 우선 변환 뒤 나누어주어야 double형으로 계산이 가능하다.
그리기