diff options
author | Damien Zammit <damien@zamaudio.com> | 2014-04-28 18:06:42 +1000 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2014-04-28 18:06:42 +1000 |
commit | 787cbe95ef61506af875cfe2ec35d935f8d537e8 (patch) | |
tree | 1002a4fe3c71da2c25dc9149a3a5971669722c40 | |
parent | 4abb9e1d658ab6fb8075ab594d79a6139b40b242 (diff) |
Getting there
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r-- | plugins/ZamSynth/ZamSynthPlugin.cpp | 28 | ||||
-rw-r--r-- | plugins/ZamSynth/ZamSynthUI.cpp | 43 |
2 files changed, 43 insertions, 28 deletions
diff --git a/plugins/ZamSynth/ZamSynthPlugin.cpp b/plugins/ZamSynth/ZamSynthPlugin.cpp index f49d1df..376849c 100644 --- a/plugins/ZamSynth/ZamSynthPlugin.cpp +++ b/plugins/ZamSynth/ZamSynthPlugin.cpp @@ -128,7 +128,7 @@ void ZamSynthPlugin::d_setProgram(uint32_t index) } for (int i = 0; i < MAX_ENV; i++) { - env_y[i] = sin(i*2.*M_PI/d_getSampleRate()*1000./2.); + env_y[i] = (sin(i*2.*M_PI/d_getSampleRate()*1000./2.)) > 0.f ? sin(i*2.*M_PI/d_getSampleRate()*1000./2.) : 0.f; } /* reset filter values */ d_activate(); @@ -157,7 +157,7 @@ void ZamSynthPlugin::d_setState(const char* key, const char* value) while ((tmp != NULL) && (i < MAX_ENV)) { env_y[i] = ((float) atoi(tmp))/MAX_ENV - 0.5; i++; - //printf("dsp wave_y[%d]=%.2f ", i, wave_y[i]); + //printf("dsp env_y[%d]=%.2f ", i, env_y[i]); tmp = strtok(NULL, " "); } } @@ -268,11 +268,12 @@ void ZamSynthPlugin::d_run(float**, float** outputs, uint32_t frames, continue; } if (v2 != -1) { + voice[v2].notenum = -1; //printf("note already off, do nothing\n"); - voice[v2].envpos = 0; - voice[v2].curamp = 0.f; - voice[v2].vi = 0.f; - voice[v2].playing = false; + // //voice[v2].envpos = 0; + //voice[v2].curamp = 0.f; + //voice[v2].vi = 0.f; + //voice[v2].playing = false; //printf("OFF: nvoices = %d\n", nvoices); } } @@ -315,6 +316,10 @@ void ZamSynthPlugin::d_run(float**, float** outputs, uint32_t frames, j->vi = 0.f; j->playing = false; curvoice--; + nvoices = 0; + for (int k = 0; k < 128; k++) + if (voice[k].playing) + nvoices++; nvoices--; if (nvoices < 0) { curvoice = voice + MAX_VOICES-1; @@ -331,7 +336,8 @@ void ZamSynthPlugin::d_run(float**, float** outputs, uint32_t frames, } for (k = 0; k < 128; k++) { float rampfreq; - if (voice[k].curamp < 0.01f) continue; + if (voice[k].curamp < 0.f && voice[k].playing) printf("WTF NEG\n"); + if (!voice[k].playing) continue; signal = true; rampfreq = 440.0*powf(2.0, (voice[k].notenum-48.0-36)/12.); @@ -345,12 +351,12 @@ void ZamSynthPlugin::d_run(float**, float** outputs, uint32_t frames, wave = wavetable(voice[k].rampstate); power += sqrt(voice[k].curamp); - outl += wave*voice[k].curamp; - outr += wave*voice[k].curamp; + outl += wave*voice[k].curamp/5.; + outr += wave*voice[k].curamp/5.; } if (signal) { - outl *= (nvoices)/(10. * power); - outr *= (nvoices)/(10. * power); + //outl; + //outr; outputs[0][i] = outl*from_dB(gain); outputs[1][i] = outr*from_dB(gain); } else { diff --git a/plugins/ZamSynth/ZamSynthUI.cpp b/plugins/ZamSynth/ZamSynthUI.cpp index 2afc28c..c23eaaa 100644 --- a/plugins/ZamSynth/ZamSynthUI.cpp +++ b/plugins/ZamSynth/ZamSynthUI.cpp @@ -59,15 +59,14 @@ ZamSynthUI::ZamSynthUI() fCanvasArea.setSize(AREAHEIGHT,AREAHEIGHT); for (int i = 0; i < AREAHEIGHT; i++) { wave_y[i] = -(AREAHEIGHT*(sin(2.*i*M_PI/AREAHEIGHT)-1.0))/2.; - env_y[i] = -(2*AREAHEIGHT*(sin(2.*i*M_PI/AREAHEIGHT/2.)-1.0))/2.; + env_y[i] = -(2*AREAHEIGHT*(sin(2.*i*M_PI/AREAHEIGHT/2.)-1.0))/2. < AREAHEIGHT / 2. ? -(2*AREAHEIGHT*(sin(2.*i*M_PI/AREAHEIGHT/2.)-1.0))/2. : AREAHEIGHT / 2.; } // toggle fToggleGraph = new ImageToggle(this, toggleonImage, toggleoffImage, toggleoffImage); fToggleGraph->setPos(290, 85); fToggleGraph->setCallback(this); - - fGraph = false; + fToggleGraph->setValue(0.f); } ZamSynthUI::~ZamSynthUI() @@ -116,6 +115,9 @@ void ZamSynthUI::d_parameterChanged(uint32_t index, float value) case ZamSynthPlugin::paramGain: fKnobGain->setValue(value); break; + case ZamSynthPlugin::paramGraph: + fToggleGraph->setValue(value); + break; } } @@ -158,7 +160,7 @@ void ZamSynthUI::imageButtonClicked(ImageButton*, int) } float *gr; - gr = (fGraph) ? env_y : wave_y; + gr = (fToggleGraph->getValue() == 1.f) ? env_y : wave_y; gaussiansmooth(wavesmooth, xs, gr, AREAHEIGHT, 4); memcpy(gr, wavesmooth, AREAHEIGHT*sizeof(float)); @@ -170,7 +172,7 @@ void ZamSynthUI::imageButtonClicked(ImageButton*, int) strcat(tmp, wavestr); } - if (fGraph) + if (fToggleGraph->getValue() == 1.f) d_setState("envelope", tmp); else d_setState("waveform", tmp); @@ -178,7 +180,9 @@ void ZamSynthUI::imageButtonClicked(ImageButton*, int) void ZamSynthUI::imageToggleClicked(ImageToggle*, int) { - fGraph = !fGraph; + float toggle = fToggleGraph->getValue(); + fToggleGraph->setValue(toggle); + d_setParameterValue(ZamSynthPlugin::paramGraph, toggle); } void ZamSynthUI::gaussiansmooth(float* smoothed, float* xs, float* ys, int n, int radius) @@ -206,8 +210,10 @@ bool ZamSynthUI::onMouse(int button, bool press, int x, int y) if (press) { - if (! fCanvasArea.contains(x, y)) + if (! fCanvasArea.contains(x, y)) { + //fDragValid = false; return false; + } fDragging = true; fDragValid = true; @@ -230,19 +236,22 @@ bool ZamSynthUI::onMotion(int x, int y) { fDragValid = true; } - + if (x > fCanvasArea.getWidth()+10) - x = fCanvasArea.getWidth()+10; - - if (y > fCanvasArea.getHeight()+10) - y = fCanvasArea.getHeight()+10; - + x = fCanvasArea.getWidth()+10; if (x < 10) x = 10; if (y < 10) y = 10; - + float *gr; - - gr = (fGraph) ? env_y : wave_y; + if (fToggleGraph->getValue() == 0.f) { + gr = wave_y; + if (y > fCanvasArea.getHeight()+10) + y = fCanvasArea.getHeight()+10; + } else { + gr = env_y; + if (y > fCanvasArea.getHeight() / 2. + 10) + y = fCanvasArea.getHeight() / 2. + 10; + } if (gr[x-10] != (y-10)) { char tmp[4*AREAHEIGHT+1] = {0}; @@ -278,7 +287,7 @@ void ZamSynthUI::onDisplay() glLineWidth(2); float *gr; - gr = (fGraph) ? env_y : wave_y; + gr = (fToggleGraph->getValue() == 1.f) ? env_y : wave_y; int i; glColor4f(0.235f, 1.f, 0.235f, 1.0f); |