From aede544740448feafc6017c4b4417ab8d2a57ab0 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 20 Feb 2025 09:19:40 +0800 Subject: [PATCH] =?UTF-8?q?[feature]=20=E6=96=B0=E5=A2=9Efilter=20model?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=EF=BC=8C=E7=94=A8=E4=BA=8E=E8=A1=A5=E5=85=85?= =?UTF-8?q?mvc=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/Ui_widget.cpython-313.pyc | Bin 85945 -> 85945 bytes .../__pycache__/Ui_widget.cpython-313.pyc | Bin 76778 -> 76756 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 169 -> 147 bytes .../audio_filter_componet.cpython-313.pyc | Bin 31533 -> 40473 bytes .../audio_filter_model.cpython-313.pyc | Bin 0 -> 8222 bytes .../checkbox_header.cpython-313.pyc | Bin 3367 -> 3345 bytes .../list_table_config.cpython-313.pyc | Bin 9717 -> 9695 bytes .../__pycache__/resources.cpython-313.pyc | Bin 2096 -> 2074 bytes .../widget_filter/audio_filter_componet.py | 127 +++++++++-------- component/widget_filter/audio_filter_model.py | 134 ++++++++++++++++++ 10 files changed, 204 insertions(+), 57 deletions(-) create mode 100644 component/widget_filter/__pycache__/audio_filter_model.cpython-313.pyc create mode 100644 component/widget_filter/audio_filter_model.py diff --git a/__pycache__/Ui_widget.cpython-313.pyc b/__pycache__/Ui_widget.cpython-313.pyc index 1ac790b03959e3d22fdfb147ada0d9f6bb1ba384..9d56fb4ba784db5614a6481b5ede8b3585d5a72b 100644 GIT binary patch delta 23 dcmdlvpLOSaR?g47yj%=G(AUVhm6LIUKLA*?2C)DD delta 23 dcmdlvpLOSaR?g47yj%=G(A&tlm6LIUKLA*)2Cx7C diff --git a/component/widget_filter/__pycache__/Ui_widget.cpython-313.pyc b/component/widget_filter/__pycache__/Ui_widget.cpython-313.pyc index 55a44f6b0c4813cabf2aa5336281b21da9fe6ca1..f41c12b7728e37c626e58a318279aa08d8973dbb 100644 GIT binary patch delta 47 zcmaELo#o1P7Vgiyyj%=G@WF0NBllKrMoDgdV-Kqs$FjuY_~6RolGNPop4^NJ6##rw B4@Lk0 delta 69 zcmca|o#oYa7Vgiyyj%=G@bK`~M((ZLjFQ}{o-S4~j%A6(@xhhFC8@bFiABj7nI);o YC8b5Fx&=jv$t9V|soRaY85b%50A6SqrT_o{ diff --git a/component/widget_filter/__pycache__/__init__.cpython-313.pyc b/component/widget_filter/__pycache__/__init__.cpython-313.pyc index e4f88846ad71628aeba09af8ed9e8ad0cddaba74..a3637de9ae95e832af9b3feecaf7b91bd2d1b862 100644 GIT binary patch delta 38 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 Tw_kf)DH?BPlH%d>aBlwxgKho_ diff --git a/component/widget_filter/__pycache__/audio_filter_model.cpython-313.pyc b/component/widget_filter/__pycache__/audio_filter_model.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d21318fe6f3a1690520097f7e7bd142150f08ae4 GIT binary patch literal 8222 zcmbtZeQ;CPmA~&xpHH^rFO2Ql2Aiw}#)jBr3~SOF3;|R&t7ip1JC>@+jQQ2rCKcQU)Pf9yH; zJ;{<0-E{VPeBS+j@1Fa+zjN-2(4g!~Z;*(4d6aLCeUrPfALO*RrmtRafzvF;G``KZmqv3e8K zn|JVf?GEE*)NZs|pw;?BtIS5)pv|6bqmEJ8?RbRa-MnTU_C>CSs zy_(JI9g7T4gfK6Ay{9L9A)}?#>m3PFH5v+r1K|iXi%0hL9Ma7FgD)NFQ54N`;NS}f zSkBzj-_J6YUauPUMT35?FB+x6S0|zY)$65Bc<(a&6RrEeE>F)HpXyc4snNig#~&FR zkHGX%&-a7Fqk$;A5m(^xO$-MkMghMs5NaDgN9`~L6Sz3F3d9dd+AdG_rb|jEUr3ia zCl5gG;tRAU+p$2UR;b0a{1J#km2M&)(IYARUqOq<1UVs>6LUE!mos5b0i<~>(AUCB zR*zM&!N1*O^VmIdCyyW5X;S1Ga!RBQPl@8lZ&7mn71C)@O0ZWBf2B$(b&fjSE=|_A z^oWo8#?(is0L`xJ$Qy-i)~q8maC#yT_Mg+tr@d!bf z4F!fZoByOQ91euMLC70(0O~Xo4MZns*l!#Scm*Lc{9}3fUqQgJKmXhN^Y1>q^~U{Mzgc?o)1@1qJbdqsrC(lMdUO6k{L`gRFK0D{XG-I|8b9LK zxYKka%s`t!xJ|SH9-72dPaCm*1B%rif+nhg&OP4sOYo_H`PwZ3- zS~n+pZw|~3z=4>yOkG&l0Uy$92&YRt{-RY9D>0Q&UF<;ykyRaa)CWdbYXM^dI z^69?m?%3&gOeQAW8r+0$@c5 z16nqc6InJRL)=m9xh4U!MCi>cLY7c>7$ct2Uo`ql+5S)IXZnWy%-^t|Wod-^=!JL`s#t11AwTixFzOEbfhZU)2_;^)ic$xURKu*b*}bwS=H5+nU>g4{JD6` zLhY7>k}BK&xDa^Ej10J4)P+keLjm3bp?E}eeSpORhKryDiiE-NXwpb1;)~K|=%I

