Commit 1d67f693f364e55fe7c4f752a49923bb51c6875b
Make delay configurable via midi
cel committed on 11/5/2016, 1:20:52 AMParent: 17960117c91fac592902939ab1835bbd28b27189
Files changed
tune.c | changed |
tune.c | |||
---|---|---|---|
@@ -20,17 +20,19 @@ | |||
20 | 20 … | // return in * 10; | |
21 | 21 … | // return sin(2. * M_PI * time * 440.) * 0.1 + in * 0.9; | |
22 | 22 … | struct { | |
23 | 23 … | struct foobuf *buf; | |
24 … | + unsigned int delay; | ||
24 | 25 … | // float *keymap; | |
25 | 26 … | } **statep = (void *)obj, *state; | |
26 | 27 … | ||
27 | 28 … | if (struct_init(statep)) { | |
28 | 29 … | warn("foobuf_init"); | |
29 | 30 … | return 0; | |
30 | 31 … | } | |
31 | 32 … | state = *statep; | |
32 | - if (foobuf_init(&state->buf, 48000)) { | ||
33 … | + if (!state->delay) state->delay = 10; | ||
34 … | + if (foobuf_init(&state->buf, state->delay)) { | ||
33 | 35 … | warn("foobuf_init"); | |
34 | 36 … | return 0; | |
35 | 37 … | } | |
36 | 38 … | // array_init(&state->keymap, 256); | |
@@ -46,16 +48,29 @@ | |||
46 | 48 … | float out = 0; | |
47 | 49 … | ||
48 | 50 … | if (midi_cmd) { | |
49 | 51 … | // float val = sin(2. * M_PI * (float)i/buf_size * freq); | |
50 | - if (midi_cmd[0] == 0x90) { | ||
51 | - // printf("key %u\n", midi_cmd[1]); | ||
52 | - notes[midi_cmd[1]] += (float)midi_cmd[2]/255.; | ||
53 | - dampen[midi_cmd[1]] = 0; | ||
54 | - } else if (midi_cmd[0] == 0x80) { | ||
55 | - dampen[midi_cmd[1]] += (float)midi_cmd[2]/255.; | ||
56 | - } else { | ||
57 | - // printf("midi %x %x %x\n", buf[0], buf[1], buf[2]); | ||
52 … | + switch (midi_cmd[0]) { | ||
53 … | + case 0x90: | ||
54 … | + // printf("key %u\n", midi_cmd[1]); | ||
55 … | + notes[midi_cmd[1]] += (float)midi_cmd[2]/255.; | ||
56 … | + dampen[midi_cmd[1]] = 0; | ||
57 … | + break; | ||
58 … | + case 0x80: | ||
59 … | + dampen[midi_cmd[1]] += (float)midi_cmd[2]/255.; | ||
60 … | + break; | ||
61 … | + case 0xb0: | ||
62 … | + switch (midi_cmd[1]) { | ||
63 … | + case 0x07: | ||
64 … | + state->delay = midi_cmd[2] * 100; | ||
65 … | + break; | ||
66 … | + default: | ||
67 … | + printf("info %x %x\n", midi_cmd[1], midi_cmd[2]); | ||
68 … | + } | ||
69 … | + break; | ||
70 … | + default: | ||
71 … | + printf("midi %x %x %x\n", midi_cmd[0], midi_cmd[1], midi_cmd[2]); | ||
72 … | + break; | ||
58 | 73 … | } | |
59 | 74 … | } | |
60 | 75 … | ||
61 | 76 … | float total = 0; | |
@@ -63,22 +78,22 @@ | |||
63 | 78 … | for (int i = 0; i < 256; i++) { | |
64 | 79 … | if (notes[i] > 0.01) { | |
65 | 80 … | float freq = midi_note_freq(i); | |
66 | 81 … | total += notes[i]; | |
67 | - out += notes[i] * saw(freq, time); | ||
68 | - // out += notes[i] * sin(2. * M_PI * time * freq); | ||
82 … | + // out += notes[i] * saw(freq, time); | ||
83 … | + out += notes[i] * sin(2. * M_PI * time * freq); | ||
69 | 84 … | notes[i] *= 0.99999 * (1 - dampen[i] * 0.001); | |
70 | 85 … | } | |
71 | 86 … | if (dampen[i] > 0.001) dampen[i] *= 0.9999; | |
72 | 87 … | } | |
73 | 88 … | ||
74 | 89 … | // return sin(2. * M_PI * time * 440.) * 0.25 + in * 0.75; | |
75 | 90 … | ||
76 | - // out += foobuf_read(state->buf, 500)*0.9; | ||
77 | - out += in*180; | ||
91 … | + out += foobuf_read(state->buf, 0)*0.9; | ||
92 … | + out += in*100; | ||
78 | 93 … | // out = in*0.1 + foobuf_read(state->buf, 48000)*0.9; | |
79 | 94 … | foobuf_write(state->buf, out); | |
80 | 95 … | // return out; | |
81 | - return out * 0.25; | ||
96 … | + // return out * 0.25; | ||
82 | 97 … | // return out / total; | |
83 | - // return 1/(1. + exp(-out * 4)) * 0.99; | ||
98 … | + return 0.99/(1. + exp(-out * 4)); | ||
84 | 99 … | } |
Built with git-ssb-web