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