working sine gen in zig
This commit is contained in:
parent
2a66715202
commit
7061a92caf
6 changed files with 243 additions and 53 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -18,6 +18,9 @@ t*.html
|
||||||
.kdev4/
|
.kdev4/
|
||||||
HTML/
|
HTML/
|
||||||
PDF/
|
PDF/
|
||||||
|
.zig-cache/
|
||||||
|
*/src/soundnode
|
||||||
|
*.o
|
||||||
JSON/
|
JSON/
|
||||||
JSON_HIST/
|
JSON_HIST/
|
||||||
testrun*/
|
testrun*/
|
||||||
|
|
|
||||||
15
test.py
15
test.py
|
|
@ -18,15 +18,12 @@ class TestProgram(Program):
|
||||||
self.reset()
|
self.reset()
|
||||||
|
|
||||||
sn = SineNode(440, self.room)
|
sn = SineNode(440, self.room)
|
||||||
sn2 = SawtoothNode(440, self.room)
|
|
||||||
|
|
||||||
sn.air_to(self.room.left_sink)
|
sn.wire_to(self.room.left_sink)
|
||||||
sn.air_to(self.room.right_sink)
|
sn.wire_to(self.room.right_sink)
|
||||||
sn2.air_to(self.room.left_sink)
|
|
||||||
sn2.air_to(self.room.right_sink)
|
|
||||||
|
|
||||||
sn.start_location = (4,0,0)
|
#sn.start_location = (49,0,0)
|
||||||
sn2.start_location = (-4,0,0)
|
#sn2.start_location = (-4,0,0)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
NoteAction('A4', self.st(0), self.st(0.5), [sn, tn], self)
|
NoteAction('A4', self.st(0), self.st(0.5), [sn, tn], self)
|
||||||
|
|
@ -34,8 +31,8 @@ class TestProgram(Program):
|
||||||
NoteAction('F4', self.st(2), self.st(0.5), [sn, tn], self)
|
NoteAction('F4', self.st(2), self.st(0.5), [sn, tn], self)
|
||||||
NoteAction('E4', self.st(3), self.st(0.5), [sn, tn], self)
|
NoteAction('E4', self.st(3), self.st(0.5), [sn, tn], self)
|
||||||
"""
|
"""
|
||||||
LinearPitchTransition('A4', 'E4', self.st(0), self.st(5), [sn], self)
|
#LinearPitchTransition('A4', 'E4', self.st(0), self.st(5), [sn], self)
|
||||||
LinearPitchTransition('E4', 'A4', self.st(0), self.st(5), [sn2], self)
|
#LinearPitchTransition('E4', 'A4', self.st(0), self.st(5), [sn2], self)
|
||||||
|
|
||||||
#LinearSpatialTransition((-8,0,0),(8,0,0), self.st(0), self.st(5), [sn], self)
|
#LinearSpatialTransition((-8,0,0),(8,0,0), self.st(0), self.st(5), [sn], self)
|
||||||
|
|
||||||
|
|
|
||||||
0
zigsonnum/src/freqampmap.zig
Normal file
0
zigsonnum/src/freqampmap.zig
Normal file
46
zigsonnum/src/main.bak.zig
Normal file
46
zigsonnum/src/main.bak.zig
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
//! By convention, main.zig is where your main function lives in the case that
|
||||||
|
//! you are building an executable. If you are making a library, the convention
|
||||||
|
//! is to delete this file and start with root.zig instead.
|
||||||
|
|
||||||
|
pub fn main() !void {
|
||||||
|
// Prints to stderr (it's a shortcut based on `std.io.getStdErr()`)
|
||||||
|
std.debug.print("All your {s} are belong to us.\n", .{"codebase"});
|
||||||
|
|
||||||
|
// stdout is for the actual output of your application, for example if you
|
||||||
|
// are implementing gzip, then only the compressed bytes should be sent to
|
||||||
|
// stdout, not any debugging messages.
|
||||||
|
const stdout_file = std.io.getStdOut().writer();
|
||||||
|
var bw = std.io.bufferedWriter(stdout_file);
|
||||||
|
const stdout = bw.writer();
|
||||||
|
|
||||||
|
try stdout.print("Run `zig build test` to run the tests.\n", .{});
|
||||||
|
|
||||||
|
try bw.flush(); // Don't forget to flush!
|
||||||
|
}
|
||||||
|
|
||||||
|
test "simple test" {
|
||||||
|
var list = std.ArrayList(i32).init(std.testing.allocator);
|
||||||
|
defer list.deinit(); // Try commenting this out and see if zig detects the memory leak!
|
||||||
|
try list.append(42);
|
||||||
|
try std.testing.expectEqual(@as(i32, 42), list.pop());
|
||||||
|
}
|
||||||
|
|
||||||
|
test "use other module" {
|
||||||
|
try std.testing.expectEqual(@as(i32, 150), lib.add(100, 50));
|
||||||
|
}
|
||||||
|
|
||||||
|
test "fuzz example" {
|
||||||
|
const Context = struct {
|
||||||
|
fn testOne(context: @This(), input: []const u8) anyerror!void {
|
||||||
|
_ = context;
|
||||||
|
// Try passing `--fuzz` to `zig build test` and see if it manages to fail this test case!
|
||||||
|
try std.testing.expect(!std.mem.eql(u8, "canyoufindme", input));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
try std.testing.fuzz(Context{}, Context.testOne, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
/// This imports the separate module containing `root.zig`. Take a look in `build.zig` for details.
|
||||||
|
const lib = @import("zigsonnum_lib");
|
||||||
|
|
@ -1,46 +1,67 @@
|
||||||
//! By convention, main.zig is where your main function lives in the case that
|
|
||||||
//! you are building an executable. If you are making a library, the convention
|
|
||||||
//! is to delete this file and start with root.zig instead.
|
|
||||||
|
|
||||||
pub fn main() !void {
|
|
||||||
// Prints to stderr (it's a shortcut based on `std.io.getStdErr()`)
|
|
||||||
std.debug.print("All your {s} are belong to us.\n", .{"codebase"});
|
|
||||||
|
|
||||||
// stdout is for the actual output of your application, for example if you
|
|
||||||
// are implementing gzip, then only the compressed bytes should be sent to
|
|
||||||
// stdout, not any debugging messages.
|
|
||||||
const stdout_file = std.io.getStdOut().writer();
|
|
||||||
var bw = std.io.bufferedWriter(stdout_file);
|
|
||||||
const stdout = bw.writer();
|
|
||||||
|
|
||||||
try stdout.print("Run `zig build test` to run the tests.\n", .{});
|
|
||||||
|
|
||||||
try bw.flush(); // Don't forget to flush!
|
|
||||||
}
|
|
||||||
|
|
||||||
test "simple test" {
|
|
||||||
var list = std.ArrayList(i32).init(std.testing.allocator);
|
|
||||||
defer list.deinit(); // Try commenting this out and see if zig detects the memory leak!
|
|
||||||
try list.append(42);
|
|
||||||
try std.testing.expectEqual(@as(i32, 42), list.pop());
|
|
||||||
}
|
|
||||||
|
|
||||||
test "use other module" {
|
|
||||||
try std.testing.expectEqual(@as(i32, 150), lib.add(100, 50));
|
|
||||||
}
|
|
||||||
|
|
||||||
test "fuzz example" {
|
|
||||||
const Context = struct {
|
|
||||||
fn testOne(context: @This(), input: []const u8) anyerror!void {
|
|
||||||
_ = context;
|
|
||||||
// Try passing `--fuzz` to `zig build test` and see if it manages to fail this test case!
|
|
||||||
try std.testing.expect(!std.mem.eql(u8, "canyoufindme", input));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
try std.testing.fuzz(Context{}, Context.testOne, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
const soundnode = @import("soundnode.zig");
|
||||||
|
const expect = std.testing.expect;
|
||||||
|
const print = std.debug.print;
|
||||||
|
const math = std.math;
|
||||||
|
|
||||||
/// This imports the separate module containing `root.zig`. Take a look in `build.zig` for details.
|
|
||||||
const lib = @import("zigsonnum_lib");
|
const TestError = error {
|
||||||
|
IsFive,
|
||||||
|
IsSix
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pub fn prnt(s: []const u8) void {
|
||||||
|
print("{s}\n", .{s});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn prntNum(i: anytype) void {
|
||||||
|
print("{d}\n", .{i});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn testValue(a: u8) TestError!u8 {
|
||||||
|
|
||||||
|
if (a == 5) {
|
||||||
|
return TestError.IsFive;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (a == 6) {
|
||||||
|
return TestError.IsSix;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn distanceBetweenPoints(pt1: *const Pnt, pt2: *const Pnt) f32 {
|
||||||
|
|
||||||
|
if ((pt1.x == pt2.x) and (pt1.y == pt2.y) and (pt1.z == pt2.z)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const dx: f32 = pt1.x - pt2.x;
|
||||||
|
const dy: f32 = pt1.y - pt2.y;
|
||||||
|
const dz: f32 = pt1.z - pt2.z;
|
||||||
|
|
||||||
|
return math.sqrt(dx*dx + dy*dy + dz*dz);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() void {
|
||||||
|
|
||||||
|
const p1: Pnt = Pnt{.x = 0, .y = 0};
|
||||||
|
const p2: Pnt = Pnt{.x = 1, .y = 1};
|
||||||
|
|
||||||
|
const p3: Pnt = Pnt{.x = 1, .y = 9751.767};
|
||||||
|
|
||||||
|
var dst: f32 = distanceBetweenPoints(&p1, &p2);
|
||||||
|
prntNum(dst);
|
||||||
|
|
||||||
|
dst = distanceBetweenPoints(&p1, &p3);
|
||||||
|
prntNum(dst);
|
||||||
|
}
|
||||||
|
|
|
||||||
123
zigsonnum/src/soundnode.zig
Normal file
123
zigsonnum/src/soundnode.zig
Normal file
|
|
@ -0,0 +1,123 @@
|
||||||
|
const std = @import("std");
|
||||||
|
const print = std.debug.print;
|
||||||
|
const math = std.math;
|
||||||
|
const Endian = std.builtin.Endian;
|
||||||
|
|
||||||
|
pub const tau: f64 = 2 * 3.1415926535897932384626433832795028841971;
|
||||||
|
|
||||||
|
|
||||||
|
pub fn prnt(s: []const u8) void {
|
||||||
|
print("{s}\n", .{s});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const SoundSettings = struct {
|
||||||
|
|
||||||
|
const default_sample_rate: u16 = 44100;
|
||||||
|
const default_bit_depth: u8 = 24;
|
||||||
|
|
||||||
|
sample_rate: u16 = default_sample_rate,
|
||||||
|
speed_of_sound: f32 = 343.0 / @as(f32, default_sample_rate),
|
||||||
|
bit_depth: u8 = default_bit_depth,
|
||||||
|
max_amp: i64 = math.pow(i64, 2, default_bit_depth-1) - 1,
|
||||||
|
min_amp: i64 = - math.pow(i64, 2, default_bit_depth-1),
|
||||||
|
sample_width: u8 = @intFromFloat(@as(f32, default_bit_depth) / 8.0),
|
||||||
|
sine_multiplier: f64 = tau / default_sample_rate,
|
||||||
|
|
||||||
|
fn printSettings(self: *const SoundSettings) void {
|
||||||
|
print("Sample rate : {d}\n", .{self.sample_rate});
|
||||||
|
print("Bit depth : {d}\n", .{self.bit_depth});
|
||||||
|
print("Max amp : {d}\n", .{self.max_amp});
|
||||||
|
print("Min amp : {d}\n", .{self.min_amp});
|
||||||
|
print("Sample width: {d}\n", .{self.sample_width});
|
||||||
|
print("Sine mult : {d}\n", .{self.sine_multiplier});
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const Pnt = struct {
|
||||||
|
|
||||||
|
x: f32 = 0,
|
||||||
|
y: f32 = 0,
|
||||||
|
z: f32 = 0,
|
||||||
|
|
||||||
|
fn printPnt(self: *const Pnt) void {
|
||||||
|
print("{d} {d} {d}\n", .{self.x, self.y, self.z});
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const SoundNode = struct {
|
||||||
|
name: []const u8 = "soundnode",
|
||||||
|
air_in: []*SoundNode = undefined,
|
||||||
|
wire_in: []*SoundNode = undefined,
|
||||||
|
location: Pnt = Pnt{.x = 0, .y = 0, .z = 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn singleSineTick(st: *SoundSettings, freq: f16, t: u64) f64 {
|
||||||
|
const ft: f64 = @floatFromInt(t);
|
||||||
|
return math.sin(st.sine_multiplier * @as(f64, freq) * ft);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() !void {
|
||||||
|
|
||||||
|
var sn1: SoundNode = SoundNode{ .name="left_sink" };
|
||||||
|
sn1.location.x = 4;
|
||||||
|
|
||||||
|
var st = SoundSettings{};
|
||||||
|
st.printSettings();
|
||||||
|
|
||||||
|
const duration_in_sec: u32 = 5*60;
|
||||||
|
|
||||||
|
prnt("start");
|
||||||
|
|
||||||
|
const stdout_file = std.io.getStdOut().writer();
|
||||||
|
var bw = std.io.bufferedWriter(stdout_file);
|
||||||
|
const stdout = bw.writer();
|
||||||
|
|
||||||
|
//WRITING WAV HEADER
|
||||||
|
try stdout.writeAll("RIFF");
|
||||||
|
|
||||||
|
try stdout.writeInt(
|
||||||
|
u32,
|
||||||
|
36 + ((duration_in_sec * st.sample_rate) * 2 * st.sample_width),
|
||||||
|
Endian.little,
|
||||||
|
);
|
||||||
|
|
||||||
|
try stdout.writeAll("WAVE");
|
||||||
|
try stdout.writeAll("fmt ");
|
||||||
|
|
||||||
|
try stdout.writeInt(u32, 16, Endian.little);
|
||||||
|
try stdout.writeInt(u16, 1, Endian.little);
|
||||||
|
try stdout.writeInt(u16, 2, Endian.little);
|
||||||
|
try stdout.writeInt(u32, st.sample_rate, Endian.little);
|
||||||
|
|
||||||
|
const block_align: u16 = @intCast(2 * st.sample_width);
|
||||||
|
|
||||||
|
try stdout.writeInt(u32, @as(u32, block_align) * st.sample_rate, Endian.little);
|
||||||
|
try stdout.writeInt(u16, block_align, Endian.little);
|
||||||
|
try stdout.writeInt(u16, st.bit_depth, Endian.little);
|
||||||
|
|
||||||
|
try stdout.writeAll("data");
|
||||||
|
try stdout.writeInt(
|
||||||
|
u32,
|
||||||
|
(duration_in_sec * st.sample_rate) * 2 * st.sample_width,
|
||||||
|
Endian.little,
|
||||||
|
);
|
||||||
|
|
||||||
|
var sample: i24 = 0.0;
|
||||||
|
|
||||||
|
var amp: f64 = undefined;
|
||||||
|
|
||||||
|
for (0 .. st.sample_rate * duration_in_sec) |t| {
|
||||||
|
amp = singleSineTick(&st, 440, t);
|
||||||
|
|
||||||
|
sample = @intFromFloat(amp * @as(f64, @floatFromInt(st.max_amp)));
|
||||||
|
try stdout.writeInt(i24, sample, Endian.little);
|
||||||
|
try stdout.writeInt(i24, sample, Endian.little);
|
||||||
|
}
|
||||||
|
prnt("done");
|
||||||
|
|
||||||
|
try bw.flush();
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue