Commit dc2fadcea45c02d204f58e09305b7bcb0c89b025
Fix stuff
cel committed on 11/4/2016, 8:15:35 PMParent: 033d2aa1890af2ff80fde819e83b034484c47cbc
Files changed
foobuf.c | changed |
foobuf.h | changed |
tune.c | changed |
tune.h | changed |
foobuf.c | ||
---|---|---|
@@ -5,20 +5,25 @@ | ||
5 | 5 … | |
6 | 6 … | int foobuf_init(struct foobuf **bufp, size_t len) |
7 | 7 … | { |
8 | 8 … | struct foobuf *buf = *bufp; |
9 | - if (!buf) buf = calloc(sizeof *buf, 1); | |
10 | - if (!buf) return 1; | |
11 | - if (buf->len != len) { | |
12 | - buf->data = realloc(buf->data, len * sizeof(buf->data[0])); | |
9 … | + if (!buf) { | |
10 … | + buf = calloc(sizeof *buf, 1); | |
11 … | + if (!buf) return 1; | |
12 … | + *bufp = buf; | |
13 … | + buf->data = calloc(len, sizeof(float)); | |
14 … | + if (!buf->data) return 1; | |
15 … | + buf->len = len; | |
16 … | + } else if (buf->len != len) { | |
17 … | + buf->data = realloc(buf->data, len * sizeof(float)); | |
18 … | + if (!buf->data) return 1; | |
13 | 19 … | if (len > buf->len) { |
14 | 20 … | memset(&buf->data[buf->len], 0, len - buf->len); |
15 | 21 … | } else { |
16 | 22 … | if (buf->offset >= len) buf->offset = 0; |
17 | 23 … | } |
18 | 24 … | buf->len = len; |
19 | 25 … | } |
20 | - *bufp = buf; | |
21 | 26 … | return 0; |
22 | 27 … | } |
23 | 28 … | |
24 | 29 … | float foobuf_read(struct foobuf *buf, size_t offset) |
@@ -35,4 +40,11 @@ | ||
35 | 40 … | offset++; |
36 | 41 … | if (offset == buf->len) offset = 0; |
37 | 42 … | buf->offset = offset; |
38 | 43 … | } |
44 … | + | |
45 … | +int _struct_init(void **ptr, size_t size) | |
46 … | +{ | |
47 … | + if (*ptr) return 0; | |
48 … | + if ((*ptr = calloc(1, size))) return 0; | |
49 … | + return 1; | |
50 … | +} |
foobuf.h | ||
---|---|---|
@@ -8,4 +8,9 @@ | ||
8 | 8 … | |
9 | 9 … | int foobuf_init(struct foobuf **, size_t len); |
10 | 10 … | float foobuf_read(struct foobuf *buf, size_t offset); |
11 | 11 … | void foobuf_write(struct foobuf *buf, float val); |
12 … | + | |
13 … | +int _struct_init(void **, size_t); | |
14 … | + | |
15 … | + | |
16 … | + |
tune.c | ||
---|---|---|
@@ -1,21 +1,55 @@ | ||
1 | 1 … | |
2 | 2 … | |
3 … | + | |
3 | 4 … | |
4 | 5 … | |
6 … | + | |
5 | 7 … | |
6 | -static float keymap[256] = {0}; | |
8 … | +static float notes[256] = {0}; | |
9 … | +static float dampen[256] = {0}; | |
7 | 10 … | |
8 | -float play(void *obj, double time, float in, unsigned char midi_cmd[3]) | |
11 … | +static float freqs[256] = {0}; | |
12 … | +static int got_freqs = 0; | |
13 … | + | |
14 … | +// static float buf[48000] = {0}; | |
15 … | + | |
16 … | +float get_freq(int i) | |
9 | 17 … | { |
18 … | + if (!got_freqs) { | |
19 … | + for (int i = 0; i < 256; i++) { | |
20 … | + freqs[i] = 440. * exp2((i-69) / 12.); | |
21 … | + } | |
22 … | + got_freqs = 1; | |
23 … | + } | |
24 … | + return freqs[i]; | |
25 … | +} | |
26 … | + | |
27 … | +float saw(float x, float t) | |
28 … | +{ | |
29 … | + return fmodf(t, 1./x) * x*2. - 1.; | |
30 … | +} | |
31 … | + | |
32 … | +float play(void **obj, double time, float in, unsigned char midi_cmd[3]) | |
33 … | +{ | |
34 … | + // return in * 10; | |
35 … | + // return sin(2. * M_PI * time * 440.) * 0.1 + in * 0.9; | |
10 | 36 … | struct { |
11 | 37 … | struct foobuf *buf; |
12 | - float *keymap; | |
13 | - } *state = obj; | |
38 … | + // float *keymap; | |
39 … | + } **statep = (void *)obj, *state; | |
14 | 40 … | |
15 | - struct_init(&state); | |
16 | - // foobuf_init(&state->buf, 48000); | |
41 … | + if (struct_init(statep)) { | |
42 … | + warn("foobuf_init"); | |
43 … | + return 0; | |
44 … | + } | |
45 … | + state = *statep; | |
46 … | + if (foobuf_init(&state->buf, 48000)) { | |
47 … | + warn("foobuf_init"); | |
48 … | + return 0; | |
49 … | + } | |
17 | 50 … | // array_init(&state->keymap, 256); |
51 … | + | |
18 | 52 … | /* |
19 | 53 … | static float keymap[256]; |
20 | 54 … | if (!state->keymap) { |
21 | 55 … | state->keymap = keymap; |
@@ -27,29 +61,38 @@ | ||
27 | 61 … | |
28 | 62 … | if (midi_cmd) { |
29 | 63 … | // float val = sin(2. * M_PI * (float)i/buf_size * freq); |
30 | 64 … | if (midi_cmd[0] == 0x90) { |
31 | - keymap[midi_cmd[1]] = (float)midi_cmd[2]/255.; | |
32 | - } else if (midi_cmd[0] == 0x90) { | |
33 | - keymap[midi_cmd[1]] = 0; | |
65 … | + // printf("key %u\n", midi_cmd[1]); | |
66 … | + notes[midi_cmd[1]] += (float)midi_cmd[2]/255.; | |
67 … | + dampen[midi_cmd[1]] = 0; | |
68 … | + } else if (midi_cmd[0] == 0x80) { | |
69 … | + dampen[midi_cmd[1]] += (float)midi_cmd[2]/255.; | |
34 | 70 … | } else { |
35 | 71 … | // printf("midi %x %x %x\n", buf[0], buf[1], buf[2]); |
36 | 72 … | } |
73 … | + } | |
37 | 74 … | |
38 | - for (size_t i = 0; i < 256; i++) { | |
39 | - float val = keymap[i]; | |
40 | - if (val > 0.01) { | |
41 | - float freq = exp2f((float)(i-69) / 12); | |
42 | - out += sin(2. * M_PI * time * freq); | |
43 | - printf("i %zu %f %f\n", i, (double)freq, val); | |
44 | - keymap[i] /= 2; | |
45 | - } | |
75 … | + float total = 0; | |
76 … | + | |
77 … | + for (int i = 0; i < 256; i++) { | |
78 … | + if (notes[i] > 0.01) { | |
79 … | + float freq = get_freq(i); | |
80 … | + total += notes[i]; | |
81 … | + out += notes[i] * saw(freq, time); | |
82 … | + // out += notes[i] * sin(2. * M_PI * time * freq); | |
83 … | + notes[i] *= 0.99999 * (1 - dampen[i] * 0.001); | |
46 | 84 … | } |
85 … | + if (dampen[i] > 0.001) dampen[i] *= 0.9999; | |
47 | 86 … | } |
87 … | + | |
48 | 88 … | // return sin(2. * M_PI * time * 440.) * 0.25 + in * 0.75; |
49 | 89 … | |
50 | - // float out = in*0.5 + foobuf_read(state->buf, 0)*0.5; | |
51 | - // foobuf_read(state->buf, 0)*0.5; | |
52 | - // float out2 = in*0.5 + out*0.5; | |
53 | - // foobuf_write(state->buf, out); | |
54 | - return out; | |
90 … | + // out += foobuf_read(state->buf, 500)*0.9; | |
91 … | + out += in*180; | |
92 … | + // out = in*0.1 + foobuf_read(state->buf, 48000)*0.9; | |
93 … | + foobuf_write(state->buf, out); | |
94 … | + // return out; | |
95 … | + return out * 0.25; | |
96 … | + // return out / total; | |
97 … | + // return 1/(1. + exp(-out * 4)) * 0.99; | |
55 | 98 … | } |
tune.h | ||
---|---|---|
@@ -1,15 +1,5 @@ | ||
1 | 1 … | |
2 | 2 … | |
3 | -typedef float play_fn(void *, double time, float in, unsigned char midi_cmd[3]); | |
3 … | +typedef float play_fn(void **, double time, float in, unsigned char midi_cmd[3]); | |
4 | 4 … | |
5 | - | |
6 | - | |
7 | - | |
8 | -static inline int _struct_init(void **ptr, size_t size) | |
9 | -{ | |
10 | - if (*ptr) return 0; | |
11 | - if ((*ptr = calloc(size, 1))) return 0; | |
12 | - return 1; | |
13 | -} | |
14 | - | |
15 | 5 … | extern play_fn play; |
Built with git-ssb-web