Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 6 of 6

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

  1. #1
    Senior Member
    Join Date
    Dec 2018
    Posts
    176

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

    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

  2. #2
    Senior Member
    Join Date
    Jul 2020
    Posts
    1,460
    Can you post the actual code involved?

  3. #3
    Senior Member oddson's Avatar
    Join Date
    Feb 2013
    Location
    Isle in the Salish Sea
    Posts
    1,413
    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.

  4. #4
    Senior Member oddson's Avatar
    Join Date
    Feb 2013
    Location
    Isle in the Salish Sea
    Posts
    1,413
    Sorry... I don't really know the audio library and I didn't read your post carefully.

  5. #5
    Senior Member
    Join Date
    Dec 2018
    Posts
    176
    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);
      }
    }

  6. #6
    Senior Member
    Join Date
    Dec 2018
    Posts
    176
    controller #15 is mapped to filter FC.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •