Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package lv2-airwindows for openSUSE:Factory checked in at 2026-06-11 17:27:27 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/lv2-airwindows (Old) and /work/SRC/openSUSE:Factory/.lv2-airwindows.new.1981 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "lv2-airwindows" Thu Jun 11 17:27:27 2026 rev:11 rq:1358615 version:38.0 Changes: -------- --- /work/SRC/openSUSE:Factory/lv2-airwindows/lv2-airwindows.changes 2026-03-27 06:44:12.376850489 +0100 +++ /work/SRC/openSUSE:Factory/.lv2-airwindows.new.1981/lv2-airwindows.changes 2026-06-11 17:29:13.951039038 +0200 @@ -1,0 +2,6 @@ +Wed Jun 10 20:38:42 UTC 2026 - Hannes Braun <[email protected]> + +- Update to new upstream release 38.0 + * New plugins: Balanced, YHighpass, YNotch + +------------------------------------------------------------------- Old: ---- lv2-airwindows-36.0.tar.gz New: ---- lv2-airwindows-38.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ lv2-airwindows.spec ++++++ --- /var/tmp/diff_new_pack.aSDV76/_old 2026-06-11 17:29:14.551064200 +0200 +++ /var/tmp/diff_new_pack.aSDV76/_new 2026-06-11 17:29:14.551064200 +0200 @@ -18,7 +18,7 @@ Name: lv2-airwindows -Version: 36.0 +Version: 38.0 Release: 0 Summary: LV2 port of the Airwindows plugins License: MIT @@ -34,7 +34,7 @@ This is an LV2 port (by Hannes Braun) of the Airwindows plugins originally developed by Chris Johnson. -Right now, only 174 plugins (out of 420) have been ported to LV2. +Right now, only 177 plugins (out of 420) have been ported to LV2. %prep %setup -q ++++++ lv2-airwindows-36.0.tar.gz -> lv2-airwindows-38.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lv2-airwindows-36.0/Makefile new/lv2-airwindows-38.0/Makefile --- old/lv2-airwindows-36.0/Makefile 2026-03-24 17:39:38.000000000 +0100 +++ new/lv2-airwindows-38.0/Makefile 2026-06-10 22:27:01.000000000 +0200 @@ -13,7 +13,7 @@ fi install: - muon install -C build + muon -C build install clean: rm -rf build diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lv2-airwindows-36.0/build.zig new/lv2-airwindows-38.0/build.zig --- old/lv2-airwindows-36.0/build.zig 2026-03-24 17:39:38.000000000 +0100 +++ new/lv2-airwindows-38.0/build.zig 2026-06-10 22:27:01.000000000 +0200 @@ -50,10 +50,11 @@ std.debug.print("Warning: tar not found\n", .{}); }; - var src_dir = try b.build_root.handle.openDir("src", .{ .iterate = true }); - defer src_dir.close(); + const io = std.Io.Threaded.global_single_threaded.io(); + var src_dir = try b.build_root.handle.openDir(io, "src", .{ .iterate = true }); + defer src_dir.close(io); var it = src_dir.iterate(); - while (try it.next()) |file| { + while (try it.next(io)) |file| { if (file.kind != .directory) { continue; } @@ -116,7 +117,7 @@ const configure_manifest = b.addRunArtifact(subst_exe); configure_manifest.addFileArg(b.path("src/manifest.ttl.in")); configure_manifest.addArgs(&.{ "@CMAKE_SHARED_LIBRARY_SUFFIX@", target.result.dynamicLibSuffix() }); - b.getInstallStep().dependOn(&b.addInstallFileWithDir(configure_manifest.captureStdOut(), .{ .custom = dest_dir }, "Airwindows.lv2/manifest.ttl").step); + b.getInstallStep().dependOn(&b.addInstallFileWithDir(configure_manifest.captureStdOut(.{}), .{ .custom = dest_dir }, "Airwindows.lv2/manifest.ttl").step); // Cross build for (targets) |cross_target| { @@ -126,9 +127,9 @@ const configure_manifest_cross = b.addRunArtifact(subst_exe); configure_manifest_cross.addFileArg(b.path("src/manifest.ttl.in")); configure_manifest_cross.addArgs(&.{ "@CMAKE_SHARED_LIBRARY_SUFFIX@", resolved_cross_target.result.dynamicLibSuffix() }); - all.dependOn(&b.addInstallFileWithDir(configure_manifest_cross.captureStdOut(), .{ .custom = cross_dest_dir }, "Airwindows.lv2/manifest.ttl").step); + all.dependOn(&b.addInstallFileWithDir(configure_manifest_cross.captureStdOut(.{}), .{ .custom = cross_dest_dir }, "Airwindows.lv2/manifest.ttl").step); - const install_license = b.addInstallFile(b.path("LICENSE"), b.pathJoin(&.{cross_dest_dir, "LICENSE"})); + const install_license = b.addInstallFile(b.path("LICENSE"), b.pathJoin(&.{ cross_dest_dir, "LICENSE" })); switch (resolved_cross_target.result.os.tag) { .macos => { @@ -203,7 +204,7 @@ } fn extractVersion(b: *std.Build, output: *std.ArrayList(u8)) !void { - var buffer = try std.fs.cwd().readFileAlloc(b.allocator, "meson.build", 100000000); + var buffer = try std.Io.Dir.cwd().readFileAlloc(std.Io.Threaded.global_single_threaded.io(), "meson.build", b.allocator, .unlimited); defer b.allocator.free(buffer); const idx = std.mem.indexOf(u8, buffer, "version : '").?; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lv2-airwindows-36.0/meson.build new/lv2-airwindows-38.0/meson.build --- old/lv2-airwindows-36.0/meson.build 2026-03-24 17:39:38.000000000 +0100 +++ new/lv2-airwindows-38.0/meson.build 2026-06-10 22:27:01.000000000 +0200 @@ -7,7 +7,7 @@ 'optimization=3' ], license : 'MIT', - version : '36.0' + version : '38.0' ) bundle_name = 'Airwindows.lv2' @@ -26,6 +26,7 @@ 'Air2', 'Air3', 'Air4', + 'Balanced', 'BassAmp', 'BassDrive', 'BassKit', @@ -189,7 +190,9 @@ 'XNotch', 'XRegion', 'YBandpass', + 'YHighpass', 'YLowpass', + 'YNotch', 'ZOutputStage', ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lv2-airwindows-36.0/src/Balanced/Balanced.c new/lv2-airwindows-38.0/src/Balanced/Balanced.c --- old/lv2-airwindows-36.0/src/Balanced/Balanced.c 1970-01-01 01:00:00.000000000 +0100 +++ new/lv2-airwindows-38.0/src/Balanced/Balanced.c 2026-06-10 22:27:01.000000000 +0200 @@ -0,0 +1,173 @@ +#include <lv2/core/lv2.h> + +#include <math.h> +#include <stdint.h> +#include <stdlib.h> + +#define BALANCED_URI "https://hannesbraun.net/ns/lv2/airwindows/balanced" + +typedef enum { + INPUT_L = 0, + INPUT_R = 1, + OUTPUT_L = 2, + OUTPUT_R = 3, + BIT_SHIFT = 4 +} PortIndex; + +typedef struct { + const float* input[2]; + float* output[2]; + const float* bitShift; + + uint32_t fpdL; + uint32_t fpdR; +} Balanced; + +static LV2_Handle instantiate( + const LV2_Descriptor* descriptor, + double rate, + const char* bundle_path, + const LV2_Feature* const* features) +{ + Balanced* balanced = (Balanced*) calloc(1, sizeof(Balanced)); + return (LV2_Handle) balanced; +} + +static void connect_port(LV2_Handle instance, uint32_t port, void* data) +{ + Balanced* balanced = (Balanced*) instance; + + switch ((PortIndex) port) { + case INPUT_L: + balanced->input[0] = (const float*) data; + break; + case INPUT_R: + balanced->input[1] = (const float*) data; + break; + case OUTPUT_L: + balanced->output[0] = (float*) data; + break; + case OUTPUT_R: + balanced->output[1] = (float*) data; + break; + case BIT_SHIFT: + balanced->bitShift = (const float*) data; + break; + } +} + +static void activate(LV2_Handle instance) +{ + Balanced* balanced = (Balanced*) instance; + balanced->fpdL = 1.0; + while (balanced->fpdL < 16386) balanced->fpdL = rand() * UINT32_MAX; + balanced->fpdR = 1.0; + while (balanced->fpdR < 16386) balanced->fpdR = rand() * UINT32_MAX; +} + +static void run(LV2_Handle instance, uint32_t sampleFrames) +{ + Balanced* balanced = (Balanced*) instance; + + const float* in1 = balanced->input[0]; + const float* in2 = balanced->input[1]; + float* out1 = balanced->output[0]; + float* out2 = balanced->output[1]; + + int bitshiftBalanced = (int) *balanced->bitShift; + double gain = 1.0; + switch (bitshiftBalanced) { + case 0: + gain = 0.5; + break; + case 1: + gain = 1.0; + break; + case 2: + gain = 2.0; + break; + case 3: + gain = 4.0; + break; + case 4: + gain = 8.0; + break; + case 5: + gain = 16.0; + break; + case 6: + gain = 32.0; + break; + case 7: + gain = 64.0; + break; + case 8: + gain = 128.0; + break; + } + // we are directly punching in the gain values rather than calculating them + + while (sampleFrames-- > 0) { + double inputSampleL = *in1; + double inputSampleR = *in2; + if (fabs(inputSampleL) < 1.18e-23) inputSampleL = balanced->fpdL * 1.18e-17; + if (fabs(inputSampleR) < 1.18e-23) inputSampleR = balanced->fpdR * 1.18e-17; + + double side = inputSampleL - inputSampleR; + // tip is left, to add negative ring (right) to combine 'em is the same as subtracting them + // end result is, mono output is made up of half of each balanced input combined. Note that we don't just + // flip the ring input, because we need to combine them to cancel out interference. + inputSampleL = side * gain; + inputSampleR = side * gain; + // assign mono as result of balancing of channels + + // begin 32 bit stereo floating point dither + int expon; + frexpf((float) inputSampleL, &expon); + balanced->fpdL ^= balanced->fpdL << 13; + balanced->fpdL ^= balanced->fpdL >> 17; + balanced->fpdL ^= balanced->fpdL << 5; + inputSampleL += (((double) balanced->fpdL - (uint32_t) 0x7fffffff) * 5.5e-36l * pow(2, expon + 62)); + frexpf((float) inputSampleR, &expon); + balanced->fpdR ^= balanced->fpdR << 13; + balanced->fpdR ^= balanced->fpdR >> 17; + balanced->fpdR ^= balanced->fpdR << 5; + inputSampleR += (((double) balanced->fpdR - (uint32_t) 0x7fffffff) * 5.5e-36l * pow(2, expon + 62)); + // end 32 bit stereo floating point dither + + *out1 = (float) inputSampleL; + *out2 = (float) inputSampleR; + + in1++; + in2++; + out1++; + out2++; + } +} + +static void deactivate(LV2_Handle instance) {} + +static void cleanup(LV2_Handle instance) +{ + free(instance); +} + +static const void* extension_data(const char* uri) +{ + return NULL; +} + +static const LV2_Descriptor descriptor = { + BALANCED_URI, + instantiate, + connect_port, + activate, + run, + deactivate, + cleanup, + extension_data}; + +LV2_SYMBOL_EXPORT const LV2_Descriptor* lv2_descriptor(uint32_t index) +{ + return index == 0 ? &descriptor : NULL; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lv2-airwindows-36.0/src/Balanced/Balanced.ttl new/lv2-airwindows-38.0/src/Balanced/Balanced.ttl --- old/lv2-airwindows-36.0/src/Balanced/Balanced.ttl 1970-01-01 01:00:00.000000000 +0100 +++ new/lv2-airwindows-38.0/src/Balanced/Balanced.ttl 2026-06-10 22:27:01.000000000 +0200 @@ -0,0 +1,64 @@ +@prefix doap: <http://usefulinc.com/ns/doap#> . +@prefix foaf: <http://xmlns.com/foaf/0.1/> . +@prefix lv2: <http://lv2plug.in/ns/lv2core#> . +@prefix pprops: <http://lv2plug.in/ns/ext/port-props#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix units: <http://lv2plug.in/ns/extensions/units#> . + +<https://hannesbraun.net/ns/lv2/airwindows/balanced> + a lv2:Plugin , + lv2:UtilityPlugin , + doap:Project ; + doap:name "Balanced" ; + rdfs:comment "run an XLR input into a stereo input, sum it to mono, and use it" ; + doap:license <https://opensource.org/licenses/MIT> ; + doap:maintainer [ + foaf:name "Hannes Braun" ; + foaf:homepage <https://hannesbraun.net/> + ] ; + + lv2:minorVersion 2 ; + lv2:microVersion 0 ; + + lv2:optionalFeature lv2:hardRTCapable ; + lv2:port [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "inL" ; + lv2:name "In L" + ] , [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 1 ; + lv2:symbol "inR" ; + lv2:name "In R" + ] , [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 2 ; + lv2:symbol "outL" ; + lv2:name "Out L" + ] , [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 3 ; + lv2:symbol "outR" ; + lv2:name "Out R" + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 4 ; + lv2:symbol "bitShift" ; + lv2:name "BitShift" ; + lv2:default 0 ; + lv2:minimum 0 ; + lv2:maximum 8 ; + units:unit [ + a units:Unit ; + rdfs:label "Bits" ; + units:symbol "bits" ; + units:render "%d bits" + ] ; + lv2:portProperty pprops:hasStrictBounds + ] . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lv2-airwindows-36.0/src/YHighpass/YHighpass.c new/lv2-airwindows-38.0/src/YHighpass/YHighpass.c --- old/lv2-airwindows-36.0/src/YHighpass/YHighpass.c 1970-01-01 01:00:00.000000000 +0100 +++ new/lv2-airwindows-38.0/src/YHighpass/YHighpass.c 2026-06-10 22:27:01.000000000 +0200 @@ -0,0 +1,349 @@ +#include <lv2/core/lv2.h> + +#include <math.h> +#include <stdint.h> +#include <stdlib.h> + +#define M_PI 3.14159265358979323846264338327950288 + +#define YHIGHPASS_URI "https://hannesbraun.net/ns/lv2/airwindows/yhighpass" + +typedef enum { + INPUT_L = 0, + INPUT_R = 1, + OUTPUT_L = 2, + OUTPUT_R = 3, + GAIN = 4, + FREQ = 5, + RESON8 = 6, + RES_EDGE = 7, + OUTPUT = 8, + DRY_WET = 9 +} PortIndex; + +enum { + biq_freq, + biq_reso, + biq_a0, + biq_a1, + biq_a2, + biq_b1, + biq_b2, + biq_aA0, + biq_aA1, + biq_aA2, + biq_bA1, + biq_bA2, + biq_aB0, + biq_aB1, + biq_aB2, + biq_bB1, + biq_bB2, + biq_sL1, + biq_sL2, + biq_sR1, + biq_sR2, + biq_total +}; // coefficient interpolating biquad filter, stereo + +enum { + fix_freq, + fix_reso, + fix_a0, + fix_a1, + fix_a2, + fix_b1, + fix_b2, + fix_sL1, + fix_sL2, + fix_sR1, + fix_sR2, + fix_total +}; // fixed frequency biquad filter for ultrasonics, stereo + +typedef struct { + double sampleRate; + const float* input[2]; + float* output[2]; + const float* gain; + const float* freq; + const float* reson8; + const float* resEdge; + const float* outputGain; + const float* dryWet; + + double biquad[biq_total]; + + double powFactorA; + double powFactorB; + double inTrimA; + double inTrimB; + double outTrimA; + double outTrimB; + + double fixA[fix_total]; + double fixB[fix_total]; + + uint32_t fpdL; + uint32_t fpdR; +} YHighpass; + +static LV2_Handle instantiate( + const LV2_Descriptor* descriptor, + double rate, + const char* bundle_path, + const LV2_Feature* const* features) +{ + YHighpass* yHighpass = (YHighpass*) calloc(1, sizeof(YHighpass)); + yHighpass->sampleRate = rate; + return (LV2_Handle) yHighpass; +} + +static void connect_port(LV2_Handle instance, uint32_t port, void* data) +{ + YHighpass* yHighpass = (YHighpass*) instance; + + switch ((PortIndex) port) { + case INPUT_L: + yHighpass->input[0] = (const float*) data; + break; + case INPUT_R: + yHighpass->input[1] = (const float*) data; + break; + case OUTPUT_L: + yHighpass->output[0] = (float*) data; + break; + case OUTPUT_R: + yHighpass->output[1] = (float*) data; + break; + case GAIN: + yHighpass->gain = (const float*) data; + break; + case FREQ: + yHighpass->freq = (const float*) data; + break; + case RESON8: + yHighpass->reson8 = (const float*) data; + break; + case RES_EDGE: + yHighpass->resEdge = (const float*) data; + break; + case OUTPUT: + yHighpass->outputGain = (const float*) data; + break; + case DRY_WET: + yHighpass->dryWet = (const float*) data; + break; + } +} + +static void activate(LV2_Handle instance) +{ + YHighpass* yHighpass = (YHighpass*) instance; + for (int x = 0; x < biq_total; x++) { + yHighpass->biquad[x] = 0.0; + } + yHighpass->powFactorA = 1.0; + yHighpass->powFactorB = 1.0; + yHighpass->inTrimA = 0.1; + yHighpass->inTrimB = 0.1; + yHighpass->outTrimA = 1.0; + yHighpass->outTrimB = 1.0; + for (int x = 0; x < fix_total; x++) { + yHighpass->fixA[x] = 0.0; + yHighpass->fixB[x] = 0.0; + } + + yHighpass->fpdL = 1.0; + while (yHighpass->fpdL < 16386) yHighpass->fpdL = rand() * UINT32_MAX; + yHighpass->fpdR = 1.0; + while (yHighpass->fpdR < 16386) yHighpass->fpdR = rand() * UINT32_MAX; +} + +static void run(LV2_Handle instance, uint32_t sampleFrames) +{ + YHighpass* yHighpass = (YHighpass*) instance; + + const float* in1 = yHighpass->input[0]; + const float* in2 = yHighpass->input[1]; + float* out1 = yHighpass->output[0]; + float* out2 = yHighpass->output[1]; + + uint32_t inFramesToProcess = sampleFrames; + double overallscale = 1.0; + overallscale /= 44100.0; + overallscale *= yHighpass->sampleRate; + + yHighpass->inTrimA = yHighpass->inTrimB; + yHighpass->inTrimB = *yHighpass->gain * 10.0; + + yHighpass->biquad[biq_freq] = pow(*yHighpass->freq, 3) * 20000.0; + if (yHighpass->biquad[biq_freq] < 15.0) yHighpass->biquad[biq_freq] = 15.0; + yHighpass->biquad[biq_freq] /= yHighpass->sampleRate; + yHighpass->biquad[biq_reso] = (pow(*yHighpass->reson8, 2) * 15.0) + 0.5571; + yHighpass->biquad[biq_aA0] = yHighpass->biquad[biq_aB0]; + yHighpass->biquad[biq_aA1] = yHighpass->biquad[biq_aB1]; + yHighpass->biquad[biq_aA2] = yHighpass->biquad[biq_aB2]; + yHighpass->biquad[biq_bA1] = yHighpass->biquad[biq_bB1]; + yHighpass->biquad[biq_bA2] = yHighpass->biquad[biq_bB2]; + // previous run through the buffer is still in the filter, so we move it + // to the A section and now it's the new starting point. + double K = tan(M_PI * yHighpass->biquad[biq_freq]); + double norm = 1.0 / (1.0 + K / yHighpass->biquad[biq_reso] + K * K); + yHighpass->biquad[biq_aB0] = norm; + yHighpass->biquad[biq_aB1] = -2.0 * yHighpass->biquad[biq_aB0]; + yHighpass->biquad[biq_aB2] = yHighpass->biquad[biq_aB0]; + yHighpass->biquad[biq_bB1] = 2.0 * (K * K - 1.0) * norm; + yHighpass->biquad[biq_bB2] = (1.0 - K / yHighpass->biquad[biq_reso] + K * K) * norm; + // for the coefficient-interpolated biquad filter + + yHighpass->powFactorA = yHighpass->powFactorB; + yHighpass->powFactorB = pow(*yHighpass->resEdge + 0.9, 4); + + // 1.0 == target neutral + + yHighpass->outTrimA = yHighpass->outTrimB; + yHighpass->outTrimB = *yHighpass->outputGain; + + double wet = *yHighpass->dryWet; + + yHighpass->fixA[fix_freq] = yHighpass->fixB[fix_freq] = 20000.0 / yHighpass->sampleRate; + yHighpass->fixA[fix_reso] = yHighpass->fixB[fix_reso] = 0.7071; // butterworth Q + + K = tan(M_PI * yHighpass->fixA[fix_freq]); + norm = 1.0 / (1.0 + K / yHighpass->fixA[fix_reso] + K * K); + yHighpass->fixA[fix_a0] = yHighpass->fixB[fix_a0] = K * K * norm; + yHighpass->fixA[fix_a1] = yHighpass->fixB[fix_a1] = 2.0 * yHighpass->fixA[fix_a0]; + yHighpass->fixA[fix_a2] = yHighpass->fixB[fix_a2] = yHighpass->fixA[fix_a0]; + yHighpass->fixA[fix_b1] = yHighpass->fixB[fix_b1] = 2.0 * (K * K - 1.0) * norm; + yHighpass->fixA[fix_b2] = yHighpass->fixB[fix_b2] = (1.0 - K / yHighpass->fixA[fix_reso] + K * K) * norm; + // for the fixed-position biquad filter + + while (sampleFrames-- > 0) { + + double inputSampleL = *in1; + double inputSampleR = *in2; + if (fabs(inputSampleL) < 1.18e-23) inputSampleL = yHighpass->fpdL * 1.18e-17; + if (fabs(inputSampleR) < 1.18e-23) inputSampleR = yHighpass->fpdR * 1.18e-17; + double drySampleL = inputSampleL; + double drySampleR = inputSampleR; + + double temp = (double) sampleFrames / inFramesToProcess; + yHighpass->biquad[biq_a0] = (yHighpass->biquad[biq_aA0] * temp) + (yHighpass->biquad[biq_aB0] * (1.0 - temp)); + yHighpass->biquad[biq_a1] = (yHighpass->biquad[biq_aA1] * temp) + (yHighpass->biquad[biq_aB1] * (1.0 - temp)); + yHighpass->biquad[biq_a2] = (yHighpass->biquad[biq_aA2] * temp) + (yHighpass->biquad[biq_aB2] * (1.0 - temp)); + yHighpass->biquad[biq_b1] = (yHighpass->biquad[biq_bA1] * temp) + (yHighpass->biquad[biq_bB1] * (1.0 - temp)); + yHighpass->biquad[biq_b2] = (yHighpass->biquad[biq_bA2] * temp) + (yHighpass->biquad[biq_bB2] * (1.0 - temp)); + // this is the interpolation code for the biquad + double powFactor = (yHighpass->powFactorA * temp) + (yHighpass->powFactorB * (1.0 - temp)); + double inTrim = (yHighpass->inTrimA * temp) + (yHighpass->inTrimB * (1.0 - temp)); + double outTrim = (yHighpass->outTrimA * temp) + (yHighpass->outTrimB * (1.0 - temp)); + + inputSampleL *= inTrim; + inputSampleR *= inTrim; + + temp = (inputSampleL * yHighpass->fixA[fix_a0]) + yHighpass->fixA[fix_sL1]; + yHighpass->fixA[fix_sL1] = (inputSampleL * yHighpass->fixA[fix_a1]) - (temp * yHighpass->fixA[fix_b1]) + yHighpass->fixA[fix_sL2]; + yHighpass->fixA[fix_sL2] = (inputSampleL * yHighpass->fixA[fix_a2]) - (temp * yHighpass->fixA[fix_b2]); + inputSampleL = temp; // fixed biquad filtering ultrasonics + temp = (inputSampleR * yHighpass->fixA[fix_a0]) + yHighpass->fixA[fix_sR1]; + yHighpass->fixA[fix_sR1] = (inputSampleR * yHighpass->fixA[fix_a1]) - (temp * yHighpass->fixA[fix_b1]) + yHighpass->fixA[fix_sR2]; + yHighpass->fixA[fix_sR2] = (inputSampleR * yHighpass->fixA[fix_a2]) - (temp * yHighpass->fixA[fix_b2]); + inputSampleR = temp; // fixed biquad filtering ultrasonics + + // encode/decode courtesy of torridgristle under the MIT license + if (inputSampleL > 1.0) inputSampleL = 1.0; + else if (inputSampleL > 0.0) inputSampleL = 1.0 - pow(1.0 - inputSampleL, powFactor); + if (inputSampleL < -1.0) inputSampleL = -1.0; + else if (inputSampleL < 0.0) inputSampleL = -1.0 + pow(1.0 + inputSampleL, powFactor); + if (inputSampleR > 1.0) inputSampleR = 1.0; + else if (inputSampleR > 0.0) inputSampleR = 1.0 - pow(1.0 - inputSampleR, powFactor); + if (inputSampleR < -1.0) inputSampleR = -1.0; + else if (inputSampleR < 0.0) inputSampleR = -1.0 + pow(1.0 + inputSampleR, powFactor); + + temp = (inputSampleL * yHighpass->biquad[biq_a0]) + yHighpass->biquad[biq_sL1]; + yHighpass->biquad[biq_sL1] = (inputSampleL * yHighpass->biquad[biq_a1]) - (temp * yHighpass->biquad[biq_b1]) + yHighpass->biquad[biq_sL2]; + yHighpass->biquad[biq_sL2] = (inputSampleL * yHighpass->biquad[biq_a2]) - (temp * yHighpass->biquad[biq_b2]); + inputSampleL = temp; // coefficient interpolating biquad filter + temp = (inputSampleR * yHighpass->biquad[biq_a0]) + yHighpass->biquad[biq_sR1]; + yHighpass->biquad[biq_sR1] = (inputSampleR * yHighpass->biquad[biq_a1]) - (temp * yHighpass->biquad[biq_b1]) + yHighpass->biquad[biq_sR2]; + yHighpass->biquad[biq_sR2] = (inputSampleR * yHighpass->biquad[biq_a2]) - (temp * yHighpass->biquad[biq_b2]); + inputSampleR = temp; // coefficient interpolating biquad filter + + // encode/decode courtesy of torridgristle under the MIT license + if (inputSampleL > 1.0) inputSampleL = 1.0; + else if (inputSampleL > 0.0) inputSampleL = 1.0 - pow(1.0 - inputSampleL, (1.0 / powFactor)); + if (inputSampleL < -1.0) inputSampleL = -1.0; + else if (inputSampleL < 0.0) inputSampleL = -1.0 + pow(1.0 + inputSampleL, (1.0 / powFactor)); + if (inputSampleR > 1.0) inputSampleR = 1.0; + else if (inputSampleR > 0.0) inputSampleR = 1.0 - pow(1.0 - inputSampleR, (1.0 / powFactor)); + if (inputSampleR < -1.0) inputSampleR = -1.0; + else if (inputSampleR < 0.0) inputSampleR = -1.0 + pow(1.0 + inputSampleR, (1.0 / powFactor)); + + inputSampleL *= outTrim; + inputSampleR *= outTrim; + + temp = (inputSampleL * yHighpass->fixB[fix_a0]) + yHighpass->fixB[fix_sL1]; + yHighpass->fixB[fix_sL1] = (inputSampleL * yHighpass->fixB[fix_a1]) - (temp * yHighpass->fixB[fix_b1]) + yHighpass->fixB[fix_sL2]; + yHighpass->fixB[fix_sL2] = (inputSampleL * yHighpass->fixB[fix_a2]) - (temp * yHighpass->fixB[fix_b2]); + inputSampleL = temp; // fixed biquad filtering ultrasonics + temp = (inputSampleR * yHighpass->fixB[fix_a0]) + yHighpass->fixB[fix_sR1]; + yHighpass->fixB[fix_sR1] = (inputSampleR * yHighpass->fixB[fix_a1]) - (temp * yHighpass->fixB[fix_b1]) + yHighpass->fixB[fix_sR2]; + yHighpass->fixB[fix_sR2] = (inputSampleR * yHighpass->fixB[fix_a2]) - (temp * yHighpass->fixB[fix_b2]); + inputSampleR = temp; // fixed biquad filtering ultrasonics + + if (wet < 1.0) { + inputSampleL = (inputSampleL * wet) + (drySampleL * (1.0 - wet)); + inputSampleR = (inputSampleR * wet) + (drySampleR * (1.0 - wet)); + } + + // begin 32 bit stereo floating point dither + int expon; + frexpf((float) inputSampleL, &expon); + yHighpass->fpdL ^= yHighpass->fpdL << 13; + yHighpass->fpdL ^= yHighpass->fpdL >> 17; + yHighpass->fpdL ^= yHighpass->fpdL << 5; + inputSampleL += (((double) yHighpass->fpdL - (uint32_t) 0x7fffffff) * 5.5e-36l * pow(2, expon + 62)); + frexpf((float) inputSampleR, &expon); + yHighpass->fpdR ^= yHighpass->fpdR << 13; + yHighpass->fpdR ^= yHighpass->fpdR >> 17; + yHighpass->fpdR ^= yHighpass->fpdR << 5; + inputSampleR += (((double) yHighpass->fpdR - (uint32_t) 0x7fffffff) * 5.5e-36l * pow(2, expon + 62)); + // end 32 bit stereo floating point dither + + *out1 = (float) inputSampleL; + *out2 = (float) inputSampleR; + + in1++; + in2++; + out1++; + out2++; + } +} + +static void deactivate(LV2_Handle instance) {} + +static void cleanup(LV2_Handle instance) +{ + free(instance); +} + +static const void* extension_data(const char* uri) +{ + return NULL; +} + +static const LV2_Descriptor descriptor = { + YHIGHPASS_URI, + instantiate, + connect_port, + activate, + run, + deactivate, + cleanup, + extension_data}; + +LV2_SYMBOL_EXPORT const LV2_Descriptor* lv2_descriptor(uint32_t index) +{ + return index == 0 ? &descriptor : NULL; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lv2-airwindows-36.0/src/YHighpass/YHighpass.ttl new/lv2-airwindows-38.0/src/YHighpass/YHighpass.ttl --- old/lv2-airwindows-36.0/src/YHighpass/YHighpass.ttl 1970-01-01 01:00:00.000000000 +0100 +++ new/lv2-airwindows-38.0/src/YHighpass/YHighpass.ttl 2026-06-10 22:27:01.000000000 +0200 @@ -0,0 +1,107 @@ +@prefix doap: <http://usefulinc.com/ns/doap#> . +@prefix foaf: <http://xmlns.com/foaf/0.1/> . +@prefix lv2: <http://lv2plug.in/ns/lv2core#> . +@prefix pprops: <http://lv2plug.in/ns/ext/port-props#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . + +<https://hannesbraun.net/ns/lv2/airwindows/yhighpass> + a lv2:Plugin , + lv2:HighpassPlugin , + doap:Project ; + doap:name "YHighpass" ; + rdfs:comment "soft and smooth to nasty, edgy texture-varying filtering" ; + doap:license <https://opensource.org/licenses/MIT> ; + doap:maintainer [ + foaf:name "Hannes Braun" ; + foaf:homepage <https://hannesbraun.net/> + ] ; + + lv2:minorVersion 2 ; + lv2:microVersion 0 ; + + lv2:optionalFeature lv2:hardRTCapable ; + lv2:port [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "inL" ; + lv2:name "In L" + ] , [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 1 ; + lv2:symbol "inR" ; + lv2:name "In R" + ] , [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 2 ; + lv2:symbol "outL" ; + lv2:name "Out L" + ] , [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 3 ; + lv2:symbol "outR" ; + lv2:name "Out R" + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 4 ; + lv2:symbol "gain" ; + lv2:name "Gain" ; + lv2:default 0.1 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 5 ; + lv2:symbol "freq" ; + lv2:name "Freq" ; + lv2:default 0.5 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 6 ; + lv2:symbol "reson8" ; + lv2:name "Reson8" ; + lv2:default 0.1 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 7 ; + lv2:symbol "resEdge" ; + lv2:name "ResEdge" ; + lv2:default 0.1 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 8 ; + lv2:symbol "output" ; + lv2:name "Output" ; + lv2:default 1.0 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 9 ; + lv2:symbol "dryWet" ; + lv2:name "Dry/Wet" ; + lv2:default 1.0 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lv2-airwindows-36.0/src/YNotch/YNotch.c new/lv2-airwindows-38.0/src/YNotch/YNotch.c --- old/lv2-airwindows-36.0/src/YNotch/YNotch.c 1970-01-01 01:00:00.000000000 +0100 +++ new/lv2-airwindows-38.0/src/YNotch/YNotch.c 2026-06-10 22:27:01.000000000 +0200 @@ -0,0 +1,348 @@ +#include <lv2/core/lv2.h> + +#include <math.h> +#include <stdint.h> +#include <stdlib.h> + +#define M_PI 3.14159265358979323846264338327950288 + +#define YNOTCH_URI "https://hannesbraun.net/ns/lv2/airwindows/ynotch" + +typedef enum { + INPUT_L = 0, + INPUT_R = 1, + OUTPUT_L = 2, + OUTPUT_R = 3, + GAIN = 4, + FREQ = 5, + RESON8 = 6, + RES_EDGE = 7, + OUTPUT = 8, + DRY_WET = 9 +} PortIndex; + +enum { + biq_freq, + biq_reso, + biq_a0, + biq_a1, + biq_a2, + biq_b1, + biq_b2, + biq_aA0, + biq_aA1, + biq_aA2, + biq_bA1, + biq_bA2, + biq_aB0, + biq_aB1, + biq_aB2, + biq_bB1, + biq_bB2, + biq_sL1, + biq_sL2, + biq_sR1, + biq_sR2, + biq_total +}; // coefficient interpolating biquad filter, stereo + +enum { + fix_freq, + fix_reso, + fix_a0, + fix_a1, + fix_a2, + fix_b1, + fix_b2, + fix_sL1, + fix_sL2, + fix_sR1, + fix_sR2, + fix_total +}; // fixed frequency biquad filter for ultrasonics, stereo + +typedef struct { + double sampleRate; + const float* input[2]; + float* output[2]; + const float* gain; + const float* freq; + const float* reson8; + const float* resEdge; + const float* outputGain; + const float* dryWet; + + double biquad[biq_total]; + + double powFactorA; + double powFactorB; + double inTrimA; + double inTrimB; + double outTrimA; + double outTrimB; + + double fixA[fix_total]; + double fixB[fix_total]; + + uint32_t fpdL; + uint32_t fpdR; +} YNotch; + +static LV2_Handle instantiate( + const LV2_Descriptor* descriptor, + double rate, + const char* bundle_path, + const LV2_Feature* const* features) +{ + YNotch* yNotch = (YNotch*) calloc(1, sizeof(YNotch)); + yNotch->sampleRate = rate; + return (LV2_Handle) yNotch; +} + +static void connect_port(LV2_Handle instance, uint32_t port, void* data) +{ + YNotch* yNotch = (YNotch*) instance; + + switch ((PortIndex) port) { + case INPUT_L: + yNotch->input[0] = (const float*) data; + break; + case INPUT_R: + yNotch->input[1] = (const float*) data; + break; + case OUTPUT_L: + yNotch->output[0] = (float*) data; + break; + case OUTPUT_R: + yNotch->output[1] = (float*) data; + break; + case GAIN: + yNotch->gain = (const float*) data; + break; + case FREQ: + yNotch->freq = (const float*) data; + break; + case RESON8: + yNotch->reson8 = (const float*) data; + break; + case RES_EDGE: + yNotch->resEdge = (const float*) data; + break; + case OUTPUT: + yNotch->outputGain = (const float*) data; + break; + case DRY_WET: + yNotch->dryWet = (const float*) data; + break; + } +} + +static void activate(LV2_Handle instance) +{ + YNotch* yNotch = (YNotch*) instance; + for (int x = 0; x < biq_total; x++) { + yNotch->biquad[x] = 0.0; + } + yNotch->powFactorA = 1.0; + yNotch->powFactorB = 1.0; + yNotch->inTrimA = 0.1; + yNotch->inTrimB = 0.1; + yNotch->outTrimA = 1.0; + yNotch->outTrimB = 1.0; + for (int x = 0; x < fix_total; x++) { + yNotch->fixA[x] = 0.0; + yNotch->fixB[x] = 0.0; + } + + yNotch->fpdL = 1.0; + while (yNotch->fpdL < 16386) yNotch->fpdL = rand() * UINT32_MAX; + yNotch->fpdR = 1.0; + while (yNotch->fpdR < 16386) yNotch->fpdR = rand() * UINT32_MAX; +} + +static void run(LV2_Handle instance, uint32_t sampleFrames) +{ + YNotch* yNotch = (YNotch*) instance; + + const float* in1 = yNotch->input[0]; + const float* in2 = yNotch->input[1]; + float* out1 = yNotch->output[0]; + float* out2 = yNotch->output[1]; + + uint32_t inFramesToProcess = sampleFrames; + double overallscale = 1.0; + overallscale /= 44100.0; + overallscale *= yNotch->sampleRate; + + yNotch->inTrimA = yNotch->inTrimB; + yNotch->inTrimB = *yNotch->gain * 10.0; + + yNotch->biquad[biq_freq] = pow(*yNotch->freq, 3) * 20000.0; + if (yNotch->biquad[biq_freq] < 15.0) yNotch->biquad[biq_freq] = 15.0; + yNotch->biquad[biq_freq] /= yNotch->sampleRate; + yNotch->biquad[biq_reso] = (pow(*yNotch->reson8, 2) * 15.0) + 0.0001; + yNotch->biquad[biq_aA0] = yNotch->biquad[biq_aB0]; + yNotch->biquad[biq_aA1] = yNotch->biquad[biq_aB1]; + yNotch->biquad[biq_aA2] = yNotch->biquad[biq_aB2]; + yNotch->biquad[biq_bA1] = yNotch->biquad[biq_bB1]; + yNotch->biquad[biq_bA2] = yNotch->biquad[biq_bB2]; + // previous run through the buffer is still in the filter, so we move it + // to the A section and now it's the new starting point. + double K = tan(M_PI * yNotch->biquad[biq_freq]); + double norm = 1.0 / (1.0 + K / yNotch->biquad[biq_reso] + K * K); + yNotch->biquad[biq_aB0] = (1.0 + K * K) * norm; + yNotch->biquad[biq_aB1] = 2.0 * (K * K - 1) * norm; + yNotch->biquad[biq_aB2] = yNotch->biquad[biq_aB0]; + yNotch->biquad[biq_bB1] = yNotch->biquad[biq_aB1]; + yNotch->biquad[biq_bB2] = (1.0 - K / yNotch->biquad[biq_reso] + K * K) * norm; + // for the coefficient-interpolated biquad filter + + yNotch->powFactorA = yNotch->powFactorB; + yNotch->powFactorB = pow(*yNotch->resEdge + 0.9, 4); + + // 1.0 == target neutral + + yNotch->outTrimA = yNotch->outTrimB; + yNotch->outTrimB = *yNotch->outputGain; + + double wet = *yNotch->dryWet; + + yNotch->fixA[fix_freq] = yNotch->fixB[fix_freq] = 20000.0 / yNotch->sampleRate; + yNotch->fixA[fix_reso] = yNotch->fixB[fix_reso] = 0.7071; // butterworth Q + + K = tan(M_PI * yNotch->fixA[fix_freq]); + norm = 1.0 / (1.0 + K / yNotch->fixA[fix_reso] + K * K); + yNotch->fixA[fix_a0] = yNotch->fixB[fix_a0] = K * K * norm; + yNotch->fixA[fix_a1] = yNotch->fixB[fix_a1] = 2.0 * yNotch->fixA[fix_a0]; + yNotch->fixA[fix_a2] = yNotch->fixB[fix_a2] = yNotch->fixA[fix_a0]; + yNotch->fixA[fix_b1] = yNotch->fixB[fix_b1] = 2.0 * (K * K - 1.0) * norm; + yNotch->fixA[fix_b2] = yNotch->fixB[fix_b2] = (1.0 - K / yNotch->fixA[fix_reso] + K * K) * norm; + // for the fixed-position biquad filter + + while (sampleFrames-- > 0) { + double inputSampleL = *in1; + double inputSampleR = *in2; + if (fabs(inputSampleL) < 1.18e-23) inputSampleL = yNotch->fpdL * 1.18e-17; + if (fabs(inputSampleR) < 1.18e-23) inputSampleR = yNotch->fpdR * 1.18e-17; + double drySampleL = inputSampleL; + double drySampleR = inputSampleR; + + double temp = (double) sampleFrames / inFramesToProcess; + yNotch->biquad[biq_a0] = (yNotch->biquad[biq_aA0] * temp) + (yNotch->biquad[biq_aB0] * (1.0 - temp)); + yNotch->biquad[biq_a1] = (yNotch->biquad[biq_aA1] * temp) + (yNotch->biquad[biq_aB1] * (1.0 - temp)); + yNotch->biquad[biq_a2] = (yNotch->biquad[biq_aA2] * temp) + (yNotch->biquad[biq_aB2] * (1.0 - temp)); + yNotch->biquad[biq_b1] = (yNotch->biquad[biq_bA1] * temp) + (yNotch->biquad[biq_bB1] * (1.0 - temp)); + yNotch->biquad[biq_b2] = (yNotch->biquad[biq_bA2] * temp) + (yNotch->biquad[biq_bB2] * (1.0 - temp)); + // this is the interpolation code for the biquad + double powFactor = (yNotch->powFactorA * temp) + (yNotch->powFactorB * (1.0 - temp)); + double inTrim = (yNotch->inTrimA * temp) + (yNotch->inTrimB * (1.0 - temp)); + double outTrim = (yNotch->outTrimA * temp) + (yNotch->outTrimB * (1.0 - temp)); + + inputSampleL *= inTrim; + inputSampleR *= inTrim; + + temp = (inputSampleL * yNotch->fixA[fix_a0]) + yNotch->fixA[fix_sL1]; + yNotch->fixA[fix_sL1] = (inputSampleL * yNotch->fixA[fix_a1]) - (temp * yNotch->fixA[fix_b1]) + yNotch->fixA[fix_sL2]; + yNotch->fixA[fix_sL2] = (inputSampleL * yNotch->fixA[fix_a2]) - (temp * yNotch->fixA[fix_b2]); + inputSampleL = temp; // fixed biquad filtering ultrasonics + temp = (inputSampleR * yNotch->fixA[fix_a0]) + yNotch->fixA[fix_sR1]; + yNotch->fixA[fix_sR1] = (inputSampleR * yNotch->fixA[fix_a1]) - (temp * yNotch->fixA[fix_b1]) + yNotch->fixA[fix_sR2]; + yNotch->fixA[fix_sR2] = (inputSampleR * yNotch->fixA[fix_a2]) - (temp * yNotch->fixA[fix_b2]); + inputSampleR = temp; // fixed biquad filtering ultrasonics + + // encode/decode courtesy of torridgristle under the MIT license + if (inputSampleL > 1.0) inputSampleL = 1.0; + else if (inputSampleL > 0.0) inputSampleL = 1.0 - pow(1.0 - inputSampleL, powFactor); + if (inputSampleL < -1.0) inputSampleL = -1.0; + else if (inputSampleL < 0.0) inputSampleL = -1.0 + pow(1.0 + inputSampleL, powFactor); + if (inputSampleR > 1.0) inputSampleR = 1.0; + else if (inputSampleR > 0.0) inputSampleR = 1.0 - pow(1.0 - inputSampleR, powFactor); + if (inputSampleR < -1.0) inputSampleR = -1.0; + else if (inputSampleR < 0.0) inputSampleR = -1.0 + pow(1.0 + inputSampleR, powFactor); + + temp = (inputSampleL * yNotch->biquad[biq_a0]) + yNotch->biquad[biq_sL1]; + yNotch->biquad[biq_sL1] = (inputSampleL * yNotch->biquad[biq_a1]) - (temp * yNotch->biquad[biq_b1]) + yNotch->biquad[biq_sL2]; + yNotch->biquad[biq_sL2] = (inputSampleL * yNotch->biquad[biq_a2]) - (temp * yNotch->biquad[biq_b2]); + inputSampleL = temp; // coefficient interpolating biquad filter + temp = (inputSampleR * yNotch->biquad[biq_a0]) + yNotch->biquad[biq_sR1]; + yNotch->biquad[biq_sR1] = (inputSampleR * yNotch->biquad[biq_a1]) - (temp * yNotch->biquad[biq_b1]) + yNotch->biquad[biq_sR2]; + yNotch->biquad[biq_sR2] = (inputSampleR * yNotch->biquad[biq_a2]) - (temp * yNotch->biquad[biq_b2]); + inputSampleR = temp; // coefficient interpolating biquad filter + + // encode/decode courtesy of torridgristle under the MIT license + if (inputSampleL > 1.0) inputSampleL = 1.0; + else if (inputSampleL > 0.0) inputSampleL = 1.0 - pow(1.0 - inputSampleL, (1.0 / powFactor)); + if (inputSampleL < -1.0) inputSampleL = -1.0; + else if (inputSampleL < 0.0) inputSampleL = -1.0 + pow(1.0 + inputSampleL, (1.0 / powFactor)); + if (inputSampleR > 1.0) inputSampleR = 1.0; + else if (inputSampleR > 0.0) inputSampleR = 1.0 - pow(1.0 - inputSampleR, (1.0 / powFactor)); + if (inputSampleR < -1.0) inputSampleR = -1.0; + else if (inputSampleR < 0.0) inputSampleR = -1.0 + pow(1.0 + inputSampleR, (1.0 / powFactor)); + + inputSampleL *= outTrim; + inputSampleR *= outTrim; + + temp = (inputSampleL * yNotch->fixB[fix_a0]) + yNotch->fixB[fix_sL1]; + yNotch->fixB[fix_sL1] = (inputSampleL * yNotch->fixB[fix_a1]) - (temp * yNotch->fixB[fix_b1]) + yNotch->fixB[fix_sL2]; + yNotch->fixB[fix_sL2] = (inputSampleL * yNotch->fixB[fix_a2]) - (temp * yNotch->fixB[fix_b2]); + inputSampleL = temp; // fixed biquad filtering ultrasonics + temp = (inputSampleR * yNotch->fixB[fix_a0]) + yNotch->fixB[fix_sR1]; + yNotch->fixB[fix_sR1] = (inputSampleR * yNotch->fixB[fix_a1]) - (temp * yNotch->fixB[fix_b1]) + yNotch->fixB[fix_sR2]; + yNotch->fixB[fix_sR2] = (inputSampleR * yNotch->fixB[fix_a2]) - (temp * yNotch->fixB[fix_b2]); + inputSampleR = temp; // fixed biquad filtering ultrasonics + + if (wet < 1.0) { + inputSampleL = (inputSampleL * wet) + (drySampleL * (1.0 - wet)); + inputSampleR = (inputSampleR * wet) + (drySampleR * (1.0 - wet)); + } + + // begin 32 bit stereo floating point dither + int expon; + frexpf((float) inputSampleL, &expon); + yNotch->fpdL ^= yNotch->fpdL << 13; + yNotch->fpdL ^= yNotch->fpdL >> 17; + yNotch->fpdL ^= yNotch->fpdL << 5; + inputSampleL += (((double) yNotch->fpdL - (uint32_t) 0x7fffffff) * 5.5e-36l * pow(2, expon + 62)); + frexpf((float) inputSampleR, &expon); + yNotch->fpdR ^= yNotch->fpdR << 13; + yNotch->fpdR ^= yNotch->fpdR >> 17; + yNotch->fpdR ^= yNotch->fpdR << 5; + inputSampleR += (((double) yNotch->fpdR - (uint32_t) 0x7fffffff) * 5.5e-36l * pow(2, expon + 62)); + // end 32 bit stereo floating point dither + + *out1 = (float) inputSampleL; + *out2 = (float) inputSampleR; + + in1++; + in2++; + out1++; + out2++; + } +} + +static void deactivate(LV2_Handle instance) {} + +static void cleanup(LV2_Handle instance) +{ + free(instance); +} + +static const void* extension_data(const char* uri) +{ + return NULL; +} + +static const LV2_Descriptor descriptor = { + YNOTCH_URI, + instantiate, + connect_port, + activate, + run, + deactivate, + cleanup, + extension_data}; + +LV2_SYMBOL_EXPORT const LV2_Descriptor* lv2_descriptor(uint32_t index) +{ + return index == 0 ? &descriptor : NULL; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lv2-airwindows-36.0/src/YNotch/YNotch.ttl new/lv2-airwindows-38.0/src/YNotch/YNotch.ttl --- old/lv2-airwindows-36.0/src/YNotch/YNotch.ttl 1970-01-01 01:00:00.000000000 +0100 +++ new/lv2-airwindows-38.0/src/YNotch/YNotch.ttl 2026-06-10 22:27:01.000000000 +0200 @@ -0,0 +1,107 @@ +@prefix doap: <http://usefulinc.com/ns/doap#> . +@prefix foaf: <http://xmlns.com/foaf/0.1/> . +@prefix lv2: <http://lv2plug.in/ns/lv2core#> . +@prefix pprops: <http://lv2plug.in/ns/ext/port-props#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . + +<https://hannesbraun.net/ns/lv2/airwindows/ynotch> + a lv2:Plugin , + lv2:EQPlugin , + doap:Project ; + doap:name "YNotch" ; + rdfs:comment "soft and smooth to nasty, edgy texture-varying filtering" ; + doap:license <https://opensource.org/licenses/MIT> ; + doap:maintainer [ + foaf:name "Hannes Braun" ; + foaf:homepage <https://hannesbraun.net/> + ] ; + + lv2:minorVersion 2 ; + lv2:microVersion 0 ; + + lv2:optionalFeature lv2:hardRTCapable ; + lv2:port [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 0 ; + lv2:symbol "inL" ; + lv2:name "In L" + ] , [ + a lv2:AudioPort , + lv2:InputPort ; + lv2:index 1 ; + lv2:symbol "inR" ; + lv2:name "In R" + ] , [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 2 ; + lv2:symbol "outL" ; + lv2:name "Out L" + ] , [ + a lv2:AudioPort , + lv2:OutputPort ; + lv2:index 3 ; + lv2:symbol "outR" ; + lv2:name "Out R" + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 4 ; + lv2:symbol "gain" ; + lv2:name "Gain" ; + lv2:default 0.1 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 5 ; + lv2:symbol "freq" ; + lv2:name "Freq" ; + lv2:default 0.5 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 6 ; + lv2:symbol "reson8" ; + lv2:name "Reson8" ; + lv2:default 0.1 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 7 ; + lv2:symbol "resEdge" ; + lv2:name "ResEdge" ; + lv2:default 0.1 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 8 ; + lv2:symbol "output" ; + lv2:name "Output" ; + lv2:default 1.0 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] , [ + a lv2:ControlPort , + lv2:InputPort ; + lv2:index 9 ; + lv2:symbol "dryWet" ; + lv2:name "Dry/Wet" ; + lv2:default 1.0 ; + lv2:minimum 0.0 ; + lv2:maximum 1.0 ; + lv2:portProperty pprops:hasStrictBounds + ] . diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lv2-airwindows-36.0/src/manifest.ttl.in new/lv2-airwindows-38.0/src/manifest.ttl.in --- old/lv2-airwindows-36.0/src/manifest.ttl.in 2026-03-24 17:39:38.000000000 +0100 +++ new/lv2-airwindows-38.0/src/manifest.ttl.in 2026-06-10 22:27:01.000000000 +0200 @@ -46,6 +46,11 @@ lv2:binary <Air4@CMAKE_SHARED_LIBRARY_SUFFIX@> ; rdfs:seeAlso <Air4.ttl> . +<https://hannesbraun.net/ns/lv2/airwindows/balanced> + a lv2:Plugin ; + lv2:binary <Balanced@CMAKE_SHARED_LIBRARY_SUFFIX@> ; + rdfs:seeAlso <Balanced.ttl> . + <https://hannesbraun.net/ns/lv2/airwindows/bassamp> a lv2:Plugin ; lv2:binary <BassAmp@CMAKE_SHARED_LIBRARY_SUFFIX@> ; @@ -861,11 +866,21 @@ lv2:binary <YBandpass@CMAKE_SHARED_LIBRARY_SUFFIX@> ; rdfs:seeAlso <YBandpass.ttl> . +<https://hannesbraun.net/ns/lv2/airwindows/yhighpass> + a lv2:Plugin ; + lv2:binary <YHighpass@CMAKE_SHARED_LIBRARY_SUFFIX@> ; + rdfs:seeAlso <YHighpass.ttl> . + <https://hannesbraun.net/ns/lv2/airwindows/ylowpass> a lv2:Plugin ; lv2:binary <YLowpass@CMAKE_SHARED_LIBRARY_SUFFIX@> ; rdfs:seeAlso <YLowpass.ttl> . +<https://hannesbraun.net/ns/lv2/airwindows/ynotch> + a lv2:Plugin ; + lv2:binary <YNotch@CMAKE_SHARED_LIBRARY_SUFFIX@> ; + rdfs:seeAlso <YNotch.ttl> . + <https://hannesbraun.net/ns/lv2/airwindows/zoutputstage> a lv2:Plugin ; lv2:binary <ZOutputStage@CMAKE_SHARED_LIBRARY_SUFFIX@> ; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lv2-airwindows-36.0/substitute.zig new/lv2-airwindows-38.0/substitute.zig --- old/lv2-airwindows-36.0/substitute.zig 2026-03-24 17:39:38.000000000 +0100 +++ new/lv2-airwindows-38.0/substitute.zig 2026-06-10 22:27:01.000000000 +0200 @@ -1,24 +1,21 @@ const std = @import("std"); -pub fn main() !void { - var debug_allocator = std.heap.DebugAllocator(.{}).init; - defer _ = debug_allocator.deinit(); - const allocator = debug_allocator.allocator(); +pub fn main(init: std.process.Init) !void { + const argv = try init.minimal.args.toSlice(init.arena.allocator()); + const input_path = argv[1]; + var buffer = try std.Io.Dir.cwd().readFileAlloc(init.io, input_path, init.gpa, .unlimited); - const input_path = std.os.argv[1]; - var buffer = try std.fs.cwd().readFileAlloc(allocator, std.mem.span(input_path), 100000000); - - for (0..((std.os.argv.len - 2) / 2)) |i| { + for (0..((argv.len - 2) / 2)) |i| { const a = 2 + 2 * i; const b = 2 + 2 * i + 1; - errdefer allocator.free(buffer); - const tmp = try std.mem.replaceOwned(u8, allocator, buffer, std.mem.span(std.os.argv[a]), std.mem.span(std.os.argv[b])); - allocator.free(buffer); + errdefer init.gpa.free(buffer); + const tmp = try std.mem.replaceOwned(u8, init.gpa, buffer, argv[a], argv[b]); + init.gpa.free(buffer); buffer = tmp; } - defer allocator.free(buffer); + defer init.gpa.free(buffer); - var stdout_writer = std.fs.File.stdout().writer(&.{}); + var stdout_writer = std.Io.File.stdout().writer(init.io, &.{}); const stdout = &stdout_writer.interface; try stdout.writeAll(buffer);
