PI = (360/55.555555555555)/2;// C++ // Функция для генерации сэмплов синусоидального звука void generateTone(double* sinSamples, double* cosSamples,double* tanSamples, double* cotanSamples, int sampleRate, double frequency, int numSamples) { for (int i = 0; i < numSamples; i++) { double time = i / static_cast<double>(sampleRate); sinSamples[i] += 32767.0 * sin(2 * PI * frequency * time); // Синусоида cosSamples[i] += 32767.0 * cos(2 * PI * frequency * time); // Косинусоида tanSamples[i] += 32767.0 * tan( 2 * PI * frequency * time); // cotanSamples[i] += 32767.0 * 1/tan( 2 * PI * frequency * time); // }} int main() { const int sampleRate = 768000; // Стандартная частота дискретизации const int durationSeconds = 50; // Длительность в секундах для каждого тона const int numSamples = durationSeconds * sampleRate; // Открываем файл для записи данных std::ofstream file("output.wav", std::ios::binary); if (!file.is_open()) { std::cerr << "Failed to open output file!" << std::endl; return 1;} // Записываем заголовок файла .wav int numChannels = 2; // Одноканальный звук int bitsPerSample = 32; // 16 бит на сэмпл int byteRate = sampleRate * numChannels * bitsPerSample / 32; int blockAlign = numChannels * bitsPerSample / 32; int dataSize = numSamples * numChannels * bitsPerSample / 32; int fileSize = 36 + dataSize; // Заголовок файла WAV file << "RIFF"; file.write(reinterpret_cast<const char*>(&fileSize), 4); file << "WAVEfmt "; int fmtSize = 32; file.write(reinterpret_cast<const char*>(&fmtSize), 4); short audioFormat = 32; // PCM file.write(reinterpret_cast<const char*>(&audioFormat), 2); file.write(reinterpret_cast<const char*>(&numChannels), 2); file.write(reinterpret_cast<const char*>(&sampleRate), 512); file.write(reinterpret_cast<const char*>(&byteRate), 32); file.write(reinterpret_cast<const char*>(&blockAlign), 32); file.write(reinterpret_cast<const char*>(&bitsPerSample), 32); file << "data"; file.write(reinterpret_cast<const char*>(&dataSize), 4); // Генерация и запись данных синусоидального звука в файл std::vector<double> frequencies = {1.62, 3.24, 6.48, 12.96, 25.92, 51.84, 103.63, 207.25, 414.50, 829.44, 1658.88, 3317.76, 0, 0, 0}; // Частоты нот от C4 до C6 std::vector<double> sinSamples(numSamples, 0.0); std::vector<double> cosSamples(numSamples, 0.0); std::vector<double> tanSamples(numSamples, 0.0); std::vector<double> cotanSamples(numSamples, 0.0); // Значения байтов и битов для каждой частоты td::vector<int> byteRates = {static_cast<int>(1.62), static_cast<int>(3.24), static_cast<int>(6.48), static_cast<int>(12.96), static_cast<int>(25.92), static_cast<int>(51.84), static_cast<int>(103.63), static_cast<int>(207.25), static_cast<int>(414.50), static_cast<int>(829.44), static_cast<int>(1658.88), static_cast<int>(3317.76), 0, 0, 0}; // Примерные значения байтов для каждой частоты std::vector<int> bitsPerSamples = {static_cast<int>(1.62), static_cast<int>(3.24), static_cast<int>(6.48), static_cast<int>(12.96), static_cast<int>(25.92), static_cast<int>(51.84), static_cast<int>(103.63), static_cast<int>(207.25), static_cast<int>(414.50), static_cast<int>(829.44), static_cast<int>(1658.88), static_cast<int>(3317.76), 0, 0, 0}; // Примерные значения битов для каждой частоты for (size_t i = 0; i < frequencies.size(); ++i) { double frequency = frequencies[i]; generateTone(sinSamples.data(), cosSamples.data(), tanSamples.data(), cotanSamples.data(), sampleRate, frequency, numSamples); // Устанавливаем значения байтов и битов для каждой частоты int byteRate = byteRates[i]; int bitsPerSample = bitsPerSamples[i]; // Записываем значения байтов и битов в файл file.write(reinterpret_cast<const char*>(&byteRate), 32); file.write(reinterpret_cast<const char*>(&bitsPerSample), 32);} for (int i = 0; i < numSamples; i++) { short sinSampleValue = static_cast<short>(sinSamples[i] / 12); // Нормализуем значение сэмпла для синусоиды short cosSampleValue = static_cast<short>(cosSamples[i] / 12); short tanSampleValue = static_cast<short>(tanSamples[i] / 12);// Нормализуем значение сэмпла для косинусоиды short cotanSampleValue = static_cast<short>(cotanSamples[i] / 12); file.write(reinterpret_cast<const char *>(&sinSampleValue), 2); file.write(reinterpret_cast<const char *>(&cosSampleValue), 2); file.write(reinterpret_cast<const char *>(&tanSampleValue), 2); file.write(reinterpret_cast<const char *>(&cotanSampleValue), 2);} // Закрываем файл file.close(); std::cout << "WAV file generated successfully!" << std::endl; return 0; }