diff options
author | Damien Zammit <damien@zamaudio.com> | 2015-01-17 18:44:30 +1100 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2015-01-17 18:44:30 +1100 |
commit | 0088d6d913bf8bd64fceeb31e7c2a0e743493eff (patch) | |
tree | a4336673ac796ae471af9ff8aa67438a3349b676 /plugins/ZamPiano | |
parent | 8ea3b5f41288a0988744c25767389dba55dddd30 (diff) |
More progress on ZamPiano
Signed-off-by: Damien Zammit <damien@zamaudio.com>
Diffstat (limited to 'plugins/ZamPiano')
-rw-r--r-- | plugins/ZamPiano/ZamPianoPlugin.cpp | 79 | ||||
-rw-r--r-- | plugins/ZamPiano/ZamPianoPlugin.hpp | 13 |
2 files changed, 45 insertions, 47 deletions
diff --git a/plugins/ZamPiano/ZamPianoPlugin.cpp b/plugins/ZamPiano/ZamPianoPlugin.cpp index 7ea893a..0ba5637 100644 --- a/plugins/ZamPiano/ZamPianoPlugin.cpp +++ b/plugins/ZamPiano/ZamPianoPlugin.cpp @@ -118,13 +118,14 @@ double ZamPianoPlugin::f0(int n) void ZamPianoPlugin::d_activate() { int i; - for (i = 0; i < 2000; i++) { + for (i = 0; i < 128; i++) { ff0[i] = f0(i); ff1[i] = 0.; + integrala[i] = 0.; + integralb[i] = 0.; timepos[i] = 0.; - } - for (i = 0; i < 128; i++) { note[i].state = SILENT; + note[i].vel = 0.; } } @@ -203,6 +204,7 @@ double ZamPianoPlugin::mu(int n) double ZamPianoPlugin::a(int i, int n) { float strike = 0.105; + if (i == 0.) return 1.; return sin(strike*i*M_PI)/(i*M_PI*c(n)*mu(n)); } @@ -216,43 +218,40 @@ void ZamPianoPlugin::e(int n, double vhammer, int *state, float *out, uint32_t f { double sr = d_getSampleRate(); double t0 = 0.008; //1000 0.8ms contact time - int N = t0 * (frames); - double dt = 1. / (sr); - double t = 0.; + //int N = t0 * frames; + double dt = 1. / sr; + double t; uint32_t i; - int j; - double intega = 0.; - double integb = 0.; //vhammer /= 1000.; memset(fftvars.cmplex[0], 0, 4096*sizeof(float)); memset(fftvars.cmplex[1], 0, 4096*sizeof(float)); - for (i = 0; i < frames; i++) { - intega = (*state == ATTACK) ? 0. : integrala[n]; - integb = (*state == ATTACK) ? 0. : integralb[n]; - ff0[0] = (*state == ATTACK) ? f0(n) : ff0[0]; - t = timepos[n]; - for (j = 0; j < N; j++) { - ff1[j] = fk1(ff0[j], dt, t, n); - intega += ff1[j] * a(i, n) * cos(w(i, n) * t / frames) * dt; - integb -= ff1[j] * a(i, n) * sin(w(i, n) * t / frames) * dt; - ff0[j] = ff1[j]; - t += dt; - } - fftvars.cmplex[0][i] = 10. * log( (2.*mstring(n)*w(i, n)*w(i, n) / (mhammer(n)*vhammer*vhammer) - * (intega*intega)) ) / frames; - fftvars.cmplex[1][i] = 10. * log( (2.*mstring(n)*w(i, n)*w(i, n) + ff0[n] = (*state == STRIKE) ? f0(n) : ff0[n]; + timepos[n] = (*state == STRIKE) ? 0. : timepos[n]; + + for (i = 0; i < frames; i++) { + ff1[n] = fk1(ff0[n], dt, timepos[n], n); + integrala[n] += ff1[n] * a(i, n) * cos(w(i, n) * timepos[n]) * dt; + integralb[n] -= ff1[n] * a(i, n) * sin(w(i, n) * timepos[n]) * dt; + + ff0[n] = ff1[n]; + timepos[n] += dt; + //printf("%f, %f, %f\n", integrala[n], integralb[n], ff0[n]); + } + for (i = 0; i < frames; i++) { + fftvars.cmplex[0][i] = ( (2.*mstring(n)*w(i, n)*w(i, n) / (mhammer(n)*vhammer*vhammer) - * (integb*integb)) ) / frames; - //printf("%f\n", fftvars.cmplex[0][i]); + * (integrala[n])) ); + fftvars.cmplex[1][i] = ( (2.*mstring(n)*w(i, n)*w(i, n) + / (mhammer(n)*vhammer*vhammer) + * (integralb[n])) ); + //printf("%f %f\n", fftvars.cmplex[0][i], fftvars.cmplex[1][i]); } - integrala[n] = intega; - integralb[n] = integb; - timepos[n] += t0; + if (*state == STRIKE) *state = ATTACK; if (timepos[n] >= t0) { *state = SUSTAIN; } - if (timepos[n] > 2) { + if (timepos[n] > 0.7) { *state = SILENT; timepos[n] = 0; integrala[n] = 0.; @@ -268,16 +267,15 @@ void ZamPianoPlugin::e(int n, double vhammer, int *state, float *out, uint32_t f fftvars.fft_inverse(); - float scale = 1. / frames; - for (i = 0; i < frames; i++) { + float scale = 1. / fftvars.ffttime[0]; + for (i = 1; i < frames; i++) { out[i] += fftvars.ffttime[i] * scale; - if (out[i] > 0.2) out[i] = 0.2; - if (out[i] < -0.2) out[i] = -0.2; + //if (out[i] > 0.2) out[i] = 0.2; + //if (out[i] < -0.2) out[i] = -0.2; //printf("%e\n", out[i]); } - //out[0] += 1.; - + out[0] += 1.; } void ZamPianoPlugin::d_run(const float**, float** outputs, uint32_t frames, @@ -293,7 +291,7 @@ void ZamPianoPlugin::d_run(const float**, float** outputs, uint32_t frames, int v = midievent[i].data[2]; if (type == 0x90 && chan == 0x0) { // NOTE ON - note[n].state = ATTACK; + note[n].state = STRIKE; note[n].vel = v / 127.f; } else if (type == 0x80 && chan == 0x0) { @@ -311,19 +309,18 @@ void ZamPianoPlugin::d_run(const float**, float** outputs, uint32_t frames, for (k = 0; k < 128; k++) { if (k > 87) continue; if (note[k].state == SILENT) { - //e(k, 0.001, ¬e[k].state, outputs[0], frames); continue; } signal = true; - if (note[k].state == ATTACK) { + if (note[k].state == STRIKE || note[k].state == ATTACK) { printf("ATT: %d\n", k); e(k, 5.*note[k].vel, ¬e[k].state, outputs[0], frames); } else if (note[k].state == SUSTAIN) { printf("SUS: %d\n", k); - e(k, 0.001, ¬e[k].state, outputs[0], frames); + e(k, 0.1, ¬e[k].state, outputs[0], frames); } else if (note[k].state == RELEASE) { printf("REL: %d\n", k); - e(k, 0.001, ¬e[k].state, outputs[0], frames); + e(k, 0.1, ¬e[k].state, outputs[0], frames); } } for (i = 0; i < frames; i++) { diff --git a/plugins/ZamPiano/ZamPianoPlugin.hpp b/plugins/ZamPiano/ZamPianoPlugin.hpp index 8d49c83..2a82f1b 100644 --- a/plugins/ZamPiano/ZamPianoPlugin.hpp +++ b/plugins/ZamPiano/ZamPianoPlugin.hpp @@ -21,10 +21,11 @@ #include <string.h> #include "DistrhoPlugin.hpp" -#define ATTACK 0 -#define SUSTAIN 1 -#define RELEASE 2 -#define SILENT 3 +#define STRIKE 0 +#define ATTACK 1 +#define SUSTAIN 2 +#define RELEASE 3 +#define SILENT 4 #define MAX_SAMP_FRAME 4096 @@ -136,8 +137,8 @@ protected: } note_t; note_t note[128]; - double ff0[2000], ff1[2000], integrala[2000], - integralb[2000], timepos[2000]; + double ff0[128], ff1[128], integrala[128], + integralb[128], timepos[128]; private: float gain; }; |