################################################################################
#
# ZOOM_ZNR_NOISE_SUPPRESSOR
#
# LV2 plugin built from the MOD Audio Cookbook workflow: DPF source is embedded
# below and compiled against a pinned DPF checkout, producing an .lv2 bundle
# that the builder.mod.audio cloud builder can compile and package for the
# MOD Dwarf.
#
################################################################################

ZOOM_ZNR_NOISE_SUPPRESSOR_VERSION = 61d38eb638449647fb8395a35c5b8dab7e981ba7
ZOOM_ZNR_NOISE_SUPPRESSOR_SITE = https://github.com/DISTRHO/DPF.git
ZOOM_ZNR_NOISE_SUPPRESSOR_SITE_METHOD = git
ZOOM_ZNR_NOISE_SUPPRESSOR_GIT_SUBMODULES = YES
ZOOM_ZNR_NOISE_SUPPRESSOR_INSTALL_STAGING = NO
ZOOM_ZNR_NOISE_SUPPRESSOR_BUNDLES = zoom-znr-noise-suppressor.lv2

define ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_CPP
#include "DistrhoPlugin.hpp"
#include <cmath>

START_NAMESPACE_DISTRHO

// Circuit: Zoom ZNR (Zoom Noise Reduction) style noise gate, stereo.
// Modeled on the ZNR module found in Zoom's rack and multi-effects units
// (9002/9010/1010, GFX/G-series, B-series), which exposes four controls:
//   DETECT  - GTRIN taps the detector at instrument level (weaker signal,
//             so the sidechain is boosted ~12dB to read it properly) or
//             EFXIN taps it at line/effects-loop level (already hot, no
//             boost needed) - matches where in a real rig's chain the ZNR
//             module sits.
//   THRSH   - how loud the input needs to get before the gate opens.
//   DEPTH   - how much the signal is attenuated while the gate is closed;
//             unlike a hard mute this is a variable floor, from no
//             reduction at 0 up to about -60dB at 100.
//   DECAY   - how long the gate takes to close once the input drops back
//             below threshold, from a fast cutoff to a slow smooth fade.
// Both channels share a single linked envelope/gate (peak of L and R) so
// the stereo image doesn't shift as the gate opens and closes, and a small
// hysteresis gap between the opening and closing threshold stops it from
// chattering on signal hovering right at the line.
class ZoomZNRNoiseSuppressor : public Plugin {
public:
    ZoomZNRNoiseSuppressor()
        : Plugin(4, 0, 0)
    {
        sampleRateChanged(getSampleRate());
    }

protected:
    const char* getLabel() const override { return "ZNRStyle"; }
    const char* getDescription() const override { return "Zoom ZNR style Noise Suppressor (Stereo) - MOD Audio Cookbook"; }
    const char* getMaker() const override { return "MODAudioCookbook"; }
    const char* getLicense() const override { return "ISC"; }
    uint32_t getVersion() const override { return d_version(1, 0, 0); }
    int64_t getUniqueId() const override { return d_cconst('Z','N','R','S'); }

    void initParameter(uint32_t index, Parameter& parameter) override {
        switch (index) {
        case 0:
            parameter.hints = kParameterIsAutomatable;
            parameter.name = "Threshold";
            parameter.symbol = "threshold";
            parameter.ranges.def = 30.0f; parameter.ranges.min = 0.0f; parameter.ranges.max = 100.0f;
            break;
        case 1:
            parameter.hints = kParameterIsAutomatable;
            parameter.name = "Depth";
            parameter.symbol = "depth";
            parameter.ranges.def = 70.0f; parameter.ranges.min = 0.0f; parameter.ranges.max = 100.0f;
            break;
        case 2:
            parameter.hints = kParameterIsAutomatable;
            parameter.name = "Decay";
            parameter.symbol = "decay";
            parameter.ranges.def = 40.0f; parameter.ranges.min = 0.0f; parameter.ranges.max = 100.0f;
            break;
        case 3:
            parameter.hints  = kParameterIsAutomatable | kParameterIsInteger;
            parameter.name   = "Detect";
            parameter.symbol = "detect";
            parameter.ranges.def = 0.0f; parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f;
            parameter.enumValues.count = 2;
            parameter.enumValues.restrictedMode = true;
            {
                ParameterEnumerationValue* const values = new ParameterEnumerationValue[2];
                values[0].value = 0.0f; values[0].label = "GTRIN";
                values[1].value = 1.0f; values[1].label = "EFXIN";
                parameter.enumValues.values = values;
            }
            break;
        }
    }

