Types/Wave/FrequencyToLetter.ps1

<#
.SYNOPSIS
    Frequency to Letter
.DESCRIPTION
    Converts a Frequency to a Letter Note.
.NOTES
    The shortest path between frequency to friendly note is thru MIDI

    MIDI gives us a linear scale starting at 21 (A0) to 108 (C8).

    Thus we can map a frequency to a friendly note by:

    * Converting Frequency to MIDI
    * Rounding
    * Subtracting 21
    * Looking up the value
.LINK
    https://en.wikipedia.org/wiki/MIDI_tuning_standard
.LINK
    https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Simple_synth

#>

param(
# The frequency.
[double]
$Frequency = 440
)

# The 88 keys in the MIDI standard.
$midi88 = @(
    'A0','A#0','B0',
    'C1','C#1','D1','D#1','E1','F1','F#1','G1','G#1','A1','A#1','B1',
    'C2','C#2','D2','D#2','E2','F2','F#2','G2','G#2','A2','A#2','B2',
    'C3','C#3','D3','D#3','E3','F3','F#3','G3','G#3','A3','A#3','B3',
    'C4','C#4','D4','D#4','E4','F4','F#4','G4','G#4','A4','A#4','B4',
    'C5','C#5','D5','D#5','E5','F5','F#5','G5','G#5','A5','A#5','B5',
    'C6','C#6','D6','D#6','E6','F6','F#6','G6','G#6','A6','A#6','B6',
    'C7','C#7','D7','D#7','E7','F7','F#7','G7','G#7','A7','A#7','B7',
    'C8'
)

# Compute our note
$midiNote = 69 + 12 * [Math]::Log2($Frequency / 440)

# Round it
$rounded = [Math]::Round($midiNote)
# If the rounded note is within the 88 key range
if ($rounded -ge 21 -and $rounded -le (21 + 88)) {
    # output the rounded letter note.
    return $midi88[$rounded - 21]
}