note.frink

View or download note.frink in plain text format


// Functions for converting frequencies to the closest musical note.  These
// are tuned to use A4 (MIDI note 69 LOL) as exactly 440 Hz.

// Sample usage:
//   note[440 Hz]
note[f is frequency] :=
{
   noteNames = ["C", "C♯/D♭", "D", "D♯/E♭", "E", "F", "F♯/G♭", "G", "G♯/A♭", "A", "A♯/B♭", "B"]

   roundnotes = MIDINote[f]
   octaves = floor[roundnotes/12] - 1   // Octaves above C0 (MIDI 0 is at C-1)
   scale = roundnotes - ((octaves+1) * 12)  // Semitones above C in that octave
   return noteNames@scale + octaves
}


/** Turns a frequency into the closest MIDI note number.  Also note that this
    is extrapolated, so there can be notes smaller than 0 or greater than 127.

    MIDI starts with note 0 being C-1 at about 8.1758 Hz and goes up to
    note 127 being G9 at ~12544 Hz.

    A4 is note 69 at exactly 440 Hz.
    C4 "middle C" is note 60

    Sample usage:
       MIDINote[440 Hz]
*/

MIDINote[f is frequency] :=
{
   notesize = 2^(1/12)
   A4 = 440 Hz
   C4 = A4 / (notesize^9) // Freq. of C4 ("Middle C"), 9 semitones down from A4
   CMinus1 = C4 / 2^5     // C-1 is MIDI note 0, 5 octaves down from C4
   ratio = f / CMinus1
   notes = ln[ratio] / ln[notesize]  // This is number of semitones above C-1
   roundnotes = round[notes]
   return roundnotes
}


View or download note.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 18014 days, 12 hours, 37 minutes ago.