added check for MW XT

This commit is contained in:
2025-08-11 18:23:29 +02:00
parent 682e8ca232
commit e9a985da09
+75 -25
View File
@@ -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)
self._is_valid = True
if self._is_valid:
self._save("combined_be.bin", data)
return True
return self._is_valid
def detect(args):
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}")