MCPcopy Create free account
hub / github.com/OpenXcom/OpenXcom / OPL_CALC_RH

Function OPL_CALC_RH

src/Engine/Adlib/fmopl.cpp:498–579  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

496/* ---------- calcrate rythm block ---------- */
497#define WHITE_NOISE_db 6.0
498INLINE void OPL_CALC_RH( OPL_CH *CH )
499{
500 UINT32 env_tam,env_sd,env_top,env_hh;
501 int whitenoise = (rand()&1)*(WHITE_NOISE_db/EG_STEP);
502 INT32 tone8;
503
504 OPL_SLOT *SLOT;
505 int env_out;
506
507 /* BD : same as FM serial mode and output level is large */
508 feedback2 = 0;
509 /* SLOT 1 */
510 SLOT = &CH[6].SLOT[SLOT1];
511 env_out=OPL_CALC_SLOT(SLOT);
512 if( env_out < EG_ENT-1 )
513 {
514 /* PG */
515 if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
516 else SLOT->Cnt += SLOT->Incr;
517 /* connection */
518 if(CH[6].FB)
519 {
520 int feedback1 = (CH[6].op1_out[0]+CH[6].op1_out[1])>>CH[6].FB;
521 CH[6].op1_out[1] = CH[6].op1_out[0];
522 feedback2 = CH[6].op1_out[0] = OP_OUT(SLOT,env_out,feedback1);
523 }
524 else
525 {
526 feedback2 = OP_OUT(SLOT,env_out,0);
527 }
528 }else
529 {
530 feedback2 = 0;
531 CH[6].op1_out[1] = CH[6].op1_out[0];
532 CH[6].op1_out[0] = 0;
533 }
534 /* SLOT 2 */
535 SLOT = &CH[6].SLOT[SLOT2];
536 env_out=OPL_CALC_SLOT(SLOT);
537 if( env_out < EG_ENT-1 )
538 {
539 /* PG */
540 if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
541 else SLOT->Cnt += SLOT->Incr;
542 /* connection */
543 outd[0] += OP_OUT(SLOT,env_out, feedback2)*2;
544 }
545
546 // SD (17) = mul14[fnum7] + white noise
547 // TAM (15) = mul15[fnum8]
548 // TOP (18) = fnum6(mul18[fnum8]+whitenoise)
549 // HH (14) = fnum7(mul18[fnum8]+whitenoise) + white noise
550 env_sd =OPL_CALC_SLOT(SLOT7_2) + whitenoise;
551 env_tam=OPL_CALC_SLOT(SLOT8_1);
552 env_top=OPL_CALC_SLOT(SLOT8_2);
553 env_hh =OPL_CALC_SLOT(SLOT7_1) + whitenoise;
554
555 /* PG */

Callers 2

YM3812UpdateOneFunction · 0.85
Y8950UpdateOneFunction · 0.85

Calls 1

OPL_CALC_SLOTFunction · 0.85

Tested by

no test coverage detected