From 5a0e6934e774e9b636c1cfe79043de1bf2aeb384 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 25 Jan 2020 22:45:37 -0300 Subject: [PATCH 1/3] add dyncomp cmd --- doc/README.md | 13 +++++++++++++ examples/degrade.scri | 9 ++++++--- src/lang.zig | 2 ++ src/printer.zig | 1 + src/runner.zig | 21 +++++++++++++++++++++ 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/doc/README.md b/doc/README.md index bb312ee..40d9976 100644 --- a/doc/README.md +++ b/doc/README.md @@ -245,3 +245,16 @@ other presets: - dry: 0..1, default 0 - carrier: 0..1, default 0 - quality: 0..1, default 1 + +## `dyncomp split index enable hold inputgain threshold ratio attack release gain_min gain_max rms` + + - enable (bool): 0..1, default 1 + - hold (bool): 0..1, default 0 + - inputgain (dB): -10..30, default 0 + - threshold (dB): -50..-10, default -30 + - ratio (???): 0..1, default 0 + - attack (seconds): 0.001..0.1, default 0.01 + - release (seconds): 0.03..3.0, default 0.3 + - gain\_min (dB): -20..40 + - gain\_max (dB): -20..40 + - rms (signal level, dB): -80..10 diff --git a/examples/degrade.scri b/examples/degrade.scri index ccd1a2c..09c04c0 100644 --- a/examples/degrade.scri +++ b/examples/degrade.scri @@ -1,5 +1,8 @@ load :0; -degrade 5 1 0.8 0.5 0.65 0.9 0.58 0.5; -degrade 5 2 0.1 1 0.65 0.5 0.5 0.4; -degrade 5 3 0.1 1 0.65 0.9 0.58 0.5; +degrade 8 1 0.8 0.5 0.65 0.9 0.58 0.5; +degrade 8 2 0.1 1 0.65 0.5 0.5 0.4; +degrade 8 3 0.1 1 0.65 0.9 0.58 0.5; +degrade 8 4 0 1 1 0 0 1; +degrade 8 5 0 1 1 0 0 0; +degrade 8 6 0 0 0 0 0 0; quicksave; diff --git a/src/lang.zig b/src/lang.zig index 1ade59c..02ce56a 100644 --- a/src/lang.zig +++ b/src/lang.zig @@ -32,6 +32,7 @@ pub const CommandType = enum { Degrade, RePsycho, TalkBox, + DynComp, Noise, WildNoise, @@ -202,6 +203,7 @@ pub const Lang = struct { _ = try self.keywords.put("embed", .Embed); _ = try self.keywords.put("degrade", .Degrade); _ = try self.keywords.put("repsycho", .RePsycho); + _ = try self.keywords.put("dyncomp", .RePsycho); // even more custom _ = try self.keywords.put("rotate", .Rotate); diff --git a/src/printer.zig b/src/printer.zig index d685979..3d7a72b 100644 --- a/src/printer.zig +++ b/src/printer.zig @@ -26,6 +26,7 @@ pub fn printList(list: langs.CommandList, stream: var) !void { .Degrade => "Degrade", .RePsycho => "repsycho", .TalkBox => "talkbox", + .DynComp => "dyncomp", .Noise => "noise", .WildNoise => "wildnoise", diff --git a/src/runner.zig b/src/runner.zig index 86f6e06..34c77a1 100644 --- a/src/runner.zig +++ b/src/runner.zig @@ -324,6 +324,11 @@ pub const Runner = struct { try image.runPlugin("http://drobilla.net/plugins/mda/TalkBox", pos, params); } + fn dynCompCmd(self: *Runner, pos: Position, params: ParamList) !void { + var image = try self.getImage(); + try image.runPlugin("http://gareus.org/oss/lv2/darc#mono", pos, params); + } + fn runCommand(self: *Runner, cmd: *lang.Command) !void { var params = ParamList.init(self.allocator); defer params.deinit(); @@ -566,6 +571,22 @@ pub const Runner = struct { try cmd.appendParam(¶ms, "quality"); try self.talkboxCmd(pos, params); }, + + .DynComp => { + const pos = try cmd.consumePosition(); + try cmd.appendParam(¶ms, "enable"); + try cmd.appendParam(¶ms, "hold"); + try cmd.appendParam(¶ms, "inputgain"); + try cmd.appendParam(¶ms, "threshold"); + try cmd.appendParam(¶ms, "ratio"); + try cmd.appendParam(¶ms, "attack"); + try cmd.appendParam(¶ms, "release"); + try cmd.appendParam(¶ms, "gain_min"); + try cmd.appendParam(¶ms, "gain_max"); + try cmd.appendParam(¶ms, "rms"); + try self.dynCompCmd(pos, params); + }, + else => blk: { std.debug.warn("Unsupported command: {}\n", .{cmd.command}); break :blk RunError.UnknownCommand; From 519eb51206036098d8e63e62735b003efccaa0a5 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 25 Jan 2020 22:46:00 -0300 Subject: [PATCH 2/3] remove heap allocation for RunBuffers --- src/image.zig | 27 ++++++++++++++++----------- src/plugin.zig | 46 ++++++++++++++++------------------------------ 2 files changed, 32 insertions(+), 41 deletions(-) diff --git a/src/image.zig b/src/image.zig index ad48f61..9541070 100644 --- a/src/image.zig +++ b/src/image.zig @@ -370,18 +370,25 @@ pub const Image = struct { var i: usize = seek_pos.start; std.debug.warn("\tseek pos start: {} end: {}\n", .{ seek_pos.start, seek_pos.end }); - var inbuf = rctx.buffers.in; - var outbuf = rctx.buffers.out; + var inbuf = &rctx.buffers.in; + var outbuf = &rctx.buffers.out; while (i <= seek_pos.end) : (i += 1) { - const read_bytes = c.sf_readf_float(self.sndfile, inbuf.ptr, 1); + inbuf[0] = 0; + inbuf[1] = 0; + + const read_bytes = c.sf_readf_float(self.sndfile, inbuf, 1); if (read_bytes == 0) { std.debug.warn("WARN! reached EOF at idx={}\n", .{i}); break; } + // trick plugins into having correct stereo signal from + // my mono input + inbuf[1] = inbuf[0]; + lv2.lilv_instance_run(rctx.instance, 1); - try swrite(out_file, outbuf.ptr, 1); + try swrite(out_file, outbuf, 1); } sseek(self.sndfile, seek_pos.end); @@ -439,9 +446,7 @@ pub const Image = struct { var out_fmt = mkSfInfo(); var out_file = try sopen(self.allocator, tmpnam, c.SFM_WRITE, &out_fmt); - var bufs = try plugins.RunBuffers.init(self.allocator); - defer bufs.deinit(); - + var bufs = plugins.RunBuffers{}; const seek_pos = self.getSeekPos(position); // make sure we start from 0 @@ -465,18 +470,18 @@ pub const Image = struct { var i: usize = seek_pos.start; std.debug.warn("\tseek pos start: {} end: {}\n", .{ seek_pos.start, seek_pos.end }); - var inbuf = bufs.in; - var outbuf = bufs.out; + var inbuf = &bufs.in; + var outbuf = &bufs.out; while (i <= seek_pos.end) : (i += 1) { - const read_bytes = c.sf_readf_float(self.sndfile, bufs.in.ptr, 1); + const read_bytes = c.sf_readf_float(self.sndfile, inbuf, 1); if (read_bytes == 0) { std.debug.warn("WARN! reached EOF at idx={}\n", .{i}); break; } plugin.run(&bufs); - try swrite(out_file, bufs.out.ptr, 1); + try swrite(out_file, outbuf, 1); } sseek(self.sndfile, seek_pos.end); diff --git a/src/plugin.zig b/src/plugin.zig index 6c98336..b979833 100644 --- a/src/plugin.zig +++ b/src/plugin.zig @@ -61,29 +61,11 @@ pub const Context = struct { /// Specific run context for non-plugins. pub const RunBuffers = struct { - allocator: *std.mem.Allocator, - - in: []f32, - out: []f32, - - pub fn init(allocator: *std.mem.Allocator) !RunBuffers { - // we allocate []f32 with size 2 to account for stereo plugins, however - // we only use &in_buf[0] and &out_buf[0], and don't use the - // (supposedly) right side of neither input or output. - var in_buf = try allocator.alloc(f32, 2); - std.mem.secureZero(f32, in_buf); - - return RunBuffers{ - .allocator = allocator, - .in = in_buf, - .out = try allocator.alloc(f32, 2), - }; - } - - pub fn deinit(self: *RunBuffers) void { - self.allocator.free(self.in); - self.allocator.free(self.out); - } + // we use [2]f32 to account for stereo plugins, however + // we only use in_buf[0] and out_buf[0], and don't use the + // (supposedly) right side of neither input or output. + in: [2]f32 = [_]f32{0} ** 2, + out: [2]f32 = [_]f32{0} ** 2, }; /// Represents the specific run context of plugin instantation. @@ -103,23 +85,19 @@ pub const RunContext = struct { } return RunContext{ - .buffers = try RunBuffers.init(allocator), + .buffers = RunBuffers{}, .instance = instance.?, }; } pub fn deinit(self: *RunContext) void { c.lilv_instance_free(self.instance); - self.buffers.deinit(); } pub fn connectPorts(self: *RunContext, ports: []lv2.Port) void { var i: usize = 0; var o: usize = 0; - var in_buf = self.buffers.in; - var out_buf = self.buffers.out; - for (ports) |_, p_idx| { var p = @intCast(u32, p_idx); var port: *lv2.Port = &ports[p_idx]; @@ -128,10 +106,18 @@ pub const RunContext = struct { .Control => lv2.lilv_instance_connect_port(self.instance, p, &port.value), .Audio => blk: { if (port.is_input) { - lv2.lilv_instance_connect_port(self.instance, p, &in_buf[i]); + lv2.lilv_instance_connect_port( + self.instance, + p, + &self.buffers.in[i], + ); i += 1; } else { - lv2.lilv_instance_connect_port(self.instance, p, &out_buf[o]); + lv2.lilv_instance_connect_port( + self.instance, + p, + &self.buffers.out[o], + ); o += 1; } }, From 046e43a68c5d3b83ec3803ee293927a1aefedc4b Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 25 Jan 2020 22:46:15 -0300 Subject: [PATCH 3/3] add dyncomp example file --- examples/dyncomp.scri | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 examples/dyncomp.scri diff --git a/examples/dyncomp.scri b/examples/dyncomp.scri new file mode 100644 index 0000000..d1d9e7b --- /dev/null +++ b/examples/dyncomp.scri @@ -0,0 +1,3 @@ +load :0; +dyncomp 3 1 1 0 0 -30 0 0.01 0.3 0 0 0; +quicksave;