Compare commits
3 commits
7dae50b030
...
046e43a68c
Author | SHA1 | Date | |
---|---|---|---|
046e43a68c | |||
519eb51206 | |||
5a0e6934e7 |
8 changed files with 78 additions and 44 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
3
examples/dyncomp.scri
Normal file
3
examples/dyncomp.scri
Normal file
|
@ -0,0 +1,3 @@
|
|||
load :0;
|
||||
dyncomp 3 1 1 0 0 -30 0 0.01 0.3 0 0 0;
|
||||
quicksave;
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
},
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue