From 8264f5b44fb3118fecb91285b605f8dbad1dd68e Mon Sep 17 00:00:00 2001 From: Mattijs Kneppers Date: Mon, 15 Jul 2024 17:02:19 +0200 Subject: [PATCH 1/2] maxdiff: Print parameter info texts on top of patcher summary --- maxdiff/patch_printer.py | 112 ++++++++++++++++++++- maxdiff/tests/test_baselines/Test.amxd.txt | 44 +++++--- maxdiff/tests/test_files/Test.amxd | Bin 23990 -> 21045 bytes 3 files changed, 142 insertions(+), 14 deletions(-) diff --git a/maxdiff/patch_printer.py b/maxdiff/patch_printer.py index ba2eb78..8b18341 100644 --- a/maxdiff/patch_printer.py +++ b/maxdiff/patch_printer.py @@ -22,7 +22,8 @@ def print_patcher(patcher_dict: dict, summarize: bool = True) -> dict | str: name = get_box_text(box) known_objects_map[name] = box - display_text = print_top_patcher_summary(patcher_dict) + display_text = print_parameter_info_texts(patcher_dict) + display_text += print_top_patcher_summary(patcher_dict) display_text += print_patcher_summary_recursive(patcher_dict, known_objects_map) return display_text else: @@ -479,6 +480,115 @@ def get_object_parameter_string(parameter: dict) -> str: return parameter_string +def print_parameter_info_texts(patcher_dict: dict) -> str: + patcher = patcher_dict["patcher"] + display_text = get_parameters_string(patcher) + if display_text != "": + display_text = f"parameter texts:\n{display_text}" + + return display_text + + +def get_parameters_string(patcher: dict) -> str: + """Recursively scans this patcher for parameters and returns a string representation""" + boxes = patcher["boxes"] + parameter_string = "" + + for box_entry in boxes: + box = box_entry["box"] + + if "patcher" in box: + patch = box["patcher"] + if box.get("maxclass") != "bpatcher" or ( + box.get("maxclass") == "bpatcher" and box.get("embed") == 1 + ): + # get subpatcher or embedded bpatcher string + parameter_string += get_parameters_string(patch) + + param_info = get_param_info(box) + + if param_info == None: + continue + + parameter_string += f'### {param_info["longname"]} ###\n' + + extra_messages = [] + + if param_info["invisible"] == 1 or param_info["invisible"] == 2: + extra_messages.append(" _not automatable_") + + if param_info["invisible"] == 2: + extra_messages.append(" _not stored_") + + if param_info["presentation"] != 1: + extra_messages.append(" _not in interface_") + + if extra_messages: + parameter_string += " ".join(extra_messages) + "\n" + + parameter_string += "\n" + + parameter_string += "- " + if param_info["infotitle"]: + parameter_string += f'{param_info["infotitle"]}\n' + else: + parameter_string += f'_no info title_ => {param_info["longname"]}\n' + + parameter_string += "- " + if param_info["infotext"]: + parameter_string += f'{param_info["infotext"]}\n' + else: + parameter_string += "_no info text_\n" + + parameter_string += "\n" + + return parameter_string + + +def get_param_info(box: dict): + param_info = { + "longname": None, + "shortname": None, + "infotitle": None, + "infotext": None, + "invisible": None, + "presentation": None, + } + + for key, value in box.items(): + if key == "presentation": + param_info["presentation"] = value + + if key == "annotation_name": + param_info["infotitle"] = value + + if key == "annotation": + param_info["infotext"] = value + + if key == "saved_attribute_attributes": + # We take the attributes out or saved_attribute_attributes and present them as properties + for attrkey, attrvalue in value.items(): + if attrvalue == "": + continue + + if attrkey == "valueof": + if "parameter_longname" in attrvalue: + param_info["longname"] = attrvalue["parameter_longname"] + if "parameter_longname" in attrvalue: + param_info["shortname"] = attrvalue["parameter_longname"] + if "parameter_annotation_name" in attrvalue: + param_info["infotitle"] = attrvalue["parameter_annotation_name"] + if "parameter_info" in attrvalue: + param_info["infotext"] = attrvalue["parameter_info"] + if "parameter_invisible" in attrvalue: + param_info["invisible"] = attrvalue["parameter_invisible"] + + if param_info["longname"] == None: + return None + + return param_info + + def concat(a: str, b: str) -> str: """Concatenate two strings with a separator if both are non-empty.""" sep = " | " diff --git a/maxdiff/tests/test_baselines/Test.amxd.txt b/maxdiff/tests/test_baselines/Test.amxd.txt index 4fa0d95..8982df1 100644 --- a/maxdiff/tests/test_baselines/Test.amxd.txt +++ b/maxdiff/tests/test_baselines/Test.amxd.txt @@ -1,5 +1,30 @@ MIDI Effect Device ------------------- +parameter texts: +### In a subpatcher ### + _not in interface_ + +- _no info title_ => In a subpatcher +- _no info text_ + +### Time Mode ### + _not automatable_ _not stored_ _not in interface_ + +- Time Mode +- Toggles between Beat Sync and Free running (Hz). + +### Dial 2 ### + _not in interface_ + +- _no info title_ => Dial 2 +- _no info text_ + +### Dial 1 ### + _not in interface_ + +- My Info View Title +- My Info View Text + parameters: [p MySubpatcher]/[live.dial]: ['In a subpatcher', 'live.dial', 0] [bpatcher ParamAbstraction.maxpat]/[obj-1]: ['InsideBpatcher', 'live.dial', 0] @@ -7,12 +32,11 @@ parameters: [AbstractionWithParameter]/[obj-1]: ['MyParameter[1]', 'MyParameter', 0] > override > ['MyParameter[1]', '-', '-'] [bpatcher ParamAbstraction.maxpat]/[obj-1]: ['OverruledParamLongName', 'OverruledParamShortName', 0] > override > ['OverruledParamLongName', 'OverruledParamShortName', '-'] [live.tab]: ['Time Mode', 'Time Mode', 0] - [bpatcher ThisWasAnAbstractionBeforeEmbeddingIt.maxpat ]/[live.numbox]: ['EmbeddedParam', 'Embedded', 0] - [live.dial]: ['live.dial', 'live.dial', 0] - [live.dial]: ['live.dial[1]', 'live.dial', 0] + [live.dial]: ['Dial 1', 'Dial 1', 0] + [live.dial]: ['Dial 2', 'Dial 2', 0] inherited_shortname: 1 banks: - 0 (MyBank): ['live.dial', 'InsideBpatcher', '-', '-', '-', '-', '-', '-'] + 0 (MyBank): ['Dial 1', 'InsideBpatcher', '-', '-', '-', '-', '-', '-'] dependency_cache: {'name': 'AbstractionWithParameter.maxpat', 'bootpath': '~/maxdevtools/maxdiff/tests/test_files', 'type': 'JSON', 'implicit': 1} {'name': 'MyAbstraction.maxpat', 'bootpath': '~/maxdevtools/maxdiff/tests/test_files', 'type': 'JSON', 'implicit': 1} @@ -29,14 +53,8 @@ project: collContent.txt ----------- patcher ----------- -appversion: 8.6.2-x64-1 | rect: [65, 399, 927, 289] | openrect: [0, 0, 0, 169] | default_fontsize: 10.0 | default_fontname: Arial Bold | gridsize: [8, 8] | boxanimatetime: 500 | latency: 0 | is_mpe: 0 | platform_compatibility: 0 | autosave: 0 +appversion: 8.6.2-x64-1 | rect: [246, 585, 927, 289] | openrect: [0, 0, 0, 169] | default_fontsize: 10.0 | default_fontname: Arial Bold | gridsize: [8, 8] | boxanimatetime: 500 | latency: 0 | is_mpe: 0 | platform_compatibility: 0 | autosave: 0 ----------- objects ----------- -[bpatcher ThisWasAnAbstractionBeforeEmbeddingIt.maxpat] embed: 1 - ----------- patcher ----------- - appversion: 8.6.2-x64-1 | rect: [927, 431, 640, 480] - ----------- objects ----------- - [live.comment Embedded] - [live.numbox] parameter: [message 😋] fontsize: 20.0 [AbstractionWithParameter] [AbstractionWithParameter] @@ -102,8 +120,8 @@ appversion: 8.6.2-x64-1 | rect: [65, 399, 927, 289] | openrect: [0, 0, 0, 169] | [live.banks] [bpatcher ParamAbstraction.maxpat] offset: [-73, -62] [bpatcher ParamAbstraction.maxpat] offset: [-73, -62] -[live.dial] activefgdialcolor: live_display_handle_two | parameter: | varname: live.dial[1] -[live.dial] parameter: +[live.dial] activefgdialcolor: live_display_handle_two | parameter: | varname: live.dial[1] +[live.dial] annotation: My Info View Text | annotation_name: My Info View Title | parameter: [button] presentation: 1 | presentation_rect: [265, 26, 24, 24] [bpatcher MyAbstraction.maxpat] offset: [-4, -12] [comment A comment] diff --git a/maxdiff/tests/test_files/Test.amxd b/maxdiff/tests/test_files/Test.amxd index cf5f281e1212c3789d1b8eef5e0f70d3055ad745..23c0ffbb859af7b1baa476dd1f1c0b8c536cf17c 100644 GIT binary patch delta 354 zcmdnCn{n$B#tAY^qCpeo&T<)C=I1FX zSScv^Rw{VrrR6JxWu}%ZgrruKDCux#8 z$6Q1R)i{s>kUOL@fmUEK0B9Z9nF1EP5N8^qy4rAapi`ZIg9%7$w1N`YV}?pPNGt<| fSg?DQ@{_W3Es)h2!POZ}4i7GYn!ou<@FPwD&zNhk delta 744 zcmdnGgmK$$#tAY^(_$yeo#iw$)icmhFt)VZ_*Ia3@-GVq&fKKb6eR^K1;fdPmL7~| zlOO7(sD@-@7KbMmJLWki6_*qxCYNO9=Q*XOg-NIC-10z~nz7R+HsLq(P=J z=auG8wiA{Gn${|8Y6;S8qGt*uOu*)tPS#YcboloAJUGA!*obV4f-9 zWo%|;m7kQQYY0k6(F#hipoE0A4njZ)m{=5I!7-@>(qIDB0C&@5FE?353v^MSOMyC- S5UOsvmvF*)n}a Date: Tue, 24 Sep 2024 12:58:21 +0200 Subject: [PATCH 2/2] Add line break after every parameter bank --- maxdiff/patch_printer.py | 4 +++- maxdiff/tests/test_baselines/Test.amxd.txt | 7 ++++--- maxdiff/tests/test_files/Test.amxd | Bin 21045 -> 21605 bytes 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/maxdiff/patch_printer.py b/maxdiff/patch_printer.py index 8b18341..9e51810 100644 --- a/maxdiff/patch_printer.py +++ b/maxdiff/patch_printer.py @@ -402,12 +402,14 @@ def get_parameters_string_block(patcher: dict) -> str: if "parameterbanks" in parameters: parameters_string += "banks:\n" + parameter_strings = [] for key, value in parameters["parameterbanks"].items(): - parameters_string += ( + parameter_strings.append( f"\t{value['index']}" + (f" ({value['name']})" if value["name"] != "" else "") + f": {value['parameters']}" ) + parameters_string += "\n".join(parameter_strings) return f"parameters:\n{parameters_string}\n" diff --git a/maxdiff/tests/test_baselines/Test.amxd.txt b/maxdiff/tests/test_baselines/Test.amxd.txt index 8982df1..8ab9d04 100644 --- a/maxdiff/tests/test_baselines/Test.amxd.txt +++ b/maxdiff/tests/test_baselines/Test.amxd.txt @@ -37,6 +37,7 @@ parameters: inherited_shortname: 1 banks: 0 (MyBank): ['Dial 1', 'InsideBpatcher', '-', '-', '-', '-', '-', '-'] + 1 (MyBank2): ['Dial 2', 'In a subpatcher', '-', '-', '-', '-', '-', '-'] dependency_cache: {'name': 'AbstractionWithParameter.maxpat', 'bootpath': '~/maxdevtools/maxdiff/tests/test_files', 'type': 'JSON', 'implicit': 1} {'name': 'MyAbstraction.maxpat', 'bootpath': '~/maxdevtools/maxdiff/tests/test_files', 'type': 'JSON', 'implicit': 1} @@ -53,7 +54,7 @@ project: collContent.txt ----------- patcher ----------- -appversion: 8.6.2-x64-1 | rect: [246, 585, 927, 289] | openrect: [0, 0, 0, 169] | default_fontsize: 10.0 | default_fontname: Arial Bold | gridsize: [8, 8] | boxanimatetime: 500 | latency: 0 | is_mpe: 0 | platform_compatibility: 0 | autosave: 0 +appversion: 8.6.5-x64-1 | rect: [246, 585, 927, 289] | openrect: [0, 0, 0, 169] | default_fontsize: 10.0 | default_fontname: Arial Bold | gridsize: [8, 8] | boxanimatetime: 500 | latency: 0 | is_mpe: 0 | external_mpe_tuning_enabled: 0 | platform_compatibility: 0 | autosave: 0 ----------- objects ----------- [message 😋] fontsize: 20.0 [AbstractionWithParameter] @@ -65,7 +66,7 @@ appversion: 8.6.2-x64-1 | rect: [246, 585, 927, 289] | openrect: [0, 0, 0, 169] [button] [gen @t exponent] ----------- patcher ----------- - appversion: 8.6.2-x64-1 | classnamespace: dsp.gen | rect: [84, 144, 653, 641] + appversion: 8.6.5-x64-1 | classnamespace: dsp.gen | rect: [84, 144, 653, 641] ----------- objects ----------- [codebox] //============================================================ @@ -108,7 +109,7 @@ appversion: 8.6.2-x64-1 | rect: [246, 585, 927, 289] | openrect: [0, 0, 0, 169] [coll @embed 1] coll_data: {'count': 2, 'data': [{'key': 0, 'value': ['test']}, {'key': 1, 'value': ['another', 'test']}]} | embed: 1 | precision: 6 [p MySubpatcher] ----------- patcher ----------- - appversion: 8.6.2-x64-1 | rect: [805, 282, 271, 250] + appversion: 8.6.5-x64-1 | rect: [805, 282, 271, 250] ----------- objects ----------- [live.dial] parameter: [t b b] diff --git a/maxdiff/tests/test_files/Test.amxd b/maxdiff/tests/test_files/Test.amxd index 23c0ffbb859af7b1baa476dd1f1c0b8c536cf17c..293b5ad8d7177c8393f4effbb3015d7c13f1c32f 100644 GIT binary patch delta 307 zcmdnGgz@PL#tAY^t|1fU@|aC^xF%2Jk=wZTE;pm;=58KKp2_^;oReA1l-W6}xj2Df z^2b1_$*uzYlZApr*gyicT$7{CB`3dA7M@(M&c6AbL^(5~>Ev#n=*O zGu0%l-D)zIncC#9fnt+Wjb#{>z=l4R(%kH=;-r!WGzAEh43!kD6hJJ9TR4?6^HNeP zK!S!46`V?WiMgpD0VUr`r^LK$BPEzbL1Gb5swB0j7$hC7pyZO7n4zN9oSGcP?pH7_wKCpBgBYhN!G0Oxj8)Bpeg delta 79 zcmV-V0I>h%r~$R40gxO56;hENZUZtb3X_ox9