麻烦使用2- d阵列生成和存储用于波形文件数据

问题描述 投票:0回答:2

最近,我一直在写歌的波形文件。不过,我决定尝试新的东西:使用2-d阵列。当我运行我的程序,但是,波文件是不是在玩什么。我的目的是创建包括笔记的阵列和阵列存储到波形文件的数据部分,以使得随着时间推移,不同的音符正在播放(即,音符我已经分配):

#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;
}
c arrays multidimensional-array wav
2个回答
0
投票

不太清楚你试图写入WAV什么调。文件,但一些初步的错误:

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

这创造了一个9x9的阵列A,B等存储在音频[0],以及所有其他值初始化为0。所以后来,你想计算频率,以及从大多数的音频值都是0。

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

由于SampleRate = 44100,你会很快走出你audio数组的边界。

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

这是什么行代码,将计算出的值存储在audio[i][0]一个int一切都说过和做过之后。我不知道为什么你当你不是试图用它做任何事情二维数组。

快乐调试!


0
投票

事实证明,我需要一个单独的数组来存储数据,然后使用一个嵌套for循环的音符存储与时间的关系。固定它是这样:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.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() {
    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;
    };
    struct WAVE w;
    FILE* fp;
    fp = fopen("song.wav", "wb");
    if (fp == NULL) {
        printf("File does not exist.\n");
        return EXIT_FAILURE;
    }
    strcpy(w.ChunkID, "RIFF");
    strcpy(w.Format, "WAVE");
    strcpy(w.Subchunk1ID, "fmt ");
    strcpy(w.Subchunk2ID, "data");
    w.Subchunk1Size = 16;
    w.AudioFormat = 1;
    w.NumChannels = 1;
    w.SampleRate = 44100;
    w.ByteRate = 2 * w.SampleRate;
    w.BitsPerSample = 16;
    w.BlockAlign = w.NumChannels * w.BitsPerSample / 8;
    short int audio[9][w.SampleRate / 3];
    float amplitude = 32700;
    int i, j, numnotes, numdatabytes;
    float f[12] = {A, As, B, C, Cs, D, Ds, E, F, Fs, G, Gs};
    int notes[9] = {1, 3, 5, 6, 8, 6, 5, 3, 1};
    numnotes = sizeof(notes) / 4;
    numdatabytes = numnotes * w.ByteRate / 3;
    for (j = 0; j < numnotes; j++) {
        for (i = 0; i < w.SampleRate / 3; i++)
            audio[j][i] = amplitude * sin(2 * M_PI * f[j] * i / w.SampleRate);
    }
    w.ChunkSize = 12 + 24 + 8 - 8 + numdatabytes;
    w.Subchunk2Size = numdatabytes;
    fwrite(&w, 44, 1, fp);
    for (i = 0; i < numnotes; i++)
        fwrite(audio[notes[i]], 2, w.SampleRate / 3, fp);
    fclose(fp);
    return EXIT_SUCCESS;
}
© www.soinside.com 2019 - 2024. All rights reserved.