    float getParameterValue(uint32_t index) const override { return params[index]; }
    void  setParameterValue(uint32_t index, float value) override { params[index] = value; }

    void sampleRateChanged(double newSampleRate) override {
        sr = (float)newSampleRate;
        // Envelope detector: fast attack so transients are caught promptly,
        // short release so the detector tracks the real signal level rather
        // than smearing it out. Independent of the gate's own Decay control.
        envAttackCoef  = expf(-1.0f / (0.0005f * sr));   // 0.5ms
        envReleaseCoef = expf(-1.0f / (0.05f  * sr));    // 50ms
        gateAttackCoef = expf(-1.0f / (0.001f * sr));    // 1ms - gate opens fast to avoid clipping transients
    }

    void activate() override {
        env = 0.0f;
        gateGain = 1.0f;
        gateOpen = true;
    }

    void run(const float** inputs, float** outputs, uint32_t frames) override {
        const float thresholdP = params[0];
        const float depthP     = params[1];
        const float decayP     = params[2];
        const int   detect     = (int)(params[3] + 0.5f); // 0=GTRIN, 1=EFXIN

        // GTRIN: instrument level is weaker, so boost the sidechain ~12dB
        // to read it properly. EFXIN: line level is already hot, no boost.
        const float detectorGain = detect == 0 ? 3.98f : 1.0f;

        // -80dB (gate barely engages, mostly transparent) up to -10dB
        // (aggressive, gates out anything but loud playing)
        const float thresholdDb = -80.0f + (thresholdP / 100.0f) * 70.0f;
        const float hysteresisDb = 3.0f;
        const float openDb  = thresholdDb + hysteresisDb;
        const float closeDb = thresholdDb - hysteresisDb;

        // Depth: how far the signal is pulled down once the gate is
        // closed, from 0dB (no reduction) to about -60dB (heavy reduction)
        const float floorDb = -(depthP / 100.0f) * 60.0f;
        const float floorGain = powf(10.0f, floorDb / 20.0f);

        // Decay: 20ms (fast, choppy cutoff) up to 900ms (slow, smooth fade)
        const float decayMs = 20.0f + (decayP / 100.0f) * 880.0f;
        const float gateReleaseCoef = expf(-1.0f / (0.001f * decayMs * sr));

        for (uint32_t i = 0; i < frames; ++i) {
            const float l = inputs[0][i];
            const float r = inputs[1][i];

            const float al = l >= 0.0f ? l : -l;
            const float ar = r >= 0.0f ? r : -r;
            // Linked stereo detection: both channels share one
            // envelope/gate so the stereo image doesn't shift.
            const float linkedIn = (al > ar ? al : ar) * detectorGain;

            const float envCoef = linkedIn > env ? envAttackCoef : envReleaseCoef;
            env = envCoef * env + (1.0f - envCoef) * linkedIn;

            const float envDb = 20.0f * log10f(env + 1.0e-9f);

            if (!gateOpen && envDb > openDb)
                gateOpen = true;
            else if (gateOpen && envDb < closeDb)
                gateOpen = false;

            const float targetGain = gateOpen ? 1.0f : floorGain;
            const float gainCoef = targetGain > gateGain ? gateAttackCoef : gateReleaseCoef;
            gateGain = gainCoef * gateGain + (1.0f - gainCoef) * targetGain;

            outputs[0][i] = l * gateGain;
            outputs[1][i] = r * gateGain;
        }
    }

private:
    float sr = 48000.0f;
    float params[4] = {30.0f, 70.0f, 40.0f, 0.0f};

