exl100

Émulateur Exelvision EXL 100 (1984) dans le navigateur : dsp-cpp en WebAssembly, cartouches et cassettes BASIC
git clone https://git.schurger.org/exl100.git
Log | Files | Refs | README

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 }