From bc8ab986898a16068180f44206e08d6f17402e90 Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 26 Jan 2020 14:03:01 -0300 Subject: [PATCH 1/2] add multichorus cmd --- README.md | 1 + doc/README.md | 22 +++++++++++++++++++++- examples/multichorus.scri | 3 +++ src/lang.zig | 2 ++ src/printer.zig | 1 + src/runner.zig | 25 +++++++++++++++++++++++++ 6 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 examples/multichorus.scri diff --git a/README.md b/README.md index 6abf427..dba4162 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ glitch art "framework", ???????? language??? something? - the Invada Studio plugins ( https://launchpad.net/invada-studio/ ) - abGate plugin - MDA plugins + - Calf plugins ```bash # build and install diff --git a/doc/README.md b/doc/README.md index d0509c0..8ae3743 100644 --- a/doc/README.md +++ b/doc/README.md @@ -312,8 +312,28 @@ GVerb algorithm from SWH plugins. - t4d (tap 4 distance, inches): 0..4, default 3 - t4a\_db (tap 4 level, dB): -90..0, default -90 -## `moddelay split index` +## `moddelay split index base` > A delay whose tap can be modulated at audio rate. - base (base delay, seconds): 0..1, default 1 + +## `multichorus split index min_delay mod_depth mod_rate stereo voices vphase amount dry freq freq2 q overlap level_in level_out lfo` + +Calf Multi Chorus + + - `min_delay` (ms): 0.1..10, default 5 + - `mod_depth` (ms): 0.1..10, default 6 + - `mod_rate` (hz): 0.1..20, default 0.1 + - `stereo` (degrees): 0..360, default 180 + - `voices`: 1..8, default 4 + - `vphase` (inter-voice phase, degrees): 0..360, default 64 + - `amount`: 0..4, default 0.5 + - `dry`: 0..4, default 0.5 + - `freq` (center frq 1, hz): 10..20000, default 100 + - `freq2` (center frq 2, hz): 10..20000, default 5000 + - `q` (???): 0.125..8, default 0.125 + - `overlap`: 0..1, default 0.75 + - `level_in` (Input Gain): 0.0156250..64, default 1 + - `level_out` (Output Gain): 0.0156250..64, default 1 + - `lfo` (toggle): 0..1, default 1 diff --git a/examples/multichorus.scri b/examples/multichorus.scri new file mode 100644 index 0000000..2355d16 --- /dev/null +++ b/examples/multichorus.scri @@ -0,0 +1,3 @@ +load :0; +multichorus 3 1 5 6 0.1 180 4 64 0.5 0.5 100 5000 0.125 0.75 1 1 1; +quicksave; diff --git a/src/lang.zig b/src/lang.zig index ae3e8cd..b652617 100644 --- a/src/lang.zig +++ b/src/lang.zig @@ -39,6 +39,7 @@ pub const CommandType = enum { Invert, TapeDelay, ModDelay, + MultiChorus, Noise, WildNoise, @@ -207,6 +208,7 @@ pub const Lang = struct { _ = try self.keywords.put("invert", .Invert); _ = try self.keywords.put("tapedelay", .TapeDelay); _ = try self.keywords.put("moddelay", .ModDelay); + _ = try self.keywords.put("multichorus", .MultiChorus); // custom implementations (not lv2) _ = try self.keywords.put("noise", .Noise); diff --git a/src/printer.zig b/src/printer.zig index 6dfc508..08734b3 100644 --- a/src/printer.zig +++ b/src/printer.zig @@ -33,6 +33,7 @@ pub fn printList(list: langs.CommandList, stream: var) !void { .Invert => "invert", .TapeDelay => "tapedelay", .ModDelay => "moddelay", + .MultiChorus => "multichorus", .Noise => "noise", .WildNoise => "wildnoise", diff --git a/src/runner.zig b/src/runner.zig index 3a9a007..5856d7d 100644 --- a/src/runner.zig +++ b/src/runner.zig @@ -359,6 +359,11 @@ pub const Runner = struct { try image.runPlugin("http://plugin.org.uk/swh-plugins/modDelay", pos, params); } + fn multichorusCmd(self: *Runner, pos: Position, params: ParamList) !void { + var image = try self.getImage(); + try image.runPlugin("http://calf.sourceforge.net/plugins/MultiChorus", pos, params); + } + fn runCommand(self: *Runner, cmd: *lang.Command) !void { var params = ParamList.init(self.allocator); defer params.deinit(); @@ -675,6 +680,26 @@ pub const Runner = struct { try self.moddelayCmd(pos, params); }, + .MultiChorus => { + const pos = try cmd.consumePosition(); + try cmd.appendParam(¶ms, "min_delay"); + try cmd.appendParam(¶ms, "mod_depth"); + try cmd.appendParam(¶ms, "mod_rate"); + try cmd.appendParam(¶ms, "stereo"); + try cmd.appendParam(¶ms, "voices"); + try cmd.appendParam(¶ms, "vphase"); + try cmd.appendParam(¶ms, "amount"); + try cmd.appendParam(¶ms, "dry"); + try cmd.appendParam(¶ms, "freq"); + try cmd.appendParam(¶ms, "freq2"); + try cmd.appendParam(¶ms, "q"); + try cmd.appendParam(¶ms, "overlap"); + try cmd.appendParam(¶ms, "level_in"); + try cmd.appendParam(¶ms, "level_out"); + try cmd.appendParam(¶ms, "lfo"); + try self.multichorusCmd(pos, params); + }, + else => blk: { std.debug.warn("Unsupported command: {}\n", .{cmd.command}); break :blk RunError.UnknownCommand; From 08d9923e756eff418c92f94efc5baaa8accb55ca Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 26 Jan 2020 14:50:50 -0300 Subject: [PATCH 2/2] add saturator, vintagedelay cmd --- doc/README.md | 40 ++++++++++++++++++++++++ examples/saturator.scri | 3 ++ examples/vintagedelay.scri | 3 ++ src/lang.zig | 4 +++ src/printer.zig | 2 ++ src/runner.zig | 62 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 114 insertions(+) create mode 100644 examples/saturator.scri create mode 100644 examples/vintagedelay.scri diff --git a/doc/README.md b/doc/README.md index 8ae3743..c02ebda 100644 --- a/doc/README.md +++ b/doc/README.md @@ -337,3 +337,43 @@ Calf Multi Chorus - `level_in` (Input Gain): 0.0156250..64, default 1 - `level_out` (Output Gain): 0.0156250..64, default 1 - `lfo` (toggle): 0..1, default 1 + +## `saturator split index bypass level_in level_out mix drive blend lp_pre_freq hp_pre_fre lp_post_freq hp_post_freq p_freq p_level p_q pre post` + + - `bypass` (toggle): 0..1, default 0 + - `level_in` (Input Gain): 0.0156250..64, default 1 + - `level_out` (Output Gain): 0.0156250..64, default 1 + - `mix`: 0..1, default 1 + - `drive` (saturation, coef): 0.1..10, default 5 + - `blend` (coef): -10..10, default 10 + - `lp_pre_freq` (lowpass, hz): 10..20000, default 20000 + - `hp_pre_freq` (highpass, hz): 10..20000, default 10 + - `lp_post_freq` (lowpass, hz): 10..20000, default 20000 + - `hp_post_freq` (highpass, hz): 10..20000, default 10 + - `p_freq` (Tone, hz): 80..8000, default 2000 + - `p_level` (Amount): 0.0625..16, default 1 + - `p_q` (???, coef): 0.1..10, default 1 + - `pre` (Activate Pre, toggle): 0..1, default 0 + - `post` (Activate Post, toggle): 0..1, default 0 + +## `vintagedelay split index ...` + + - `level_in` (Input Gain): 0.0156250..64, default 1 + - `level_out` (Output Gain): 0.0156250..64, default 1 + - `subdiv` (int): 1..16, default 4 + - `time_l` (int): 1..16, default 3 + - `time_r` (int): 1..16, default 5 + - `feedback`: 0..1, default 0.5 + - `amount` (Wet): 0..4, default 0.25 + - `mix_mode` (enum): Stereo=0, Ping-Pong=1, L then R=2, R then L=3, default 1 + - `medium` (enum): Plain=0, Tape=1, Old Tape=2, default 1 + - `dry` (dry): 0..4, default 1 + - `width` (stereo width, strict): -1..1, default 1 + - `fragmentation` (enum): Repeating=0, Pattern=1, default 0 + - `pbeats` (Pattern Beats, int): 1..8, default 4 + - `pfrag` (Pattern Fragmentation, int): 1..8, default 4 + - `timing` (enum): BPM=0, ms=1, Hz=2, Sync=3, default 0 + - `bpm`: 30..300, default 120 + - `ms` (int): 10..2000, default 500 + - `hz`: 0.01..100, default 2 + - `bpm_host` (strict): 1..300, default 120 diff --git a/examples/saturator.scri b/examples/saturator.scri new file mode 100644 index 0000000..864c27a --- /dev/null +++ b/examples/saturator.scri @@ -0,0 +1,3 @@ +load :0; +saturator 3 1 0 1 1 1 5 10 20000 10 20000 10 2000 1 1 0 0; +quicksave; diff --git a/examples/vintagedelay.scri b/examples/vintagedelay.scri new file mode 100644 index 0000000..156638a --- /dev/null +++ b/examples/vintagedelay.scri @@ -0,0 +1,3 @@ +load :0; +vintagedelay 3 1 1 1 4 3 5 0.5 0.25 1 1 1 1 0 4 4 0 120 500 2 120; +quicksave; diff --git a/src/lang.zig b/src/lang.zig index b652617..45b806c 100644 --- a/src/lang.zig +++ b/src/lang.zig @@ -40,6 +40,8 @@ pub const CommandType = enum { TapeDelay, ModDelay, MultiChorus, + Saturator, + VintageDelay, Noise, WildNoise, @@ -209,6 +211,8 @@ pub const Lang = struct { _ = try self.keywords.put("tapedelay", .TapeDelay); _ = try self.keywords.put("moddelay", .ModDelay); _ = try self.keywords.put("multichorus", .MultiChorus); + _ = try self.keywords.put("saturator", .Saturator); + _ = try self.keywords.put("vintagedelay", .VintageDelay); // custom implementations (not lv2) _ = try self.keywords.put("noise", .Noise); diff --git a/src/printer.zig b/src/printer.zig index 08734b3..3cbcd72 100644 --- a/src/printer.zig +++ b/src/printer.zig @@ -34,6 +34,8 @@ pub fn printList(list: langs.CommandList, stream: var) !void { .TapeDelay => "tapedelay", .ModDelay => "moddelay", .MultiChorus => "multichorus", + .Saturator => "saturator", + .VintageDelay => "vintagedelay", .Noise => "noise", .WildNoise => "wildnoise", diff --git a/src/runner.zig b/src/runner.zig index 5856d7d..b3c4ed6 100644 --- a/src/runner.zig +++ b/src/runner.zig @@ -364,6 +364,16 @@ pub const Runner = struct { try image.runPlugin("http://calf.sourceforge.net/plugins/MultiChorus", pos, params); } + fn saturatorCmd(self: *Runner, pos: Position, params: ParamList) !void { + var image = try self.getImage(); + try image.runPlugin("http://calf.sourceforge.net/plugins/Saturator", pos, params); + } + + fn vintagedelayCmd(self: *Runner, pos: Position, params: ParamList) !void { + var image = try self.getImage(); + try image.runPlugin("http://calf.sourceforge.net/plugins/VintageDelay", pos, params); + } + fn runCommand(self: *Runner, cmd: *lang.Command) !void { var params = ParamList.init(self.allocator); defer params.deinit(); @@ -700,6 +710,58 @@ pub const Runner = struct { try self.multichorusCmd(pos, params); }, + .Saturator => { + const pos = try cmd.consumePosition(); + + try cmd.appendParam(¶ms, "bypass"); + try cmd.appendParam(¶ms, "level_in"); + try cmd.appendParam(¶ms, "level_out"); + try cmd.appendParam(¶ms, "mix"); + try cmd.appendParam(¶ms, "drive"); + try cmd.appendParam(¶ms, "blend"); + try cmd.appendParam(¶ms, "lp_pre_freq"); + try cmd.appendParam(¶ms, "hp_pre_freq"); + try cmd.appendParam(¶ms, "lp_post_freq"); + try cmd.appendParam(¶ms, "hp_post_freq"); + try cmd.appendParam(¶ms, "p_freq"); + try cmd.appendParam(¶ms, "p_level"); + try cmd.appendParam(¶ms, "p_q"); + try cmd.appendParam(¶ms, "pre"); + try cmd.appendParam(¶ms, "post"); + try self.saturatorCmd(pos, params); + }, + + .VintageDelay => { + const pos = try cmd.consumePosition(); + const PARAMS = [_][]const u8{ + "level_in", + "level_out", + "subdiv", + "time_l", + "time_r", + "feedback", + "amount", + "mix_mode", + "medium", + "dry", + "width", + "fragmentation", + "pbeats", + "pfrag", + "timing", + "bpm", + "ms", + "hz", + "bpm_host", + }; + + inline for (PARAMS) |param| { + try cmd.appendParam(¶ms, param); + } + + try self.vintagedelayCmd(pos, params); + }, + else => blk: { std.debug.warn("Unsupported command: {}\n", .{cmd.command}); break :blk RunError.UnknownCommand;