wav2k7.cpp (1607B)
1 // Convertit un enregistrement de cassette EXL 100 (.wav) en image .k7 compacte, avec le décodeur 2 // de cassette de dsp-cpp lui-même (exelv_tape). Un .k7 n'est que la suite d'octets décodés. 3 // Compilé en WebAssembly exécutable par Node (NODERAWFS pour lire/écrire les fichiers de l'hôte) : 4 // emcc -I upstream/src tools/wav2k7.cpp upstream/src/drivers/computers/exelv_tape.cpp \ 5 // -sNODERAWFS=1 -sENVIRONMENT=node -o tools/wav2k7.js 6 // node tools/wav2k7.js in.wav out.k7 7 #include "drivers/computers/exelv_tape.h" 8 #include <cstdio> 9 #include <string> 10 #include <vector> 11 12 int main(int argc, char** argv) { 13 if (argc < 3) { std::fprintf(stderr, "usage: wav2k7 in.wav out.k7\n"); return 2; } 14 FILE* f = std::fopen(argv[1], "rb"); 15 if (!f) { std::fprintf(stderr, "cannot open %s\n", argv[1]); return 2; } 16 std::fseek(f, 0, SEEK_END); 17 long n = std::ftell(f); 18 std::fseek(f, 0, SEEK_SET); 19 std::vector<uint8_t> file(size_t(n < 0 ? 0 : n)); 20 if (n > 0 && std::fread(file.data(), 1, size_t(n), f) != size_t(n)) { std::fclose(f); return 2; } 21 std::fclose(f); 22 23 dsp::ExelTape tape; 24 std::string err; 25 if (!tape.load_wav(file, &err)) { std::fprintf(stderr, "decode failed: %s\n", err.c_str()); return 1; } 26 const auto& b = tape.bytes(); 27 if (b.empty()) { std::fprintf(stderr, "empty result\n"); return 1; } 28 FILE* o = std::fopen(argv[2], "wb"); 29 if (!o) { std::fprintf(stderr, "cannot write %s\n", argv[2]); return 2; } 30 std::fwrite(b.data(), 1, b.size(), o); 31 std::fclose(o); 32 std::fprintf(stderr, "%zu octets\n", b.size()); 33 return 0; 34 }