ics2115: Improved sound using next-state logic

This commit is contained in:
Esteban Diez Laiz 2021-08-16 21:45:17 +02:00
parent 1f192de48f
commit 091944f534

View File

@ -201,9 +201,31 @@ device_memory_interface::space_config_vector ics2115_device::memory_space_config
} }
//TODO: improve using next-state logic from column 126 of patent 5809466 // Using next-state logic from column 126 of patent 5809466.
// VOL(L) = vol.acc
// VINC = vol.inc
// DIR = invert
// BC = boundary cross (start or end )
// BLEN = bi directional loop enable
// LEN loop enable
// UVOL LEN BLEN DIR BC Next VOL(L)
// 0 x x x x VOL(L) // no change no vol envelope
// 1 x x 0 0 VOL(L) + VINC // foward dir no bc
// 1 x x 1 0 VOL(L) - VINC // invert no bc
// 1 0 x x 1 VOL(L) // no env len no vel envelope
// ----------------------------------------------------------------------------
// 1 1 0 0 1 start - ( end - (VOL(L) + VINC) )
// 1 1 0 1 1 end + ( (VOL(L) - VINC) - start)
// 1 1 1 0 1 end + (end - (VOL(L) + VINC) ) // here
// 1 1 1 1 1 start - ( (VOL(L) - VINC)- start)
int ics2115_device::ics2115_voice::update_volume_envelope() int ics2115_device::ics2115_voice::update_volume_envelope()
{ {
// test for boundary cross
bool bc = false;
if (vol.acc >= vol.end || vol.acc <= vol.end)
bc = true;
int ret = 0; int ret = 0;
if (vol_ctrl.bitflags.done || vol_ctrl.bitflags.stop) if (vol_ctrl.bitflags.done || vol_ctrl.bitflags.stop)
return ret; return ret;
@ -231,15 +253,26 @@ int ics2115_device::ics2115_voice::update_volume_envelope()
if (osc_conf.bitflags.eightbit) if (osc_conf.bitflags.eightbit)
return ret; return ret;
if (vol_ctrl.bitflags.loop) if (vol_ctrl.bitflags.loop)
{ {
if (vol_ctrl.bitflags.loop_bidir) if (bc) {
vol_ctrl.bitflags.invert = !vol_ctrl.bitflags.invert; if (!vol_ctrl.bitflags.loop_bidir && !vol_ctrl.bitflags.invert)
// uvol = 1* len = 1* blen = 0 dir = 0 bc = 1* start - ( end - (VOL(L) + VINC) )
vol.acc = vol.start - (vol.end - (vol.acc + vol.incr));
if (vol_ctrl.bitflags.invert) if (!vol_ctrl.bitflags.loop_bidir && vol_ctrl.bitflags.invert)
vol.acc = vol.end + vol.left; // 1 1 blen = 0 dir= 1 1 end + ( (VOL(L) - VINC) - start)
else vol.acc = vol.end + ((vol.acc - vol.incr) - vol.start);
vol.acc = vol.start - vol.left;
if (vol_ctrl.bitflags.loop_bidir && !vol_ctrl.bitflags.invert)
// 1 1 blen = 1 dir = 0 1 end + (end - (VOL(L) + VINC) )
vol.acc = vol.end + (vol.end - (vol.acc + vol.incr));
if (vol_ctrl.bitflags.loop_bidir && vol_ctrl.bitflags.invert)
// 1 1 beln = 1 dir = 1 1 start - ( (VOL(L) - VINC)- start)
vol.acc = vol.start - ((vol.acc - vol.incr) - vol.start);
}
} }
else else
vol_ctrl.bitflags.done = true; vol_ctrl.bitflags.done = true;