summaryrefslogtreecommitdiff
path: root/apps/plugins/midi/synth.c
diff options
context:
space:
mode:
authorStepan Moskovchenko <stevenm@rockbox.org>2006-10-03 21:09:47 +0000
committerStepan Moskovchenko <stevenm@rockbox.org>2006-10-03 21:09:47 +0000
commitc84461fb8f9404b2b32d90a649b63b669e1a6bb8 (patch)
tree4b9e5b78b1abb5bfc6eccb61a86236427cb32bf4 /apps/plugins/midi/synth.c
parentf5a356989980aeabdfb6446d65d54cf8ec7928ab (diff)
downloadrockbox-c84461fb8f9404b2b32d90a649b63b669e1a6bb8.zip
rockbox-c84461fb8f9404b2b32d90a649b63b669e1a6bb8.tar.gz
rockbox-c84461fb8f9404b2b32d90a649b63b669e1a6bb8.tar.bz2
rockbox-c84461fb8f9404b2b32d90a649b63b669e1a6bb8.tar.xz
More adsr related nonsense, argh! Fix adsr related problem on some notes being stopped instead of
looped. Ramping code still not quite right, but dont want to lose this. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11117 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/midi/synth.c')
-rw-r--r--apps/plugins/midi/synth.c50
1 files changed, 35 insertions, 15 deletions
diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c
index d844cc0..95bb88f 100644
--- a/apps/plugins/midi/synth.c
+++ b/apps/plugins/midi/synth.c
@@ -238,7 +238,7 @@ void setPoint(struct SynthObject * so, int pt)
*
* Or just move the 1 up one line to optimize a tiny bit.
*/
-/* so->curRate = so->curRate << 1;*/
+ so->curRate = so->curRate << 1;
so->targetOffset = so->wf->envOffset[pt]<<(20);
@@ -251,9 +251,9 @@ inline void stopVoice(struct SynthObject * so)
{
if(so->state == STATE_RAMPDOWN)
return;
+ // so->isUsed = 0;
so->state = STATE_RAMPDOWN;
so->decay = 0;
-
}
signed short int synthVoice(struct SynthObject * so)
@@ -277,7 +277,7 @@ signed short int synthVoice(struct SynthObject * so)
if(so->decay < 10 && so->decay > -10)
so->isUsed = 0;
- return so->decay*so->volscale>>14;
+ return so->decay;
}
} else /* OK to advance voice */
{
@@ -287,13 +287,7 @@ signed short int synthVoice(struct SynthObject * so)
cpShifted = so->cp >> FRACTSIZE; //Was 10
- /* Have we overrun? */
- if( (cpShifted >= (wf->numSamples-1)))
- {
- so->cp -= so->delta;
- cpShifted = so->cp >> FRACTSIZE;
- stopVoice(so);
- }
+
s2 = getSample((cpShifted)+1, wf);
@@ -307,8 +301,8 @@ signed short int synthVoice(struct SynthObject * so)
s2=getSample((cpShifted), wf);
}
else
- {
- so->delta = -so->delta;
+ {
+ so->delta = -so->delta;
so->loopDir = LOOPDIR_FORWARD;
}
}
@@ -329,6 +323,20 @@ signed short int synthVoice(struct SynthObject * so)
}
}
+
+ /* Have we overrun? */
+ if( (cpShifted >= (wf->numSamples-1)))
+ {
+ so->cp -= so->delta;
+
+ cpShifted = so->cp >> FRACTSIZE;
+ s2 = getSample((cpShifted)+1, wf);
+ // if((wf->mode & (28)))
+ // printf("OV1 (loop 2)");
+ stopVoice(so);
+ }
+
+
/* Better, working, linear interpolation */
s1=getSample((cpShifted), wf);
@@ -337,8 +345,10 @@ signed short int synthVoice(struct SynthObject * so)
/* ADSR COMMENT WOULD GO FROM HERE.........*/
if(so->curRate == 0)
+ {
stopVoice(so);
-
+// printf("OV2");
+ }
if(so->ch != 9 && so->state != STATE_RAMPDOWN) /* Stupid ADSR code... and don't do ADSR for drums */
{
@@ -350,7 +360,10 @@ signed short int synthVoice(struct SynthObject * so)
if(so->curPoint != 5)
setPoint(so, so->curPoint+1);
else
+ {
stopVoice(so);
+// printf("OV3");
+ }
}
} else
{
@@ -361,22 +374,29 @@ signed short int synthVoice(struct SynthObject * so)
if(so->curPoint != 5)
setPoint(so, so->curPoint+1);
else
+ {
stopVoice(so);
+// printf("OV4");
+ }
}
}
}
if(so->curOffset < 0)
+ {
stopVoice(so);
-
+// printf("OV5");
+ }
s = (s * (so->curOffset >> 22) >> 8);
/* need to set ramp beginning */
if(so->state == STATE_RAMPDOWN && so->decay == 0)
{
- so->decay = s;
+ so->decay = s*so->volscale>>14;
+ if(so->decay == 0)
+ so->decay = 1; /* stupid junk.. */
}