gpt4 book ai didi

c - 使用二维数组创建和存储波形文件数据时遇到问题

转载 作者:行者123 更新时间:2023-11-30 19:42:38 26 4
gpt4 key购买 nike

最近,我一直在将歌曲写成波形文件。然而,我决定尝试一些新的东西:使用二维数组。然而,当我运行程序时,波形文件没有播放任何内容。我的目的是创建一个由音符组成的数组,并将该数组存储到波形文件的数据部分中,以便随着时间的推移,播放不同的音符(即我分配的音符):

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define A 440.00
#define As 466.16
#define B 493.88
#define C 523.25
#define Cs 554.37
#define D 587.33
#define Ds 622.25
#define E 659.25
#define F 698.46
#define Fs 739.99
#define G 783.99
#define Gs 830.61

int main() {
FILE* fp;
fp = fopen("song.wav", "wb");
if (fp == NULL) {
printf("File does not exist.\n");
return EXIT_FAILURE;
}
char ChunkID[4] = "RIFF", Format[4] = "WAVE", Subchunk1ID[4] = "fmt ", Subchunk2ID[4] = "data";
unsigned int ChunkSize, Subchunk1Size, Subchunk2Size;
unsigned short int AudioFormat, NumChannels, BlockAlign, BitsPerSample;
int SampleRate, ByteRate;
ChunkSize = 12 + 24 + 8 - 8 + 5 * 44100 * 2;
Subchunk1Size = 16;
AudioFormat = 1;
NumChannels = 1;
SampleRate = 44100;
ByteRate = 2 * SampleRate;
BitsPerSample = 16;
BlockAlign = NumChannels * BitsPerSample / 8;
Subchunk2Size = 9 * ByteRate;
int i, j;
short int audio[9][9] = {A, B, Cs, D, E, D, Cs, B, A};
float freq, amplitude = 32700;
for (i = 0; i < 9 * SampleRate; i++){
for (j = 0; j == i; j++)
freq = audio[i][j] * 2.0 * M_PI;
*audio[i] = amplitude * sin(freq * i / SampleRate);
}
fwrite(ChunkID, 4, 1, fp);
fwrite(&ChunkSize, 4, 1, fp);
fwrite(Format, 4, 1, fp);
fwrite(Subchunk1ID, 4, 1, fp);
fwrite(&Subchunk1Size, 4, 1, fp);
fwrite(&AudioFormat, 2, 1, fp);
fwrite(&NumChannels, 2, 1, fp);
fwrite(&SampleRate, 4, 1, fp);
fwrite(&ByteRate, 4, 1, fp);
fwrite(&BlockAlign, 2, 1, fp);
fwrite(&BitsPerSample, 2, 1, fp);
fwrite(Subchunk2ID, 4, 1, fp);
fwrite(&Subchunk2Size, 4, 1, fp);
fwrite(audio, 2, 1, fp);
fclose(fp);
return EXIT_SUCCESS;
}

最佳答案

不太确定您要向 wav 写入什么曲调。文件,但有一些初始错误:

short int audio[9][9] = {A, B, Cs, D, E, D, Cs, B, A};

这会创建一个 9x9 数组,其中 A、B 等存储在 audio[0] 中,所有其他值都初始化为 0。所以稍后,您尝试计算频率,而大多数音频值都是 0。

  for (i = 0; i < 9 * SampleRate; i++){

由于 SampleRate = 44100,您将很快超出 audio 数组的范围。

    *audio[i] = amplitude * sin(freq * i / SampleRate);

这行代码的作用是,在完成所有操作后,它将计算值作为 int 存储在 audio[i][0] 中。我不知道为什么当你不尝试用它做任何事情时你有一个二维数组。

调试愉快!

关于c - 使用二维数组创建和存储波形文件数据时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31282564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com