#include #include #include #include using namespace std; struct Note { double freq; // Hz double duration; // seconds }; // Write a simple WAV header (16-bit mono) void writeWavHeader(ofstream &out, int sampleRate, int numSamples) { int byteRate = sampleRate * 2; int subchunk2Size = numSamples * 2; int chunkSize = 36 + subchunk2Size; out.write("RIFF", 4); out.write((char*)&chunkSize, 4); out.write("WAVEfmt ", 8); int subchunk1Size = 16; short audioFormat = 1, numChannels = 1, bitsPerSample = 16; out.write((char*)&subchunk1Size, 4); out.write((char*)&audioFormat, 2); out.write((char*)&numChannels, 2); out.write((char*)&sampleRate, 4); int byteRateVal = byteRate; short blockAlign = 2; out.write((char*)&byteRateVal, 4); out.write((char*)&blockAlign, 2); out.write((char*)&bitsPerSample, 2); out.write("data", 4); out.write((char*)&subchunk2Size, 4); } int main() { const int SAMPLE_RATE = 44100; vector bass = { {41.20, 0.5}, {41.20, 0.5}, // E {61.74, 0.5}, {61.74, 0.5}, // B {55.00, 0.5}, {55.00, 0.5}, // A {41.20, 0.5}, {41.20, 0.5} // E }; // Repeat bassline vector bassline; for (int i = 0; i < 8; ++i) bassline.insert(bassline.end(), bass.begin(), bass.end()); // Simple melody (approximation) vector melody = { {440.0, 0.5}, {440.0, 0.5}, {392.0, 0.5}, {440.0, 0.75}, {392.0, 0.25}, {349.0, 1.0}, {440.0, 0.5}, {392.0, 0.5}, {349.0, 0.5}, {330.0, 0.75}, {349.0, 0.25}, {330.0, 1.0} }; // Prepare samples vector samples; size_t melodyIndex = 0, melodySamples = 0; double melodyStep = 0, melodyFreq = melody[0].freq; for (const auto ¬e : bassline) { int nSamples = note.duration * SAMPLE_RATE; double bassStep = 2 * M_PI * note.freq / SAMPLE_RATE; for (int i = 0; i < nSamples; ++i) { // Handle melody progression if (melodyIndex < melody.size() && melodySamples <= 0) { melodyFreq = melody[melodyIndex].freq; melodyStep = 2 * M_PI * melodyFreq / SAMPLE_RATE; melodySamples = melody[melodyIndex].duration * SAMPLE_RATE; melodyIndex++; } double bassVal = 15000 * sin(i * bassStep); double melVal = 12000 * sin(i * melodyStep); short sample = (short)((bassVal + melVal) / 2); samples.push_back(sample); melodySamples--; } } // Write to WAV ofstream out("stand_by_me_song.wav", ios::binary); writeWavHeader(out, SAMPLE_RATE, samples.size()); out.write((char*)samples.data(), samples.size() * 2); out.close(); cout << "Created stand_by_me_song.wav successfully!\n"; return EXIT_SUCCESS; }