@@ -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