Browse Source

less deterministic random

master
Nicola Pisanti 6 years ago
parent
commit
2fee3a706b
  1. 28
      sim.c
  2. 4
      sim.h
  3. 47
      tui_main.c

28
sim.c

@ -142,6 +142,7 @@ typedef struct {
Glyph* vars_slots;
Piano_bits piano_bits;
Oevent_list* oevent_list;
Usz random_seed;
} Oper_extra_params;
static void oper_poke_and_stun(Glyph* restrict gbuffer, Mark* restrict mbuffer,
@ -417,7 +418,7 @@ END_OPERATOR
BEGIN_OPERATOR(add)
LOWERCASE_REQUIRES_BANG;
PORT(0, -1, IN);
PORT(0, -1, IN | PARAM);
PORT(0, 1, IN);
PORT(1, 0, OUT);
Usz a = index_of(PEEK(0, -1));
@ -434,10 +435,8 @@ BEGIN_OPERATOR(bounce)
Usz to = index_of(PEEK(0, 1));
if (rate == 0)
rate = 1;
if (to < 2) {
POKE(1, 0, glyph_of(0));
return;
}
if (to == 0)
to = 8;
to = to - 1;
Usz key = (Tick_number / rate) % (to * 2);
if (key > to)
@ -478,7 +477,7 @@ END_OPERATOR
BEGIN_OPERATOR(if)
LOWERCASE_REQUIRES_BANG;
PORT(0, -1, IN);
PORT(0, -1, IN | PARAM);
PORT(0, 1, IN);
PORT(1, 0, OUT);
Glyph g0 = PEEK(0, -1);
@ -509,7 +508,7 @@ END_OPERATOR
BEGIN_OPERATOR(increment)
LOWERCASE_REQUIRES_BANG;
PORT(0, -1, IN);
PORT(0, -1, IN | PARAM);
PORT(0, 1, IN);
PORT(1, 0, IN | OUT);
Glyph g = PEEK(0, -1);
@ -582,7 +581,7 @@ END_OPERATOR
BEGIN_OPERATOR(multiply)
LOWERCASE_REQUIRES_BANG;
PORT(0, -1, IN);
PORT(0, -1, IN | PARAM);
PORT(0, 1, IN);
PORT(1, 0, OUT);
Usz ia = index_of(PEEK(0, -1));
@ -648,7 +647,7 @@ static Usz hash32_shift_mult(Usz key) {
BEGIN_OPERATOR(random)
LOWERCASE_REQUIRES_BANG;
PORT(0, -1, IN);
PORT(0, -1, IN | PARAM);
PORT(0, 1, IN);
PORT(1, 0, OUT);
Usz a = index_of(PEEK(0, -1));
@ -666,8 +665,8 @@ BEGIN_OPERATOR(random)
min = b;
max = a;
}
Usz key = y * width + x;
key = hash32_shift_mult((y * width + x) ^ (Tick_number << UINT32_C(16)));
Usz key = hash32_shift_mult((extra_params->random_seed + y * width + x) ^
(Tick_number << UINT32_C(16)));
Usz val = key % (max - min) + min;
POKE(1, 0, glyph_of(val));
END_OPERATOR
@ -753,7 +752,7 @@ END_OPERATOR
BEGIN_OPERATOR(lerp)
LOWERCASE_REQUIRES_BANG;
PORT(0, -1, IN);
PORT(0, -1, IN | PARAM);
PORT(0, 1, IN);
PORT(1, 0, IN | OUT);
Glyph g = PEEK(0, -1);
@ -771,8 +770,8 @@ END_OPERATOR
//////// Run simulation
void orca_run(Glyph* restrict gbuf, Mark* restrict mbuf, Usz height, Usz width,
Usz tick_number, Oevent_list* oevent_list,
Piano_bits piano_bits) {
Usz tick_number, Oevent_list* oevent_list, Piano_bits piano_bits,
Usz random_seed) {
Glyph vars_slots[Glyphs_index_count];
memset(vars_slots, '.', sizeof(vars_slots));
mbuffer_clear(mbuf, height, width);
@ -781,6 +780,7 @@ void orca_run(Glyph* restrict gbuf, Mark* restrict mbuf, Usz height, Usz width,
extras.vars_slots = &vars_slots[0];
extras.piano_bits = piano_bits;
extras.oevent_list = oevent_list;
extras.random_seed = random_seed;
for (Usz iy = 0; iy < height; ++iy) {
Glyph const* glyph_row = gbuf + iy * width;

4
sim.h

@ -15,6 +15,8 @@ static inline Piano_bits piano_bits_of(Glyph g) {
return UINT64_C(0);
}
void init_random_seed(Usz value);
void orca_run(Glyph* restrict gbuffer, Mark* restrict mbuffer, Usz height,
Usz width, Usz tick_number, Oevent_list* oevent_list,
Piano_bits piano_bits);
Piano_bits piano_bits, Usz random_seed);

47
tui_main.c

@ -768,8 +768,45 @@ typedef struct {
bool is_mouse_down : 1;
bool is_mouse_dragging : 1;
bool is_hud_visible : 1;
Usz random_seed;
} Ged;
// for initializing random, unsed in ged_init
// http://www.concentric.net/~Ttwang/tech/inthash.htm
Usz random_seed_mix(void) {
Isz a = (Isz)clock();
Isz b = (Isz)time(NULL);
Isz c = (Isz)getpid();
a = a - b;
a = a - c;
a = a ^ (c >> 13);
b = b - c;
b = b - a;
b = b ^ (a << 8);
c = c - a;
c = c - b;
c = c ^ (b >> 13);
a = a - b;
a = a - c;
a = a ^ (c >> 12);
b = b - c;
b = b - a;
b = b ^ (a << 16);
c = c - a;
c = c - b;
c = c ^ (b >> 5);
a = a - b;
a = a - c;
a = a ^ (c >> 3);
b = b - c;
b = b - a;
b = b ^ (a << 10);
c = c - a;
c = c - b;
c = c ^ (b >> 15);
return (Usz)c;
}
void ged_init(Ged* a, Usz undo_limit, Usz init_bpm) {
field_init(&a->field);
field_init(&a->scratch_field);
@ -802,11 +839,12 @@ void ged_init(Ged* a, Usz undo_limit, Usz init_bpm) {
a->drag_start_x = 0;
a->needs_remarking = true;
a->is_draw_dirty = false;
a->is_playing = false;
a->is_playing = true;
a->draw_event_list = false;
a->is_mouse_down = false;
a->is_mouse_dragging = false;
a->is_hud_visible = false;
a->random_seed = random_seed_mix();
}
void ged_deinit(Ged* a) {
@ -1105,7 +1143,7 @@ void ged_do_stuff(Ged* a) {
apply_time_to_sustained_notes(oosc_dev, midi_mode, secs_span,
&a->susnote_list, &a->time_to_next_note_off);
orca_run(a->field.buffer, a->mbuf_r.buffer, a->field.height, a->field.width,
a->tick_num, &a->oevent_list, a->piano_bits);
a->tick_num, &a->oevent_list, a->piano_bits, a->random_seed);
++a->tick_num;
a->piano_bits = ORCA_PIANO_BITS_NONE;
a->needs_remarking = true;
@ -1199,7 +1237,7 @@ void ged_draw(Ged* a, WINDOW* win) {
mbuf_reusable_ensure_size(&a->mbuf_r, a->field.height, a->field.width);
orca_run(a->scratch_field.buffer, a->mbuf_r.buffer, a->field.height,
a->field.width, a->tick_num, &a->scratch_oevent_list,
a->piano_bits);
a->piano_bits, a->random_seed);
a->needs_remarking = false;
}
int win_h = a->win_h;
@ -1573,7 +1611,7 @@ void ged_input_cmd(Ged* a, Ged_input_cmd ev) {
case Ged_input_cmd_step_forward:
undo_history_push(&a->undo_hist, &a->field, a->tick_num);
orca_run(a->field.buffer, a->mbuf_r.buffer, a->field.height, a->field.width,
a->tick_num, &a->oevent_list, a->piano_bits);
a->tick_num, &a->oevent_list, a->piano_bits, a->random_seed);
++a->tick_num;
a->piano_bits = ORCA_PIANO_BITS_NONE;
a->needs_remarking = true;
@ -1877,6 +1915,7 @@ int main(int argc, char** argv) {
int init_grid_dim_x = 57;
Midi_mode midi_mode;
midi_mode_init_null(&midi_mode);
for (;;) {
int c = getopt_long(argc, argv, "h", tui_options, NULL);
if (c == -1)

Loading…
Cancel
Save