I have an idea of how to implement additive or FM synth, using a small amount of memory and speed. Have the SPC700 draw a short looping BRR waveform, and continuously update the BRR waveform while it's being played by the DSP, to produce detuning effects.
FM synthesis implementations tend to work a lot better as phase modulation (see: any YM FM chip) than true frequency modulation. The two methods can produce identical output under ideal conditions, but true frequency modulation is much harder to implement in a stable way (i.e. sounds the same every time).
If you're implementing a frequency modulation scheme on the SPC I would recommend resetting the waveform's phase at the start of the note, and try to keep the timings as consistent as possible. Very small timing variations can accumulate as big timbre differences in frequency modulation (something much easier to avoid with phase modulation, usually).
Is the SPC700 even fast enough to do realtime synthesis? The SNES CPU would need to run the music engine methinks.
Speech synthesizer SAM ran in real time on the 1 MHz 6502 in Apple II and C64. The SPC700 is a 1 MHz 65C02 with a reshuffled instruction encoding and a minor difference in the PLA instruction.
Drag wrote:
Is the SPC700 even fast enough to do realtime synthesis? The SNES CPU would need to run the music engine methinks.
Most synthesized instruments can be emulated as a gradually changing short loop.
Gradually changing a short-loop type instrument is perfectly possible, and is actually done in Chrono Trigger (for instrument #16, which is pulse-width modulation pulse wave).
I don't see how this can be even remotely called "FM synth" though.
If the modulator is detuned to the carrier, then you need the modulator to slowly drift out of phase with the carrier.
I have a question about spc700 asm. Is "inw" supposed to increment a 16 bit word in memory? That's what I thought it does, but I looked at a debugger, and it's not incrementing.
If that's INCW that you mean, then yes it increases a 16-bit word in memory, in little-endian. (increment 1st byte, and increment 2nd byte if the result of the 1st increment was zero).
I just realized that I have to compose a song just to demonstrate this.