Skip to content

Commit 75389ed

Browse files
committed
WIP MoonSound/OPL4
1 parent d395c1a commit 75389ed

File tree

1 file changed

+27
-12
lines changed

1 file changed

+27
-12
lines changed

src/main/msx/audio/OPL4AudioWave.js

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ wmsx.OPL4AudioWave = function(opl4) {
221221
case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f:
222222
cha = reg - 0x68;
223223
if (mod & 0x80) setKeyOn(cha, val >> 7); // KEY ON
224+
if (mod & 0x40)
225+
if (val & 0x40) setEnvStep(cha, DAMP_END); // DAMP
224226
break;
225227
case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f: case 0xa0: case 0xa1: case 0xa2: case 0xa3:
226228
case 0xa4: case 0xa5: case 0xa6: case 0xa7: case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
@@ -296,7 +298,7 @@ wmsx.OPL4AudioWave = function(opl4) {
296298
keyOn[cha] = on;
297299
// Define ADSR phase
298300
if (on) {
299-
setEnvStep(cha, DAMP);
301+
setEnvStep(cha, DAMP_START);
300302

301303
// console.log("Note:", cha, waveNumber[cha], octave[cha], fNum[cha], phaseInc[cha].toString(16));
302304
} else
@@ -370,9 +372,10 @@ wmsx.OPL4AudioWave = function(opl4) {
370372

371373
function setEnvStep(cha, step) {
372374
envStep[cha] = step;
373-
var reverbEnvLevel = 6 << 3;
375+
var reverbEnvLevel = 6 << 3; // -18 dB
376+
var nextLevel;
374377
switch (step) {
375-
case DAMP:
378+
case DAMP_START:
376379
envStepLevelDur[cha] = 1; // rateDecayDurTable[(14 << 2)];
377380
envStepLevelIncClock[cha] = clock + envStepLevelDur[cha];
378381
envStepLevelInc[cha] = 1;
@@ -391,19 +394,21 @@ wmsx.OPL4AudioWave = function(opl4) {
391394
envStepLevelDur[cha] = d1r[cha] === 0 ? 0 : rateDecayDurTable[d1r[cha] + rcOffset[cha]];
392395
envStepLevelIncClock[cha] = clock + envStepLevelDur[cha];
393396
envStepLevelInc[cha] = 1;
394-
envStepNextAtLevel[cha] = dl[cha] << 3;
395-
envStepNext[cha] = DECAY2;
396-
if (reverb[cha] && envStepNextAtLevel[cha] >= reverbEnvLevel) {
397-
envStepNextAtLevel[cha] = reverbEnvLevel; // ~ 18 dB
397+
nextLevel = dl[cha] << 3;
398+
if (reverb[cha] && nextLevel >= reverbEnvLevel) {
399+
envStepNextAtLevel[cha] = reverbEnvLevel;
398400
envStepNext[cha] = REVERB;
401+
} else {
402+
envStepNextAtLevel[cha] = nextLevel;
403+
envStepNext[cha] = DECAY2;
399404
}
400405
break;
401406
case DECAY2:
402407
envStepLevelDur[cha] = d2r[cha] === 0 ? 0 : rateDecayDurTable[d2r[cha] + rcOffset[cha]];
403408
envStepLevelIncClock[cha] = clock + envStepLevelDur[cha];
404409
envStepLevelInc[cha] = 1;
405410
if (reverb[cha] && envLevel[cha] < reverbEnvLevel) {
406-
envStepNextAtLevel[cha] = reverbEnvLevel; // ~ 18 dB
411+
envStepNextAtLevel[cha] = reverbEnvLevel;
407412
envStepNext[cha] = REVERB;
408413
} else {
409414
envStepNextAtLevel[cha] = 256;
@@ -414,9 +419,12 @@ wmsx.OPL4AudioWave = function(opl4) {
414419
envStepLevelDur[cha] = rr[cha] === 0 ? 0 : rateDecayDurTable[rr[cha] + rcOffset[cha]];
415420
envStepLevelIncClock[cha] = clock + envStepLevelDur[cha];
416421
envStepLevelInc[cha] = 1;
417-
if (reverb[cha] && envLevel[cha] < reverbEnvLevel) {
418-
envStepNextAtLevel[cha] = reverbEnvLevel; // ~ 18 dB
419-
envStepNext[cha] = REVERB;
422+
if (reverb[cha]) {
423+
if (envLevel[cha] < reverbEnvLevel) {
424+
envStepNextAtLevel[cha] = reverbEnvLevel;
425+
envStepNext[cha] = REVERB;
426+
} else
427+
setEnvStep(cha, REVERB);
420428
} else {
421429
envStepNextAtLevel[cha] = 256;
422430
envStepNext[cha] = IDLE;
@@ -429,6 +437,13 @@ wmsx.OPL4AudioWave = function(opl4) {
429437
envStepNextAtLevel[cha] = 256;
430438
envStepNext[cha] = IDLE;
431439
break;
440+
case DAMP_END:
441+
envStepLevelDur[cha] = rateDecayDurTable[(14 << 2)];
442+
envStepLevelIncClock[cha] = clock + envStepLevelDur[cha];
443+
envStepLevelInc[cha] = 1;
444+
envStepNextAtLevel[cha] = 256;
445+
envStepNext[cha] = IDLE;
446+
break;
432447
case IDLE:
433448
default:
434449
envLevel[cha] = 256;
@@ -535,7 +550,7 @@ wmsx.OPL4AudioWave = function(opl4) {
535550

536551
// Constants
537552

538-
var IDLE = 255, DAMP = 0, ATTACK = 1, DECAY1 = 2, DECAY2 = 3, RELEASE = 4, REVERB = 5; // Envelope steps
553+
var IDLE = 255, DAMP_START = 0, ATTACK = 1, DECAY1 = 2, DECAY2 = 3, RELEASE = 4, REVERB = 5, DAMP_END = 6; // Envelope steps
539554

540555

541556
// Pre calculated tables, factors, values

0 commit comments

Comments
 (0)