Как небольшая экспериментальная музыкальная пьеса, я пытаюсь запрограммировать песню в стандартном C. Код выводит необработанный файл PCM, который можно импортировать в Audacity. На данный момент все работает как положено, но я сталкиваюсь с проблемами при попытке записать каждый семпл как 16-битный в отличие от текущего 8-битного, который я использую.
Вплоть до момента записи текущая выборка рассчитывается как число с плавающей точкой, и ее границы в значительной степени находятся в диапазоне 8-разрядного целого числа со знаком. Затем оно записывается как 8-битное целое число, а затем повторяется процесс для следующего семпла. Это отлично работает и играет правильно. Проблема возникает, когда я пытаюсь записать его как 16-битный необработанный файл PCM - я умножаю число с плавающей запятой на 256 и копирую результат в целое число, после чего я использую fwrite для записи результирующего 16-битного целого числа. Это не дает ожидаемых результатов при импорте, что приводит к сильно искаженной версии того, что я ожидал.
Я добавил действительный код ниже, поскольку проблема возникает только на этапе записи.
Рабочий 8-битный код:
if (out<-127) {out=-128;} else if (out>126) {out=127;}
putc(out,fo);
Не работает 16-битный код:
if (out<-127) {out=-128;} else if (out>126) {out=127;}
pcm=out*256;
fwrite(&pcm,2,1,fo);
Возможно, я просто упускаю что-то очевидное, но я пытался решить это часами. Заранее спасибо!