Compare commits

..

3 commits

Author SHA1 Message Date
387984bff1 call sf_seek before main plugin loop 2019-07-11 10:57:39 -03:00
107a00593a do larger copies for safety reasons 2019-07-11 10:51:00 -03:00
b9160adad2 add delay cmd 2019-07-11 10:20:09 -03:00
5 changed files with 50 additions and 5 deletions

View file

@ -100,9 +100,23 @@ Run the Early Reflection Reverb from the Invada Studio plugins.
Run the High Pass Filter from the Invada Studio plugins. Run the High Pass Filter from the Invada Studio plugins.
Parameters: Parameters:
- `freq`: Frequency. 20-20000, default 1000 - `freq`: Frequency. 20..20000, default 1000
- `gain`: Gain, 0-12, default 0 - `gain`: Gain, 0..12, default 0
- `noClip`: Soft Clip (assumed boolean), 0-1, default 0 - `noClip`: Soft Clip (assumed boolean), 0..1, default 0
## `delay seed gain`
Parameters:
- `seed`: Random seed, 0..1000, default 0
- `gain`: Input gain (dB), -96..24, default 0
- `feedback_pc`: Feedback (%), 0..100, default 0
- `tap_count`: Number of taps, 2..128, default 2
- `first_delay`: First delay (s), 0..5, default 0
- `delay_range`: Delay range (s), 0..6, default 6
- `delay_scale`: Delay change, 0..5, default 1
- `delay_rand_pc`: Delay random (%), 0..100, default 0
- `gain_scale`: Amplitude change, 0.2..5, default 1
- `wet`: Dry/wet mix, 0..1, default 1
## TODO `echo split index delay` ## TODO `echo split index delay`

3
examples/delay.scri Normal file
View file

@ -0,0 +1,3 @@
load :0;
delay 3 1 0 0 0 2 0 6 1 0 1 1;
quicksave;

View file

@ -284,9 +284,11 @@ pub const Image = struct {
out_file, out_file,
file_copy_buf, file_copy_buf,
usize(0), usize(0),
seek_pos.start - 1, seek_pos.start + @mod(seek_pos.start, BufferSize),
); );
_ = c.sf_seek(self.sndfile, @intCast(i64, seek_pos.start), c.SEEK_SET);
var i: usize = seek_pos.start; var i: usize = seek_pos.start;
std.debug.warn("\tseek pos start: {} end: {}\n", seek_pos.start, seek_pos.end); std.debug.warn("\tseek pos start: {} end: {}\n", seek_pos.start, seek_pos.end);
@ -301,12 +303,14 @@ pub const Image = struct {
try swrite(out_file, rctx.out_buf.ptr, 1); try swrite(out_file, rctx.out_buf.ptr, 1);
} }
_ = c.sf_seek(self.sndfile, @intCast(i64, seek_pos.end), c.SEEK_SET);
// post-plugin copy // post-plugin copy
try self.copyBytes( try self.copyBytes(
out_file, out_file,
file_copy_buf, file_copy_buf,
seek_pos.end + 1, seek_pos.end + 1,
file_end, file_end + @mod(file_end, BufferSize),
); );
c.sf_write_sync(out_file); c.sf_write_sync(out_file);

View file

@ -23,6 +23,7 @@ pub const CommandType = enum {
PitchScaler, PitchScaler,
Reverb, Reverb,
Highpass, Highpass,
Delay,
}; };
pub const Command = struct { pub const Command = struct {
@ -137,6 +138,7 @@ pub const Lang = struct {
_ = try self.keywords.put("pitchscaler", .PitchScaler); _ = try self.keywords.put("pitchscaler", .PitchScaler);
_ = try self.keywords.put("reverb", .Reverb); _ = try self.keywords.put("reverb", .Reverb);
_ = try self.keywords.put("highpass", .Highpass); _ = try self.keywords.put("highpass", .Highpass);
_ = try self.keywords.put("delay", .Delay);
} }
pub fn parse(self: *Lang, data: []const u8) !CommandList { pub fn parse(self: *Lang, data: []const u8) !CommandList {

View file

@ -230,6 +230,11 @@ pub const Runner = struct {
try image.runPlugin("http://invadarecords.com/plugins/lv2/filter/hpf/mono", pos, params); try image.runPlugin("http://invadarecords.com/plugins/lv2/filter/hpf/mono", pos, params);
} }
fn delayCmd(self: *Runner, pos: Position, params: ParamList) !void {
var image = try self.getImage();
try image.runPlugin("http://plugin.org.uk/swh-plugins/delayorama", pos, params);
}
fn runCommand(self: *Runner, cmd: *lang.Command) !void { fn runCommand(self: *Runner, cmd: *lang.Command) !void {
var params = ParamList.init(self.allocator); var params = ParamList.init(self.allocator);
defer params.deinit(); defer params.deinit();
@ -328,6 +333,23 @@ pub const Runner = struct {
try self.highpassCmd(pos, params); try self.highpassCmd(pos, params);
}, },
.Delay => blk: {
const pos = try cmd.consumePosition();
try cmd.appendParam(&params, "seed");
try cmd.appendParam(&params, "gain");
try cmd.appendParam(&params, "feedback_pc");
try cmd.appendParam(&params, "tap_count");
try cmd.appendParam(&params, "first_delay");
try cmd.appendParam(&params, "delay_range");
try cmd.appendParam(&params, "delay_scale");
try cmd.appendParam(&params, "delay_rand_pc");
try cmd.appendParam(&params, "gain_scale");
try cmd.appendParam(&params, "wet");
try self.delayCmd(pos, params);
},
else => blk: { else => blk: {
std.debug.warn("Unsupported command: {}\n", cmd.command); std.debug.warn("Unsupported command: {}\n", cmd.command);
break :blk RunError.UnknownCommand; break :blk RunError.UnknownCommand;