Top.Mail.Ru
Ответы

Создание wav - файла на С++

Я пишу код на C++, который обрабатывает текстовый файл с параметрами (S(i) A, f, t, t0, где S(i) - номер строки, A - амплитуда ноты, f - частота ноты, t - продолжительность воспроизведения, t0 - начало воспроизведения). Мой код этот файл обрабатывает следующим образом: он удаляет все лишние символы, кроме "чисел", после этого делает их целочисленными и записывает в двумерный динамический массив. Затем он создаёт массив микроамплитуд к каждой из нот, которые после этого передаются в сам WAV-файл. Так же я использую структуру WaveHeader, которая по сути структура RIFF. Этот код создаёт WAV-файл, но его продолжительность не соответствует параметрам, которые задаёт пользователь. Помимо этого звук сильно искажен. Как это исправить? Где ошибки?
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <sstream>
#include <math.h>
#include <cstring>

#define PI 3.14

using namespace std;
using uli = unsigned long int;


struct WaveHeader
{
public:
char chunkID[4];
int chunkSize;
char format[4];
char subChunk1ID[4];
int subChunk1Size;
short int audioFormat;
short int numChannels;
int sampleRate;
int byteRate;
short int blockAlign;
short int bitsPerSample;
char subChunk2ID[4];
int dataSize;
float data;
};




int main()
{
ifstream file;
file.open ("Parameters.txt");


WaveHeader waveHeader;
strcpy(waveHeader.chunkID, "RIFF\0");
waveHeader.chunkSize = 36;
strcpy(waveHeader.format, "WAVE\0");
strcpy(waveHeader.subChunk1ID, "fmt \0");
waveHeader.subChunk1Size = 16;
waveHeader.audioFormat = 1;
waveHeader.numChannels = 2;
waveHeader.sampleRate = 44100;
waveHeader.dataSize = (waveHeader.sampleRate * waveHeader.numChannels * waveHeader.bitsPerSample) / 8;
waveHeader.data = 500000;
waveHeader.byteRate = waveHeader.sampleRate * waveHeader.numChannels * (waveHeader.bitsPerSample / 8);
waveHeader.blockAlign = waveHeader.numChannels * (waveHeader.bitsPerSample / 8);
waveHeader.bitsPerSample = 16;
strcpy(waveHeader.subChunk2ID, "data\0");

Дополнен

if (! file.is _open())

{

cout << "Problems accessing the file";

return 0;

}

else

{

string separate_line;

string summary_line;

while (!file.eof())

{

getline(file, separate_line);

for (unsigned int i = 0; i != separate_line.length(); i++)

{

if (isdigit(separate_line[i]) || (separate_line[i] == '.'))

{

summary_line += separate_line[i];

}

else if (separate_line[i] == '=')

{

separate_line[i] = ' ';

summary_line += separate_line[i];

}

else if (separate_line[i] == ';')

Дополнен

{



summary_line += ' ';



}



}



}



istringstream ss(summary_line);



int n = 0;



float num;



vector <float> arr;



while (ss >> num)



{



arr.push_back(num);



n++;



}



short rows = n / 5;



short cols = 5;



float **data_of_parameters_arr = new float* [rows];



short plus = 0;



for (int i = 0; i < rows; i++)



{



data_of_parameters_arr[i] = new float[cols];



}



for (int i=0; i < rows; i++)



{



plus += 0;



for (int j = 0; j < cols; j++)



{



data_of_parameters_arr[i][j] = arr[j + plus];



}



plus += 5;

Дополнен

}







int count_of_micro_ampl = 0;







for (int c = 0; c < rows; c++)







{







for (int k = 0; k < waveHeader.sampleRate * data_of_parameters_arr[c][3]; k++)







{







count_of_micro_ampl += 1;







}

Дополнен

}



float* arr_of_ampl = new float[count_of_micro_ampl];















float step = 1.0 / waveHeader.sampleRate;















float amplitude = 0;















uli number_of_element = 0;















for (int c = 0; c < rows; c++)















{















for (int k = 0; k < waveHeader.sampleRate * data_of_parameters_arr[c][3]; k++)















{















amplitude = sin(2 * PI * step * data_of_parameters_arr[c][3] + data_of_parameters_arr[c][4]);















arr_of_ampl[number_of_element] = amplitude;















number_of_element++;















step += (1.0 / waveHeader.sampleRate);



}


step = 1.0 / waveHeader.sampleRate;



}


ofstream outfile("FinalSoundNew.wav");


outfile.write((const char *)&waveHeader, sizeof(waveHeader));

float* pcm = (float*)&arr_of_ampl;



for (int i = 0; i < waveHeader.sampleRate; i++)


{

outfile.write(reinterpret_cast<const char*>(pcm) + i * 8, sizeof(waveHeader));


}
outfile.close();


delete [] arr_of_ampl;

for (int i = 0; i < rows; i++)

delete [] data_of_parameters_arr[i];


}

По дате
По рейтингу
Аватар пользователя
Оракул

чудик, спрашивай в разделе ПРОГРАММИРОВАНИЕ