    float env = 0.0f;
    float envAttackCoef = 0.0f, envReleaseCoef = 0.0f;

    float gateGain = 1.0f;
    float gateAttackCoef = 0.0f;
    bool  gateOpen = true;

    ZoomZNRNoiseSuppressor(const ZoomZNRNoiseSuppressor&) = delete;
    ZoomZNRNoiseSuppressor& operator=(const ZoomZNRNoiseSuppressor&) = delete;
};

Plugin* createPlugin() { return new ZoomZNRNoiseSuppressor(); }

END_NAMESPACE_DISTRHO

endef
export ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_CPP

define ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_INFO_H
#ifndef DISTRHO_PLUGIN_INFO_H_INCLUDED
#define DISTRHO_PLUGIN_INFO_H_INCLUDED

#define DISTRHO_PLUGIN_BRAND   "MODAudioCookbook"
#define DISTRHO_PLUGIN_NAME    "Zoom ZNR style Noise Suppressor (Stereo)"
#define DISTRHO_PLUGIN_URI     "https://mod.audio/cookbook/noisegate/znrstyle"
#define DISTRHO_PLUGIN_NUM_INPUTS  2
#define DISTRHO_PLUGIN_NUM_OUTPUTS 2
#define DISTRHO_PLUGIN_IS_RT_SAFE  1
#define DISTRHO_PLUGIN_WANT_STATE 0
#define DISTRHO_PLUGIN_HAS_UI     0

#endif

endef
export ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_INFO_H

define ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_TTL
@prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<https://mod.audio/cookbook/noisegate/znrstyle>
    a lv2:Plugin , lv2:ExpanderPlugin ;
    doap:name "Zoom ZNR style Noise Suppressor (Stereo)" ;
    doap:license <http://opensource.org/licenses/isc> ;
    lv2:project <https://mod.audio/cookbook/noisegate/znrstyle> ;
    lv2:optionalFeature lv2:hardRTCapable ;
    lv2:port
    [
        a lv2:AudioPort , lv2:InputPort ;
        lv2:index 0 ;
        lv2:symbol "in_l" ;
        lv2:name "In L" ;
    ] ,
    [
        a lv2:AudioPort , lv2:InputPort ;
        lv2:index 1 ;
        lv2:symbol "in_r" ;
        lv2:name "In R" ;
    ] ,
    [
        a lv2:AudioPort , lv2:OutputPort ;
        lv2:index 2 ;
        lv2:symbol "out_l" ;
        lv2:name "Out L" ;
    ] ,
    [
        a lv2:AudioPort , lv2:OutputPort ;
        lv2:index 3 ;
        lv2:symbol "out_r" ;
        lv2:name "Out R" ;
    ] ,
    [
        a lv2:InputPort , lv2:ControlPort ;
        lv2:index 4 ;
        lv2:symbol "threshold" ;
        lv2:name "Threshold" ;
        lv2:default 30.0 ;
        lv2:minimum 0.0 ;
        lv2:maximum 100.0 ;
    ] ,
    [
        a lv2:InputPort , lv2:ControlPort ;
        lv2:index 5 ;
        lv2:symbol "depth" ;
        lv2:name "Depth" ;
        lv2:default 70.0 ;
        lv2:minimum 0.0 ;
        lv2:maximum 100.0 ;
    ] ,
    [
        a lv2:InputPort , lv2:ControlPort ;
        lv2:index 6 ;
        lv2:symbol "decay" ;
        lv2:name "Decay" ;
        lv2:default 40.0 ;
        lv2:minimum 0.0 ;
        lv2:maximum 100.0 ;
    ] ,
    [
        a lv2:InputPort , lv2:ControlPort ;
        lv2:index 7 ;
        lv2:symbol "detect" ;
        lv2:name "Detect" ;
        lv2:default 0.0 ;
        lv2:minimum 0.0 ;
        lv2:maximum 1.0 ;
        lv2:portProperty lv2:integer , lv2:enumeration ;
        lv2:scalePoint
            [ rdfs:label "GTRIN" ; rdf:value 0.0 ] ,
            [ rdfs:label "EFXIN" ; rdf:value 1.0 ] ;
    ] .

