Wow.. three days in a row for audio tests :D
This time, LFO:
The run down.
_ D7: 1= Stop channel 1’s waveform pointer. 0= left pointer continue (if set to do so). This really has nothing to do with LFO. This stops the channel’s waveform and reset the waveform pointer whether or not the channels is in LFO mode. Which is handy. If the channel is on LFO mode, and writing to D7 is desired, you should write $00 to the low two bits as well. Toggling back and forth between $83 and $80 on this register gave some random inconsistent effects (gets stuck on off mode randomly), upon power on. It’s recommend to just write $80 from whatever value you had before (drop the lower bits), if you want to pause the modulation. Or just write $00 is you don’t want to reset the waveform – but do want a pause.
_ D1-0: These are the FM data multipliers. They are: $00=Off, $01=0.5x, $02=4x, $03=16x. These multiply against the signed data in the channels waveform memory, to be applied to channel 0. But there’s another effect of these values. They multiply against channel 1’s period value (or dividing the whole frequency down, however you look at it). Yes, you read that correctly. $00=N/A, $01=1x, $02=2x, $03=3x. Divide’s channel 1’s frequency by that factor. Making the modulation against channel 0 slower with each increased value, but more pronounced with each step. To see the frequency differences, hard pan channel 0 and 1 to left/right, and make channel 1’s sinewave viewable/audible ($9f@$804). And… using an FFT and the channel buffer filled with all the same value, you can see the resulting fixed step in the multiplied values against the original FM data sample.
Channel 1 will output the waveform data as normal sound in LFO mode. You can also write to channel 1’s data port and replace the waveform memory as it’s playing. Just like with other channels. It’s unclear if the new data written on the port effects the frequency modulation write away, either. This still needs to be tested. But I do know that the sound will be heard if channel 1’s volume is high enough for audible output.
FM waveform data. The data is 5bit signed when applied to channel 0’s period value. But the signed data is inverted. $00= -$10, $8= -$08, $10= $00, $1f= +$0f.
$808 is another period multiplier. It has no effect when D1-0@$809 are set to $00.
Writing to either $808 or $809 doesn’t correspond to what value is in $800.
Also curious enough, not initializing all channel registers, will randomly get you an incorrect waveform for channel 1 modulation. Even if you setup both channel 1 and 0 registers correctly. I don’t know why this is, but waveform always looks square (with uneven duty cycle).
Putting channel 1 into DDA mode and then LFO mode, causes a single value to modulate channel 0. Where this value is pulled from, isn’t known yet. But it’s not the value written to the data port when in DDA mode. No sound output or change takes place for such writes when DDA+LFO is used (unlike writing to the DATA port in buffer mode). Whatever the value was in my tests output a fixed frequency modulation to channel 0, it didn’t correspond to the multipliers 0.5x, 4x, 16x. But changing $809 lower 2 bits did have an effect (it looked closer to 1x,4x,16x applied against of a value of 6. But $06 was neither the first or the last value written to the waveform memory. But it is the value if you subtracted the first value in the sine waveform from the last. Probably just coincidence). Hmm.. maybe I should recheck the 0.5x multiplier against a few more values.
If I have time, I’ll do more audio tests tonight. But if not, I’ll be back in town for the weekend to finish up.