///|
pub fn program_to_instrument(program : Byte) -> String {
  match program {
    // Piano
    0 => "Acoustic Grand Piano"
    1 => "Bright Acoustic Piano"
    2 => "Electric Grand Piano"
    3 => "Honky-tonk Piano"
    4 => "Electric Piano 1"
    5 => "Electric Piano 2"
    6 => "Harpsichord"
    7 => "Clavinet"

    // Chromatic Percussion
    8 => "Celesta"
    9 => "Glockenspiel"
    10 => "Music Box"
    11 => "Vibraphone"
    12 => "Marimba"
    13 => "Xylophone"
    14 => "Tubular Bells"
    15 => "Dulcimer"

    // Organ
    16 => "Drawbar Organ"
    17 => "Percussive Organ"
    18 => "Rock Organ"
    19 => "Church Organ"
    20 => "Reed Organ"
    21 => "Accordion"
    22 => "Harmonica"
    23 => "Tango Accordion"

    // Guitar
    24 => "Acoustic Guitar (nylon)"
    25 => "Acoustic Guitar (steel)"
    26 => "Electric Guitar (jazz)"
    27 => "Electric Guitar (clean)"
    28 => "Electric Guitar (muted)"
    29 => "Overdriven Guitar"
    30 => "Distortion Guitar"
    31 => "Guitar Harmonics"

    // Bass
    32 => "Acoustic Bass"
    33 => "Electric Bass (finger)"
    34 => "Electric Bass (pick)"
    35 => "Fretless Bass"
    36 => "Slap Bass 1"
    37 => "Slap Bass 2"
    38 => "Synth Bass 1"
    39 => "Synth Bass 2"

    // Strings
    40 => "Violin"
    41 => "Viola"
    42 => "Cello"
    43 => "Contrabass"
    44 => "Tremolo Strings"
    45 => "Pizzicato Strings"
    46 => "Orchestral Harp"
    47 => "Timpani"

    // Ensemble
    48 => "String Ensemble 1"
    49 => "String Ensemble 2"
    50 => "Synth Strings 1"
    51 => "Synth Strings 2"
    52 => "Choir Aahs"
    53 => "Voice Oohs"
    54 => "Synth Voice"
    55 => "Orchestra Hit"

    // Brass
    56 => "Trumpet"
    57 => "Trombone"
    58 => "Tuba"
    59 => "Muted Trumpet"
    60 => "French Horn"
    61 => "Brass Section"
    62 => "Synth Brass 1"
    63 => "Synth Brass 2"

    // Reed
    64 => "Soprano Sax"
    65 => "Alto Sax"
    66 => "Tenor Sax"
    67 => "Baritone Sax"
    68 => "Oboe"
    69 => "English Horn"
    70 => "Bassoon"
    71 => "Clarinet"

    // Pipe
    72 => "Piccolo"
    73 => "Flute"
    74 => "Recorder"
    75 => "Pan Flute"
    76 => "Blown Bottle"
    77 => "Shakuhachi"
    78 => "Whistle"
    79 => "Ocarina"

    // Synth Lead
    80 => "Lead 1 (square)"
    81 => "Lead 2 (sawtooth)"
    82 => "Lead 3 (calliope)"
    83 => "Lead 4 (chiff)"
    84 => "Lead 5 (charang)"
    85 => "Lead 6 (voice)"
    86 => "Lead 7 (fifths)"
    87 => "Lead 8 (bass + lead)"

    // Synth Pad
    88 => "Pad 1 (new age)"
    89 => "Pad 2 (warm)"
    90 => "Pad 3 (polysynth)"
    91 => "Pad 4 (choir)"
    92 => "Pad 5 (bowed)"
    93 => "Pad 6 (metallic)"
    94 => "Pad 7 (halo)"
    95 => "Pad 8 (sweep)"

    // Synth Effects
    96 => "FX 1 (rain)"
    97 => "FX 2 (soundtrack)"
    98 => "FX 3 (crystal)"
    99 => "FX 4 (atmosphere)"
    100 => "FX 5 (brightness)"
    101 => "FX 6 (goblins)"
    102 => "FX 7 (echoes)"
    103 => "FX 8 (sci-fi)"

    // Ethnic
    104 => "Sitar"
    105 => "Banjo"
    106 => "Shamisen"
    107 => "Koto"
    108 => "Kalimba"
    109 => "Bagpipe"
    110 => "Fiddle"
    111 => "Shanai"

    // Percussive
    112 => "Tinkle Bell"
    113 => "Agogo"
    114 => "Steel Drums"
    115 => "Woodblock"
    116 => "Taiko Drum"
    117 => "Melodic Tom"
    118 => "Synth Drum"
    119 => "Reverse Cymbal"

    // Sound Effects
    120 => "Guitar Fret Noise"
    121 => "Breath Noise"
    122 => "Seashore"
    123 => "Bird Tweet"
    124 => "Telephone Ring"
    125 => "Helicopter"
    126 => "Applause"
    127 => "Gunshot"
    _ => "Unknown"
  }
}

