So, I'm working on a YM2612 core based pretty much exclusively on the information in this forum (I'm trying very hard to avoid referencing MAME). When I was first getting the basic shell functioning, I made an extremely basic test rom that played one note:
* Alg#7, only on operator 4 - should be pure sine
* AR $1F, no attack phase. KS=0.
* DR=4
* SL is 4, so normalized to a 10 bit attenuation value, it should switch to sustain at an attenuation value of 128.
* SR is $10 so once it switches to sustain the note ends very rapidly.
* My TL is $13, though I don't believe this should matter.
The issue I noticed was that the note played noticeably longer in my emulator than in KEGA. I kept looking for an error in my code and never found it - It appears to correct based on the information in page 8 about the envelope generator.
In my emulator it took ~7.4 seconds from key-on to the sustain phase.
In KEGA, Regen, and in MAME (genplus-gx version), it took ~5 seconds (to be exact, it took 87040 EG cycles in genplus-gx).
Interestingly enough, in GENS it took ~4.5 seconds.
So, here's my math.
DR=4,KS=0, means my Rate is 8.
That means my shift value is 9, so it takes 512 EG cycles per EG update tick.
At rate 8, there is a total of 4 attenuation gain per 8-cycle group.
SL=4 means we need to gain 128 attenuation.
So it should take (128/4)*8*512 EG cycles to complete the decay phase. That works to 131072 EG cycles or 7.38 seconds.
I tested on my Everdrive and the result was... it took 5 seconds.
Here is my test ROM. https://dl.dropbox.com/u/2253413/simpletest.bin
I just now tested on some version of Exodus that I found buried in these forums somewhere, and it took ~5 seconds. I'm assuming that Exodus should match the behavior described on page 8, so I assume that the information is correct but I'm just misunderstanding it. But I'm totally at a loss as to what I'm not understanding. The rate calcs and example code seem quite clear.
Any guesses at what I'm missing? What part of my math is wrong?
YM2612 Envelope generator question
Moderator: BigEvilCorporation