HISE Logo Forum
    • Categories
    • Register
    • Login

    Help me understand VCF keytracking.

    Scheduled Pinned Locked Moved General Questions
    8 Posts 3 Posters 302 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • MorphoiceM
      Morphoice
      last edited by

      I was wondering what the formula for general VCF keytracking on common synthesizers is.

      my suspicion would be
      filter_cutoff_frequency + (note_frequecy * keytracking_intensity)

      does that make any sense?

      https://instagram.com/morphoice - 80s inspired Synthwave Music, Arcade & Gameboy homebrew!

      griffinboyG ulrikU 3 Replies Last reply Reply Quote 0
      • griffinboyG
        griffinboy @Morphoice
        last edited by

        @Morphoice

        Idk what is standard, but I always use middle C as the base frequency. And then the filter basically doubles frequency every octave, moving in these increments

        1 Reply Last reply Reply Quote 0
        • griffinboyG
          griffinboy @Morphoice
          last edited by

          @Morphoice

          Pseudocode. I'm sure you've figured it out by now, but might as well post it since I remembered that my original response sucked lol.

          FUNCTION keytrack(midiNote, baseNote, baseFreq, trackingAmount)
          
              // Step 1: Find the difference in semitones
              semitoneDifference = midiNote - baseNote
          
              // Step 2: Convert to a freq multiplier
              frequencyScale = 2 ^ ( (semitoneDifference * trackingAmount) / 12 )
          
              // Step 3: Apply scaling to the base freq
              RETURN baseFreq * frequencyScale
          
          END FUNCTION
          
          

          Example usage:

          midiNote        = 72        // Target note (C5)
          baseNote        = 60        // Reference note (Middle C)
          baseFreq        = 1000 Hz   // Reference frequency (e.g. filter cutoff)
          trackingAmount  = 1         // Full keytracking
          
          trackedFreq = keytrack(midiNote, baseNote, baseFreq, trackingAmount)
          
          // Expected Output: 2000 Hz
          
          
          MorphoiceM 1 Reply Last reply Reply Quote 0
          • ulrikU
            ulrik @Morphoice
            last edited by ulrik

            This post is deleted!
            1 Reply Last reply Reply Quote 0
            • MorphoiceM
              Morphoice @griffinboy
              last edited by

              @griffinboy I'm down with the men flu for over a week now, my brain still does not compute ;(

              https://instagram.com/morphoice - 80s inspired Synthwave Music, Arcade & Gameboy homebrew!

              griffinboyG 1 Reply Last reply Reply Quote 1
              • griffinboyG
                griffinboy @Morphoice
                last edited by

                @Morphoice

                Oh dear! Well you've been working hard, hopefully you'll feel back to normal soon!

                MorphoiceM 1 Reply Last reply Reply Quote 1
                • MorphoiceM
                  Morphoice @griffinboy
                  last edited by

                  @griffinboy I've had a quick look at the JUNO-6 when the fever went down briefly, and how it works there is the lowest key is always the set vcf cutoff, and at maximum keyboard tracking the highest key would be the fully open filter...

                  so I recon it's ((22khz - cutoff) / 88 keys) * intensity (from 0-1) to get the cutoff increase by each key

                  I don't feel well enough to be able to translate this to faust code, also I have no idea how to limit those values ranges, as midi can have more than 88 notes.

                  other synths offer a bi-directional intensity, so the lower keys can have less cutoff than higher ones... which makes the selected cutoff kind of the midpoint and the whole frequency range along the keys pretty skewed... no idea there. in faust probably the break point function (ba.)bpf would be a good solution to that but I can imagine it takes a lot of cpu to calculate the curve all the time

                  https://instagram.com/morphoice - 80s inspired Synthwave Music, Arcade & Gameboy homebrew!

                  griffinboyG 1 Reply Last reply Reply Quote 0
                  • griffinboyG
                    griffinboy @Morphoice
                    last edited by griffinboy

                    @Morphoice

                    You can map it to a function of best fit using python / matlab.
                    Ask chat gpt how to do this from a table of data.

                    Alternatively you could create a lookup table of accurate values.

                    I didn't realize you were going for analog tracking, that's a different case to digital, yes.
                    The tracking lookup only happens once per note, so you don't have to worry about efficiency here. Envelopes by comparison need optimization as they are applied per sample.

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post

                    28

                    Online

                    1.7k

                    Users

                    11.8k

                    Topics

                    102.8k

                    Posts