From e9a985da094b11680904de97abf18d409b6be43a Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Mon, 11 Aug 2025 18:23:29 +0200 Subject: [PATCH] added check for MW XT --- main.py | 100 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 25 deletions(-) diff --git a/main.py b/main.py index 28cf942..ad5ce46 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,3 @@ -import enum import os import re import struct @@ -22,12 +21,18 @@ class AImage(abc.ABC): def is_valid(self): return False + def wave_extract(self): + pass + + def wave_table_extract(self): + pass + @staticmethod def _check(data: bytes, target: dict): is_valid = True is_valid &= AImage._check_len(data, target['LEN']) is_valid &= AImage._check_fingerprint(data, target['DIGEST']) - is_valid &= AImage._check_version(data, 0x1B430, bytearray.fromhex(target['VERSION'])) + is_valid &= AImage._check_version(data, 0x1B430, target['VERSION']) print("is_valid =", is_valid) @@ -48,7 +53,7 @@ class AImage(abc.ABC): @staticmethod def _check_version(data: bytes, offset : int, target: bytearray): actual = data[offset:offset+len(target)] - print(actual) + print((actual)) return actual == target @staticmethod @@ -90,14 +95,10 @@ class WaldorfMicroWave1V25(AImage): pass class WaldorfMicroWave2V00(AImage): - class ImagePart(enum.Enum): - Hi = 0 - Lo = 1 - target = { "LEN" : 131072, "DIGEST" : b'\xe3G\n~\xfb\xd0P\xf4~\x8d\xf3\x12p9\x88X\x95e\xc2\xc5e\xdev\xe6\r\xaba\x8b\xadDY\x90', - "VERSION" : "322E3030300000004D6F6E204D617220372031323A30363A3132204D4554203139393400303230303934303337000000" + "VERSION" : b'2.000\x00\x00\x00Mon Mar 7 12:06:12 MET 1994\x00020094037\x00\x00\x00' } wave_data_descr = [ @@ -125,6 +126,8 @@ class WaldorfMicroWave2V00(AImage): def __init__(self, folder: str, out_dir="."): AImage.__init__(self, folder, out_dir) self._is_valid = False + self.data_hi = None + self.data_lo = None def parse(self): filename_hi = None @@ -142,35 +145,27 @@ class WaldorfMicroWave2V00(AImage): if filename_lo is None: return False - data, data_hi, data_lo = self.combine(filename_hi, filename_lo) + data, self.data_hi, self.data_lo = self.combine(filename_hi, filename_lo) self._is_valid = self._check(data, self.target) if self._is_valid: - self._save("combined_test_be.bin", data) - - wave_data = self.wave_extract(self.wave_data_descr, data_hi, data_lo) - self._save("wave_data.bin", wave_data) - - wave_table = self.wave_table_extract(self.wave_tables_descr, data_hi, data_lo) - self._json_save("wave_table.json", wave_table) + self._save("combined_be.bin", data) return self._is_valid - @staticmethod - def wave_extract(descr, data_hi, data_lo): + def wave_extract(self): data = b'' - for des, rom_data in zip(descr, [data_hi, data_lo]): + for des, rom_data in zip(self.wave_data_descr, [self.data_hi, self.data_lo]): offset = des['offset'] length = des['len'] data += rom_data[offset:offset+length] return data - @staticmethod - def wave_table_extract(descr, data_hi, data_lo): + def wave_table_extract(self): data = [] table_count = 0 pos = 0 - for des, rom_data in zip(descr, [data_hi, data_lo]): + for des, rom_data in zip(self.wave_tables_descr, [self.data_hi, self.data_lo]): offset = des['offset'] length = des['len'] @@ -203,8 +198,39 @@ class PpgEvu2v00(AImage): pass class WaldorfMicrowaveXT(AImage): + target = { + "LEN" : 262144, + "DIGEST" : b'r+\xf7a\r\xe6\xd6\xe4\xfazq\x08\xf6\xfce\t\x91L\xd9\x9a\x85\xddS\xa9\x19\x9fx\xb1\xa4V\xf9\x9e', + "VERSION" : b'\x00\x01g\x16`\x00\x00\xa0\x0cD\x00\x03gT\x0cD\x00\x04g\x00\x00\x82`\x00\x00\x8e2KA\xfa\xee\xd6' + } + + wave_data_descr = [ + { + 'offset': 0xAA18, + 'len': 0x1B00 + }, + { + 'offset': 0xAA18, + 'len': 0x3000 + } + ] + + wave_tables_descr = [ + { + 'offset': 0x9A18, + 'len': 0x0E00 + }, + { + 'offset': 0x9A18, + 'len': 0x0600 + } + ] + def __init__(self, folder: str, out_dir="."): AImage.__init__(self, folder, out_dir) + self._is_valid = False + self.data_hi = None + self.data_lo = None def parse(self): filename_hi = None @@ -222,12 +248,34 @@ class WaldorfMicrowaveXT(AImage): if filename_lo is None: return False - data, data_hi, data_lo = self.combine(filename_lo, filename_hi) + data, self.data_hi, self.data_lo = self.combine(filename_lo, filename_hi) self._save("combined_be.bin", data) + self._is_valid = self._check(data, self.target) - return True + self._is_valid = True + if self._is_valid: + self._save("combined_be.bin", data) -def detect(args): + return self._is_valid + + def wave_extract(self): + if not self._is_valid: + return None + +# wave_data = self.wave_extract(self.wave_data_descr, self.data_hi, self.data_lo) +# self._save("wave_data.bin", wave_data) + return None + + def wave_table_extract(self): + if not self._is_valid: + return None + +# wave_table = self.wave_table_extract(self.wave_tables_descr, self.data_hi, self.data_lo) +# self._json_save("wave_table.json", wave_table) + return None + + +def detect(args) -> AImage: wave_obj_list = [ WaldorfMicroWave2V00(args.folder, args.output_dir), WaldorfMicrowaveXT(args.folder, args.output_dir) @@ -241,6 +289,8 @@ def detect(args): def main(args): result = detect(args) + result.wave_extract() + result.wave_table_extract() print(f"Detected parser: {result}")