From 92c0f7a3658ed62478c25d54060d1d1da82ad62e Mon Sep 17 00:00:00 2001 From: Jordan Alwon Date: Sat, 24 Feb 2024 21:50:42 +0100 Subject: [PATCH 01/10] Switch write function to buffer_write --- convert.py | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/convert.py b/convert.py index bb73c24..9a426da 100644 --- a/convert.py +++ b/convert.py @@ -31,26 +31,31 @@ def _rate(self): return int(rate) - def _sampleformt(self, format_id): + def _sampleformat(self, format_id): if format_id == 262159: - return ' Date: Sat, 24 Feb 2024 21:52:09 +0100 Subject: [PATCH 02/10] Add tqdm output --- convert.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/convert.py b/convert.py index 9a426da..11b9f31 100644 --- a/convert.py +++ b/convert.py @@ -4,6 +4,7 @@ from xml_object import XMLObject import numpy as np import soundfile as sf +from tqdm import tqdm class Converter(): def __init__(self, path): @@ -46,7 +47,7 @@ def export_audio(self, file): channels = self._channels() sampleformat = self._sampleformat(self.xml['project']['wavetrack'][0]['sampleformat']) blocks = len(self.xml['project']['wavetrack'][0]['waveclip']['sequence']['waveblock']) - with sf.SoundFile(file, mode='w', samplerate=rate, channels=channels) as soundfile: + with sf.SoundFile(file, mode='w', samplerate=rate, channels=channels) as soundfile, tqdm(total=blocks*channels, desc="export audio") as pbar: for idx in range(blocks): c_data = [] for c in range(channels): From 4a8a6ac4dc9849f88b365af264fea333076b35b4 Mon Sep 17 00:00:00 2001 From: Jordan Alwon Date: Sat, 24 Feb 2024 21:53:58 +0100 Subject: [PATCH 03/10] Add parameter for significance digit --- convert.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/convert.py b/convert.py index 11b9f31..1f9a63a 100644 --- a/convert.py +++ b/convert.py @@ -59,10 +59,10 @@ def export_audio(self, file): soundfile.buffer_write(o_data, dtype=sampleformat['soundfile']) return - def export_label(self, file): + def export_label(self, file, sign_digits=6): with open(file, 'w') as f: for label in self.xml['project']['labeltrack']['label']: - f.write(f"{label['t']:.8f}\t{label['t1']:.8f}\t{label['title']}\n") + f.write(f"{label['t']:.{sign_digits}f}\t{label['t1']:.{sign_digits}f}\t{label['title']}\n") return if __name__ == "__main__": From d773eaa6982870bba7124d3b7d4815cee4dbf81c Mon Sep 17 00:00:00 2001 From: Jordan Alwon Date: Sat, 24 Feb 2024 21:56:16 +0100 Subject: [PATCH 04/10] Readme dependencies section --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ae8f647..6009bb0 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,10 @@ (c) 2024, Jordan Alwon ## Installation -*.aup3-Converter* depends on the Python packages NumPy and Soundfile. +*.aup3-Converter* has following dependencies: +- Numpy +- Soundfile +- tqdm ## Export Data ```python From ccf05d664593a0545a0fabd9e2fa3edc9060b0c6 Mon Sep 17 00:00:00 2001 From: Jordan Alwon Date: Tue, 27 Feb 2024 17:00:14 +0100 Subject: [PATCH 05/10] remove match case for compatibility --- xml_object.py | 99 +++++++++++++++++++++++++-------------------------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/xml_object.py b/xml_object.py index 9a86d68..9467013 100644 --- a/xml_object.py +++ b/xml_object.py @@ -8,57 +8,56 @@ def __init__(self, binary_stream, object_names): while bool(self.binary_stream): indecator = self._indecator() - match indecator: - case 1: - obj_name = self._object_name() - if hasattr(self, obj_name): - if type(getattr(self, obj_name)) == list: - getattr(self,obj_name).append(XMLObject(self.binary_stream, self.object_names)) - else: - setattr(self, obj_name, [getattr(self,obj_name),XMLObject(self.binary_stream, self.object_names)]) + if indecator == 1: + obj_name = self._object_name() + if hasattr(self, obj_name): + if type(getattr(self, obj_name)) == list: + getattr(self,obj_name).append(XMLObject(self.binary_stream, self.object_names)) else: - setattr(self, obj_name, XMLObject(self.binary_stream, self.object_names)) - case 2: - self.binary_stream(2) - break - case 3: - obj_name = self._object_name() - text = self._text(self._block_length()) - setattr(self, obj_name, text) - case 4: - obj_name = self._object_name() - value = self._integer() - setattr(self, obj_name, value) - case 5: - obj_name = self._object_name() - boolean = self._bool() - setattr(self, obj_name, boolean) - case 6: - obj_name = self._object_name() - value = self._integer() - setattr(self,obj_name, value) - case 7: - obj_name = self._object_name() - long = self._long_long() - setattr(self, obj_name, long) - case 8: - obj_name = self._object_name() - value = self._integer() - setattr(self, obj_name, value) - case 10: - obj_name = self._object_name() - value = self._double() - setattr(self, obj_name, value) - self.binary_stream(4) # Skip unknown sequence (FFFF) TODO - case 12: - obj_name = "head" - text = self._text(self._block_length()) - if hasattr(self,obj_name): - self.head += text - else: - setattr(self,obj_name, text) - case _: - raise ValueError("Unknown Indecator!") + setattr(self, obj_name, [getattr(self,obj_name),XMLObject(self.binary_stream, self.object_names)]) + else: + setattr(self, obj_name, XMLObject(self.binary_stream, self.object_names)) + elif indecator == 2: + self.binary_stream(2) + break + elif indecator == 3: + obj_name = self._object_name() + text = self._text(self._block_length()) + setattr(self, obj_name, text) + elif indecator == 4: + obj_name = self._object_name() + value = self._integer() + setattr(self, obj_name, value) + elif indecator == 5: + obj_name = self._object_name() + boolean = self._bool() + setattr(self, obj_name, boolean) + elif indecator == 6: + obj_name = self._object_name() + value = self._integer() + setattr(self,obj_name, value) + elif indecator == 7: + obj_name = self._object_name() + long = self._long_long() + setattr(self, obj_name, long) + elif indecator == 8: + obj_name = self._object_name() + value = self._integer() + setattr(self, obj_name, value) + elif indecator == 10: + obj_name = self._object_name() + value = self._double() + setattr(self, obj_name, value) + self.binary_stream(4) # Skip unknown sequence (FFFF) TODO + elif indecator == 12: + obj_name = "head" + text = self._text(self._block_length()) + if hasattr(self,obj_name): + self.head += text + else: + setattr(self,obj_name, text) + else: + raise ValueError("Unknown Indecator!") def _indecator(self): return struct.unpack('B', self.binary_stream(1))[0] From 83cd4b36cca39c58e054e39c9edc355b60bf649a Mon Sep 17 00:00:00 2001 From: Jordan Alwon Date: Thu, 29 Feb 2024 12:54:36 +0100 Subject: [PATCH 06/10] Add new labels function --- convert.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/convert.py b/convert.py index 1f9a63a..bf09c3f 100644 --- a/convert.py +++ b/convert.py @@ -1,7 +1,7 @@ -from reader import SQLite3Reader -from binary_stream import BinaryStream -from name_space import NameSpace -from xml_object import XMLObject +from .reader import SQLite3Reader +from .binary_stream import BinaryStream +from .name_space import NameSpace +from .xml_object import XMLObject import numpy as np import soundfile as sf from tqdm import tqdm @@ -42,6 +42,9 @@ def _sampleformat(self, format_id): def _channels(self): return len(self.xml['project']['wavetrack']) + def labels(self): + return self.xml['project']['labeltrack'] + def export_audio(self, file): rate = self._rate() channels = self._channels() @@ -61,7 +64,7 @@ def export_audio(self, file): def export_label(self, file, sign_digits=6): with open(file, 'w') as f: - for label in self.xml['project']['labeltrack']['label']: + for label in self.labels['label']: f.write(f"{label['t']:.{sign_digits}f}\t{label['t1']:.{sign_digits}f}\t{label['title']}\n") return From 79705219fe06ffff4f03278a1fd1ec0ee4730e07 Mon Sep 17 00:00:00 2001 From: Jordan Alwon Date: Wed, 13 Mar 2024 10:27:42 +0100 Subject: [PATCH 07/10] Improve label return --- convert.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/convert.py b/convert.py index bf09c3f..9a30d5e 100644 --- a/convert.py +++ b/convert.py @@ -43,7 +43,10 @@ def _channels(self): return len(self.xml['project']['wavetrack']) def labels(self): - return self.xml['project']['labeltrack'] + if 'labeltrack' in self.xml['project'].keys(): + return self.xml['project']['labeltrack'] + else: + return None def export_audio(self, file): rate = self._rate() From ecd2dd546d7b6a4628fca44aba3f6746287f8783 Mon Sep 17 00:00:00 2001 From: Jordan Alwon Date: Fri, 15 Mar 2024 07:10:08 +0100 Subject: [PATCH 08/10] Implement changeable string block size --- name_space.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/name_space.py b/name_space.py index d8b8bbd..d61d29c 100644 --- a/name_space.py +++ b/name_space.py @@ -5,8 +5,10 @@ def __init__(self, binary_stream): self.binary_stream = binary_stream self.name_space = {} - # Skip unkown start sequence - self.binary_stream(2) + # Skip start element + self.binary_stream(1) + + self.string_block_size = self._indecator() while bool(self.binary_stream): indecator = self._indecator() @@ -34,6 +36,6 @@ def _block_length(self): def _text(self, l): s = '' - for _ in range(l//2): - s += struct.unpack('s', self.binary_stream(2)[:1])[0].decode(encoding='utf-8') + for _ in range(l//self.string_block_size): + s += struct.unpack('s', self.binary_stream(self.string_block_size)[:1])[0].decode(encoding='utf-8') # TODO why are string blocks 4 chars long and not 2? 2. file char as indecator? return s From 1729c287a2d5ce30808511271ccbf1b892891dbb Mon Sep 17 00:00:00 2001 From: Jordan Alwon Date: Fri, 15 Mar 2024 07:12:33 +0100 Subject: [PATCH 09/10] Remove TODO Comment --- name_space.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/name_space.py b/name_space.py index d61d29c..1dda9be 100644 --- a/name_space.py +++ b/name_space.py @@ -37,5 +37,5 @@ def _block_length(self): def _text(self, l): s = '' for _ in range(l//self.string_block_size): - s += struct.unpack('s', self.binary_stream(self.string_block_size)[:1])[0].decode(encoding='utf-8') # TODO why are string blocks 4 chars long and not 2? 2. file char as indecator? + s += struct.unpack('s', self.binary_stream(self.string_block_size)[:1])[0].decode(encoding='utf-8') return s From a950338569b660a7b8c2f2319ceb1d940fd1cb73 Mon Sep 17 00:00:00 2001 From: Jordan Alwon Date: Fri, 15 Mar 2024 09:46:55 +0100 Subject: [PATCH 10/10] Add changeable string block size to xml obj --- name_space.py | 1 + xml_object.py | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/name_space.py b/name_space.py index 1dda9be..35dc360 100644 --- a/name_space.py +++ b/name_space.py @@ -9,6 +9,7 @@ def __init__(self, binary_stream): self.binary_stream(1) self.string_block_size = self._indecator() + self.name_space['string_block_size'] = self.string_block_size while bool(self.binary_stream): indecator = self._indecator() diff --git a/xml_object.py b/xml_object.py index 9467013..64bf2b4 100644 --- a/xml_object.py +++ b/xml_object.py @@ -4,6 +4,7 @@ class XMLObject(): def __init__(self, binary_stream, object_names): self.binary_stream = binary_stream self.object_names = object_names + self.string_block_size = self.object_names['string_block_size'] while bool(self.binary_stream): indecator = self._indecator() @@ -71,8 +72,8 @@ def _block_length(self): return self._integer() def _text(self, l): s = '' - for _ in range(l//2): - s += struct.unpack('s', self.binary_stream(2)[:1])[0].decode(encoding='iso-8859-1') + for _ in range(l//self.string_block_size): + s += struct.unpack('s', self.binary_stream(self.string_block_size)[:1])[0].decode(encoding='iso-8859-1') return s