From 8236e0a7d4f99d1d354b3c7667327e707f1f2f4c Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 22 Jul 2023 10:08:20 +0200 Subject: Add trig probability --- src/main.c | 4 ++-- src/rng.c | 4 +++- src/sequencer.c | 25 +++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index ffe60e4..a6c2238 100644 --- a/src/main.c +++ b/src/main.c @@ -15,9 +15,9 @@ WITH REGARD TO THIS SOFTWARE. // + Add new UI for the parameter pages // + Change cursor drawing for new parameter pages // + Change cursor behaviour for new parameter pages +// + Allow prob control (% based or 1:2, etc.) // - Display notification when editing a parameter with the highest priority // - Add panning support. -// - Allow prob control (% based or 1:2, etc.) // - Add custom user themes // - Animations for cursor movement/current step highlight. (A fade out maybe?) // @@ -29,7 +29,7 @@ WITH REGARD TO THIS SOFTWARE. // - Undo/Redo. // // Advanced -// - Per trig note probability. +// + Per trig note probability. // - Add tap tempo for BPM. // - Allow "marking" several trigs to be able to copy/paste them and/or adjust // their parameters. diff --git a/src/rng.c b/src/rng.c index 58a517b..4a93562 100644 --- a/src/rng.c +++ b/src/rng.c @@ -7,7 +7,9 @@ u32 hash16(u32 input, u32 key) { u16 rng16() { rng_state += 0xbadd; - return hash16(rng_state, 0x10de); + u32 ret = hash16(rng_state, 0x10de); + rng_state += ret; + return ret; } u32 rng32() { diff --git a/src/sequencer.c b/src/sequencer.c index 00baebb..e017700 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -17,6 +17,7 @@ bool redraw_params = true; bool redraw_bpm = true; bool redraw_piano_note = true; bool update_bpm = false; +u8 bar_counter = 0; void gate_off(void) { @@ -73,6 +74,25 @@ find_prev_pattern(void) { bool should_play(u8 prob) { + switch (prob) { + case PROB_100: { return true; } break; + case PROB_80: { return rng16() < 52427; } break; + case PROB_60: { return rng16() < 39320; } break; + case PROB_40: { return rng16() < 26213; } break; + case PROB_20: { return rng16() < 13106; } break; + case PROB_FIRST: { return bar_counter == 0; } break; + case PROB_NOT_FIRST: { return bar_counter != 0; } break; + case PROB_ONE_TWO: { return bar_counter % 2 == 0; } break; + case PROB_TWO_TWO: { return bar_counter % 2 == 1; } break; + case PROB_ONE_THREE: { return bar_counter % 3 == 0; } break; + case PROB_TWO_THREE: { return bar_counter % 3 == 1; } break; + case PROB_THREE_THREE: { return bar_counter % 3 == 2; } break; + case PROB_ONE_FOUR: { return bar_counter % 4 == 0; } break; + case PROB_TWO_FOUR: { return bar_counter % 4 == 1; } break; + case PROB_THREE_FOUR: { return bar_counter % 4 == 2; } break; + case PROB_FOUR_FOUR: { return bar_counter % 4 == 3; } break; + default: break; + } return true; } @@ -246,6 +266,9 @@ play_step(void) { case SYNC_OUT_LINK_AUDIO_4: { if (step_counter % 4 == 0) { gate_on(); audio_sync_click = true; } } break; default: break; } + if (step_counter == 15) { + bar_counter++; + } step_counter = (step_counter + 1) % 16; redraw_piano_note = true; } @@ -389,6 +412,7 @@ stop_playing(void) { chain.current = 15; chain.current = find_next_pattern(); chain.playing = false; + bar_counter = 0; stop_sound(); } @@ -399,6 +423,7 @@ toggle_playing(void) { chain.current = 15; chain.current = find_next_pattern(); chain.playing = false; + bar_counter = 0; if (current_pattern == next_pattern && chain.len > 0) { chain.playing = true; next_pattern = chain.chain[chain.current]; -- cgit v1.2.1