added check for MW XT
This commit is contained in:
@@ -1,4 +1,3 @@
|
|||||||
import enum
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import struct
|
import struct
|
||||||
@@ -22,12 +21,18 @@ class AImage(abc.ABC):
|
|||||||
def is_valid(self):
|
def is_valid(self):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def wave_extract(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def wave_table_extract(self):
|
||||||
|
pass
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _check(data: bytes, target: dict):
|
def _check(data: bytes, target: dict):
|
||||||
is_valid = True
|
is_valid = True
|
||||||
is_valid &= AImage._check_len(data, target['LEN'])
|
is_valid &= AImage._check_len(data, target['LEN'])
|
||||||
is_valid &= AImage._check_fingerprint(data, target['DIGEST'])
|
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)
|
print("is_valid =", is_valid)
|
||||||
|
|
||||||
@@ -48,7 +53,7 @@ class AImage(abc.ABC):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def _check_version(data: bytes, offset : int, target: bytearray):
|
def _check_version(data: bytes, offset : int, target: bytearray):
|
||||||
actual = data[offset:offset+len(target)]
|
actual = data[offset:offset+len(target)]
|
||||||
print(actual)
|
print((actual))
|
||||||
return actual == target
|
return actual == target
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -90,14 +95,10 @@ class WaldorfMicroWave1V25(AImage):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
class WaldorfMicroWave2V00(AImage):
|
class WaldorfMicroWave2V00(AImage):
|
||||||
class ImagePart(enum.Enum):
|
|
||||||
Hi = 0
|
|
||||||
Lo = 1
|
|
||||||
|
|
||||||
target = {
|
target = {
|
||||||
"LEN" : 131072,
|
"LEN" : 131072,
|
||||||
"DIGEST" : b'\xe3G\n~\xfb\xd0P\xf4~\x8d\xf3\x12p9\x88X\x95e\xc2\xc5e\xdev\xe6\r\xaba\x8b\xadDY\x90',
|
"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 = [
|
wave_data_descr = [
|
||||||
@@ -125,6 +126,8 @@ class WaldorfMicroWave2V00(AImage):
|
|||||||
def __init__(self, folder: str, out_dir="."):
|
def __init__(self, folder: str, out_dir="."):
|
||||||
AImage.__init__(self, folder, out_dir)
|
AImage.__init__(self, folder, out_dir)
|
||||||
self._is_valid = False
|
self._is_valid = False
|
||||||
|
self.data_hi = None
|
||||||
|
self.data_lo = None
|
||||||
|
|
||||||
def parse(self):
|
def parse(self):
|
||||||
filename_hi = None
|
filename_hi = None
|
||||||
@@ -142,35 +145,27 @@ class WaldorfMicroWave2V00(AImage):
|
|||||||
if filename_lo is None:
|
if filename_lo is None:
|
||||||
return False
|
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)
|
self._is_valid = self._check(data, self.target)
|
||||||
if self._is_valid:
|
if self._is_valid:
|
||||||
self._save("combined_test_be.bin", data)
|
self._save("combined_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)
|
|
||||||
|
|
||||||
return self._is_valid
|
return self._is_valid
|
||||||
|
|
||||||
@staticmethod
|
def wave_extract(self):
|
||||||
def wave_extract(descr, data_hi, data_lo):
|
|
||||||
data = b''
|
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']
|
offset = des['offset']
|
||||||
length = des['len']
|
length = des['len']
|
||||||
data += rom_data[offset:offset+length]
|
data += rom_data[offset:offset+length]
|
||||||
return data
|
return data
|
||||||
|
|
||||||
@staticmethod
|
def wave_table_extract(self):
|
||||||
def wave_table_extract(descr, data_hi, data_lo):
|
|
||||||
data = []
|
data = []
|
||||||
table_count = 0
|
table_count = 0
|
||||||
pos = 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']
|
offset = des['offset']
|
||||||
length = des['len']
|
length = des['len']
|
||||||
|
|
||||||
@@ -203,8 +198,39 @@ class PpgEvu2v00(AImage):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
class WaldorfMicrowaveXT(AImage):
|
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="."):
|
def __init__(self, folder: str, out_dir="."):
|
||||||
AImage.__init__(self, folder, out_dir)
|
AImage.__init__(self, folder, out_dir)
|
||||||
|
self._is_valid = False
|
||||||
|
self.data_hi = None
|
||||||
|
self.data_lo = None
|
||||||
|
|
||||||
def parse(self):
|
def parse(self):
|
||||||
filename_hi = None
|
filename_hi = None
|
||||||
@@ -222,12 +248,34 @@ class WaldorfMicrowaveXT(AImage):
|
|||||||
if filename_lo is None:
|
if filename_lo is None:
|
||||||
return False
|
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._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 = [
|
wave_obj_list = [
|
||||||
WaldorfMicroWave2V00(args.folder, args.output_dir),
|
WaldorfMicroWave2V00(args.folder, args.output_dir),
|
||||||
WaldorfMicrowaveXT(args.folder, args.output_dir)
|
WaldorfMicrowaveXT(args.folder, args.output_dir)
|
||||||
@@ -241,6 +289,8 @@ def detect(args):
|
|||||||
|
|
||||||
def main(args):
|
def main(args):
|
||||||
result = detect(args)
|
result = detect(args)
|
||||||
|
result.wave_extract()
|
||||||
|
result.wave_table_extract()
|
||||||
print(f"Detected parser: {result}")
|
print(f"Detected parser: {result}")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user