it works :)
[maximus:tilde.git] / puredata.h
1 #include <algorithm>
2 #include <cmath>
3
4 using namespace std;
5
6 typedef float sample;
7
8 inline sample clip(sample x, sample lo, sample hi) {
9   return min(max(x, lo), hi);
10 }
11
12 inline sample rmstodb(sample x) {
13   if (x <= 0) {
14     return 0;
15   } else {
16     return max(sample(0), 100 + 20 * log10(x));
17   }
18 }
19 inline sample dbtorms(sample x) {
20   if (x <= 0) {
21     return 0;
22   } else {
23     return pow10((min(x, sample(485)) - 100) / 20);
24   }
25 }
26
27 #define PI 3.141592653589793
28 #define SR 44100
29
30 #define ADDf_state(S) sample S;
31 #define ADDf_init(S,R) S = R;
32 #define ADDf_dsp(S,O,L) O = L + S;
33
34 #define SUBf_state(S) sample S;
35 #define SUBf_init(S,R) S = R;
36 #define SUBf_dsp(S,O,L) O = L - S;
37
38 #define MULf_state(S) sample S;
39 #define MULf_init(S,R) S = R;
40 #define MULf_dsp(S,O,L) O = L * S;
41
42 #define DIVf_state(S) sample S;
43 #define DIVf_init(S,R) S = R;
44 #define DIVf_dsp(S,O,L) O = L / S;
45
46 #define ADD_dsp(S,O,L,R) O = L + R;
47
48 #define SUB_dsp(S,O,L,R) O = L - R;
49
50 #define MUL_dsp(S,O,L,R) O = L * R;
51
52 #define DIV_dsp(S,O,L,R) O = L / R;
53
54 #define DBTORMS_dsp(S,O,I) O = dbtorms(I);
55 #define RMSTODB_dsp(S,O,I) O = rmstodb(I);
56 #define SQRT_dsp(S,O,I) O = sqrt(I);
57 #define TANH_dsp(S,O,I) O = tanh(I);
58
59 #define HIPf_state(S) struct { sample last, coef; } S;
60 #define HIPf_init(S,HZ) { S.last = 0; S.coef = clip(1 - HZ * 2 * PI / SR, 0, 1); }
61 #define HIPf_dsp(S,O,I) { sample next = I + S.coef * S.last; O = next - S.last; S.last = next; }
62
63 #define HIP_state(S) HIPf_state(S)
64 #define HIP_init(S) HIPf_init(S,0)
65 #define HIP_dsp(S,O,I) HIPf_dsp(S,O,I)
66
67 #define LOPf_state(S) struct { sample last, coef, feedback; } S;
68 #define LOPf_init(S,HZ) { S.last = 0; S.coef = clip(HZ * 2 * PI / SR, 0, 1); S.feedback = 1 - S.coef; }
69 #define LOPf_dsp(S,O,I) { O = S.last = S.coef * I + S.feedback * S.last; }
70
71 #define LOP_state(S) LOPf_state(S)
72 #define LOP_init(S) LOPf_init(S,0)
73 #define LOP_dsp(S,O,I) LOPf_dsp(S,O,I)
74
75 #define ADC_state(S) sample *S[2];
76 #define ADC_init(S) { S[0] = &(state->adc[0]); S[1] = &(state->adc[1]); }
77 #define ADC_dsp(S,L,R) { L = *(S[0]); R = *(S[1]); }
78
79 #define DAC_state(S) sample *S[2];
80 #define DAC_init(S) { S[0] = &(state->dac[0]); S[1] = &(state->dac[1]); }
81 #define DAC_dsp(S,L,R) { *(S[0]) = L; *(S[1]) = R; }