scritcher/src/custom.zig

116 lines
2.9 KiB
Zig

// Custom plugins
const std = @import("std");
const lv2 = @import("lv2_helpers.zig");
const plugins = @import("plugin.zig");
const c = lv2.c;
const RunBuffers = plugins.RunBuffers;
pub const RandomNoise = struct {
r: std.rand.DefaultPrng,
rand_buf: ?[]f32,
cnt: usize = 0,
pub fn init(
allocator: *std.mem.Allocator,
params: *plugins.ParamMap,
) ?RandomNoise {
const seed = @floatToInt(u64, params.get("seed").?.value);
const fillbytes = @floatToInt(usize, params.get("fill_bytes").?.value);
var r = std.rand.DefaultPrng.init(seed);
if (fillbytes > 0) {
var rand_buf = allocator.alloc(f32, fillbytes) catch return null;
for (rand_buf) |_, idx| {
rand_buf[idx] = r.random.float(f32);
}
return RandomNoise{
.r = r,
.rand_buf = rand_buf,
};
} else {
return RandomNoise{
.r = r,
.rand_buf = null,
};
}
}
pub fn run(self: *RandomNoise, bufs: *RunBuffers) void {
if (self.rand_buf) |rand_buf| {
if (self.cnt >= rand_buf.len) self.cnt = 0;
bufs.out[0] = rand_buf[self.cnt];
self.cnt += 1;
} else {
bufs.out[0] = self.r.random.float(f32);
}
}
};
pub const WildNoise = struct {
r: std.rand.DefaultPrng,
rand_buf: ?[]f32,
cnt: usize = 0,
pub fn init(
allocator: *std.mem.Allocator,
params: *plugins.ParamMap,
) ?WildNoise {
const seed = @floatToInt(u64, params.get("seed").?.value);
const fillbytes = @floatToInt(usize, params.get("fill_bytes").?.value);
var r = std.rand.DefaultPrng.init(seed);
if (fillbytes > 0) {
var rand_buf = allocator.alloc(f32, fillbytes) catch return null;
for (rand_buf) |_, idx| {
rand_buf[idx] = @intToFloat(f32, r.random.int(u1));
}
return WildNoise{
.r = r,
.rand_buf = rand_buf,
};
} else {
return WildNoise{
.r = r,
.rand_buf = null,
};
}
}
pub fn run(self: *WildNoise, bufs: *RunBuffers) void {
if (self.rand_buf) |rand_buf| {
if (self.cnt >= rand_buf.len) self.cnt = 0;
bufs.out[0] = rand_buf[self.cnt];
self.cnt += 1;
} else {
bufs.out[0] = @intToFloat(f32, self.r.random.int(u1));
}
}
};
pub const Write = struct {
data: f32,
pub fn init(
allocator: *std.mem.Allocator,
params: *plugins.ParamMap,
) Write {
const data = params.get("data").?;
return Write{
.data = data.value,
};
}
pub fn run(self: *Write, bufs: *RunBuffers) void {
bufs.out[0] = self.data;
}
};