how to track filter frequency with midi note (keyboard tracking) ?

Status
Not open for further replies.

emmanuel63

Well-known member
Hello,

I try to find the correct formula to map the frequency of a filter with the note played on a keyboard. I first thought that was easy... but I am not happy with what I have tried so far. My approach is very simple :

Freq(filter) = Freq(note) * k

But it doesn't work. For instance when I set k = 2 with a low pass filter, the low pitch notes are filtered much more than the high pitch ones. I try to find a formula to get an even effect for low and high pitch notes but I can't find.

If some of you could point me to articles or ressources that explain this subject, I would appreciate.

Emmanuel
 
Typically when a filter cutoff is modulated by pitch it's normalized relative to one half the sample rate and then some parameter for slope. You might also want an offset to move the cutoff from the fundamental.
 
Sorry... I don't really know the audio library and I didn't read your post carefully.
 
Here is a simple test code to demonstrate the problem.
My issue is getting an even filtering "impact" from low to high pitch notes.

MY guess :
- less filtering for lower pitch notes.
- more filtering for high pitch range.

Emmanuel

Code:
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>

// GUItool: begin automatically generated code
AudioSynthWaveformModulated waveformMod1;   //xy=371,328
AudioFilterStateVariable filter1;        //xy=601,332
AudioEffectEnvelope      envelope1;      //xy=796,337
AudioOutputI2S           i2s1;           //xy=963,339
AudioConnection          patchCord1(waveformMod1, 0, filter1, 0);
AudioConnection          patchCord2(filter1, 0, envelope1, 0);
AudioConnection          patchCord3(envelope1, 0, i2s1, 0);
AudioConnection          patchCord4(envelope1, 0, i2s1, 1);
// GUItool: end automatically generated code




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};
float k = 1;
float oscFreq;

void setup() {
  AudioMemory(10);
  usbMIDI.setHandleNoteOn(myNoteOn);
  usbMIDI.setHandleNoteOff(myNoteOff);
  usbMIDI.setHandleControlChange(myControlChange);

  waveformMod1.begin(0.2, 0, WAVEFORM_BANDLIMIT_SQUARE);
  filter1.resonance(1.1);

}

void loop() {
  usbMIDI.read();
}

void myNoteOn(byte channel, byte note, byte velocity) {
  oscFreq = noteFreqs[note];
  waveformMod1.frequency(oscFreq);
  envelope1.noteOn();
  filter1.frequency(oscFreq * k);
  Serial.println(oscFreq * k);
}

void myNoteOff(byte channel, byte note, byte velocity) {
  envelope1.noteOff();
}

void myControlChange(byte channel, byte control, byte value) {
  if (control == 15) {
    k = powf((float)value/127, 3) * 50;  //log scale
    Serial.println(k);
    filter1.frequency(oscFreq * k);
  }
}
 
Status
Not open for further replies.
Back
Top