From 23c2f4f5189f17828c8999c406571537e78f4c99 Mon Sep 17 00:00:00 2001 From: Steven Bailey Date: Mon, 26 Oct 2026 19:35:31 -0400 Subject: [PATCH 1/2] feat: Frequency.Scale ( Cont. #125 ) Added symmetric scales: - Whole Tone - Octatonic - Augmented Also optimized processing a bit. --- Types/Frequency/get_Scale.ps1 | 47 +++++++++++++++++++++++++++++++---- Wave.types.ps1xml | 47 +++++++++++++++++++++++++++++++---- 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/Types/Frequency/get_Scale.ps1 b/Types/Frequency/get_Scale.ps1 index 61c8347..b39465e 100644 --- a/Types/Frequency/get_Scale.ps1 +++ b/Types/Frequency/get_Scale.ps1 @@ -13,13 +13,10 @@ if ($this.'#Scale') { return $this.'#Scale'} $majorScale = [Collections.ArrayList]::new() $null = $majorScale.Add($this) -$currentNote = $this - #Start with constructing the major scale foreach ($step in ("WWHWWWH".ToCharArray())) { #Standard major scale step pattern $stepCount = if ($step -eq "W") { 2 } else { 1 } - $currentNote = $currentNote.Sharpen($stepCount) - $null = $majorScale.Add($currentNote) + $null = $majorScale.Add($majorScale[-1].Sharpen($stepCount)) } $scaleTable = [Ordered]@{ @@ -32,12 +29,20 @@ $scaleTable = [Ordered]@{ MelodicMinor = $majorScale.Clone() PentatonicMajor = $majorScale.Clone() PentatonicMajorDescending = $majorScale.Clone() - PentatonicMinor = $null #These are derived from MINOR scale which isn't built yet + # Remaining scales are NOT derived from major scale + PentatonicMinor = $null PentatonicMinorDescending = $null PentatonicBlues = $null PentatonicBluesDescending = $null + WholeTone = [Collections.ArrayList]::new() + WholeToneDescending = $null + Octatonic = [Collections.ArrayList]::new() + OctatonicDescending = $null + Augmented = [Collections.ArrayList]::new() + AugmentedDescending = $null } +#region Diatonic Scales # The minor scales are just the major scale with certain scale degrees flattened $flat3rd = $majorScale[2].Flatten(1) $scaleTable["Minor"][2] = $flat3rd @@ -58,7 +63,9 @@ $scaleTable["MinorDescending"].Reverse() $scaleTable["HarmonicMinorDescending"]= $scaleTable["HarmonicMinor"].Clone() $scaleTable["HarmonicMinorDescending"].Reverse() +#endregion Diatonic Scales +#region Pentatonic Scales # Pentatonic scales mainly derive from the major/minor scale, # but with certain scale degrees removed to make them 5 notes long (hence 'penta'tonic) $scaleTable["PentatonicMajor"].RemoveAt(3) @@ -78,6 +85,36 @@ $aug4th = $scaleTable["PentatonicBlues"][2].Sharpen(1) $scaleTable["PentatonicBlues"].Insert(3,$aug4th) $scaleTable["PentatonicBluesDescending"] = $scaleTable["PentatonicBlues"].Clone() $scaleTable["PentatonicBluesDescending"].Reverse() +#endregion Pentatonic Scales + +#region Symmetric Scales +$null = $scaleTable["WholeTone"].Add($this) +$null = $scaleTable["Octatonic"].Add($this) +$null = $scaleTable["Augmented"].Add($this) + +# Whole Tone scale is all whole steps up +1..6 | ForEach-Object { + $null = $scaleTable["WholeTone"].Add($scaleTable["WholeTone"][-1].Sharpen(2)) +} +$scaleTable["WholeToneDescending"] = $scaleTable["WholeTone"].Clone() +$scaleTable["WholeToneDescending"].Reverse() + +# Octatonic scale alternates b/w whole steps and half steps +1..8 | ForEach-Object { + $stepCount = if ($_ % 2 -eq 0) { 1 } else { 2 } + $null = $scaleTable["Octatonic"].Add($scaleTable["Octatonic"][-1].Sharpen($stepCount)) +} +$scaleTable["OctatonicDescending"] = $scaleTable["Octatonic"].Clone() +$scaleTable["OctatonicDescending"].Reverse() + +# Augmented scale alternates b/w minor 3rds and half steps +1..6 | ForEach-Object { + $stepCount = if ($_ % 2 -eq 0) { 1 } else { 3 } + $null = $scaleTable["Augmented"].Add($scaleTable["Augmented"][-1].Sharpen($stepCount)) +} +$scaleTable["AugmentedDescending"] = $scaleTable["Augmented"].Clone() +$scaleTable["AugmentedDescending"].Reverse() +#endregion Symmetric Scales $this | Add-Member NoteProperty '#Scale' $scaleTable -Force return $scaleTable diff --git a/Wave.types.ps1xml b/Wave.types.ps1xml index 326d123..2183acd 100644 --- a/Wave.types.ps1xml +++ b/Wave.types.ps1xml @@ -134,13 +134,10 @@ if ($this.'#Scale') { return $this.'#Scale'} $majorScale = [Collections.ArrayList]::new() $null = $majorScale.Add($this) -$currentNote = $this - #Start with constructing the major scale foreach ($step in ("WWHWWWH".ToCharArray())) { #Standard major scale step pattern $stepCount = if ($step -eq "W") { 2 } else { 1 } - $currentNote = $currentNote.Sharpen($stepCount) - $null = $majorScale.Add($currentNote) + $null = $majorScale.Add($majorScale[-1].Sharpen($stepCount)) } $scaleTable = [Ordered]@{ @@ -153,12 +150,20 @@ $scaleTable = [Ordered]@{ MelodicMinor = $majorScale.Clone() PentatonicMajor = $majorScale.Clone() PentatonicMajorDescending = $majorScale.Clone() - PentatonicMinor = $null #These are derived from MINOR scale which isn't built yet + # Remaining scales are NOT derived from major scale + PentatonicMinor = $null PentatonicMinorDescending = $null PentatonicBlues = $null PentatonicBluesDescending = $null + WholeTone = [Collections.ArrayList]::new() + WholeToneDescending = $null + Octatonic = [Collections.ArrayList]::new() + OctatonicDescending = $null + Augmented = [Collections.ArrayList]::new() + AugmentedDescending = $null } +#region Diatonic Scales # The minor scales are just the major scale with certain scale degrees flattened $flat3rd = $majorScale[2].Flatten(1) $scaleTable["Minor"][2] = $flat3rd @@ -179,7 +184,9 @@ $scaleTable["MinorDescending"].Reverse() $scaleTable["HarmonicMinorDescending"]= $scaleTable["HarmonicMinor"].Clone() $scaleTable["HarmonicMinorDescending"].Reverse() +#endregion Diatonic Scales +#region Pentatonic Scales # Pentatonic scales mainly derive from the major/minor scale, # but with certain scale degrees removed to make them 5 notes long (hence 'penta'tonic) $scaleTable["PentatonicMajor"].RemoveAt(3) @@ -199,6 +206,36 @@ $aug4th = $scaleTable["PentatonicBlues"][2].Sharpen(1) $scaleTable["PentatonicBlues"].Insert(3,$aug4th) $scaleTable["PentatonicBluesDescending"] = $scaleTable["PentatonicBlues"].Clone() $scaleTable["PentatonicBluesDescending"].Reverse() +#endregion Pentatonic Scales + +#region Symmetric Scales +$null = $scaleTable["WholeTone"].Add($this) +$null = $scaleTable["Octatonic"].Add($this) +$null = $scaleTable["Augmented"].Add($this) + +# Whole Tone scale is all whole steps up +1..6 | ForEach-Object { + $null = $scaleTable["WholeTone"].Add($scaleTable["WholeTone"][-1].Sharpen(2)) +} +$scaleTable["WholeToneDescending"] = $scaleTable["WholeTone"].Clone() +$scaleTable["WholeToneDescending"].Reverse() + +# Octatonic scale alternates b/w whole steps and half steps +1..8 | ForEach-Object { + $stepCount = if ($_ % 2 -eq 0) { 1 } else { 2 } + $null = $scaleTable["Octatonic"].Add($scaleTable["Octatonic"][-1].Sharpen($stepCount)) +} +$scaleTable["OctatonicDescending"] = $scaleTable["Octatonic"].Clone() +$scaleTable["OctatonicDescending"].Reverse() + +# Augmented scale alternates b/w minor 3rds and half steps +1..6 | ForEach-Object { + $stepCount = if ($_ % 2 -eq 0) { 1 } else { 3 } + $null = $scaleTable["Augmented"].Add($scaleTable["Augmented"][-1].Sharpen($stepCount)) +} +$scaleTable["AugmentedDescending"] = $scaleTable["Augmented"].Clone() +$scaleTable["AugmentedDescending"].Reverse() +#endregion Symmetric Scales $this | Add-Member NoteProperty '#Scale' $scaleTable -Force return $scaleTable From 7a4c6a5162a15bbc1be70a55496efd894030c18a Mon Sep 17 00:00:00 2001 From: Steven Bailey Date: Mon, 26 Oct 2026 20:44:57 -0400 Subject: [PATCH 2/2] feat: Frequency.Scale ( Fix for #125 ) Realization that our descending scales (being the reversed forms of their ascending counterparts) weren't actually starting on the current note, but an octave above. Easy fix is to drop them all down an octave. --- Types/Frequency/get_Scale.ps1 | 11 +++++++++++ Wave.types.ps1xml | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/Types/Frequency/get_Scale.ps1 b/Types/Frequency/get_Scale.ps1 index b39465e..06cbea7 100644 --- a/Types/Frequency/get_Scale.ps1 +++ b/Types/Frequency/get_Scale.ps1 @@ -116,5 +116,16 @@ $scaleTable["AugmentedDescending"] = $scaleTable["Augmented"].Clone() $scaleTable["AugmentedDescending"].Reverse() #endregion Symmetric Scales +# Because our descending scales are just the reverse of the originals right now, +# they start at the top note of each scale. +# Need to drop all descending scales down an octave to start on current note +foreach ($scale in $scaleTable.Keys) { + if ($scale -match "Descending$") { + foreach ($i in (1..$scaleTable[$scale].Count)) { + $scaleTable[$scale][($i - 1)] = $scaleTable[$scale][($i - 1)].Flatten(12) + } + } +} + $this | Add-Member NoteProperty '#Scale' $scaleTable -Force return $scaleTable diff --git a/Wave.types.ps1xml b/Wave.types.ps1xml index 2183acd..975ac1c 100644 --- a/Wave.types.ps1xml +++ b/Wave.types.ps1xml @@ -237,6 +237,17 @@ $scaleTable["AugmentedDescending"] = $scaleTable["Augmented"].Clone() $scaleTable["AugmentedDescending"].Reverse() #endregion Symmetric Scales +# Because our descending scales are just the reverse of the originals right now, +# they start at the top note of each scale. +# Need to drop all descending scales down an octave to start on current note +foreach ($scale in $scaleTable.Keys) { + if ($scale -match "Descending$") { + foreach ($i in (1..$scaleTable[$scale].Count)) { + $scaleTable[$scale][($i - 1)] = $scaleTable[$scale][($i - 1)].Flatten(12) + } + } +} + $this | Add-Member NoteProperty '#Scale' $scaleTable -Force return $scaleTable