///|
pub fn note_to_pitch(note : Byte) -> String {
  match note {
    // Octave -1 (0-11)
    0 => "C-1"
    1 => "C#-1"
    2 => "D-1"
    3 => "D#-1"
    4 => "E-1"
    5 => "F-1"
    6 => "F#-1"
    7 => "G-1"
    8 => "G#-1"
    9 => "A-1"
    10 => "A#-1"
    11 => "B-1"

    // Octave 0 (12-23)
    12 => "C0"
    13 => "C#0"
    14 => "D0"
    15 => "D#0"
    16 => "E0"
    17 => "F0"
    18 => "F#0"
    19 => "G0"
    20 => "G#0"
    21 => "A0"
    22 => "A#0"
    23 => "B0"

    // Octave 1 (24-35)
    24 => "C1"
    25 => "C#1"
    26 => "D1"
    27 => "D#1"
    28 => "E1"
    29 => "F1"
    30 => "F#1"
    31 => "G1"
    32 => "G#1"
    33 => "A1"
    34 => "A#1"
    35 => "B1"

    // Octave 2 (36-47)
    36 => "C2"
    37 => "C#2"
    38 => "D2"
    39 => "D#2"
    40 => "E2"
    41 => "F2"
    42 => "F#2"
    43 => "G2"
    44 => "G#2"
    45 => "A2"
    46 => "A#2"
    47 => "B2"

    // Octave 3 (48-59)
    48 => "C3"
    49 => "C#3"
    50 => "D3"
    51 => "D#3"
    52 => "E3"
    53 => "F3"
    54 => "F#3"
    55 => "G3"
    56 => "G#3"
    57 => "A3"
    58 => "A#3"
    59 => "B3"

    // Octave 4 (60-71) - Middle C is C4
    60 => "C4"
    61 => "C#4"
    62 => "D4"
    63 => "D#4"
    64 => "E4"
    65 => "F4"
    66 => "F#4"
    67 => "G4"
    68 => "G#4"
    69 => "A4"
    70 => "A#4"
    71 => "B4"

    // Octave 5 (72-83)
    72 => "C5"
    73 => "C#5"
    74 => "D5"
    75 => "D#5"
    76 => "E5"
    77 => "F5"
    78 => "F#5"
    79 => "G5"
    80 => "G#5"
    81 => "A5"
    82 => "A#5"
    83 => "B5"

    // Octave 6 (84-95)
    84 => "C6"
    85 => "C#6"
    86 => "D6"
    87 => "D#6"
    88 => "E6"
    89 => "F6"
    90 => "F#6"
    91 => "G6"
    92 => "G#6"
    93 => "A6"
    94 => "A#6"
    95 => "B6"

    // Octave 7 (96-107)
    96 => "C7"
    97 => "C#7"
    98 => "D7"
    99 => "D#7"
    100 => "E7"
    101 => "F7"
    102 => "F#7"
    103 => "G7"
    104 => "G#7"
    105 => "A7"
    106 => "A#7"
    107 => "B7"

    // Octave 8 (108-119)
    108 => "C8"
    109 => "C#8"
    110 => "D8"
    111 => "D#8"
    112 => "E8"
    113 => "F8"
    114 => "F#8"
    115 => "G8"
    116 => "G#8"
    117 => "A8"
    118 => "A#8"
    119 => "B8"

    // Octave 9 (120-127)
    120 => "C9"
    121 => "C#9"
    122 => "D9"
    123 => "D#9"
    124 => "E9"
    125 => "F9"
    126 => "F#9"
    127 => "G9"
    _ => "Unknown"
  }
}

///|
pub fn microseconds_to_bpm(microseconds : UInt) -> Double {
  60000000.0 / microseconds.to_double()
}