endef
export ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_TTL

define ZOOM_ZNR_NOISE_SUPPRESSOR_MANIFEST_TTL
@prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
@prefix pset: <http://lv2plug.in/ns/ext/presets#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<https://mod.audio/cookbook/noisegate/znrstyle>
    a lv2:Plugin ;
    lv2:binary <zoom-znr-noise-suppressor_dsp.so> ;
    rdfs:seeAlso <zoom-znr-noise-suppressor.ttl> .

<https://mod.audio/cookbook/noisegate/znrstyle#preset-clean-studio>
    a pset:Preset ;
    lv2:appliesTo <https://mod.audio/cookbook/noisegate/znrstyle> ;
    rdfs:label "Clean Studio" ;
    rdfs:seeAlso <presets/clean-studio.ttl> .

<https://mod.audio/cookbook/noisegate/znrstyle#preset-high-gain-rack>
    a pset:Preset ;
    lv2:appliesTo <https://mod.audio/cookbook/noisegate/znrstyle> ;
    rdfs:label "High Gain Rack" ;
    rdfs:seeAlso <presets/high-gain-rack.ttl> .

<https://mod.audio/cookbook/noisegate/znrstyle#preset-effects-loop-return>
    a pset:Preset ;
    lv2:appliesTo <https://mod.audio/cookbook/noisegate/znrstyle> ;
    rdfs:label "Effects Loop Return" ;
    rdfs:seeAlso <presets/effects-loop-return.ttl> .

<https://mod.audio/cookbook/noisegate/znrstyle#preset-subtle-live>
    a pset:Preset ;
    lv2:appliesTo <https://mod.audio/cookbook/noisegate/znrstyle> ;
    rdfs:label "Subtle Live" ;
    rdfs:seeAlso <presets/subtle-live.ttl> .

<https://mod.audio/cookbook/noisegate/znrstyle#preset-deep-silence>
    a pset:Preset ;
    lv2:appliesTo <https://mod.audio/cookbook/noisegate/znrstyle> ;
    rdfs:label "Deep Silence" ;
    rdfs:seeAlso <presets/deep-silence.ttl> .

endef
export ZOOM_ZNR_NOISE_SUPPRESSOR_MANIFEST_TTL

define ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_MAKEFILE
#!/usr/bin/make -f
# Makefile for zoom-znr-noise-suppressor (MOD Audio Cookbook / DPF) #
# ------------------------------------------------ #

include ../../Makefile.base.mk

NAME = zoom-znr-noise-suppressor

all: lv2_dsp

BUILD_DIR = ../../build/zoom-znr-noise-suppressor

FILES_DSP = \
	DistrhoPluginZoomZNRNoiseSuppressor.cpp

include ../../Makefile.plugins.mk

TARGETS += lv2_dsp

all: $(TARGETS)

endef
export ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_MAKEFILE

define ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_CLEAN_STUDIO_TTL
@prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
@prefix pset: <http://lv2plug.in/ns/ext/presets#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<https://mod.audio/cookbook/noisegate/znrstyle#preset-clean-studio>
    a pset:Preset ;
    lv2:appliesTo <https://mod.audio/cookbook/noisegate/znrstyle> ;
    rdfs:label "Clean Studio" ;
    lv2:port
        [ lv2:symbol "threshold" ; pset:value 20.0 ] ,
        [ lv2:symbol "depth" ; pset:value 50.0 ] ,
        [ lv2:symbol "decay" ; pset:value 50.0 ] ,
        [ lv2:symbol "detect" ; pset:value 0.0 ] .

endef
export ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_CLEAN_STUDIO_TTL

define ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_HIGH_GAIN_RACK_TTL
@prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
@prefix pset: <http://lv2plug.in/ns/ext/presets#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<https://mod.audio/cookbook/noisegate/znrstyle#preset-high-gain-rack>
    a pset:Preset ;
    lv2:appliesTo <https://mod.audio/cookbook/noisegate/znrstyle> ;
    rdfs:label "High Gain Rack" ;
    lv2:port
        [ lv2:symbol "threshold" ; pset:value 60.0 ] ,
        [ lv2:symbol "depth" ; pset:value 90.0 ] ,
        [ lv2:symbol "decay" ; pset:value 25.0 ] ,
        [ lv2:symbol "detect" ; pset:value 0.0 ] .

endef
export ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_HIGH_GAIN_RACK_TTL

define ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_EFFECTS_LOOP_RETURN_TTL
@prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
@prefix pset: <http://lv2plug.in/ns/ext/presets#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<https://mod.audio/cookbook/noisegate/znrstyle#preset-effects-loop-return>
    a pset:Preset ;
    lv2:appliesTo <https://mod.audio/cookbook/noisegate/znrstyle> ;
    rdfs:label "Effects Loop Return" ;
    lv2:port
        [ lv2:symbol "threshold" ; pset:value 40.0 ] ,
        [ lv2:symbol "depth" ; pset:value 70.0 ] ,
        [ lv2:symbol "decay" ; pset:value 40.0 ] ,
        [ lv2:symbol "detect" ; pset:value 1.0 ] .

endef
export ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_EFFECTS_LOOP_RETURN_TTL

define ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_SUBTLE_LIVE_TTL
@prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
@prefix pset: <http://lv2plug.in/ns/ext/presets#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<https://mod.audio/cookbook/noisegate/znrstyle#preset-subtle-live>
    a pset:Preset ;
    lv2:appliesTo <https://mod.audio/cookbook/noisegate/znrstyle> ;
    rdfs:label "Subtle Live" ;
    lv2:port
        [ lv2:symbol "threshold" ; pset:value 15.0 ] ,
        [ lv2:symbol "depth" ; pset:value 30.0 ] ,
        [ lv2:symbol "decay" ; pset:value 70.0 ] ,
        [ lv2:symbol "detect" ; pset:value 0.0 ] .

endef
export ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_SUBTLE_LIVE_TTL

define ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_DEEP_SILENCE_TTL
@prefix lv2:  <http://lv2plug.in/ns/lv2core#> .
@prefix pset: <http://lv2plug.in/ns/ext/presets#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

<https://mod.audio/cookbook/noisegate/znrstyle#preset-deep-silence>
    a pset:Preset ;
    lv2:appliesTo <https://mod.audio/cookbook/noisegate/znrstyle> ;
    rdfs:label "Deep Silence" ;
    lv2:port
        [ lv2:symbol "threshold" ; pset:value 70.0 ] ,
        [ lv2:symbol "depth" ; pset:value 100.0 ] ,
        [ lv2:symbol "decay" ; pset:value 20.0 ] ,
        [ lv2:symbol "detect" ; pset:value 1.0 ] .

endef
export ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_DEEP_SILENCE_TTL


