Создание 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];
}
чудик, спрашивай в разделе ПРОГРАММИРОВАНИЕ