summaryrefslogtreecommitdiff
path: root/apps/plugins/midi
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/midi')
-rw-r--r--apps/plugins/midi/midiutil.c2
-rw-r--r--apps/plugins/midi/sequencer.c6
-rw-r--r--apps/plugins/midi/synth.c50
3 files changed, 40 insertions, 18 deletions
diff --git a/apps/plugins/midi/midiutil.c b/apps/plugins/midi/midiutil.c
index 4562089578..aa3a0cca28 100644
--- a/apps/plugins/midi/midiutil.c
+++ b/apps/plugins/midi/midiutil.c
@@ -124,7 +124,7 @@ struct SynthObject
124 struct GWaveform * wf; 124 struct GWaveform * wf;
125 int delta; 125 int delta;
126 int decay; 126 int decay;
127 unsigned int cp; 127 unsigned int cp; /* unsigned int */
128 int state, loopState, loopDir; 128 int state, loopState, loopDir;
129 int note, vol, ch, isUsed; 129 int note, vol, ch, isUsed;
130 int curRate, curOffset, targetOffset; 130 int curRate, curOffset, targetOffset;
diff --git a/apps/plugins/midi/sequencer.c b/apps/plugins/midi/sequencer.c
index ebd5b76405..fdfd5d7620 100644
--- a/apps/plugins/midi/sequencer.c
+++ b/apps/plugins/midi/sequencer.c
@@ -119,12 +119,13 @@ long pitchTbl[] ICONST_ATTR={
119 73297,73330,73363,73396,73429,73462,73495,73528 119 73297,73330,73363,73396,73429,73462,73495,73528
120}; 120};
121 121
122
122void findDelta(struct SynthObject * so, int ch, int note) 123void findDelta(struct SynthObject * so, int ch, int note)
123{ 124{
124 125
125 struct GWaveform * wf = patchSet[chPat[ch]]->waveforms[patchSet[chPat[ch]]->noteTable[note]]; 126 struct GWaveform * wf = patchSet[chPat[ch]]->waveforms[patchSet[chPat[ch]]->noteTable[note]];
126 so->wf=wf; 127 so->wf=wf;
127 unsigned long delta= 0; /* More percision- extra bit - not so off-key as before */ 128 unsigned int delta= 0;
128 129
129 delta = (((gustable[note]<<FRACTSIZE) / (wf->rootFreq)) * wf->sampRate / (SAMPLE_RATE)); 130 delta = (((gustable[note]<<FRACTSIZE) / (wf->rootFreq)) * wf->sampRate / (SAMPLE_RATE));
130 delta = (delta * pitchTbl[chPW[ch]])>> 16; 131 delta = (delta * pitchTbl[chPW[ch]])>> 16;
@@ -248,10 +249,11 @@ void pressNote(int ch, int note, int vol)
248 } 249 }
249 } 250 }
250} 251}
251 252inline void stopVoice(struct SynthObject * so);
252 253
253void releaseNote(int ch, int note) 254void releaseNote(int ch, int note)
254{ 255{
256
255 if(ch==9) 257 if(ch==9)
256 return; 258 return;
257 259
diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c
index d844cc05ad..95bb88f8c6 100644
--- a/apps/plugins/midi/synth.c
+++ b/apps/plugins/midi/synth.c
@@ -238,7 +238,7 @@ void setPoint(struct SynthObject * so, int pt)
238 * 238 *
239 * Or just move the 1 up one line to optimize a tiny bit. 239 * Or just move the 1 up one line to optimize a tiny bit.
240 */ 240 */
241/* so->curRate = so->curRate << 1;*/ 241 so->curRate = so->curRate << 1;
242 242
243 243
244 so->targetOffset = so->wf->envOffset[pt]<<(20); 244 so->targetOffset = so->wf->envOffset[pt]<<(20);
@@ -251,9 +251,9 @@ inline void stopVoice(struct SynthObject * so)
251{ 251{
252 if(so->state == STATE_RAMPDOWN) 252 if(so->state == STATE_RAMPDOWN)
253 return; 253 return;
254 // so->isUsed = 0;
254 so->state = STATE_RAMPDOWN; 255 so->state = STATE_RAMPDOWN;
255 so->decay = 0; 256 so->decay = 0;
256
257} 257}
258 258
259signed short int synthVoice(struct SynthObject * so) 259signed short int synthVoice(struct SynthObject * so)
@@ -277,7 +277,7 @@ signed short int synthVoice(struct SynthObject * so)
277 if(so->decay < 10 && so->decay > -10) 277 if(so->decay < 10 && so->decay > -10)
278 so->isUsed = 0; 278 so->isUsed = 0;
279 279
280 return so->decay*so->volscale>>14; 280 return so->decay;
281 } 281 }
282 } else /* OK to advance voice */ 282 } else /* OK to advance voice */
283 { 283 {
@@ -287,13 +287,7 @@ signed short int synthVoice(struct SynthObject * so)
287 287
288 cpShifted = so->cp >> FRACTSIZE; //Was 10 288 cpShifted = so->cp >> FRACTSIZE; //Was 10
289 289
290 /* Have we overrun? */ 290
291 if( (cpShifted >= (wf->numSamples-1)))
292 {
293 so->cp -= so->delta;
294 cpShifted = so->cp >> FRACTSIZE;
295 stopVoice(so);
296 }
297 291
298 s2 = getSample((cpShifted)+1, wf); 292 s2 = getSample((cpShifted)+1, wf);
299 293
@@ -307,8 +301,8 @@ signed short int synthVoice(struct SynthObject * so)
307 s2=getSample((cpShifted), wf); 301 s2=getSample((cpShifted), wf);
308 } 302 }
309 else 303 else
310 { 304 {
311 so->delta = -so->delta; 305 so->delta = -so->delta;
312 so->loopDir = LOOPDIR_FORWARD; 306 so->loopDir = LOOPDIR_FORWARD;
313 } 307 }
314 } 308 }
@@ -329,6 +323,20 @@ signed short int synthVoice(struct SynthObject * so)
329 } 323 }
330 } 324 }
331 325
326
327 /* Have we overrun? */
328 if( (cpShifted >= (wf->numSamples-1)))
329 {
330 so->cp -= so->delta;
331
332 cpShifted = so->cp >> FRACTSIZE;
333 s2 = getSample((cpShifted)+1, wf);
334 // if((wf->mode & (28)))
335 // printf("OV1 (loop 2)");
336 stopVoice(so);
337 }
338
339
332 /* Better, working, linear interpolation */ 340 /* Better, working, linear interpolation */
333 s1=getSample((cpShifted), wf); 341 s1=getSample((cpShifted), wf);
334 342
@@ -337,8 +345,10 @@ signed short int synthVoice(struct SynthObject * so)
337/* ADSR COMMENT WOULD GO FROM HERE.........*/ 345/* ADSR COMMENT WOULD GO FROM HERE.........*/
338 346
339 if(so->curRate == 0) 347 if(so->curRate == 0)
348 {
340 stopVoice(so); 349 stopVoice(so);
341 350// printf("OV2");
351 }
342 352
343 if(so->ch != 9 && so->state != STATE_RAMPDOWN) /* Stupid ADSR code... and don't do ADSR for drums */ 353 if(so->ch != 9 && so->state != STATE_RAMPDOWN) /* Stupid ADSR code... and don't do ADSR for drums */
344 { 354 {
@@ -350,7 +360,10 @@ signed short int synthVoice(struct SynthObject * so)
350 if(so->curPoint != 5) 360 if(so->curPoint != 5)
351 setPoint(so, so->curPoint+1); 361 setPoint(so, so->curPoint+1);
352 else 362 else
363 {
353 stopVoice(so); 364 stopVoice(so);
365// printf("OV3");
366 }
354 } 367 }
355 } else 368 } else
356 { 369 {
@@ -361,22 +374,29 @@ signed short int synthVoice(struct SynthObject * so)
361 if(so->curPoint != 5) 374 if(so->curPoint != 5)
362 setPoint(so, so->curPoint+1); 375 setPoint(so, so->curPoint+1);
363 else 376 else
377 {
364 stopVoice(so); 378 stopVoice(so);
379// printf("OV4");
380 }
365 381
366 } 382 }
367 } 383 }
368 } 384 }
369 385
370 if(so->curOffset < 0) 386 if(so->curOffset < 0)
387 {
371 stopVoice(so); 388 stopVoice(so);
372 389// printf("OV5");
390 }
373 s = (s * (so->curOffset >> 22) >> 8); 391 s = (s * (so->curOffset >> 22) >> 8);
374 392
375 393
376 /* need to set ramp beginning */ 394 /* need to set ramp beginning */
377 if(so->state == STATE_RAMPDOWN && so->decay == 0) 395 if(so->state == STATE_RAMPDOWN && so->decay == 0)
378 { 396 {
379 so->decay = s; 397 so->decay = s*so->volscale>>14;
398 if(so->decay == 0)
399 so->decay = 1; /* stupid junk.. */
380 } 400 }
381 401
382 402