`mL-$CRSeu@fP{g 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 literal 0 HcmV?d00001 diff --git a/component/widget_filter/__pycache__/checkbox_header.cpython-313.pyc b/component/widget_filter/__pycache__/checkbox_header.cpython-313.pyc index d176b662f53ace1215544f7525f3771252c1f22d..b09ea10c92072287e34d456861abfde8cd596fef 100644 GIT binary patch delta 41 vcmZ23HBpNDGcPX}0}z~O*s_sZhne5f!z#wHEU`E~xU#q;HFt9i^Jz{1`A`h; delta 63 zcmbOzwOoq(GcPX}0}wnsymceD4zsGii&czcSz>W~aAk2xYHmzoQF2CRNosOQX;G?f RK~Z9INoI2DW;f>3oB)<^7B>I@ diff --git a/component/widget_filter/__pycache__/list_table_config.cpython-313.pyc b/component/widget_filter/__pycache__/list_table_config.cpython-313.pyc index 38700d93635f4c537ea2eec91f350cac1c89fc23..29a737a014f8ce95a46b1a983b30113357b9a9f5 100644 GIT binary patch delta 41 vcmezBeczk=GcPX}0}$M)+_sV1UV-1*!z#wHEU`E~xU#q;HFtBqLK`apCd3XG delta 63 zcmccb{neZMGcPX}0}xz!ymceDy@G0>i&czcSz>W~aAk2xYHmzoQF2CRNosOQX;G?f RK~Z9INoI2D=17G$Rsi4R7hwPZ diff --git a/component/widget_filter/__pycache__/resources.cpython-313.pyc b/component/widget_filter/__pycache__/resources.cpython-313.pyc index 760073ee4b6aa3b01393283af466f50acdc622fd..835b1ae4fa7c5338080521d335e27c07911cd62c 100644 GIT binary patch delta 41 vcmdlWFiU{@GcPX}0}$*m+p>{cosHkv!z#wHEU`E~xU#q;HFtA3+f7CQ?&b`U delta 63 zcmbOwut9+PGcPX}0}wnsymceDI-9Dei&czcSz>W~aAk2xYHmzoQF2CRNosOQX;G?f RK~Z9INoI2DW=FQ0i~y9l7BK(- diff --git a/component/widget_filter/audio_filter_componet.py b/component/widget_filter/audio_filter_componet.py index 0267bc8..00a2ace 100644 --- a/component/widget_filter/audio_filter_componet.py +++ b/component/widget_filter/audio_filter_componet.py @@ -12,6 +12,7 @@ from Ui_widget import Ui_Widget from checkbox_header import SCheckBoxHeaderView +# from component.widget_filter.checkbox_header import SCheckBoxHeaderView from typing import List, Dict, Optional, Any @@ -676,69 +677,81 @@ class AudioFilterWidget(QWidget): if __name__ == "__main__": import sys from PySide6.QtWidgets import QApplication + from audio_filter_model import AudioFilterModel, ChannelParams, FilterParams, FilterType app = QApplication(sys.argv) # Create and show widget + # widget = AudioFilterWidget() + # widget.setWindowTitle("Audio Filter Widget") + # widget.resize(800, 600) + + # widget.set_channel_id(2) + # widget.set_channel("channel_2") + + # test_case_3 = { + # 'delay_data2': 100.0, # 最大延迟 + # 'vol_data2': -80.0, # 最小音量 + # 'mix_right_data2': 100.0, # 最大混音 + # 'mix_left_data2': 0.0, # 最小混音 + # 'filterType2_1': 2, # 低架滤波器 + # 'fc2_1': 20000.0, # 最大频率 + # 'q2_1': 10.0, # 最大Q值 + # 'gain2_1': 12.0, # 最大增益 + # 'slope2_1': 4.0, # 最大斜率 + # 'filterType2_2': 3, # 高架滤波器 + # 'fc2_2': 20.0, # 最小频率 + # 'q2_2': 0.1, # 最小Q值 + # 'gain2_2': -12.0, # 最小增益 + # 'slope2_2': 1.0 # 最小斜率 + # } + + # widget.set_all_params(test_case_3) + + # # 获取所有参数 + # params = widget.get_all_params() + # print("params:", params) + + # widget.show() + + # 创建模型实例 + model = AudioFilterModel(channel_id=2, channel_name="channel_2") + + # 设置通道参数 + model.channel_params = ChannelParams( + delay=100.0, + volume=-80.0, + mix_right=100.0, + mix_left=0.0 + ) + + # 添加滤波器 + model.add_filter(FilterParams( + filter_type=FilterType.HIGHPASS, + frequency=20000.0, + q_value=10.0, + gain=12.0, + slope=4.0 + )) + + model.add_filter(FilterParams( + filter_type=FilterType.ALLPASS, + frequency=20.0, + q_value=0.1, + gain=-12.0, + slope=1.0 + )) + + widget_params = model.to_widget_params() + print("widget_params:", widget_params) + widget = AudioFilterWidget() - widget.setWindowTitle("Audio Filter Widget") - widget.resize(800, 600) - - # 测试数据 - # widget.set_filters_count(2) - # widget.set_filter_data(0, { - # 'filter_name': 'peak', - # 'filter_type': 'PEAK', - # 'freq': 100, - # 'q': 1.0, - # 'gain': 0.0, - # 'slope': 1.0, - # 'enabled': True - # }) - # widget.set_filter_data(1, { - # 'filter_name': 'lowpass', - # 'filter_type': 'LOWPASS', - # 'freq': 1000, - # 'q': 0.7, - # 'gain': 0.0, - # 'slope': 2.0, - # 'enabled': True - # }) - - # widget.set_param_data({ - # 'delay_data1': 30, - # 'ENT_volume_data1': 2, - # 'ENT_mx_right_data': 3, - # 'ENT_mix_left_data': 4 - # }) + widget.set_channel_id(model.channel_id) + widget.set_channel_name(model.channel_name) + widget.set_all_params(widget_params) - widget.set_channel_id(2) - widget.set_channel("channel_2") - - test_case_3 = { - 'delay_data2': 100.0, # 最大延迟 - 'vol_data2': -80.0, # 最小音量 - 'mix_right_data2': 100.0, # 最大混音 - 'mix_left_data2': 0.0, # 最小混音 - 'filterType2_1': 2, # 低架滤波器 - 'fc2_1': 20000.0, # 最大频率 - 'q2_1': 10.0, # 最大Q值 - 'gain2_1': 12.0, # 最大增益 - 'slope2_1': 4.0, # 最大斜率 - 'filterType2_2': 3, # 高架滤波器 - 'fc2_2': 20.0, # 最小频率 - 'q2_2': 0.1, # 最小Q值 - 'gain2_2': -12.0, # 最小增益 - 'slope2_2': 1.0 # 最小斜率 - } - - widget.set_all_params(test_case_3) - - # widget.set_all_params(test_params) - - # 获取所有参数 params = widget.get_all_params() - print("aaaa params:", params) - + print("params:", params) widget.show() + sys.exit(app.exec()) \ No newline at end of file diff --git a/component/widget_filter/audio_filter_model.py b/component/widget_filter/audio_filter_model.py new file mode 100644 index 0000000..48eb001 --- /dev/null +++ b/component/widget_filter/audio_filter_model.py @@ -0,0 +1,134 @@ +from dataclasses import dataclass, asdict +from typing import List, Dict, Any, Optional +from enum import Enum + +class FilterType(Enum): + PEAK = 0 + LOWPASS = 1 + HIGHPASS = 2 + ALLPASS = 3 + +@dataclass +class FilterParams: + filter_type: FilterType + frequency: float + q_value: float + gain: float + slope: float + enabled: bool = True + + def to_dict(self, channel_id: int, filter_num: int) -> Dict[str, Any]: + """转换为与组件兼容的字典格式""" + return { + f'filterType{channel_id}_{filter_num}': self.filter_type.value, + f'fc{channel_id}_{filter_num}': self.frequency, + f'q{channel_id}_{filter_num}': self.q_value, + f'gain{channel_id}_{filter_num}': self.gain, + f'slope{channel_id}_{filter_num}': self.slope + } + + @classmethod + def from_dict(cls, data: Dict[str, Any], channel_id: int, filter_num: int) -> 'FilterParams': + """从字典创建FilterParams实例""" + prefix = f'{channel_id}_{filter_num}' + return cls( + filter_type=FilterType(data.get(f'filterType{prefix}', 0)), + frequency=data.get(f'fc{prefix}', 0.0), + q_value=data.get(f'q{prefix}', 0.0), + gain=data.get(f'gain{prefix}', 0.0), + slope=data.get(f'slope{prefix}', 0.0) + ) + +@dataclass +class ChannelParams: + delay: float + volume: float + mix_right: float + mix_left: float + + def to_dict(self, channel_id: int) -> Dict[str, Any]: + """转换为与组件兼容的字典格式""" + return { + f'delay_data{channel_id}': self.delay, + f'vol_data{channel_id}': self.volume, + f'mix_right_data{channel_id}': self.mix_right, + f'mix_left_data{channel_id}': self.mix_left + } + + @classmethod + def from_dict(cls, data: Dict[str, Any], channel_id: int) -> 'ChannelParams': + """从字典创建ChannelParams实例""" + return cls( + delay=data.get(f'delay_data{channel_id}', 0.0), + volume=data.get(f'vol_data{channel_id}', 0.0), + mix_right=data.get(f'mix_right_data{channel_id}', 0.0), + mix_left=data.get(f'mix_left_data{channel_id}', 0.0) + ) + +class AudioFilterModel: + def __init__(self, channel_id: int, channel_name: str): + self.channel_id = channel_id + self.channel_name = channel_name + self.channel_params = ChannelParams(0.0, 0.0, 0.0, 0.0) + self.filters: List[FilterParams] = [] + + def add_filter(self, filter_params: FilterParams): + """添加新的滤波器""" + self.filters.append(filter_params) + + def remove_filter(self, index: int): + """移除指定索引的滤波器""" + if 0 <= index < len(self.filters): + self.filters.pop(index) + + def update_filter(self, index: int, filter_params: FilterParams): + """更新指定索引的滤波器参数""" + if 0 <= index < len(self.filters): + self.filters[index] = filter_params + + def to_widget_params(self) -> Dict[str, Any]: + """转换为AudioFilterWidget兼容的参数格式""" + params = self.channel_params.to_dict(self.channel_id) + + for i, filter_param in enumerate(self.filters, 1): + params.update(filter_param.to_dict(self.channel_id, i)) + + return params + + def from_widget_params(self, params: Dict[str, Any]): + """从AudioFilterWidget参数更新模型""" + self.channel_params = ChannelParams.from_dict(params, self.channel_id) + + self.filters.clear() + filter_count = 1 + while True: + if f'filterType{self.channel_id}_{filter_count}' in params: + filter_param = FilterParams.from_dict(params, self.channel_id, filter_count) + self.filters.append(filter_param) + filter_count += 1 + else: + break + + def save_to_file(self, filepath: str): + """保存配置到文件""" + import json + data = { + 'channel_id': self.channel_id, + 'channel_name': self.channel_name, + 'channel_params': asdict(self.channel_params), + 'filters': [asdict(f) for f in self.filters] + } + with open(filepath, 'w') as f: + json.dump(data, f, indent=2) + + @classmethod + def load_from_file(cls, filepath: str) -> 'AudioFilterModel': + """从文件加载配置""" + import json + with open(filepath, 'r') as f: + data = json.load(f) + + model = cls(data['channel_id'], data['channel_name']) + model.channel_params = ChannelParams(**data['channel_params']) + model.filters = [FilterParams(**f) for f in data['filters']] + return model \ No newline at end of file