define ZOOM_ZNR_NOISE_SUPPRESSOR_CONFIGURE_CMDS
	mkdir -p $(@D)/examples/zoom-znr-noise-suppressor
	mkdir -p $(@D)/examples/zoom-znr-noise-suppressor/presets
	printf '%s' "$$ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_CPP" > $(@D)/examples/zoom-znr-noise-suppressor/DistrhoPluginZoomZNRNoiseSuppressor.cpp
	printf '%s' "$$ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_INFO_H" > $(@D)/examples/zoom-znr-noise-suppressor/DistrhoPluginInfo.h
	printf '%s' "$$ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_TTL" > $(@D)/examples/zoom-znr-noise-suppressor/zoom-znr-noise-suppressor.ttl
	printf '%s' "$$ZOOM_ZNR_NOISE_SUPPRESSOR_MANIFEST_TTL" > $(@D)/examples/zoom-znr-noise-suppressor/manifest.ttl
	printf '%s' "$$ZOOM_ZNR_NOISE_SUPPRESSOR_PLUGIN_MAKEFILE" > $(@D)/examples/zoom-znr-noise-suppressor/Makefile
	printf '%s' "$$ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_CLEAN_STUDIO_TTL" > $(@D)/examples/zoom-znr-noise-suppressor/presets/clean-studio.ttl
	printf '%s' "$$ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_HIGH_GAIN_RACK_TTL" > $(@D)/examples/zoom-znr-noise-suppressor/presets/high-gain-rack.ttl
	printf '%s' "$$ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_EFFECTS_LOOP_RETURN_TTL" > $(@D)/examples/zoom-znr-noise-suppressor/presets/effects-loop-return.ttl
	printf '%s' "$$ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_SUBTLE_LIVE_TTL" > $(@D)/examples/zoom-znr-noise-suppressor/presets/subtle-live.ttl
	printf '%s' "$$ZOOM_ZNR_NOISE_SUPPRESSOR_PRESET_DEEP_SILENCE_TTL" > $(@D)/examples/zoom-znr-noise-suppressor/presets/deep-silence.ttl
endef

define ZOOM_ZNR_NOISE_SUPPRESSOR_BUILD_CMDS
	$(TARGET_MAKE_ENV) $(TARGET_CONFIGURE_OPTS) $(MAKE) NOOPT=true -C $(@D)/examples/zoom-znr-noise-suppressor lv2_dsp
endef

define ZOOM_ZNR_NOISE_SUPPRESSOR_INSTALL_TARGET_CMDS
	cp $(@D)/examples/zoom-znr-noise-suppressor/manifest.ttl $(@D)/bin/zoom-znr-noise-suppressor.lv2/manifest.ttl
	cp $(@D)/examples/zoom-znr-noise-suppressor/zoom-znr-noise-suppressor.ttl $(@D)/bin/zoom-znr-noise-suppressor.lv2/zoom-znr-noise-suppressor.ttl
	mkdir -p $(@D)/bin/zoom-znr-noise-suppressor.lv2/presets
	cp $(@D)/examples/zoom-znr-noise-suppressor/presets/clean-studio.ttl $(@D)/bin/zoom-znr-noise-suppressor.lv2/presets/clean-studio.ttl
	cp $(@D)/examples/zoom-znr-noise-suppressor/presets/high-gain-rack.ttl $(@D)/bin/zoom-znr-noise-suppressor.lv2/presets/high-gain-rack.ttl
	cp $(@D)/examples/zoom-znr-noise-suppressor/presets/effects-loop-return.ttl $(@D)/bin/zoom-znr-noise-suppressor.lv2/presets/effects-loop-return.ttl
	cp $(@D)/examples/zoom-znr-noise-suppressor/presets/subtle-live.ttl $(@D)/bin/zoom-znr-noise-suppressor.lv2/presets/subtle-live.ttl
	cp $(@D)/examples/zoom-znr-noise-suppressor/presets/deep-silence.ttl $(@D)/bin/zoom-znr-noise-suppressor.lv2/presets/deep-silence.ttl
	mkdir -p $(TARGET_DIR)/usr/lib/lv2
	cp -r $(@D)/bin/zoom-znr-noise-suppressor.lv2 $(TARGET_DIR)/usr/lib/lv2/
endef

$(eval $(generic-package))
