summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2014-04-28 18:06:42 +1000
committerDamien Zammit <damien@zamaudio.com>2014-04-28 18:06:42 +1000
commit787cbe95ef61506af875cfe2ec35d935f8d537e8 (patch)
tree1002a4fe3c71da2c25dc9149a3a5971669722c40
parent4abb9e1d658ab6fb8075ab594d79a6139b40b242 (diff)
Getting there
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r--plugins/ZamSynth/ZamSynthPlugin.cpp28
-rw-r--r--plugins/ZamSynth/ZamSynthUI.cpp43
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);