c - Gradually slow down audio file from normal speed to half speed? -
i'm trying contents audio file , write them audio file--except output should start @ normal speed , slow down time progresses , finish @ half original speed. i'm trying lagrange interpolation approach can't seem quite right. held off on struct see i'm doing. here's code:
#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 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 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]; (i = 0; < subchunk2size / 2; i++) { fread(&data, 2, 1, original); audio[i] = data; } (i = 0; < 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); (i = 0; < 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]; } (i = 0; < 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 figured out. went struct , redid math.
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { file *original, *fast, *slow, *slowdown; unsigned int riffsize, fmtsize, datasize; struct wave { char chunkid[4]; unsigned int chunksize; char format[4]; char subchunk1id[4]; unsigned int subchunk1size; unsigned short int audioformat; unsigned short int numchannels; int samplerate; int byterate; unsigned short int blockalign; unsigned short int bitspersample; char subchunk2id[4]; unsigned int subchunk2size; } o, f, s, sd; char path[filename_max], dfast[filename_max], dslow[filename_max], dslowdown[filename_max]; printf("enter path input wave (.wav) file:\n"); gets(path); strcpy(dfast, path); dfast[strlen(path) - 4] = '\0'; strcpy(dslow, dfast); strcpy(dslowdown, dslow); strcat(dfast, "_fast.wav"); strcat(dslow, "_slow.wav"); strcat(dslowdown, "_slowdown.wav"); original = fopen(path, "rb"); if (!original) { printf("error: file not exist.\n"); return exit_failure; } fread(&o, 44, 1, original); fseek(original, 0, seek_set); fread(&f, 44, 1, original); fseek(original, 0, seek_set); fread(&s, 44, 1, original); fseek(original, 0, seek_set); fread(&sd, 44, 1, original); fmtsize = o.subchunk1size + 8; datasize = o.subchunk2size + 8; riffsize = o.chunksize + 8 - (fmtsize + datasize); printf("characteristics of %s:\n", path); printf("riff size: %d\n", riffsize); printf("fmt size: %d\n", fmtsize); printf("data size: %d\n\n", datasize); printf("chunkid: %.4s\n", o.chunkid); printf("chunksize: %d\n", o.chunksize); printf("format: %.4s\n\n", o.format); printf("subchunk1id: %.4s\n", o.subchunk1id); printf("subchunk1size: %d\n", o.subchunk1size); printf("audioformat: %d\n", o.audioformat); printf("numchannels: %d\n", o.numchannels); printf("samplerate: %d\n", o.samplerate); printf("byterate: %d\n", o.byterate); printf("blockalign: %d\n", o.blockalign); printf("bitspersample: %d\n\n", o.bitspersample); printf("subchunk2id: %.4s\n", o.subchunk2id); printf("subchunk2size: %d\n\n", o.subchunk2size); fseek(original, 0, seek_set); fast = fopen(dfast, "wb"); f.samplerate = o.samplerate * 2; f.byterate = 2 * f.samplerate; fseek(fast, 0, seek_set); fwrite(&f, 44, 1, fast); fmtsize = f.subchunk1size + 8; datasize = f.subchunk2size + 8; riffsize = f.chunksize + 8 - (fmtsize + datasize); printf("\ncharacteristics of %s:\n", dfast); printf("riff size: %d\n", riffsize); printf("fmt size: %d\n", fmtsize); printf("data size: %d\n\n", datasize); printf("chunkid: %.4s\n", f.chunkid); printf("chunksize: %d\n", f.chunksize); printf("format: %.4s\n\n", f.format); printf("subchunk1id: %.4s\n", f.subchunk1id); printf("subchunk1size: %d\n", f.subchunk1size); printf("audioformat: %d\n", f.audioformat); printf("numchannels: %d\n", f.numchannels); printf("samplerate: %d\n", f.samplerate); printf("byterate: %d\n", f.byterate); printf("blockalign: %d\n", f.blockalign); printf("bitspersample: %d\n\n", f.bitspersample); printf("subchunk2id: %.4s\n", f.subchunk2id); printf("subchunk2size: %d\n\n", f.subchunk2size); short int data; unsigned int i; (i = 0; < f.subchunk2size / 2; i++) { fread(&data, 2, 1, original); fwrite(&data, 2, 1, fast); } fclose(fast); fseek(original, 0, seek_set); slow = fopen(dslow, "wb"); s.samplerate = o.samplerate / 2; s.byterate = 2 * s.samplerate; fseek(slow, 0, seek_set); fwrite(&s, 44, 1, slow); printf("\ncharacteristics of %s:\n", dslow); printf("riff size: %d\n", riffsize); printf("fmt size: %d\n", fmtsize); printf("data size: %d\n\n", datasize); printf("chunkid: %.4s\n", s.chunkid); printf("chunksize: %d\n", s.chunksize); printf("format: %.4s\n\n", s.format); printf("subchunk1id: %.4s\n", s.subchunk1id); printf("subchunk1size: %d\n", s.subchunk1size); printf("audioformat: %d\n", s.audioformat); printf("numchannels: %d\n", s.numchannels); printf("samplerate: %d\n", s.samplerate); printf("byterate: %d\n", s.byterate); printf("blockalign: %d\n", s.blockalign); printf("bitspersample: %d\n\n", s.bitspersample); printf("subchunk2id: %.4s\n", s.subchunk2id); printf("subchunk2size: %d\n\n", s.subchunk2size); (i = 0; < s.subchunk2size / 2; i++) { fread(&data, 2, 1, original); fwrite(&data, 2, 1, slow); } fclose(slow); fseek(original, 0, seek_set); slowdown = fopen(dslowdown, "wb"); unsigned int samples; fseek(original, 44, seek_set); fseek(slowdown, 44, seek_set); samples = o.subchunk2size / 2; double dt = 1/22050.0, out, space, t; double point[4], ta, tb, tc, td; unsigned int stamp; unsigned int count = 0; short int fd[4], audio; t = dt; space = dt; point[0] = (-1.0) * (-2.0) * (-3.0) * dt; point[1] = (1.0) * (-1.0) * (-2.0) * dt; point[2] = (2.0) * (1.0) * (-1.0) * dt; point[3] = (3.0) * (2.0) * (1.0) * dt; while (t < (samples - 2) * dt) { stamp = (int)(t / dt - 1); fseek(original, 44 + stamp * 2, seek_set); for(i = 0; < 4; i++) { fread(&fd[i], 2, 1, original); } ta = stamp * dt; tb = (stamp + 1) * dt; tc = (stamp + 2) * dt; td = (stamp + 3); out = (((t - tb) * (t - tc) * (t - td)) / (point[0])) * fd[0] + (((t - ta) * (t - tc) * (t - td)) / (point[1])) * fd[1] + (((t - ta) * (t - tb) * (t - td)) / (point[2])) * fd[2] + (((t - ta) * (t - tb) * (t - tc)) / (point[3])) * fd[3]; audio = (short int)(out); fwrite(&audio, 2, 1, slowdown); space = (((samples - 1) * dt - t) / ((samples - 1) * dt)) * dt + (t / ((samples - 1) * dt)) * .4 * dt; t += space; count++; } sd.subchunk2size = count * 2; sd.chunksize = 36 + sd.subchunk2size; fseek(slowdown, 0, seek_set); fwrite(&sd, 44, 1, slowdown); fmtsize = sd.subchunk1size + 8; datasize = sd.subchunk2size + 8; riffsize = sd.chunksize + 8 - (fmtsize + datasize); printf("\ncharacteristics of %s:\n", dslowdown); printf("riff size: %d\n", riffsize); printf("fmt size: %d\n", fmtsize); printf("data size: %d\n\n", datasize); printf("chunkid: %.4s\n", sd.chunkid); printf("chunksize: %d\n", sd.chunksize); printf("format: %.4s\n\n", sd.format); printf("subchunk1id: %.4s\n", sd.subchunk1id); printf("subchunk1size: %d\n", sd.subchunk1size); printf("audioformat: %d\n", sd.audioformat); printf("numchannels: %d\n", sd.numchannels); printf("samplerate: %d\n", sd.samplerate); printf("byterate: %d\n", sd.byterate); printf("blockalign: %d\n", sd.blockalign); printf("bitspersample: %d\n\n", sd.bitspersample); printf("subchunk2id: %.4s\n", sd.subchunk2id); printf("subchunk2size: %d\n\n", sd.subchunk2size); printf("\nas can see, differences between fast/slow output files , original input file sample rate , byte rate. however, slowdown output file differs original input file not in sample rate , byte rate, in data size, chunk size, , subchunk2 size.\n"); fclose(slowdown); fclose(original); return exit_success; }
Comments
Post a Comment