emmanuel63
Well-known member
Hello,
I am playing with FM synthesis, but I can't get "musical" results. The notes I produce are very quickly out of tune. Mastering a consistant pitch seems to be difficult.
I tried to link the modulator frequency to the midi notes, but still out of tune very quickly.
I need somme directions to master the art of FM synthesis !
I use T4.0 and PCM5102 DAC (no audio shield).
Emmanuel
I am playing with FM synthesis, but I can't get "musical" results. The notes I produce are very quickly out of tune. Mastering a consistant pitch seems to be difficult.
I tried to link the modulator frequency to the midi notes, but still out of tune very quickly.
I need somme directions to master the art of FM synthesis !
I use T4.0 and PCM5102 DAC (no audio shield).
Emmanuel
Code:
#include <Audio.h>
// GUItool: begin automatically generated code
AudioSynthWaveformModulated FM_mod; //xy=393,275
AudioSynthWaveformModulated waveformMod1; //xy=647,278
AudioEffectEnvelope envelope1; //xy=827,277
AudioAmplifier Volume_amp; //xy=991,277
AudioOutputI2S i2s1; //xy=1162,277
AudioConnection patchCord1(FM_mod, 0, waveformMod1, 0);
AudioConnection patchCord2(waveformMod1, envelope1);
AudioConnection patchCord3(envelope1, Volume_amp);
AudioConnection patchCord4(Volume_amp, 0, i2s1, 0);
AudioConnection patchCord5(Volume_amp, 0, i2s1, 1);
// GUItool: end automatically generated code
float freq;
float FM_index;
const byte cc_fm_freq1 = 27; //MIDI CC #
const byte cc_fm_depth1 = 28; //MIDI CC #
const float noteFreqs[128] = {8.176, 8.662, 9.177, 9.723, 10.301, 10.913, 11.562, 12.25, 12.978, 13.75, 14.568, 15.434, 16.352, 17.324, 18.354, 19.445, 20.602, 21.827, 23.125, 24.5, 25.957, 27.5, 29.135, 30.868, 32.703, 34.648, 36.708, 38.891, 41.203, 43.654, 46.249, 48.999, 51.913, 55, 58.27, 61.735, 65.406, 69.296, 73.416, 77.782, 82.407, 87.307, 92.499, 97.999, 103.826, 110, 116.541, 123.471, 130.813, 138.591, 146.832, 155.563, 164.814, 174.614, 184.997, 195.998, 207.652, 220, 233.082, 246.942, 261.626, 277.183, 293.665, 311.127, 329.628, 349.228, 369.994, 391.995, 415.305, 440, 466.164, 493.883, 523.251, 554.365, 587.33, 622.254, 659.255, 698.456, 739.989, 783.991, 830.609, 880, 932.328, 987.767, 1046.502, 1108.731, 1174.659, 1244.508, 1318.51, 1396.913, 1479.978, 1567.982, 1661.219, 1760, 1864.655, 1975.533, 2093.005, 2217.461, 2349.318, 2489.016, 2637.02, 2793.826, 2959.955, 3135.963, 3322.438, 3520, 3729.31, 3951.066, 4186.009, 4434.922, 4698.636, 4978.032, 5274.041, 5587.652, 5919.911, 6271.927, 6644.875, 7040, 7458.62, 7902.133, 8372.018, 8869.844, 9397.273, 9956.063, 10548.08, 11175.3, 11839.82, 12543.85};
void setup() {
//***MEMORY***//
AudioMemory(10);
//***INIT MIDI***//
usbMIDI.setHandleNoteOn(myNoteOn);
usbMIDI.setHandleNoteOff(myNoteOff);
usbMIDI.setHandleControlChange(myControlChange);
//***OSCs INIT***//
waveformMod1.begin(1, 0, WAVEFORM_SINE);
FM_mod.begin(1, 0, WAVEFORM_SINE);
waveformMod1.frequencyModulation(8);
Volume_amp.gain(0.1); //VOL
}
void loop() {
usbMIDI.read();
}
//MIDI CC
void myControlChange(byte channel, byte CC, byte value) {
//OSC1 FM FREQ
if (CC == cc_fm_freq1) {
FM_index = (float)value / 2;
Serial.print("FM INDEX = "); Serial.println(FM_index);
FM_mod.frequency(freq * FM_index);
}
//OSC1 FM DEPTH
if (CC == cc_fm_depth1) {
float FM_depth = (float)value / 127;
Serial.print("FM DEPTH = "); Serial.println(FM_depth);
FM_mod.amplitude(FM_depth);
}
}
//MIDI NOTE ON/OFF
void myNoteOn(byte channel, byte midi_note, byte velocity) {
freq = noteFreqs[midi_note];
waveformMod1.frequency(freq);
FM_mod.frequency(freq * FM_index);
envelope1.noteOn();
}
void myNoteOff(byte channel, byte midi_note, byte velocity) {
envelope1.noteOff();
}