From 8384b7858ae58493bd93f795cf5cc67e3e51735e Mon Sep 17 00:00:00 2001 From: dreamer <1185977+dromer@users.noreply.github.com> Date: Tue, 17 Sep 2024 01:52:20 +0200 Subject: [PATCH 01/10] add flag for disabling DSP (#194) * add flag for disabling DSP * set correct default --- CHANGELOG.md | 7 +++++++ hvcc/__init__.py | 15 ++++++++++++--- hvcc/generators/ir2c/ir2c.py | 6 ++++-- hvcc/generators/ir2c/templates/Heavy_NAME.cpp | 2 +- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 699ee97d..58762d15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ CHANGELOG ===== +Next Release +----- + +Features: + +* Only disable DSP with new `--nodsp` flag + 0.12.0 ----- diff --git a/hvcc/__init__.py b/hvcc/__init__.py index aac9e5bd..e8fa6b81 100644 --- a/hvcc/__init__.py +++ b/hvcc/__init__.py @@ -209,7 +209,8 @@ def compile_dataflow( search_paths: Optional[List] = None, generators: Optional[List] = None, verbose: bool = False, - copyright: Optional[str] = None + copyright: Optional[str] = None, + nodsp: Optional[bool] = False ) -> OrderedDict: results: OrderedDict = OrderedDict() # default value, empty dictionary @@ -273,7 +274,8 @@ def compile_dataflow( static_dir=os.path.join(os.path.dirname(__file__), "generators/ir2c/static"), output_dir=c_src_dir, externs=externs, - copyright=copyright) + copyright=copyright, + nodsp=nodsp) # check for errors if results["ir2c"]["notifs"].get("has_error", False): @@ -401,6 +403,11 @@ def main() -> bool: "--results_path", help="Write results dictionary to the given path as a JSON-formatted string." " Target directory will be created if it does not exist.") + parser.add_argument( + "--nodsp", + action='store_true', + help="Disable DSP. Run as control-only patch." + ) parser.add_argument( "-v", "--verbose", @@ -420,7 +427,9 @@ def main() -> bool: search_paths=args.search_paths, generators=args.gen, verbose=args.verbose, - copyright=args.copyright) + copyright=args.copyright, + nodsp=args.nodsp + ) errorCount = 0 for r in list(results.values()): diff --git a/hvcc/generators/ir2c/ir2c.py b/hvcc/generators/ir2c/ir2c.py index c822c007..e14c3c20 100644 --- a/hvcc/generators/ir2c/ir2c.py +++ b/hvcc/generators/ir2c/ir2c.py @@ -157,7 +157,8 @@ def compile( static_dir: str, output_dir: str, externs: Dict, - copyright: Optional[str] = None + copyright: Optional[str] = None, + nodsp: Optional[bool] = False ) -> Dict: """ Compiles a HeavyIR file into a C. Returns a tuple of compile time in seconds, a notification dictionary, @@ -276,7 +277,8 @@ def compile( send_table=ir["tables"], process_list=process_list, table_data_list=table_data_list, - copyright=copyright)) + copyright=copyright, + nodsp=nodsp)) # write C API, hv_NAME.h with open(os.path.join(output_dir, f"Heavy_{name}.h"), "w") as f: diff --git a/hvcc/generators/ir2c/templates/Heavy_NAME.cpp b/hvcc/generators/ir2c/templates/Heavy_NAME.cpp index a9e0a33c..b8b86385 100644 --- a/hvcc/generators/ir2c/templates/Heavy_NAME.cpp +++ b/hvcc/generators/ir2c/templates/Heavy_NAME.cpp @@ -171,7 +171,7 @@ int Heavy_{{name}}::process(float **inputBuffers, float **outputBuffers, int n) sendBangToReceiver(0xDD21C0EB); // send to __hv_bang~ on next cycle - {%- if signal.numInputBuffers > 0 or signal.numOutputBuffers > 0 %} + {%- if nodsp is sameas false %} const int n4 = n & ~HV_N_SIMD_MASK; // ensure that the block size is a multiple of HV_N_SIMD // temporary signal vars From b15b8100b1b9bb449d2cdc42ad3676d42d9baf81 Mon Sep 17 00:00:00 2001 From: dreamer Date: Tue, 17 Sep 2024 15:05:08 +0200 Subject: [PATCH 02/10] update docs --- docs/02.getting_started.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/02.getting_started.md b/docs/02.getting_started.md index f3d5a931..087e2412 100644 --- a/docs/02.getting_started.md +++ b/docs/02.getting_started.md @@ -8,8 +8,6 @@ To send audio output add a `[dac~]` The number of channels can be configured by Note that top-level graphs (e.g. `_main.pd`) should not have any `[inlet~]` or `[outlet~]` objects. These are reserved only for abstractions. -> NOTE: Currently if your main patch does not have at least an `adc~` or `dac~` configured signal rate objects will not be evaluated in the graph! - ## Exposing Parameters ### Input Parameters From 7a926b4b6403f6f983a3724ecb3102cc29f2debf Mon Sep 17 00:00:00 2001 From: dreamer <1185977+dromer@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:05:41 +0200 Subject: [PATCH 03/10] allow Bang messages in OnSendMessageCallback() (#193) --- CHANGELOG.md | 7 +++++++ .../SoundEnginePlugin/{{name}}{{plugin_type}}.cpp | 3 +-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58762d15..f391b554 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,17 @@ CHANGELOG Next Release ----- +<<<<<<< HEAD Features: * Only disable DSP with new `--nodsp` flag +Bugfixes + +* wwise: allow Bang messages in OnSendMessageCallback() +======= +>>>>>>> develop + 0.12.0 ----- diff --git a/hvcc/generators/c2wwise/templates/SoundEnginePlugin/{{name}}{{plugin_type}}.cpp b/hvcc/generators/c2wwise/templates/SoundEnginePlugin/{{name}}{{plugin_type}}.cpp index 61841232..09d0e8ea 100644 --- a/hvcc/generators/c2wwise/templates/SoundEnginePlugin/{{name}}{{plugin_type}}.cpp +++ b/hvcc/generators/c2wwise/templates/SoundEnginePlugin/{{name}}{{plugin_type}}.cpp @@ -98,7 +98,7 @@ namespace {{name}}_Private static void OnSendMessageCallback(HeavyContextInterface *in_pHeavyCtx, const char *in_szSendName, uint32_t in_uSendHash, const HvMessage *in_pHvMessage) { auto* pPlugin = reinterpret_cast<{{name}}{{plugin_type}}*>(in_pHeavyCtx->getUserData()); - if (pPlugin != nullptr && hv_msg_isFloat(in_pHvMessage, 0)) + if (pPlugin != nullptr && (hv_msg_isFloat(in_pHvMessage, 0) || hv_msg_isBang(in_pHvMessage, 0))) { switch (in_uSendHash) { @@ -293,4 +293,3 @@ void {{name}}{{plugin_type}}::Execute(AkAudioBuffer* io_pBuffer) {% endif %} AK_PERF_RECORDING_STOP("{{name}}{{plugin_type}}", 25, 30); } - From 690f5cd6945d036101ffa6e2dc58e48cab3aa9b6 Mon Sep 17 00:00:00 2001 From: dreamer Date: Wed, 18 Sep 2024 19:11:00 +0200 Subject: [PATCH 04/10] merge conflict --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f391b554..9185a062 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,6 @@ CHANGELOG Next Release ----- -<<<<<<< HEAD Features: * Only disable DSP with new `--nodsp` flag @@ -12,8 +11,6 @@ Features: Bugfixes * wwise: allow Bang messages in OnSendMessageCallback() -======= ->>>>>>> develop 0.12.0 ----- From b192db5b2d0ef5000e9bd2ad3ffb3140a38bf780 Mon Sep 17 00:00:00 2001 From: dreamer <1185977+dromer@users.noreply.github.com> Date: Wed, 18 Sep 2024 23:17:33 +0200 Subject: [PATCH 05/10] Pydantic types for Metadata input (#197) * first test with pydantic for meta validation - broken * start with pydantic * improve dpf type and template * flake8 and update pydantic version * add pyantic typing to daisy meta; improve template boolean usage * cleanup * add changelog * cleanup * DPF: alternative CV port implementation (#198) * use int/bool tuple for port defs * union type for int and tuple * update changelog * set numerical bool * meta json schema util * typo --- CHANGELOG.md | 2 + docs/03.gen.daisy.md | 4 +- examples/dpf/dpf_example.json | 6 +- hvcc/__init__.py | 8 ++- hvcc/generators/c2daisy/c2daisy.py | 42 ++++++-------- .../c2daisy/templates/HeavyDaisy.cpp | 26 ++++----- hvcc/generators/c2daisy/templates/Makefile | 8 +-- hvcc/generators/c2dpf/c2dpf.py | 14 ++--- .../c2dpf/templates/DistrhoPluginInfo.h | 24 ++++---- hvcc/generators/c2dpf/templates/HeavyDPF.cpp | 8 +-- hvcc/generators/c2dpf/templates/HeavyDPF.hpp | 14 ++--- .../c2dpf/templates/HeavyDPF_UI.cpp | 2 +- .../c2dpf/templates/Makefile_plugin | 12 ++-- .../c2dpf/templates/initParameter.cpp | 4 +- .../generators/c2dpf/templates/portGroups.cpp | 10 +++- hvcc/generators/types/__init__.py | 0 hvcc/generators/types/meta.py | 58 +++++++++++++++++++ hvcc/utils.py | 16 +++++ setup.cfg | 1 + 19 files changed, 165 insertions(+), 94 deletions(-) create mode 100644 hvcc/generators/types/__init__.py create mode 100644 hvcc/generators/types/meta.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 9185a062..0449a365 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ Next Release Features: * Only disable DSP with new `--nodsp` flag +* Use pydantic types to define metadata objects +* DPF: CV flag in portgroups Bugfixes diff --git a/docs/03.gen.daisy.md b/docs/03.gen.daisy.md index 362e5c26..b0f8c130 100644 --- a/docs/03.gen.daisy.md +++ b/docs/03.gen.daisy.md @@ -4,12 +4,10 @@ Daisy is an embedded platform for music. It features everything you need for cre Currently daisy platform is supported for: -* `seed` * `pod` * `petal` * `patch` * `patch_init` -* `patch_sm` * `field` Which can be configured using the `-m` metadata.json `daisy.board` setting: @@ -17,7 +15,7 @@ Which can be configured using the `-m` metadata.json `daisy.board` setting: ```json { "daisy": { - "board": "seed" + "board": "pod" } } ``` diff --git a/examples/dpf/dpf_example.json b/examples/dpf/dpf_example.json index b1e21ed0..bd081d27 100644 --- a/examples/dpf/dpf_example.json +++ b/examples/dpf/dpf_example.json @@ -10,9 +10,9 @@ "midi_input": 1, "midi_output": 0, "plugin_formats": [ - "lv2_dsp", - "vst", + "lv2_sep", + "vst2", "jack" ] } -} \ No newline at end of file +} diff --git a/hvcc/__init__.py b/hvcc/__init__.py index e8fa6b81..d7434baf 100644 --- a/hvcc/__init__.py +++ b/hvcc/__init__.py @@ -34,6 +34,7 @@ from hvcc.generators.c2pdext import c2pdext from hvcc.generators.c2wwise import c2wwise from hvcc.generators.c2unity import c2unity +from hvcc.generators.types.meta import Meta class Colours: @@ -214,7 +215,7 @@ def compile_dataflow( ) -> OrderedDict: results: OrderedDict = OrderedDict() # default value, empty dictionary - patch_meta = {} + patch_meta = Meta() # basic error checking on input if os.path.isfile(in_path): @@ -231,11 +232,12 @@ def compile_dataflow( if os.path.isfile(patch_meta_file): with open(patch_meta_file) as json_file: try: - patch_meta = json.load(json_file) + patch_meta_json = json.load(json_file) + patch_meta = Meta(**patch_meta_json) except Exception as e: return add_error(results, f"Unable to open json_file: {e}") - patch_name = patch_meta.get("name", patch_name) + patch_name = patch_meta.name or patch_name generators = ["c"] if generators is None else [x.lower() for x in generators] if in_path.endswith((".pd")): diff --git a/hvcc/generators/c2daisy/c2daisy.py b/hvcc/generators/c2daisy/c2daisy.py index df0b3431..4ef47117 100644 --- a/hvcc/generators/c2daisy/c2daisy.py +++ b/hvcc/generators/c2daisy/c2daisy.py @@ -4,9 +4,10 @@ import time import json2daisy # type: ignore -from typing import Dict, Optional +from typing import Any, Dict, Optional from ..copyright import copyright_manager +from ..types.meta import Meta, Daisy from . import parameters @@ -33,7 +34,7 @@ def compile( out_dir: str, externs: Dict, patch_name: Optional[str] = None, - patch_meta: Optional[Dict] = None, + patch_meta: Meta = Meta(), num_input_channels: int = 0, num_output_channels: int = 0, copyright: Optional[str] = None, @@ -44,17 +45,10 @@ def compile( out_dir = os.path.join(out_dir, "daisy") - if patch_meta: - patch_name = patch_meta.get("name", patch_name) - daisy_meta = patch_meta.get("daisy", {}) - else: - daisy_meta = {} - - board = daisy_meta.get("board", "pod") + daisy_meta: Daisy = patch_meta.daisy + board = daisy_meta.board copyright_c = copyright_manager.get_copyright_for_c(copyright) - # copyright_plist = copyright or u"Copyright {0} Enzien Audio, Ltd." \ - # " All Rights Reserved.".format(datetime.datetime.now().year) try: # ensure that the output directory does not exist @@ -69,8 +63,8 @@ def compile( source_dir = os.path.join(out_dir, "source") shutil.copytree(c_src_dir, source_dir) - if daisy_meta.get('board_file'): - header, board_info = json2daisy.generate_header_from_file(daisy_meta['board_file']) + if daisy_meta.board_file is not None: + header, board_info = json2daisy.generate_header_from_file(daisy_meta.board_file) else: header, board_info = json2daisy.generate_header_from_name(board) @@ -87,12 +81,12 @@ def compile( component_glue['num_output_channels'] = num_output_channels component_glue['has_midi'] = board_info['has_midi'] component_glue['displayprocess'] = board_info['displayprocess'] - component_glue['debug_printing'] = daisy_meta.get('debug_printing', False) - component_glue['usb_midi'] = daisy_meta.get('usb_midi', False) + component_glue['debug_printing'] = daisy_meta.debug_printing + component_glue['usb_midi'] = daisy_meta.usb_midi component_glue['pool_sizes_kb'] = externs["memoryPoolSizesKb"] # samplerate - samplerate = daisy_meta.get('samplerate', 48000) + samplerate = daisy_meta.samplerate if samplerate >= 96000: component_glue['samplerate'] = 96000 elif samplerate >= 48000: @@ -105,8 +99,8 @@ def compile( component_glue['samplerate'] = 8000 # blocksize - blocksize = daisy_meta.get('blocksize') - if blocksize: + blocksize = daisy_meta.blocksize + if blocksize is not None: component_glue['blocksize'] = max(min(256, blocksize), 1) else: component_glue['blocksize'] = None @@ -125,20 +119,18 @@ def compile( with open(daisy_cpp_path, 'w') as f: f.write(rendered_cpp) - makefile_replacements = {'name': patch_name} - makefile_replacements['linker_script'] = daisy_meta.get('linker_script', '') - if makefile_replacements['linker_script'] != '': - makefile_replacements['linker_script'] = daisy_meta["linker_script"] + makefile_replacements: Dict[str, Any] = {'name': patch_name} + makefile_replacements['linker_script'] = daisy_meta.linker_script # libdaisy path - path = daisy_meta.get('libdaisy_path', 2) + path = daisy_meta.libdaisy_path if isinstance(path, int): makefile_replacements['libdaisy_path'] = f'{"../" * path}libdaisy' elif isinstance(path, str): makefile_replacements['libdaisy_path'] = path - makefile_replacements['bootloader'] = daisy_meta.get('bootloader', '') - makefile_replacements['debug_printing'] = daisy_meta.get('debug_printing', False) + makefile_replacements['bootloader'] = daisy_meta.bootloader + makefile_replacements['debug_printing'] = daisy_meta.debug_printing rendered_makefile = env.get_template('Makefile').render(makefile_replacements) with open(os.path.join(source_dir, "Makefile"), "w") as f: diff --git a/hvcc/generators/c2daisy/templates/HeavyDaisy.cpp b/hvcc/generators/c2daisy/templates/HeavyDaisy.cpp index a67444a8..3ede2309 100644 --- a/hvcc/generators/c2daisy/templates/HeavyDaisy.cpp +++ b/hvcc/generators/c2daisy/templates/HeavyDaisy.cpp @@ -41,11 +41,11 @@ Heavy_{{patch_name}}* hv; void audiocallback(daisy::AudioHandle::InputBuffer in, daisy::AudioHandle::OutputBuffer out, size_t size); static void sendHook(HeavyContextInterface *c, const char *receiverName, uint32_t receiverHash, const HvMessage * m); -{% if debug_printing %} +{% if debug_printing is sameas true %} static void printHook(HeavyContextInterface *c, const char *printLabel, const char *msgString, const HvMessage *m); /** FIFO to hold messages as we're ready to print them */ FIFO, 64> event_log; -{% elif usb_midi %} +{% elif usb_midi is sameas true %} daisy::MidiUsbHandler midiusb; {% endif %} // int midiOutCount; @@ -95,7 +95,7 @@ DaisyHvParamOut DaisyOutputParameters[DaisyNumOutputParameters] = { }; {% endif %} -{% if has_midi or usb_midi %} +{% if (has_midi is sameas true) or (usb_midi is sameas true) %} // Typical Switch case for Message Type. void HandleMidiMessage(MidiEvent m) { @@ -208,19 +208,19 @@ int main(void) {% if blocksize %} hardware.SetAudioBlockSize({{blocksize}}); {% endif %} - {% if has_midi %} + {% if has_midi is sameas true %} MidiUartHandler::Config midi_config; hardware.midi.Init(midi_config); hardware.midi.StartReceive(); {% endif %} - {% if not debug_printing and usb_midi %} + {% if (debug_printing is not sameas true) and (usb_midi is sameas true) %} MidiUsbHandler::Config midiusb_config; midiusb.Init(midiusb_config); midiusb.StartReceive(); {% endif %} hardware.StartAudio(audiocallback); - {% if debug_printing %} + {% if debug_printing is sameas true %} hardware.som.StartLog(); hv->setPrintHook(printHook); @@ -243,7 +243,7 @@ int main(void) HandleMidiMessage(hardware.midi.PopEvent()); } {% endif %} - {% if not debug_printing and usb_midi %} + {% if (debug_printing is not sameas true) and (usb_midi is sameas true) %} midiusb.Listen(); while(midiusb.HasEvents()) { @@ -258,7 +258,7 @@ int main(void) LoopWriteOut(); {% endif %} - {% if debug_printing %} + {% if debug_printing is sameas true %} /** Now separately, every 5ms we'll print the top message in our queue if there is one */ if(now - log_time > 5) { @@ -297,13 +297,13 @@ void audiocallback(daisy::AudioHandle::InputBuffer in, daisy::AudioHandle::Outpu hardware.PostProcess(); } -{% if has_midi or usb_midi %} +{% if (has_midi is sameas true) or (usb_midi is sameas true) %} void HandleMidiOut(uint8_t *midiData, const uint8_t numElements) { - {% if has_midi %} + {% if has_midi is sameas true %} hardware.midi.SendMessage(midiData, numElements); {% endif %} - {% if not debug_printing and usb_midi %} + {% if (debug_printing is not sameas true) and (usb_midi is sameas true) %} midiusb.SendMessage(midiData, numElements); {% endif %} } @@ -448,12 +448,12 @@ static void sendHook(HeavyContextInterface *c, const char *receiverName, uint32_ } } {% endif %} - {% if has_midi or usb_midi %} + {% if (has_midi is sameas true) or (usb_midi is sameas true) %} HandleMidiSend(receiverHash, m); {% endif %} } -{% if debug_printing %} +{% if debug_printing is sameas true %} /** Receives messages from the PD [print] object and writes them to the serial console. * */ diff --git a/hvcc/generators/c2daisy/templates/Makefile b/hvcc/generators/c2daisy/templates/Makefile index 0841d020..e7327c2c 100644 --- a/hvcc/generators/c2daisy/templates/Makefile +++ b/hvcc/generators/c2daisy/templates/Makefile @@ -4,15 +4,15 @@ TARGET = HeavyDaisy_{{name}} # Library Locations LIBDAISY_DIR = {{libdaisy_path}} -{% if linker_script != '' %} +{%- if linker_script != '' %} LDSCRIPT = {{linker_script}} -{% endif %} +{%- endif %} -{% if bootloader != '' %} +{% if bootloader != None %} APP_TYPE = {{bootloader}} {% endif %} -{% if debug_printing %} +{% if debug_printing is sameas true %} LDFLAGS += -u _printf_float {% endif %} diff --git a/hvcc/generators/c2dpf/c2dpf.py b/hvcc/generators/c2dpf/c2dpf.py index d5ffb195..90f2b508 100644 --- a/hvcc/generators/c2dpf/c2dpf.py +++ b/hvcc/generators/c2dpf/c2dpf.py @@ -21,6 +21,7 @@ from ..copyright import copyright_manager from ..filters import filter_uniqueid +from ..types.meta import Meta, DPF class c2dpf: @@ -34,7 +35,7 @@ def compile( out_dir: str, externs: Dict, patch_name: Optional[str] = None, - patch_meta: Optional[Dict] = None, + patch_meta: Meta = Meta(), num_input_channels: int = 0, num_output_channels: int = 0, copyright: Optional[str] = None, @@ -47,13 +48,8 @@ def compile( receiver_list = externs['parameters']['in'] sender_list = externs["parameters"]["out"] - if patch_meta: - patch_name = patch_meta.get("name", patch_name) - dpf_meta = patch_meta.get("dpf", {}) - else: - dpf_meta = {} - - dpf_path = dpf_meta.get('dpf_path', '') + dpf_meta: DPF = patch_meta.dpf + dpf_path = dpf_meta.dpf_path copyright_c = copyright_manager.get_copyright_for_c(copyright) @@ -102,7 +98,7 @@ def compile( senders=sender_list, pool_sizes_kb=externs["memoryPoolSizesKb"], copyright=copyright_c)) - if dpf_meta.get("enable_ui"): + if dpf_meta.enable_ui: dpf_ui_path = os.path.join(source_dir, f"HeavyDPF_{patch_name}_UI.cpp") with open(dpf_ui_path, "w") as f: f.write(env.get_template("HeavyDPF_UI.cpp").render( diff --git a/hvcc/generators/c2dpf/templates/DistrhoPluginInfo.h b/hvcc/generators/c2dpf/templates/DistrhoPluginInfo.h index 8fe2f69e..16efa07f 100644 --- a/hvcc/generators/c2dpf/templates/DistrhoPluginInfo.h +++ b/hvcc/generators/c2dpf/templates/DistrhoPluginInfo.h @@ -3,46 +3,46 @@ #pragma once #define DISTRHO_PLUGIN_NAME "{{name.replace('_', ' ')}}" -{%- if meta.plugin_uri is defined %} +{%- if meta.plugin_uri != None %} #define DISTRHO_PLUGIN_URI "{{meta.plugin_uri}}" {% else %} #define DISTRHO_PLUGIN_URI "urn:hvcc:{{name}}" {%- endif %} -{%- if meta.plugin_clap_id is defined %} +{%- if meta.plugin_clap_id != None %} #define DISTRHO_PLUGIN_CLAP_ID "{{meta.plugin_clap_id}}" {% else %} #define DISTRHO_PLUGIN_CLAP_ID "urn.hvcc.{{name}}" {%- endif %} #define DISTRHO_PLUGIN_NUM_INPUTS {{num_input_channels}} #define DISTRHO_PLUGIN_NUM_OUTPUTS {{num_output_channels}} -#define DISTRHO_PLUGIN_IS_SYNTH {{1 if num_output_channels > 0 and meta.midi_input is defined and meta.midi_input > 0 else 0}} -#define DISTRHO_PLUGIN_HAS_UI {{1 if meta.enable_ui is defined and meta.enable_ui is sameas true else 0}} +#define DISTRHO_PLUGIN_IS_SYNTH {{1 if num_output_channels > 0 and meta.midi_input > 0 else 0}} +#define DISTRHO_PLUGIN_HAS_UI {{1 if meta.enable_ui is sameas true else 0}} #define DISTRHO_PLUGIN_IS_RT_SAFE 1 #define DISTRHO_PLUGIN_WANT_PROGRAMS 0 #define DISTRHO_PLUGIN_WANT_STATE 0 #define DISTRHO_PLUGIN_WANT_TIMEPOS 1 #define DISTRHO_PLUGIN_WANT_FULL_STATE 0 -#define DISTRHO_PLUGIN_WANT_MIDI_INPUT {{meta.midi_input if meta.midi_input is defined else 1}} -#define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT {{meta.midi_output if meta.midi_output is defined else 1}} -{%- if meta.lv2_info is defined %} +#define DISTRHO_PLUGIN_WANT_MIDI_INPUT {{1 if meta.midi_input is sameas true else 0}} +#define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT {{1 if meta.midi_output is sameas true else 0}} +{%- if meta.lv2_info != None %} #define DISTRHO_PLUGIN_LV2_CATEGORY "{{meta.lv2_info}}" {%- endif %} -{%- if meta.vst3_info is defined %} +{%- if meta.vst3_info != None %} #define DISTRHO_PLUGIN_VST3_CATEGORIES "{{meta.vst3_info}}" {%- endif %} -{%- if meta.clap_info is defined %} +{%- if meta.clap_info|length > 0 %} #define DISTRHO_PLUGIN_CLAP_FEATURES "{{ meta.clap_info|join('", "') }}" {%- endif %} // for level monitoring #define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 0 -{%- if meta.enable_ui is defined %} +{% if meta.enable_ui is sameas true %} // if you are using a UI you'll probably want to modify these settings to your needs #define DISTRHO_UI_USE_CUSTOM 1 #define DISTRHO_UI_CUSTOM_INCLUDE_PATH "DearImGui.hpp" #define DISTRHO_UI_CUSTOM_WIDGET_TYPE DGL_NAMESPACE::ImGuiTopLevelWidget - {%- if meta.ui_size is defined %} + {%- if meta.ui_size != None %} #define DISTRHO_UI_DEFAULT_WIDTH {{meta.ui_size.width}} #define DISTRHO_UI_DEFAULT_HEIGHT {{meta.ui_size.height}} {% else %} @@ -51,7 +51,7 @@ {%- endif %} {%- endif %} -{%- if meta.enable_modgui is defined %} +{%- if meta.enable_modgui is sameas true %} #ifdef __MOD_DEVICES__ #undef DISTRHO_PLUGIN_USES_MODGUI #define DISTRHO_PLUGIN_USES_MODGUI 1 diff --git a/hvcc/generators/c2dpf/templates/HeavyDPF.cpp b/hvcc/generators/c2dpf/templates/HeavyDPF.cpp index d7f69a7d..a8130ec5 100644 --- a/hvcc/generators/c2dpf/templates/HeavyDPF.cpp +++ b/hvcc/generators/c2dpf/templates/HeavyDPF.cpp @@ -56,7 +56,7 @@ static void hvSendHookFunc(HeavyContextInterface *c, const char *sendName, uint3 if (plugin != nullptr) { plugin->setOutputParameter(sendHash, m); -{%- if meta.midi_output is defined and meta.midi_output == 1 %} +{%- if meta.midi_output is sameas true %} #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT plugin->handleMidiSend(sendHash, m); #endif @@ -102,7 +102,7 @@ static void hvPrintHookFunc(HeavyContextInterface *c, const char *printLabel, co hv_{{name}}_free(_context); } -{%- if meta.port_groups is defined %} +{%- if meta.port_groups != None %} {% include 'portGroups.cpp' %} {%- endif %} @@ -178,13 +178,13 @@ void {{class_name}}::setOutputParameter(uint32_t sendHash, const HvMessage *m) // } -{%- if meta.midi_input is defined and meta.midi_input == 1 %} +{%- if meta.midi_input is sameas true %} #if DISTRHO_PLUGIN_WANT_MIDI_INPUT {% include 'midiInput.cpp' %} #endif {% endif %} -{%- if meta.midi_output is defined and meta.midi_output == 1 %} +{%- if meta.midi_output is sameas true %} #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT {% include 'midiOutput.cpp' %} #endif diff --git a/hvcc/generators/c2dpf/templates/HeavyDPF.hpp b/hvcc/generators/c2dpf/templates/HeavyDPF.hpp index cd4f6610..3ea3aec0 100644 --- a/hvcc/generators/c2dpf/templates/HeavyDPF.hpp +++ b/hvcc/generators/c2dpf/templates/HeavyDPF.hpp @@ -25,7 +25,7 @@ class {{class_name}} : public Plugin {% endfor %} }; -{% if meta.port_groups is defined %} +{% if meta.port_groups != None %} enum PortGroups { {%- if meta.port_groups.input|length %} @@ -58,7 +58,7 @@ class {{class_name}} : public Plugin return "{{name}}"; } -{%- if meta.description is defined %} +{%- if meta.description != None %} const char* getDescription() const override { return "{{meta.description}}"; @@ -67,14 +67,14 @@ class {{class_name}} : public Plugin const char* getMaker() const noexcept override { -{%- if meta.maker is defined %} +{%- if meta.maker != None %} return "{{meta.maker}}"; {% else %} return "Wasted Audio"; {%- endif %} } -{%- if meta.homepage is defined %} +{%- if meta.homepage != None %} const char* getHomePage() const override { return "{{meta.homepage}}"; @@ -83,7 +83,7 @@ class {{class_name}} : public Plugin const char* getLicense() const noexcept override { -{%- if meta.license is defined %} +{%- if meta.license != None %} return "{{meta.license}}"; {% else %} return "GPL v3+"; @@ -92,7 +92,7 @@ class {{class_name}} : public Plugin uint32_t getVersion() const noexcept override { -{%- if meta.version is defined %} +{%- if meta.version != None %} return d_version({{meta.version}}); {% else %} return d_version(0, 0, 1); @@ -108,7 +108,7 @@ class {{class_name}} : public Plugin // Init void initParameter(uint32_t index, Parameter& parameter) override; - {% if meta.port_groups is defined %} + {% if meta.port_groups != None %} void initAudioPort(bool input, uint32_t index, AudioPort& port) override; void initPortGroup(uint32_t groupId, PortGroup& portGroup) override; {%- endif %} diff --git a/hvcc/generators/c2dpf/templates/HeavyDPF_UI.cpp b/hvcc/generators/c2dpf/templates/HeavyDPF_UI.cpp index 0aa2982d..a1a023fb 100644 --- a/hvcc/generators/c2dpf/templates/HeavyDPF_UI.cpp +++ b/hvcc/generators/c2dpf/templates/HeavyDPF_UI.cpp @@ -94,7 +94,7 @@ class ImGuiPluginUI : public UI { {%- for k, v in receivers + senders %} {%- set v_display = v.display|lower %} - {%- if meta.enumerators is defined and meta.enumerators[v.display] is defined -%} + {%- if meta.enumerators != None and meta.enumerators[v.display] is defined -%} {%- set enums = meta.enumerators[v.display] -%} {%- set enumlen = enums|length %} {%- set enum_list = v_display + "_list" %} diff --git a/hvcc/generators/c2dpf/templates/Makefile_plugin b/hvcc/generators/c2dpf/templates/Makefile_plugin index 30e11d7c..6becc0d9 100644 --- a/hvcc/generators/c2dpf/templates/Makefile_plugin +++ b/hvcc/generators/c2dpf/templates/Makefile_plugin @@ -1,15 +1,15 @@ NAME = {{name}} -{%- if meta.enable_modgui is defined %} +{%- if meta.enable_modgui is sameas true %} MODGUI_CLASS_NAME = hv_{{name}} {%- endif %} -{%- if meta.enable_ui is defined %} +{%- if meta.enable_ui is sameas true %} FILES_DSP = $(filter-out HeavyDPF_{{name}}_UI.cpp, $(wildcard *.cpp)) {%- else %} FILES_DSP = $(wildcard *.cpp) {%- endif %} FILES_DSP += $(wildcard *.c) -{%- if meta.enable_ui is defined %} +{%- if meta.enable_ui is sameas true %} FILES_UI = HeavyDPF_{{name}}_UI.cpp FILES_UI += ../../{{dpf_path}}dpf-widgets/opengl/DearImGui.cpp {%- endif %} @@ -20,12 +20,12 @@ DPF_PATH = ../../{{dpf_path}}dpf include ../../{{dpf_path}}dpf/Makefile.plugins.mk -{%- if meta.enable_ui is defined %} +{%- if meta.enable_ui is sameas true %} BUILD_CXX_FLAGS += -I ../../{{dpf_path}}dpf-widgets/generic BUILD_CXX_FLAGS += -I ../../{{dpf_path}}dpf-widgets/opengl {%- endif %} -{%- if meta.makefile_dep is defined %} +{%- if meta.makefile_dep|length > 0 %} {%- for dependency in meta.makefile_dep %} BUILD_CXX_FLAGS += -I ../../{{dpf_path}}{{dependency}} {%- endfor %} @@ -35,7 +35,7 @@ BUILD_C_FLAGS += -Wno-unused-parameter -std=c11 -fno-strict-aliasing -pthread BUILD_CXX_FLAGS += -Wno-unused-parameter -fno-strict-aliasing -pthread LINK_FLAGS += -pthread -{% if meta.plugin_formats is defined %} +{% if meta.plugin_formats|length > 0 %} {%- for format in meta.plugin_formats %} TARGETS += {{format}} {%- endfor %} diff --git a/hvcc/generators/c2dpf/templates/initParameter.cpp b/hvcc/generators/c2dpf/templates/initParameter.cpp index 47628021..8a7d3dec 100644 --- a/hvcc/generators/c2dpf/templates/initParameter.cpp +++ b/hvcc/generators/c2dpf/templates/initParameter.cpp @@ -23,7 +23,7 @@ parameter.ranges.min = {{v.attributes.min}}f; parameter.ranges.max = {{v.attributes.max}}f; parameter.ranges.def = {{v.attributes.default}}f; - {%- if v.attributes.type == 'db' and not (meta.enumerators is defined and meta.enumerators[v.display] is defined): %} + {%- if v.attributes.type == 'db' and not (meta.enumerators != None and meta.enumerators[v.display] is defined): %} { ParameterEnumerationValue* const enumValues = new ParameterEnumerationValue[1]; enumValues[0].value = {{v.attributes.min}}f; @@ -32,7 +32,7 @@ parameter.enumValues.values = enumValues; } {%- endif %} - {%- if meta.enumerators is defined and meta.enumerators[v.display] is defined %} + {%- if meta.enumerators != None and meta.enumerators[v.display] is defined %} {% set enums = meta.enumerators[v.display] %} {% set enumlen = enums|length %} if (ParameterEnumerationValue *values = new ParameterEnumerationValue[{{enumlen}}]) diff --git a/hvcc/generators/c2dpf/templates/portGroups.cpp b/hvcc/generators/c2dpf/templates/portGroups.cpp index 31d5a1da..47cca00b 100644 --- a/hvcc/generators/c2dpf/templates/portGroups.cpp +++ b/hvcc/generators/c2dpf/templates/portGroups.cpp @@ -9,10 +9,13 @@ void {{class_name}}::initAudioPort(bool input, uint32_t index, AudioPort& port) {%- if meta.port_groups.input|length %} {%- for group, gConfig in meta.port_groups.input.items() %} {%- for port, value in gConfig.items() %} - case {{value}}: + case {{value[0] or value}}: port.name = "Input {{port}} ({{group}})"; port.symbol = "in_{{port|lower}}_{{group|lower}}"; port.groupId = kPortGroup{{group}}; + {%- if value[1] is sameas true %} + port.hints = kAudioPortIsCV | kCVPortHasPositiveUnipolarRange | kCVPortHasScaledRange | kCVPortIsOptional; + {%- endif %} break; {%- endfor %} {%- endfor %} @@ -38,10 +41,13 @@ void {{class_name}}::initAudioPort(bool input, uint32_t index, AudioPort& port) {%- if meta.port_groups.output|length %} {%- for group, gConfig in meta.port_groups.output.items() %} {%- for port, value in gConfig.items() %} - case {{value}}: + case {{value[0] or value}}: port.name = "Output {{port}} ({{group}})"; port.symbol = "out_{{port|lower}}_{{group|lower}}"; port.groupId = kPortGroup{{group}}; + {%- if value[1] is sameas true %} + port.hints = kAudioPortIsCV | kCVPortHasPositiveUnipolarRange | kCVPortHasScaledRange | kCVPortIsOptional; + {%- endif %} break; {%- endfor %} {%- endfor %} diff --git a/hvcc/generators/types/__init__.py b/hvcc/generators/types/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hvcc/generators/types/meta.py b/hvcc/generators/types/meta.py new file mode 100644 index 00000000..38adbc60 --- /dev/null +++ b/hvcc/generators/types/meta.py @@ -0,0 +1,58 @@ +from typing import Dict, Literal, List, Optional, Tuple, Union +from pydantic import BaseModel, HttpUrl + + +DaisyBoards = Literal['pod', 'petal', 'patch', 'patch_init', 'field'] +DaisyBootloader = Literal['BOOT_NONE', 'BOOT_SRAM', 'BOOT_QSPI'] +DPFFormats = Literal['lv2', 'lv2_sep', 'vst2', 'vst3', 'clap', 'jack', 'dssi', 'ladspa'] + + +class Daisy(BaseModel): + board: DaisyBoards = 'pod' + board_file: Optional[str] = None + libdaisy_path: Union[str, int] = 2 + usb_midi: bool = False + debug_printing: bool = False + samplerate: int = 48000 + blocksize: Optional[int] = None + linker_script: str = '' + bootloader: Optional[DaisyBootloader] = None + + +class DPFUISize(BaseModel): + width: int + height: int + + +class DPFPortGroups(BaseModel): + input: Dict[str, Dict[str, Union[int, Tuple[int, bool]]]] = {} + output: Dict[str, Dict[str, Union[int, Tuple[int, bool]]]] = {} + + +class DPF(BaseModel): + dpf_path: str = "" + description: Optional[str] = None + makefile_dep: List[str] = [] + enable_ui: bool = False + enable_modgui: bool = False + ui_size: Optional[DPFUISize] = None + midi_input: bool = False + midi_output: bool = False + port_groups: Optional[DPFPortGroups] = None + enumerators: Optional[Dict[str, List[str]]] = None + version: Optional[str] = None + license: Optional[str] = None + maker: Optional[str] = None + homepage: Optional[HttpUrl] = None + plugin_uri: Optional[str] = None + plugin_clap_id: Optional[str] = None + plugin_formats: List[DPFFormats] = [] + lv2_info: Optional[str] = None + vst3_info: Optional[str] = None + clap_info: List[str] = [] + + +class Meta(BaseModel): + name: Optional[str] = None + daisy: Daisy = Daisy() + dpf: DPF = DPF() diff --git a/hvcc/utils.py b/hvcc/utils.py index d45b4a6f..40c3811e 100644 --- a/hvcc/utils.py +++ b/hvcc/utils.py @@ -19,6 +19,13 @@ from hvcc.core.hv2ir.HeavyLangObject import HeavyLangObject from hvcc.interpreters.pd2hv.PdParser import PdParser +from hvcc.generators.types.meta import Meta, DPF, Daisy + + +gens = { + "dpf": DPF, + "daisy": Daisy +} def main() -> None: @@ -28,6 +35,8 @@ def main() -> None: subparsers.add_parser("pdobjects", help="list supported Pure Data objects") subparser_hvhash = subparsers.add_parser("hvhash", help="print the heavy hash of the input string") subparser_hvhash.add_argument("string") + subparser_meta = subparsers.add_parser("metaschema", help="show JSON Schema of the Meta() model") + subparser_meta.add_argument("-g", "--generator", help="Choose supported generator: DPF, Daisy") parsed_args = parser.parse_args(args=None if sys.argv[1:] else ['--help']) args = vars(parsed_args) @@ -44,6 +53,13 @@ def main() -> None: print(json.dumps(obj_dict, indent=4)) elif command == "hvhash": print("0x{0:X}".format(HeavyLangObject.get_hash(args['string']))) + elif command == "metaschema": + generator = args.get('generator') + if generator is not None: + model = gens[generator.lower()] + else: + model = Meta + print(json.dumps(model.model_json_schema(), indent=4)) else: pass diff --git a/setup.cfg b/setup.cfg index 6b8e2844..42d51e06 100644 --- a/setup.cfg +++ b/setup.cfg @@ -25,6 +25,7 @@ install_requires = Jinja2>=2.11 importlib_resources>=5.1 wstd2daisy>=0.5.2 + pydantic>=2.9.1 [options.entry_points] console_scripts = From ce0b87e0e08d4e45eb67b198de253d19061d58fd Mon Sep 17 00:00:00 2001 From: dreamer Date: Wed, 18 Sep 2024 23:40:29 +0200 Subject: [PATCH 06/10] init ModelMetaclass --- hvcc/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hvcc/utils.py b/hvcc/utils.py index 40c3811e..469d0a43 100644 --- a/hvcc/utils.py +++ b/hvcc/utils.py @@ -56,7 +56,7 @@ def main() -> None: elif command == "metaschema": generator = args.get('generator') if generator is not None: - model = gens[generator.lower()] + model = gens[generator.lower()]() else: model = Meta print(json.dumps(model.model_json_schema(), indent=4)) From eaebd0a90bb1e10546a3f115150d2fb957cf6326 Mon Sep 17 00:00:00 2001 From: dreamer <1185977+dromer@users.noreply.github.com> Date: Thu, 19 Sep 2024 13:08:46 +0200 Subject: [PATCH 07/10] try disabling denormal numbers for plugins with input (#158) * try disabling denormal numbers for plugins with input * flag to disable scoped denormals --- CHANGELOG.md | 1 + hvcc/generators/c2dpf/templates/HeavyDPF.cpp | 6 ++++++ hvcc/generators/types/meta.py | 1 + 3 files changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0449a365..4c33e08e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Features: * Only disable DSP with new `--nodsp` flag * Use pydantic types to define metadata objects * DPF: CV flag in portgroups +* DPF: flag to disable scoped denormals Bugfixes diff --git a/hvcc/generators/c2dpf/templates/HeavyDPF.cpp b/hvcc/generators/c2dpf/templates/HeavyDPF.cpp index a8130ec5..0d73340c 100644 --- a/hvcc/generators/c2dpf/templates/HeavyDPF.cpp +++ b/hvcc/generators/c2dpf/templates/HeavyDPF.cpp @@ -3,6 +3,9 @@ #include "Heavy_{{name}}.h" #include "{{class_name}}.hpp" #include +{% if meta.denormals is sameas false %} +#include "extra/ScopedDenormalDisable.hpp" +{% endif %} #define HV_DPF_NUM_PARAMETER {{receivers|length + senders|length}} @@ -203,6 +206,9 @@ void {{class_name}}::run(const float** inputs, float** outputs, uint32_t frames, void {{class_name}}::run(const float** inputs, float** outputs, uint32_t frames) { #endif +{% if meta.denormals is sameas false %} + const ScopedDenormalDisable sdd; +{% endif %} const TimePosition& timePos(getTimePosition()); if (timePos.playing && timePos.bbt.valid) _context->sendMessageToReceiverV(HV_HASH_DPF_BPM, 0, "f", timePos.bbt.beatsPerMinute); diff --git a/hvcc/generators/types/meta.py b/hvcc/generators/types/meta.py index 38adbc60..f55e474c 100644 --- a/hvcc/generators/types/meta.py +++ b/hvcc/generators/types/meta.py @@ -40,6 +40,7 @@ class DPF(BaseModel): midi_output: bool = False port_groups: Optional[DPFPortGroups] = None enumerators: Optional[Dict[str, List[str]]] = None + denormals: bool = True version: Optional[str] = None license: Optional[str] = None maker: Optional[str] = None From 7a2098a6dacdde7798f4edeaa466970b127a347d Mon Sep 17 00:00:00 2001 From: dreamer <1185977+dromer@users.noreply.github.com> Date: Fri, 20 Sep 2024 18:18:11 +0200 Subject: [PATCH 08/10] add approximation stages (#179) * add approximation stages * add changelog --- CHANGELOG.md | 1 + hvcc/interpreters/pd2hv/libs/pd/cos~.pd | 78 +++++++++++++++---------- 2 files changed, 49 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c33e08e..f62ba55e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Features: Bugfixes * wwise: allow Bang messages in OnSendMessageCallback() +* Improve `[cos~]` precision. 0.12.0 ----- diff --git a/hvcc/interpreters/pd2hv/libs/pd/cos~.pd b/hvcc/interpreters/pd2hv/libs/pd/cos~.pd index 76a28d0e..9e85bb0e 100644 --- a/hvcc/interpreters/pd2hv/libs/pd/cos~.pd +++ b/hvcc/interpreters/pd2hv/libs/pd/cos~.pd @@ -1,37 +1,55 @@ #N canvas 515 39 304 425 10; -#X obj 47 248 *~; -#X obj 132 278 *~; -#X obj 147 220 *~; -#X text 173 219 x^2; -#X text 71 248 x^3; -#X text 156 278 x^5; -#X obj 32 348 +~; -#X obj 32 308 -~; -#X obj 47 278 *~ 0.166667; #X obj 32 167 *~ 6.28319; -#X text 58 350 -5% to adjust for taylor expansion; -#X obj 132 308 *~ 0.00784314; #X obj 32 17 inlet~; -#X obj 32 378 outlet~; +#X obj 31 594 outlet~; #X obj 32 137 -~ 0.25; #X obj 32 77 -~ 0.5; #X obj 32 107 abs~; #X obj 32 47 wrap~; -#X connect 0 0 8 0; -#X connect 0 0 1 0; -#X connect 1 0 11 0; -#X connect 2 0 1 1; -#X connect 2 0 0 1; -#X connect 6 0 13 0; -#X connect 7 0 6 0; -#X connect 8 0 7 1; -#X connect 9 0 2 0; -#X connect 9 0 2 1; -#X connect 9 0 7 0; -#X connect 9 0 0 0; -#X connect 11 0 6 1; -#X connect 12 0 17 0; -#X connect 14 0 9 0; -#X connect 15 0 16 0; -#X connect 16 0 14 0; -#X connect 17 0 15 0; +#X obj 64 268 *~; +#X obj 92 327 *~; +#X obj 127 215 *~; +#X text 166 214 x^2; +#X text 100 267 x^3; +#X text 127 326 x^5; +#X obj 32 430 +~; +#X obj 32 360 -~; +#X obj 65 298 *~ 0.166667; +#X obj 92 359 *~ 0.00833333; +#X obj 113 391 *~; +#X obj 113 425 *~ 0.000198413; +#X obj 32 518 -~; +#X obj 139 455 *~; +#X obj 31 551 +~; +#X obj 139 481 *~ 2.75573e-06; +#X text 148 390 x^7; +#X text 176 454 x^9; +#X text 121 166 sine taylor approximation; +#X connect 0 0 14 0; +#X connect 0 0 7 0; +#X connect 0 0 9 0; +#X connect 0 0 9 1; +#X connect 1 0 6 0; +#X connect 3 0 0 0; +#X connect 4 0 5 0; +#X connect 5 0 3 0; +#X connect 6 0 4 0; +#X connect 7 0 15 0; +#X connect 7 0 8 0; +#X connect 8 0 16 0; +#X connect 8 0 17 0; +#X connect 9 0 8 1; +#X connect 9 0 7 1; +#X connect 9 0 17 1; +#X connect 9 0 20 1; +#X connect 13 0 19 0; +#X connect 14 0 13 0; +#X connect 15 0 14 1; +#X connect 16 0 13 1; +#X connect 17 0 18 0; +#X connect 17 0 20 0; +#X connect 18 0 19 1; +#X connect 19 0 21 0; +#X connect 20 0 22 0; +#X connect 21 0 2 0; +#X connect 22 0 21 1; From 5fcb1606958831c7d95f500ea98722955f16ae54 Mon Sep 17 00:00:00 2001 From: dreamer Date: Fri, 20 Sep 2024 18:59:04 +0200 Subject: [PATCH 09/10] update wstd2daisy --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 42d51e06..f4ccc6d1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -24,7 +24,7 @@ python_requires = >= 3.8 install_requires = Jinja2>=2.11 importlib_resources>=5.1 - wstd2daisy>=0.5.2 + wstd2daisy>=0.5.3 pydantic>=2.9.1 [options.entry_points] From dc058385a7159d6c1336d6d1075decb9d7a97cac Mon Sep 17 00:00:00 2001 From: dreamer Date: Fri, 20 Sep 2024 19:01:21 +0200 Subject: [PATCH 10/10] bump version --- .bumpversion.cfg | 2 +- CHANGELOG.md | 2 +- setup.cfg | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index f2e3f053..9d2d9db5 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.12.0 +current_version = 0.12.1 [bumpversion:file:setup.cfg] diff --git a/CHANGELOG.md b/CHANGELOG.md index f62ba55e..39887ddb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ CHANGELOG ===== -Next Release +0.12.1 ----- Features: diff --git a/setup.cfg b/setup.cfg index f4ccc6d1..67457688 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,11 +1,11 @@ [metadata] name = hvcc -version = 0.12.0 +version = 0.12.1 license = GPLv3 author = Enzien Audio, Wasted Audio description = `hvcc` is a python-based dataflow audio programming language compiler that generates C/C++ code and a variety of specific framework wrappers. url = https://github.com/Wasted-Audio/hvcc -download_url = https://github.com/Wasted-Audio/hvcc/archive/refs/tags/v0.12.0.tar.gz +download_url = https://github.com/Wasted-Audio/hvcc/archive/refs/tags/v0.12.1.tar.gz classifiers = Development Status :: 4 - Beta Intended Audience :: Developers