Bringing the Holiday Spirit with PowerShell: Play “Jingle Bells”

The holiday season is here, and what better way to spread some Christmas cheer than by combining coding with some festive fun? Today, I’ll show you how you can use PowerShell to play the iconic Christmas tune, “Jingle Bells.”

PowerShell isn’t just a powerful tool for automation and management; with a little creativity, it can also bring a smile to your face. Here’s how you can create a simple script to play the “Jingle Bells” melody using PowerShell’s built-in Beep functionality.

The Script

Below is the full script for playing “Jingle Bells” using PowerShell:

PowerShell
# Define the frequencies for musical notes
$notes = @{
    "B3" = 247;  # B3
    "C4" = 262;  # C4
    "D4" = 294;  # D4
    "E4" = 330;  # E4
    "F4" = 349;  # F4
    "G4" = 392;  # G4
    "A4" = 440;  # A4
    "B4" = 494;  # B4
    "REST" = 0   # Pause
}

# Jingle Bells Chorus (Note, Duration in ms)
$melody = @(
    # Jingle Bells, Jingle Bells
    @{Note="E4"; Duration=400}, @{Note="E4"; Duration=400}, @{Note="E4"; Duration=800},
    @{Note="E4"; Duration=400}, @{Note="E4"; Duration=400}, @{Note="E4"; Duration=800},

    # Jingle all the way
    @{Note="E4"; Duration=400}, @{Note="G4"; Duration=400}, @{Note="C4"; Duration=400}, @{Note="D4"; Duration=400}, 
    @{Note="E4"; Duration=1600},

    # Oh what fun it is to ride
    @{Note="F4"; Duration=400}, @{Note="F4"; Duration=400}, @{Note="F4"; Duration=400}, @{Note="F4"; Duration=400},
    @{Note="F4"; Duration=400}, @{Note="E4"; Duration=400}, @{Note="E4"; Duration=400}, @{Note="E4"; Duration=400},

    # In a one-horse open sleigh, hey!
    @{Note="E4"; Duration=400}, @{Note="D4"; Duration=400}, @{Note="D4"; Duration=400}, @{Note="E4"; Duration=400}, 
    @{Note="D4"; Duration=800},
    @{Note="G4"; Duration=800},

    # Repeat of the chorus
    # Jingle Bells, Jingle Bells
    @{Note="E4"; Duration=400}, @{Note="E4"; Duration=400}, @{Note="E4"; Duration=800},
    @{Note="E4"; Duration=400}, @{Note="E4"; Duration=400}, @{Note="E4"; Duration=800},

    # Jingle all the way
    @{Note="E4"; Duration=400}, @{Note="G4"; Duration=400}, @{Note="C4"; Duration=400}, @{Note="D4"; Duration=400}, 
    @{Note="E4"; Duration=1600},

    # Oh what fun it is to ride
    @{Note="F4"; Duration=400}, @{Note="F4"; Duration=400}, @{Note="F4"; Duration=400}, @{Note="F4"; Duration=400},
    @{Note="F4"; Duration=400}, @{Note="E4"; Duration=400}, @{Note="E4"; Duration=400}, @{Note="E4"; Duration=400},

    # In a one-horse open sleigh!
    @{Note="G4"; Duration=400}, @{Note="G4"; Duration=400}, @{Note="F4"; Duration=400}, @{Note="D4"; Duration=400}, 
    @{Note="C4"; Duration=1600}
)

# Function to play a note
function Play-Note
{
  param (
    [string]$Note,
    [int]$Duration
  )
  $freq = $notes[$Note]
  if($freq -eq 0)
  {
    Start-Sleep -Milliseconds $Duration
  }
  else
  {
    [Console]::Beep($freq, $Duration)
  }
}

# Play the melody
$melody | ForEach-Object -Process {
  Play-Note -Note $_.Note -Duration $_.Duration
}

How It Works

  1. Defining Notes: The $notes hashtable maps musical notes to their corresponding frequencies in Hertz. These frequencies allow the Beep method to generate sound for specific notes.
  2. The Melody: The $melody array defines each note and its duration in milliseconds.
  3. The Function: The Play-Note function takes a note and duration as input, playing the sound with [Console]::Beep or pausing for a rest.
  4. Playing the Song: The script iterates through the $melody array and plays each note sequentially.

Running the Script

Save the script to a .ps1 file, then open PowerShell and execute it. Make sure you have sufficient privileges to run scripts by setting the execution policy:

PowerShell
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

I hope this script brings a little joy to your day and inspires you to experiment with PowerShell beyond its traditional use. Whether you’re coding or just enjoying the holidays, may your season be filled with happiness and cheer.

Happy Holidays and Merry Christmas!