Я пытаюсь получить содержимое из аудиофайла и записать их в другой аудиофайл - за исключением того, что выход должен начинаться с нормальной скорости, а затем замедляться по мере того, как время прогрессирует и заканчивается на половине его первоначальной скорости. Я пытаюсь использовать интерполяционный подход Лагранжа, но, похоже, не совсем прав. Я остановился на структуре, чтобы просто посмотреть, что я делаю. Вот мой код:Постепенно замедляйте аудиофайл с нормальной скорости на половину скорости?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
FILE *original, *slowdown;
unsigned int ChunkSize, Subchunk1Size, Subchunk2Size, RIFFSize, fmtSize, dataSize, SampleRate, ByteRate;
unsigned short int AudioFormat, NumChannels, BlockAlign, BitsPerSample;
char ChunkID[5], Format[5], Subchunk1ID[5], Subchunk2ID[5];
ChunkID[4] = '\0';
Format[4] = '\0';
Subchunk1ID[4] = '\0';
Subchunk2ID[4] = '\0';
char path[FILENAME_MAX], dslowdown[FILENAME_MAX];
printf("Enter path to Alejandro_project.wav file:\n");
scanf("%s", path);
strcpy(dslowdown, path);
dslowdown[strlen(path) - 21] = '\0';
strcat(dslowdown, "Alejandro_fast.wav");
original = fopen(path, "rb");
if (!original) {
printf("Error: file does not exist.\n");
return EXIT_FAILURE;
}
fread(ChunkID, 4, 1, original);
fread(&ChunkSize, 4, 1, original);
fread(Format, 4, 1, original);
fread(Subchunk1ID, 4, 1, original);
fread(&Subchunk1Size, 4, 1, original);
fread(&AudioFormat, 2, 1, original);
fread(&NumChannels, 2, 1, original);
fread(&SampleRate, 4, 1, original);
fread(&ByteRate, 4, 1, original);
fread(&BlockAlign, 2, 1, original);
fread(&BitsPerSample, 2, 1, original);
fread(Subchunk2ID, 4, 1, original);
fread(&Subchunk2Size, 4, 1, original);
fseek(original, 0, SEEK_SET);
slowdown = fopen(dslowdown, "wb");
fwrite(ChunkID, 4, 1, slowdown);
fwrite(&ChunkSize, 4, 1, slowdown);
fwrite(Format, 4, 1, slowdown);
fwrite(Subchunk1ID, 4, 1, slowdown);
fwrite(&Subchunk1Size, 4, 1, slowdown);
fwrite(&AudioFormat, 2, 1, slowdown);
fwrite(&NumChannels, 2, 1, slowdown);
fwrite(&SampleRate, 4, 1, slowdown);
fwrite(&ByteRate, 4, 1, slowdown);
fwrite(&BlockAlign, 2, 1, slowdown);
fwrite(&BitsPerSample, 2, 1, slowdown);
fwrite(Subchunk2ID, 4, 1, slowdown);
fwrite(&Subchunk2Size, 4, 1, slowdown);
short int t[4], audio[Subchunk2Size/2], f[4];
for (i = 0; i < Subchunk2Size/2; i++) {
fread(&data, 2, 1, original);
audio[i] = data;
}
for (i = 0; i < sizeof(t)/2; i++)
t[i + 1] = t[i] + (11.41 - t[i])/11.41 * (1.0/22050.0) + t[i]/11.41 * (0.4/22050.0);
for (i = 0; i < sizeof(f)/2; i++) {
f[i + 1] = ((t[i] - t[i - 1]) * (t[i] - t[i + 1]) * (t[i] - t[i + 2]))/((t[i - 2] - t[i - 1]) * (t[i - 2] - t[i + 1]) * (t[i - 2] - t[i + 2])) * f[i - 2] + ((t[i] - t[i - 2]) * (t[i] - t[i + 1]) * (t[i] - t[i + 2]))/((t[i - 1] - t[i - 2]) * (t[i - 1] - t[i + 1]) * (t[i - 1] - t[i + 2])) * f[i - 1] + ((t[i] - t[i - 2]) * (t[i] - t[i - 1]) * (t[i] - t[i + 2]))/((t[i + 1] - t[i - 2]) * (t[i + 1] - t[i - 1]) * (t[i + 1] - t[i + 2])) * f[i + 1] + ((t[i] - t[i - 2]) * (t[i] - t[i - 1]) * (t[i] - t[i + 2]))/((t[i + 1] - t[i - 2]) * (t[i + 1] - t[i - 1]) * (t[i + 1] - t[i + 2])) * f[i + 2];
}
for (i = 0; i < Subchunk2Size; i++) {
audio[i] = audio[f[i]];
}
fwrite(audio, sizeof(audio), 1, slowdown);
fseek(slowdown, 40, SEEK_SET);
fwrite(&Subchunk2Size, 4, 1, slowdown);
fseek(slowdown, 40, SEEK_SET);
fwrite(audio, sizeof(audio), 1, slowdown);
fseek(slowdown, 4, SEEK_SET);
fwrite(&ChunkSize, 4, 1, slowdown);
fclose(slowdown);
fclose(original);
return EXIT_SUCCESS;
}
Данная программа не компилируется. i и данные не определены. Используйте -Wall при компиляции и исправлении всех предупреждений. После того, как вы получите его для компиляции, вы можете начать отладку. – user464502