added check for MW XT
This commit is contained in:
@@ -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}")
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user