template<class Int>
bool WriteWaveFile(std::vector<Int>& D, std::uint64_t Hz, std::uint16_t Channel, std::string Name = "out.wav") {
std::ofstream ofs(Name, std::ios::binary);
char RIFF[] = "RIFF";
char WAVE[] = "WAVE";
char fmt[] = "fmt ";
char data[] = "data";
std::uint32_t FSize = (44 - 8) + (D.size() * sizeof(std::vector<Int>::value_type));
std::uint32_t ui32 = 0;
std::uint16_t ui16 = 0;
ofs.write(RIFF, 4);
ofs.write(reinterpret_cast<const char*>(&FSize), 4);//fsize-8.
ofs.write(WAVE, 4);
ofs.write(fmt, 4);
ui32 = 16;
ofs.write(reinterpret_cast<const char*>(&ui32), 4);//fmt chunk size
ui16 = 1;
ofs.write(reinterpret_cast<const char*>(&ui16), 2);//sound type. PCM = 1.
ui16 = Channel;
ofs.write(reinterpret_cast<const char*>(&ui16), 2);//Channnel count.
ui32 = static_cast<std::uint32_t>(Hz);
ofs.write(reinterpret_cast<const char*>(&ui32), 4);//Sampling Hz.
ui32 = static_cast<std::uint32_t>(Hz*Channel*(sizeof(std::vector<Int>::value_type)));
ofs.write(reinterpret_cast<const char*>(&ui32), 4);//data speed??
ui16 = Channel*(sizeof(std::vector<Int>::value_type));
ofs.write(reinterpret_cast<const char*>(&ui16), 2);//BlockSize??
ui16 = (sizeof(std::vector<Int>::value_type) * 8);
ofs.write(reinterpret_cast<const char*>(&ui16), 2);//Sampling Bit.
ofs.write(data, 4);
ui32 = static_cast<std::uint32_t>(D.size() * sizeof(std::vector<Int>::value_type));
ofs.write(reinterpret_cast<const char*>(&ui32), 4);//Sample's ALL SIZE.max at 32bit.
ofs.write(reinterpret_cast<const char*>(&D[0]), D.size() * sizeof(std::vector<Int>::value_type));//WriteSamples.
return true;
}
dGVtcGxhdGU8Y2xhc3MgSW50Pgpib29sIFdyaXRlV2F2ZUZpbGUoc3RkOjp2ZWN0b3I8SW50PiYgRCwgc3RkOjp1aW50NjRfdCBIeiwgc3RkOjp1aW50MTZfdCBDaGFubmVsLCBzdGQ6OnN0cmluZyBOYW1lID0gIm91dC53YXYiKSB7CglzdGQ6Om9mc3RyZWFtIG9mcyhOYW1lLCBzdGQ6Omlvczo6YmluYXJ5KTsKCWNoYXIgUklGRltdID0gIlJJRkYiOwoJY2hhciBXQVZFW10gPSAiV0FWRSI7CgljaGFyIGZtdFtdID0gImZtdCAiOwoJY2hhciBkYXRhW10gPSAiZGF0YSI7CglzdGQ6OnVpbnQzMl90IEZTaXplID0gKDQ0IC0gOCkgKyAoRC5zaXplKCkgKiBzaXplb2Yoc3RkOjp2ZWN0b3I8SW50Pjo6dmFsdWVfdHlwZSkpOwoJc3RkOjp1aW50MzJfdCB1aTMyID0gMDsKCXN0ZDo6dWludDE2X3QgdWkxNiA9IDA7CglvZnMud3JpdGUoUklGRiwgNCk7CglvZnMud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJkZTaXplKSwgNCk7Ly9mc2l6ZS04LgkKCW9mcy53cml0ZShXQVZFLCA0KTsKCW9mcy53cml0ZShmbXQsIDQpOwoJdWkzMiA9IDE2OwoJb2ZzLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZ1aTMyKSwgNCk7Ly9mbXQgY2h1bmsgc2l6ZQoJdWkxNiA9IDE7CglvZnMud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnVpMTYpLCAyKTsvL3NvdW5kIHR5cGUuIFBDTSA9IDEuCgl1aTE2ID0gQ2hhbm5lbDsKCW9mcy53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmdWkxNiksIDIpOy8vQ2hhbm5uZWwgY291bnQuCgl1aTMyID0gc3RhdGljX2Nhc3Q8c3RkOjp1aW50MzJfdD4oSHopOwoJb2ZzLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZ1aTMyKSwgNCk7Ly9TYW1wbGluZyBIei4KCXVpMzIgPSBzdGF0aWNfY2FzdDxzdGQ6OnVpbnQzMl90PihIeipDaGFubmVsKihzaXplb2Yoc3RkOjp2ZWN0b3I8SW50Pjo6dmFsdWVfdHlwZSkpKTsKCW9mcy53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmdWkzMiksIDQpOy8vZGF0YSBzcGVlZD8/Cgl1aTE2ID0gQ2hhbm5lbCooc2l6ZW9mKHN0ZDo6dmVjdG9yPEludD46OnZhbHVlX3R5cGUpKTsKCW9mcy53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmdWkxNiksIDIpOy8vQmxvY2tTaXplPz8KCXVpMTYgPSAoc2l6ZW9mKHN0ZDo6dmVjdG9yPEludD46OnZhbHVlX3R5cGUpICogOCk7CglvZnMud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnVpMTYpLCAyKTsvL1NhbXBsaW5nIEJpdC4KCW9mcy53cml0ZShkYXRhLCA0KTsKCXVpMzIgPSBzdGF0aWNfY2FzdDxzdGQ6OnVpbnQzMl90PihELnNpemUoKSAqIHNpemVvZihzdGQ6OnZlY3RvcjxJbnQ+Ojp2YWx1ZV90eXBlKSk7CglvZnMud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnVpMzIpLCA0KTsvL1NhbXBsZSdzIEFMTCBTSVpFLm1heCBhdCAzMmJpdC4KCglvZnMud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJkRbMF0pLCBELnNpemUoKSAqIHNpemVvZihzdGQ6OnZlY3RvcjxJbnQ+Ojp2YWx1ZV90eXBlKSk7Ly9Xcml0ZVNhbXBsZXMuCgoJcmV0dXJuIHRydWU7Cn0=