diff --git a/src/main.zig b/src/main.zig index f752975..0941b9e 100644 --- a/src/main.zig +++ b/src/main.zig @@ -16,21 +16,27 @@ const Note = struct { key_id: u32 = 0, }; -fn semitoneFreq(n: f64) f64 { - return 440 * std.math.pow(f64, 2, (n - 49) / 12.0); -} - -// TODO: add other octaves -const Tones = struct { - const C4: f64 = semitoneFreq(40); - const D4: f64 = semitoneFreq(42); - const E4: f64 = semitoneFreq(44); - const F4: f64 = semitoneFreq(45); - const G4: f64 = semitoneFreq(47); - const A4: f64 = semitoneFreq(49); - const H4: f64 = semitoneFreq(51); +const Tone = enum { + c, + C, + d, + D, + e, + f, + F, + g, + G, + a, + A, + b, }; +fn toneFreq(tone: Tone, octave: i32) f64 { + const tone_val = 12 * (octave - 1) + @intFromEnum(tone); + const tone_val_f: f64 = @floatFromInt(tone_val); + return 440 * std.math.pow(f64, 2, (tone_val_f - 45.0) / 12.0); +} + fn sine_fn(t: f64) f64 { return std.math.sin(t * std.math.pi * 2); } @@ -146,49 +152,75 @@ pub fn main(init: std.process.Init) !void { .base_fn = &sine_fn, .start = userdata.frame, .end = ~@as(usize, 0), - .frequency = Tones.A4, + .frequency = toneFreq(.a, 4), .attack = 48000 * 0.2, .decay = 48000 * 0.2, .decay_value = 0.6, .release = 48000, - .volume = 0.2, + .volume = 0.05, .key_id = 0, }; switch (event.key.key) { - sdl.SDLK_C => { + sdl.SDLK_Z => { try userdata.notes.append(allocator, simple_note); - userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_C; - userdata.notes.items[userdata.notes.items.len - 1].frequency = Tones.C4; + userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_Z; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.c, 4); + }, + sdl.SDLK_S => { + try userdata.notes.append(allocator, simple_note); + userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_S; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.C, 4); + }, + sdl.SDLK_X => { + try userdata.notes.append(allocator, simple_note); + userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_X; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.d, 4); }, sdl.SDLK_D => { try userdata.notes.append(allocator, simple_note); userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_D; - userdata.notes.items[userdata.notes.items.len - 1].frequency = Tones.D4; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.D, 4); }, - sdl.SDLK_E => { + sdl.SDLK_C => { try userdata.notes.append(allocator, simple_note); - userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_E; - userdata.notes.items[userdata.notes.items.len - 1].frequency = Tones.E4; + userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_C; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.e, 4); }, - sdl.SDLK_F => { + sdl.SDLK_V => { try userdata.notes.append(allocator, simple_note); - userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_F; - userdata.notes.items[userdata.notes.items.len - 1].frequency = Tones.F4; + userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_V; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.f, 4); }, sdl.SDLK_G => { try userdata.notes.append(allocator, simple_note); userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_G; - userdata.notes.items[userdata.notes.items.len - 1].frequency = Tones.G4; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.F, 4); }, - sdl.SDLK_A => { + sdl.SDLK_B => { try userdata.notes.append(allocator, simple_note); - userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_A; - userdata.notes.items[userdata.notes.items.len - 1].frequency = Tones.A4; + userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_B; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.g, 4); }, sdl.SDLK_H => { try userdata.notes.append(allocator, simple_note); userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_H; - userdata.notes.items[userdata.notes.items.len - 1].frequency = Tones.H4; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.G, 4); + }, + sdl.SDLK_N => { + try userdata.notes.append(allocator, simple_note); + userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_N; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.a, 4); + }, + sdl.SDLK_J => { + try userdata.notes.append(allocator, simple_note); + userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_J; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.A, 4); + }, + + sdl.SDLK_M => { + try userdata.notes.append(allocator, simple_note); + userdata.notes.items[userdata.notes.items.len - 1].key_id = sdl.SDLK_M; + userdata.notes.items[userdata.notes.items.len - 1].frequency = toneFreq(.b, 4); }, else => {}, @@ -203,9 +235,9 @@ pub fn main(init: std.process.Init) !void { }, else => {}, } - _ = sdl.SDL_RenderClear(renderer); - _ = sdl.SDL_RenderPresent(renderer); - sdl.SDL_Delay(10); } + _ = sdl.SDL_RenderClear(renderer); + _ = sdl.SDL_RenderPresent(renderer); + sdl.SDL_Delay(10); } }