From 0398dce247220f3bbc5fb6dff39ae36fa653f4a6 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Sat, 20 Jan 2024 16:14:21 -0600 Subject: [PATCH] Change scale indexing to be 1-based --- src/scales.jl | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/scales.jl b/src/scales.jl index 1c8d14d..9e50c1b 100644 --- a/src/scales.jl +++ b/src/scales.jl @@ -48,14 +48,22 @@ Base.eltype(::Type{Scale{T}}) where {T} = T function Base.getindex(s::Scale{Pitch}, n::Int) - octave = n รท length(s.notes) - n = n % length(s.notes) + if n == 0 + error("Scale indices start at 1 or must be negative") + end + + if n < 1 + n += 2 # offset so that scale[-2] means "go down by a second from the tonic" + end + + octave = fld1(n, length(s.notes)) - 1 + n = mod1(n, length(s.notes)) if n < 0 n += length(s.notes) octave -= 1 end - return Pitch(PitchClass(s.notes[n + 1]), s.notes[n + 1].octave + octave) + return Pitch(PitchClass(s.notes[n]), s.notes[n].octave + octave) end