mirror of
https://github.com/holub/mame
synced 2025-04-20 23:42:22 +03:00
ics2115: Improved sound using next-state logic
This commit is contained in:
parent
1f192de48f
commit
091944f534
@ -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()
|
||||
{
|
||||
|
||||
// test for boundary cross
|
||||
bool bc = false;
|
||||
if (vol.acc >= vol.end || vol.acc <= vol.end)
|
||||
bc = true;
|
||||
|
||||
int ret = 0;
|
||||
if (vol_ctrl.bitflags.done || vol_ctrl.bitflags.stop)
|
||||
return ret;
|
||||
@ -231,15 +253,26 @@ int ics2115_device::ics2115_voice::update_volume_envelope()
|
||||
if (osc_conf.bitflags.eightbit)
|
||||
return ret;
|
||||
|
||||
if (vol_ctrl.bitflags.loop)
|
||||
if (vol_ctrl.bitflags.loop)
|
||||
{
|
||||
if (vol_ctrl.bitflags.loop_bidir)
|
||||
vol_ctrl.bitflags.invert = !vol_ctrl.bitflags.invert;
|
||||
if (bc) {
|
||||
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)
|
||||
vol.acc = vol.end + vol.left;
|
||||
else
|
||||
vol.acc = vol.start - vol.left;
|
||||
if (!vol_ctrl.bitflags.loop_bidir && vol_ctrl.bitflags.invert)
|
||||
// 1 1 blen = 0 dir= 1 1 end + ( (VOL(L) - VINC) - start)
|
||||
vol.acc = vol.end + ((vol.acc - vol.incr) - vol.start);
|
||||
|
||||
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
|
||||
vol_ctrl.bitflags.done = true;
|
||||
|
Loading…
Reference in New Issue
Block a user