Hi,
without setting up the hardware, I haven't tested this, but it is the approach I would start with.
It adds an offset to the frequency of each oscillator that's playing. Keep track of the base frequency of the note set when the note-on is triggered for each oscillator. The offset is set by your moduation oscil or analog input, and added every time updateControl() runs.
I hope this gives you some clues....
// do once at noteon
Q16n16_freq1_base = Q16n16_mtof(Q8n0_to_Q16n16(note1));
// every time updateControl() runs, for each playing oscillator....
// freq offset/modulation cv on FREQ_OFFSET_PIN, centred at VCC/2
// this would go up or down by roughly 5 semitones (512 cents)
int freq1_offset_cents = mozziAnalogRead(FREQ_OFFSET_PIN)-512;
// the following would be ideal, but div is too slow
// float freq_offset_midi_notes = (float)freq1_offset_cents/100.f
// this is faster, and gives a range of +-4 semitones
Q16n16 Q16n16_freq_offset = Q16n16_mtof((signed)freq1_offset_cents<<9);
Q16n16_freq1 = Q16n16_freq1_base+Q16n16_freq_offset;
// set the freqency for each playing oscillator, every time update(control runs, eg.
oscil1.setFreq_Q16n16(Q16n16_freq1);