From 980acea61c765e7f98bb737f5ba06da40f9c50e7 Mon Sep 17 00:00:00 2001 From: Mathieu Barbin Date: Tue, 9 Apr 2024 12:32:53 +0200 Subject: [PATCH] Add edo-19 system --- src/cello.ml | 54 +++ src/cello.mli | 26 + src/characterized_scale.ml | 13 + src/characterized_scale.mli | 1 + systems/cello/e19/dune | 30 ++ systems/cello/e19/e19.ml | 253 ++++++++++ systems/cello/e19/e19.mli | 20 + systems/cello/e19/scales.ml | 742 +++++++++++++++++++++++++++++ systems/cello/e19/scales.mli | 33 ++ systems/cello/e19/sixths.ml | 528 ++++++++++++++++++++ systems/cello/e19/sixths.mli | 18 + systems/cello/e19/thirds.ml | 561 ++++++++++++++++++++++ systems/cello/e19/thirds.mli | 18 + test/dune | 1 + test/test__cello_systems.ml | 393 +++++++++++++++ test/test__fingerboard_position.ml | 18 + 16 files changed, 2709 insertions(+) create mode 100644 systems/cello/e19/dune create mode 100644 systems/cello/e19/e19.ml create mode 100644 systems/cello/e19/e19.mli create mode 100644 systems/cello/e19/scales.ml create mode 100644 systems/cello/e19/scales.mli create mode 100644 systems/cello/e19/sixths.ml create mode 100644 systems/cello/e19/sixths.mli create mode 100644 systems/cello/e19/thirds.ml create mode 100644 systems/cello/e19/thirds.mli diff --git a/src/cello.ml b/src/cello.ml index e8090fb..7374570 100644 --- a/src/cello.ml +++ b/src/cello.ml @@ -61,6 +61,57 @@ module Fingerboard_position_name = struct ;; end + module Edo19 = struct + type t = + [ `A1_e19 + | `m2_e19 + | `M2_e19 + | `A2_e19 + | `m3_e19 + | `M3_e19 + | `A3_e19 + | `P4_e19 + | `A4_e19 + | `d5_e19 + | `P5_e19 + | `A5_e19 + | `m6_e19 + | `M6_e19 + | `d7_e19 + | `m7_e19 + | `M7_e19 + | `d8_e19 + ] + [@@deriving compare, equal, enumerate, hash, sexp_of] + + let sexp_of_t t = Sexp_to_string.position sexp_of_t t + + let acoustic_interval_to_the_open_string (t : t) = + let number_of_divisions = + match (t : t) with + | `A1_e19 -> 1 + | `m2_e19 -> 2 + | `M2_e19 -> 3 + | `A2_e19 -> 4 + | `m3_e19 -> 5 + | `M3_e19 -> 6 + | `A3_e19 -> 7 + | `P4_e19 -> 8 + | `A4_e19 -> 9 + | `d5_e19 -> 10 + | `P5_e19 -> 11 + | `A5_e19 -> 12 + | `m6_e19 -> 13 + | `M6_e19 -> 14 + | `d7_e19 -> 15 + | `m7_e19 -> 16 + | `M7_e19 -> 17 + | `d8_e19 -> 18 + in + Acoustic_interval.equal_division_of_the_octave ~divisor:19 ~number_of_divisions + ;; + end + module Edo31 = struct type t = [ `A1_e31 @@ -394,6 +445,7 @@ module Fingerboard_position_name = struct type t = [ `open_string | Edo12.t + | Edo19.t | Edo31.t | Edo53.t | Edo55.t @@ -405,6 +457,7 @@ module Fingerboard_position_name = struct let sexp_of_t : t -> Sexp.t = function | `open_string -> Atom "0" | #Edo12.t as t -> [%sexp (t : Edo12.t)] + | #Edo19.t as t -> [%sexp (t : Edo19.t)] | #Edo31.t as t -> [%sexp (t : Edo31.t)] | #Edo53.t as t -> [%sexp (t : Edo53.t)] | #Edo55.t as t -> [%sexp (t : Edo55.t)] @@ -415,6 +468,7 @@ module Fingerboard_position_name = struct let acoustic_interval_to_the_open_string : t -> Acoustic_interval.t = function | `open_string -> Acoustic_interval.unison | #Edo12.t as t -> t |> Edo12.acoustic_interval_to_the_open_string + | #Edo19.t as t -> t |> Edo19.acoustic_interval_to_the_open_string | #Edo31.t as t -> t |> Edo31.acoustic_interval_to_the_open_string | #Edo53.t as t -> t |> Edo53.acoustic_interval_to_the_open_string | #Edo55.t as t -> t |> Edo55.acoustic_interval_to_the_open_string diff --git a/src/cello.mli b/src/cello.mli index bfa75c7..b1d8901 100644 --- a/src/cello.mli +++ b/src/cello.mli @@ -44,6 +44,31 @@ module Fingerboard_position_name : sig include S with type t := t end + module Edo19 : sig + type t = + [ `A1_e19 + | `m2_e19 + | `M2_e19 + | `A2_e19 + | `m3_e19 + | `M3_e19 + | `A3_e19 + | `P4_e19 + | `A4_e19 + | `d5_e19 + | `P5_e19 + | `A5_e19 + | `m6_e19 + | `M6_e19 + | `d7_e19 + | `m7_e19 + | `M7_e19 + | `d8_e19 + ] + + include S with type t := t + end + module Edo31 : sig type t = [ `A1_e31 @@ -185,6 +210,7 @@ module Fingerboard_position_name : sig type t = [ `open_string | Edo12.t + | Edo19.t | Edo31.t | Edo53.t | Edo55.t diff --git a/src/characterized_scale.ml b/src/characterized_scale.ml index 0fef0d6..2cbf61b 100644 --- a/src/characterized_scale.ml +++ b/src/characterized_scale.ml @@ -81,6 +81,19 @@ let major_e12 = [ ton; ton; semiton; ton; ton; ton; semiton ] ;; +let major_e19 = + let second quality number_of_divisions = + let interval = { Interval.number = Second; quality; additional_octaves = 0 } in + Characterized_interval.create_exn + ~interval + ~acoustic_interval: + (Acoustic_interval.equal_division_of_the_octave ~divisor:19 ~number_of_divisions) + in + let ton = second Major 3 in + let semiton = second Minor 2 in + [ ton; ton; semiton; ton; ton; ton; semiton ] +;; + let major_e31 = let second quality number_of_divisions = let interval = { Interval.number = Second; quality; additional_octaves = 0 } in diff --git a/src/characterized_scale.mli b/src/characterized_scale.mli index f0842e0..b39f42c 100644 --- a/src/characterized_scale.mli +++ b/src/characterized_scale.mli @@ -29,5 +29,6 @@ val major_pythagorean : t val major_just_e53 : t val major_pythagorean_e53 : t val major_e12 : t +val major_e19 : t val major_e31 : t val major_e55 : t diff --git a/systems/cello/e19/dune b/systems/cello/e19/dune new file mode 100644 index 0000000..e2efd2f --- /dev/null +++ b/systems/cello/e19/dune @@ -0,0 +1,30 @@ +(library + (name fingerboard_cello_system_e19) + (flags + :standard + -w + +a-4-40-41-42-44-45-48-66 + -warn-error + +a + -open + Base + -open + Expect_test_helpers + -open + Fingerboard) + (libraries base expect-test-helpers fingerboard textutils.ascii_table) + (inline_tests) + (instrumentation + (backend bisect_ppx)) + (lint + (pps ppx_js_style -check-doc-comments)) + (preprocess + (pps + ppx_compare + ppx_enumerate + ppx_expect + ppx_hash + ppx_here + ppx_let + ppx_sexp_conv + ppx_sexp_value))) diff --git a/systems/cello/e19/e19.ml b/systems/cello/e19/e19.ml new file mode 100644 index 0000000..c5750f6 --- /dev/null +++ b/systems/cello/e19/e19.ml @@ -0,0 +1,253 @@ +(**********************************************************************************) +(* Fingerboard - a microtonal geography of the cello fingerboard *) +(* Copyright (C) 2022-2024 Mathieu Barbin *) +(* *) +(* This file is part of Fingerboard. *) +(* *) +(* Fingerboard is free software: you can redistribute it and/or modify it under *) +(* the terms of the GNU Affero General Public License as published by the Free *) +(* Software Foundation, either version 3 of the License, or any later version. *) +(* *) +(* Fingerboard is distributed in the hope that it will be useful, but WITHOUT *) +(* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *) +(* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License *) +(* for more details. *) +(* *) +(* You should have received a copy of the GNU Affero General Public License *) +(* along with Fingerboard. If not, see . *) +(**********************************************************************************) + +let create () = + Cello.fifth_system + ~acoustic_interval: + (Acoustic_interval.equal_division_of_the_octave ~divisor:19 ~number_of_divisions:11) + () +;; + +let add_positions t = + List.iter + ~f:(fun name -> Cello.add_fingerboard_position_exn t name) + (Cello.Fingerboard_position_name.Edo19.all :> Cello.Fingerboard_position_name.t list) +;; + +let t = + lazy + (let t = create () in + add_positions t; + t) +;; + +let%expect_test "tables" = + let t = force t in + print_endline (System.to_ascii_tables t); + [%expect + {| + ┌────────┬──────┬────────┬───────────────┬───────┐ + │ String │ Note │ Pitch │ Interval │ Cents │ + ├────────┼──────┼────────┼───────────────┼───────┤ + │ I │ A3 │ 220.00 │ P5 - 11-19edo │ 695 │ + │ II │ D3 │ 147.28 │ P5 - 11-19edo │ 695 │ + │ III │ G2 │ 98.60 │ P5 - 11-19edo │ 695 │ + │ IV │ C2 │ 66.01 │ │ │ + └────────┴──────┴────────┴───────────────┴───────┘ + + ┌──────────┬───────┬───────────┐ + │ Pos │ Cents │ Interval │ + ├──────────┼───────┼───────────┤ + │ 0 │ 0 │ unison │ + │ A1-e19 │ 63 │ 1-19edo │ + │ m2-e19 │ 126 │ 2-19edo │ + │ M2-e19 │ 189 │ 3-19edo │ + │ A2-e19 │ 253 │ 4-19edo │ + │ m3-e19 │ 316 │ 5-19edo │ + │ M3-e19 │ 379 │ 6-19edo │ + │ A3-e19 │ 442 │ 7-19edo │ + │ 4-e19 │ 505 │ 8-19edo │ + │ A4-e19 │ 568 │ 9-19edo │ + │ d5-e19 │ 632 │ 10-19edo │ + │ 5-e19 │ 695 │ 11-19edo │ + │ A5-e19 │ 758 │ 12-19edo │ + │ m6-e19 │ 821 │ 13-19edo │ + │ M6-e19 │ 884 │ 14-19edo │ + │ d7-e19 │ 947 │ 15-19edo │ + │ m7-e19 │ 1011 │ 16-19edo │ + │ M7-e19 │ 1074 │ 17-19edo │ + │ d8-e19 │ 1137 │ 18-19edo │ + │ 0-1 │ 1200 │ 1 octave │ + │ A1-e19-1 │ 1263 │ 20-19edo │ + │ m2-e19-1 │ 1326 │ 21-19edo │ + │ M2-e19-1 │ 1389 │ 22-19edo │ + │ A2-e19-1 │ 1453 │ 23-19edo │ + │ m3-e19-1 │ 1516 │ 24-19edo │ + │ M3-e19-1 │ 1579 │ 25-19edo │ + │ A3-e19-1 │ 1642 │ 26-19edo │ + │ 4-e19-1 │ 1705 │ 27-19edo │ + │ A4-e19-1 │ 1768 │ 28-19edo │ + │ d5-e19-1 │ 1832 │ 29-19edo │ + │ 5-e19-1 │ 1895 │ 30-19edo │ + │ A5-e19-1 │ 1958 │ 31-19edo │ + │ m6-e19-1 │ 2021 │ 32-19edo │ + │ M6-e19-1 │ 2084 │ 33-19edo │ + │ d7-e19-1 │ 2147 │ 34-19edo │ + │ m7-e19-1 │ 2211 │ 35-19edo │ + │ M7-e19-1 │ 2274 │ 36-19edo │ + │ d8-e19-1 │ 2337 │ 37-19edo │ + │ 0-2 │ 2400 │ 2 octaves │ + │ A1-e19-2 │ 2463 │ 39-19edo │ + │ m2-e19-2 │ 2526 │ 40-19edo │ + │ M2-e19-2 │ 2589 │ 41-19edo │ + │ A2-e19-2 │ 2653 │ 42-19edo │ + │ m3-e19-2 │ 2716 │ 43-19edo │ + │ M3-e19-2 │ 2779 │ 44-19edo │ + │ A3-e19-2 │ 2842 │ 45-19edo │ + │ 4-e19-2 │ 2905 │ 46-19edo │ + │ A4-e19-2 │ 2968 │ 47-19edo │ + │ d5-e19-2 │ 3032 │ 48-19edo │ + │ 5-e19-2 │ 3095 │ 49-19edo │ + │ A5-e19-2 │ 3158 │ 50-19edo │ + │ m6-e19-2 │ 3221 │ 51-19edo │ + │ M6-e19-2 │ 3284 │ 52-19edo │ + │ d7-e19-2 │ 3347 │ 53-19edo │ + │ m7-e19-2 │ 3411 │ 54-19edo │ + │ M7-e19-2 │ 3474 │ 55-19edo │ + │ d8-e19-2 │ 3537 │ 56-19edo │ + └──────────┴───────┴───────────┘ |}] +;; + +let%expect_test "approximating just intervals" = + let module Kind = struct + type t = + | Exact + | E19 + | E53 + | Equal_temperament + [@@deriving enumerate, sexp_of] + end + in + let module Row = struct + type t = + | Octave + | Just_major_sixth + | Just_minor_sixth + | Fifth + | Fourth + | Just_major_third + | Just_minor_third + | Pythagorean_major_second + | Pythagorean_diatonic_semiton + | Pythagorean_chromatic_semiton + | Just_diatonic_semiton + [@@deriving enumerate, sexp_of] + end + in + let acoustic_interval (interval : Row.t) (kind : Kind.t) = + match (kind : Kind.t) with + | Exact -> + (match interval with + | Octave -> Acoustic_interval.octave + | Just_major_sixth -> Acoustic_interval.just_major_sixth + | Just_minor_sixth -> Acoustic_interval.just_minor_sixth + | Fifth -> + Acoustic_interval.pythagorean + { number = Fifth; quality = Perfect; additional_octaves = 0 } + | Fourth -> + Acoustic_interval.pythagorean + { number = Fourth; quality = Perfect; additional_octaves = 0 } + | Just_major_third -> Acoustic_interval.just_major_third + | Just_minor_third -> Acoustic_interval.just_minor_third + | Pythagorean_major_second -> + Acoustic_interval.pythagorean + { number = Second; quality = Major; additional_octaves = 0 } + | Pythagorean_diatonic_semiton -> Acoustic_interval.pythagorean_diatonic_semiton + | Pythagorean_chromatic_semiton -> Acoustic_interval.pythagorean_chromatic_semiton + | Just_diatonic_semiton -> Acoustic_interval.just_diatonic_semiton) + | Equal_temperament -> + let number_of_divisions = + match interval with + | Octave -> 12 + | Just_major_sixth -> 9 + | Just_minor_sixth -> 8 + | Fifth -> 7 + | Fourth -> 5 + | Just_major_third -> 4 + | Just_minor_third -> 3 + | Pythagorean_major_second -> 2 + | Pythagorean_diatonic_semiton + | Pythagorean_chromatic_semiton + | Just_diatonic_semiton -> 1 + in + Acoustic_interval.equal_division_of_the_octave ~divisor:12 ~number_of_divisions + | E19 -> + let number_of_divisions = + match interval with + | Octave -> 19 + | Just_major_sixth -> 41 + | Just_minor_sixth -> 37 + | Fifth -> 32 + | Fourth -> 23 + | Just_major_third -> 18 + | Just_minor_third -> 14 + | Pythagorean_major_second -> 9 + | Pythagorean_diatonic_semiton -> 4 + | Pythagorean_chromatic_semiton -> 5 + | Just_diatonic_semiton -> 5 + in + Acoustic_interval.equal_division_of_the_octave ~divisor:19 ~number_of_divisions + | E53 -> + let number_of_divisions = + match interval with + | Octave -> 53 + | Just_major_sixth -> 39 + | Just_minor_sixth -> 36 + | Fifth -> 19 + | Fourth -> 22 + | Just_major_third -> 17 + | Just_minor_third -> 14 + | Pythagorean_major_second -> 9 + | Pythagorean_diatonic_semiton -> 4 + | Pythagorean_chromatic_semiton -> 5 + | Just_diatonic_semiton -> 5 + in + Acoustic_interval.equal_division_of_the_octave ~divisor:53 ~number_of_divisions + in + let columns = + let cents_column kind = + Ascii_table.Column.create_attr + ~align:Right + (Sexp.to_string [%sexp (kind : Kind.t)]) + (fun (t : Row.t) -> + acoustic_interval t kind + |> Acoustic_interval.to_cents + |> Float.iround_exn ~dir:`Nearest + |> Int.to_string + |> fun i -> [], i) + in + Ascii_table.Column.( + [ [ create_attr "Interval" (fun (t : Row.t) -> + ( [] + , Sexp.to_string_hum [%sexp (t : Row.t)] + |> String.substr_replace_all ~pattern:"_" ~with_:" " )) + ] + ; List.map Kind.all ~f:cents_column + ] + |> List.concat) + in + Ascii_table.to_string columns Row.all |> print_endline; + [%expect + {| + ┌───────────────────────────────┬───────┬──────┬──────┬───────────────────┐ + │ Interval │ Exact │ E19 │ E53 │ Equal_temperament │ + ├───────────────────────────────┼───────┼──────┼──────┼───────────────────┤ + │ Octave │ 1200 │ 1200 │ 1200 │ 1200 │ + │ Just major sixth │ 884 │ 2589 │ 883 │ 900 │ + │ Just minor sixth │ 814 │ 2337 │ 815 │ 800 │ + │ Fifth │ 702 │ 2021 │ 430 │ 700 │ + │ Fourth │ 498 │ 1453 │ 498 │ 500 │ + │ Just major third │ 386 │ 1137 │ 385 │ 400 │ + │ Just minor third │ 316 │ 884 │ 317 │ 300 │ + │ Pythagorean major second │ 204 │ 568 │ 204 │ 200 │ + │ Pythagorean diatonic semiton │ 90 │ 253 │ 91 │ 100 │ + │ Pythagorean chromatic semiton │ 114 │ 316 │ 113 │ 100 │ + │ Just diatonic semiton │ 112 │ 316 │ 113 │ 100 │ + └───────────────────────────────┴───────┴──────┴──────┴───────────────────┘ |}] +;; diff --git a/systems/cello/e19/e19.mli b/systems/cello/e19/e19.mli new file mode 100644 index 0000000..91c6d53 --- /dev/null +++ b/systems/cello/e19/e19.mli @@ -0,0 +1,20 @@ +(*_*********************************************************************************) +(*_ Fingerboard - a microtonal geography of the cello fingerboard *) +(*_ Copyright (C) 2022-2024 Mathieu Barbin *) +(*_ *) +(*_ This file is part of Fingerboard. *) +(*_ *) +(*_ Fingerboard is free software: you can redistribute it and/or modify it under *) +(*_ the terms of the GNU Affero General Public License as published by the Free *) +(*_ Software Foundation, either version 3 of the License, or any later version. *) +(*_ *) +(*_ Fingerboard is distributed in the hope that it will be useful, but WITHOUT *) +(*_ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *) +(*_ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License *) +(*_ for more details. *) +(*_ *) +(*_ You should have received a copy of the GNU Affero General Public License *) +(*_ along with Fingerboard. If not, see . *) +(*_*********************************************************************************) + +val t : System.t Lazy.t diff --git a/systems/cello/e19/scales.ml b/systems/cello/e19/scales.ml new file mode 100644 index 0000000..0f11ab3 --- /dev/null +++ b/systems/cello/e19/scales.ml @@ -0,0 +1,742 @@ +(**********************************************************************************) +(* Fingerboard - a microtonal geography of the cello fingerboard *) +(* Copyright (C) 2022-2024 Mathieu Barbin *) +(* *) +(* This file is part of Fingerboard. *) +(* *) +(* Fingerboard is free software: you can redistribute it and/or modify it under *) +(* the terms of the GNU Affero General Public License as published by the Free *) +(* Software Foundation, either version 3 of the License, or any later version. *) +(* *) +(* Fingerboard is distributed in the hope that it will be useful, but WITHOUT *) +(* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *) +(* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License *) +(* for more details. *) +(* *) +(* You should have received a copy of the GNU Affero General Public License *) +(* along with Fingerboard. If not, see . *) +(**********************************************************************************) + +let make_scale t ~characterized_scale ~from = + System.make_scale t ~characterized_scale ~from ~to_:Cello.fingerboard_highest_note +;; + +let make_major_scale ~from = + let t = force E19.t in + make_scale t ~characterized_scale:Characterized_scale.major_e19 ~from +;; + +let lower_c = + let t = force E19.t in + System.open_string t IV |> Option.value_exn ~here:[%here] +;; + +let%expect_test "c_major" = + let scale = make_major_scale ~from:lower_c in + print_s [%sexp (List.length scale : int)]; + [%expect {| 31 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((IV ( + (C2 0) + (D2 M2-e19) + (E2 M3-e19) + (F2 4-e19))) + (III ( + (G2 0) + (A2 M2-e19) + (B2 M3-e19) + (C3 4-e19))) + (II ( + (D3 0) + (E3 M2-e19) + (F3 m3-e19) + (G3 4-e19))) + (I ( + (A3 0) + (B3 M2-e19) + (C4 m3-e19) + (D4 4-e19) + (E4 5-e19) + (F4 m6-e19) + (G4 m7-e19) + (A4 0-1) + (B4 M2-e19-1) + (C5 m3-e19-1) + (D5 4-e19-1) + (E5 5-e19-1) + (F5 m6-e19-1) + (G5 m7-e19-1) + (A5 0-2) + (B5 M2-e19-2) + (C6 m3-e19-2) + (D6 4-e19-2) + (E6 5-e19-2)))) |}]; + () +;; + +let lower_c_sharp = + let t = force E19.t in + { Located_note.note = { letter_name = C; symbol = Sharp; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `A1_e19 + ; string_number = IV + } + } +;; + +let%expect_test "c_sharp_major" = + let scale = make_major_scale ~from:lower_c_sharp in + print_s [%sexp (List.length scale : int)]; + [%expect {| 31 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((IV ( + (C#2 A1-e19) + (D#2 A2-e19) + (E#2 A3-e19) + (F#2 A4-e19))) + (III ( + (G#2 A1-e19) + (A#2 A2-e19) + (B#2 A3-e19) + (C#3 A4-e19))) + (II ( + (D#3 A1-e19) + (E#3 A2-e19) + (F#3 M3-e19) + (G#3 A4-e19))) + (I ( + (A#3 A1-e19) + (B#3 A2-e19) + (C#4 M3-e19) + (D#4 A4-e19) + (E#4 A5-e19) + (F#4 M6-e19) + (G#4 M7-e19) + (A#4 A1-e19-1) + (B#4 A2-e19-1) + (C#5 M3-e19-1) + (D#5 A4-e19-1) + (E#5 A5-e19-1) + (F#5 M6-e19-1) + (G#5 M7-e19-1) + (A#5 A1-e19-2) + (B#5 A2-e19-2) + (C#6 M3-e19-2) + (D#6 A4-e19-2) + (E#6 A5-e19-2)))) |}]; + () +;; + +let lower_d_flat = + let t = force E19.t in + { Located_note.note = { letter_name = D; symbol = Flat; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `m2_e19 + ; string_number = IV + } + } +;; + +let%expect_test "d_flat_major" = + let scale = make_major_scale ~from:lower_d_flat in + print_s [%sexp (List.length scale : int)]; + [%expect {| 31 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((IV ( + (Db2 m2-e19) + (Eb2 m3-e19) + (F2 4-e19) + (Gb2 d5-e19))) + (III ( + (Ab2 m2-e19) + (Bb2 m3-e19) + (C3 4-e19) + (Db3 d5-e19))) + (II ( + (Eb3 m2-e19) + (F3 m3-e19) + (Gb3 A3-e19) + (Ab3 d5-e19))) + (I ( + (Bb3 m2-e19) + (C4 m3-e19) + (Db4 A3-e19) + (Eb4 d5-e19) + (F4 m6-e19) + (Gb4 d7-e19) + (Ab4 d8-e19) + (Bb4 m2-e19-1) + (C5 m3-e19-1) + (Db5 A3-e19-1) + (Eb5 d5-e19-1) + (F5 m6-e19-1) + (Gb5 d7-e19-1) + (Ab5 d8-e19-1) + (Bb5 m2-e19-2) + (C6 m3-e19-2) + (Db6 A3-e19-2) + (Eb6 d5-e19-2) + (F6 m6-e19-2)))) |}]; + () +;; + +let lower_d = + let t = force E19.t in + { Located_note.note = { letter_name = D; symbol = Natural; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `M2_e19 + ; string_number = IV + } + } +;; + +let%expect_test "d_major" = + let scale = make_major_scale ~from:lower_d in + print_s [%sexp (List.length scale : int)]; + [%expect {| 30 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((IV ( + (D2 M2-e19) + (E2 M3-e19) + (F#2 A4-e19))) + (III ( + (G2 0) + (A2 M2-e19) + (B2 M3-e19) + (C#3 A4-e19))) + (II ( + (D3 0) + (E3 M2-e19) + (F#3 M3-e19) + (G3 4-e19))) + (I ( + (A3 0) + (B3 M2-e19) + (C#4 M3-e19) + (D4 4-e19) + (E4 5-e19) + (F#4 M6-e19) + (G4 m7-e19) + (A4 0-1) + (B4 M2-e19-1) + (C#5 M3-e19-1) + (D5 4-e19-1) + (E5 5-e19-1) + (F#5 M6-e19-1) + (G5 m7-e19-1) + (A5 0-2) + (B5 M2-e19-2) + (C#6 M3-e19-2) + (D6 4-e19-2) + (E6 5-e19-2)))) |}]; + () +;; + +let lower_e_flat = + let t = force E19.t in + { Located_note.note = { letter_name = E; symbol = Flat; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `m3_e19 + ; string_number = IV + } + } +;; + +let%expect_test "e_flat_major" = + let scale = make_major_scale ~from:lower_e_flat in + print_s [%sexp (List.length scale : int)]; + [%expect {| 30 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((IV ( + (Eb2 m3-e19) + (F2 4-e19))) + (III ( + (G2 0) + (Ab2 m2-e19) + (Bb2 m3-e19) + (C3 4-e19))) + (II ( + (D3 0) + (Eb3 m2-e19) + (F3 m3-e19) + (G3 4-e19) + (Ab3 d5-e19))) + (I ( + (Bb3 m2-e19) + (C4 m3-e19) + (D4 4-e19) + (Eb4 d5-e19) + (F4 m6-e19) + (G4 m7-e19) + (Ab4 d8-e19) + (Bb4 m2-e19-1) + (C5 m3-e19-1) + (D5 4-e19-1) + (Eb5 d5-e19-1) + (F5 m6-e19-1) + (G5 m7-e19-1) + (Ab5 d8-e19-1) + (Bb5 m2-e19-2) + (C6 m3-e19-2) + (D6 4-e19-2) + (Eb6 d5-e19-2) + (F6 m6-e19-2)))) |}]; + () +;; + +let lower_e = + let t = force E19.t in + { Located_note.note = { letter_name = E; symbol = Natural; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `M3_e19 + ; string_number = IV + } + } +;; + +let%expect_test "e_major" = + let scale = make_major_scale ~from:lower_e in + print_s [%sexp (List.length scale : int)]; + [%expect {| 29 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((IV ( + (E2 M3-e19) + (F#2 A4-e19))) + (III ( + (G#2 A1-e19) + (A2 M2-e19) + (B2 M3-e19) + (C#3 A4-e19))) + (II ( + (D#3 A1-e19) + (E3 M2-e19) + (F#3 M3-e19) + (G#3 A4-e19))) + (I ( + (A3 0) + (B3 M2-e19) + (C#4 M3-e19) + (D#4 A4-e19) + (E4 5-e19) + (F#4 M6-e19) + (G#4 M7-e19) + (A4 0-1) + (B4 M2-e19-1) + (C#5 M3-e19-1) + (D#5 A4-e19-1) + (E5 5-e19-1) + (F#5 M6-e19-1) + (G#5 M7-e19-1) + (A5 0-2) + (B5 M2-e19-2) + (C#6 M3-e19-2) + (D#6 A4-e19-2) + (E6 5-e19-2)))) |}]; + () +;; + +let lower_f = + let t = force E19.t in + { Located_note.note = { letter_name = F; symbol = Natural; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `P4_e19 + ; string_number = IV + } + } +;; + +let%expect_test "f_major" = + let scale = make_major_scale ~from:lower_f in + print_s [%sexp (List.length scale : int)]; + [%expect {| 28 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((IV ((F2 4-e19))) + (III ( + (G2 0) + (A2 M2-e19) + (Bb2 m3-e19) + (C3 4-e19))) + (II ( + (D3 0) + (E3 M2-e19) + (F3 m3-e19) + (G3 4-e19))) + (I ( + (A3 0) + (Bb3 m2-e19) + (C4 m3-e19) + (D4 4-e19) + (E4 5-e19) + (F4 m6-e19) + (G4 m7-e19) + (A4 0-1) + (Bb4 m2-e19-1) + (C5 m3-e19-1) + (D5 4-e19-1) + (E5 5-e19-1) + (F5 m6-e19-1) + (G5 m7-e19-1) + (A5 0-2) + (Bb5 m2-e19-2) + (C6 m3-e19-2) + (D6 4-e19-2) + (E6 5-e19-2)))) |}]; + () +;; + +let lower_f_sharp = + let t = force E19.t in + { Located_note.note = { letter_name = F; symbol = Sharp; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `A4_e19 + ; string_number = IV + } + } +;; + +let%expect_test "f_sharp_major" = + let scale = make_major_scale ~from:lower_f_sharp in + print_s [%sexp (List.length scale : int)]; + [%expect {| 28 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((IV ((F#2 A4-e19))) + (III ( + (G#2 A1-e19) + (A#2 A2-e19) + (B2 M3-e19) + (C#3 A4-e19))) + (II ( + (D#3 A1-e19) + (E#3 A2-e19) + (F#3 M3-e19) + (G#3 A4-e19))) + (I ( + (A#3 A1-e19) + (B3 M2-e19) + (C#4 M3-e19) + (D#4 A4-e19) + (E#4 A5-e19) + (F#4 M6-e19) + (G#4 M7-e19) + (A#4 A1-e19-1) + (B4 M2-e19-1) + (C#5 M3-e19-1) + (D#5 A4-e19-1) + (E#5 A5-e19-1) + (F#5 M6-e19-1) + (G#5 M7-e19-1) + (A#5 A1-e19-2) + (B5 M2-e19-2) + (C#6 M3-e19-2) + (D#6 A4-e19-2) + (E#6 A5-e19-2)))) |}]; + () +;; + +let lower_g_flat = + let t = force E19.t in + { Located_note.note = { letter_name = G; symbol = Flat; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `d5_e19 + ; string_number = IV + } + } +;; + +let%expect_test "g_flat_major" = + let scale = make_major_scale ~from:lower_g_flat in + print_s [%sexp (List.length scale : int)]; + [%expect {| 28 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((IV ((Gb2 d5-e19))) + (III ( + (Ab2 m2-e19) + (Bb2 m3-e19) + (Cb3 A3-e19) + (Db3 d5-e19))) + (II ( + (Eb3 m2-e19) + (F3 m3-e19) + (Gb3 A3-e19) + (Ab3 d5-e19))) + (I ( + (Bb3 m2-e19) + (Cb4 A2-e19) + (Db4 A3-e19) + (Eb4 d5-e19) + (F4 m6-e19) + (Gb4 d7-e19) + (Ab4 d8-e19) + (Bb4 m2-e19-1) + (Cb5 A2-e19-1) + (Db5 A3-e19-1) + (Eb5 d5-e19-1) + (F5 m6-e19-1) + (Gb5 d7-e19-1) + (Ab5 d8-e19-1) + (Bb5 m2-e19-2) + (Cb6 A2-e19-2) + (Db6 A3-e19-2) + (Eb6 d5-e19-2) + (F6 m6-e19-2)))) |}]; + () +;; + +let lower_g = + let t = force E19.t in + System.open_string t III |> Option.value_exn ~here:[%here] +;; + +let%expect_test "g_major" = + let scale = make_major_scale ~from:lower_g in + print_s [%sexp (List.length scale : int)]; + [%expect {| 27 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((III ( + (G2 0) + (A2 M2-e19) + (B2 M3-e19) + (C3 4-e19))) + (II ( + (D3 0) + (E3 M2-e19) + (F#3 M3-e19) + (G3 4-e19))) + (I ( + (A3 0) + (B3 M2-e19) + (C4 m3-e19) + (D4 4-e19) + (E4 5-e19) + (F#4 M6-e19) + (G4 m7-e19) + (A4 0-1) + (B4 M2-e19-1) + (C5 m3-e19-1) + (D5 4-e19-1) + (E5 5-e19-1) + (F#5 M6-e19-1) + (G5 m7-e19-1) + (A5 0-2) + (B5 M2-e19-2) + (C6 m3-e19-2) + (D6 4-e19-2) + (E6 5-e19-2)))) |}]; + () +;; + +let lower_a_flat = + let t = force E19.t in + { Located_note.note = { letter_name = A; symbol = Flat; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `m2_e19 + ; string_number = III + } + } +;; + +let%expect_test "a_flat_major" = + let scale = make_major_scale ~from:lower_a_flat in + print_s [%sexp (List.length scale : int)]; + [%expect {| 27 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((III ( + (Ab2 m2-e19) + (Bb2 m3-e19) + (C3 4-e19) + (Db3 d5-e19))) + (II ( + (Eb3 m2-e19) + (F3 m3-e19) + (G3 4-e19) + (Ab3 d5-e19))) + (I ( + (Bb3 m2-e19) + (C4 m3-e19) + (Db4 A3-e19) + (Eb4 d5-e19) + (F4 m6-e19) + (G4 m7-e19) + (Ab4 d8-e19) + (Bb4 m2-e19-1) + (C5 m3-e19-1) + (Db5 A3-e19-1) + (Eb5 d5-e19-1) + (F5 m6-e19-1) + (G5 m7-e19-1) + (Ab5 d8-e19-1) + (Bb5 m2-e19-2) + (C6 m3-e19-2) + (Db6 A3-e19-2) + (Eb6 d5-e19-2) + (F6 m6-e19-2)))) |}]; + () +;; + +let lower_a = + let t = force E19.t in + { Located_note.note = { letter_name = A; symbol = Natural; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `M2_e19 + ; string_number = III + } + } +;; + +let%expect_test "a_major" = + let scale = make_major_scale ~from:lower_a in + print_s [%sexp (List.length scale : int)]; + [%expect {| 26 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((III ( + (A2 M2-e19) + (B2 M3-e19) + (C#3 A4-e19))) + (II ( + (D3 0) + (E3 M2-e19) + (F#3 M3-e19) + (G#3 A4-e19))) + (I ( + (A3 0) + (B3 M2-e19) + (C#4 M3-e19) + (D4 4-e19) + (E4 5-e19) + (F#4 M6-e19) + (G#4 M7-e19) + (A4 0-1) + (B4 M2-e19-1) + (C#5 M3-e19-1) + (D5 4-e19-1) + (E5 5-e19-1) + (F#5 M6-e19-1) + (G#5 M7-e19-1) + (A5 0-2) + (B5 M2-e19-2) + (C#6 M3-e19-2) + (D6 4-e19-2) + (E6 5-e19-2)))) |}]; + () +;; + +let lower_b_flat = + let t = force E19.t in + { Located_note.note = { letter_name = B; symbol = Flat; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `m3_e19 + ; string_number = III + } + } +;; + +let%expect_test "b_flat_major" = + let scale = make_major_scale ~from:lower_b_flat in + print_s [%sexp (List.length scale : int)]; + [%expect {| 26 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((III ( + (Bb2 m3-e19) + (C3 4-e19))) + (II ( + (D3 0) + (Eb3 m2-e19) + (F3 m3-e19) + (G3 4-e19))) + (I ( + (A3 0) + (Bb3 m2-e19) + (C4 m3-e19) + (D4 4-e19) + (Eb4 d5-e19) + (F4 m6-e19) + (G4 m7-e19) + (A4 0-1) + (Bb4 m2-e19-1) + (C5 m3-e19-1) + (D5 4-e19-1) + (Eb5 d5-e19-1) + (F5 m6-e19-1) + (G5 m7-e19-1) + (A5 0-2) + (Bb5 m2-e19-2) + (C6 m3-e19-2) + (D6 4-e19-2) + (Eb6 d5-e19-2) + (F6 m6-e19-2)))) |}]; + () +;; + +let lower_b = + let t = force E19.t in + { Located_note.note = { letter_name = B; symbol = Natural; octave_designation = 2 } + ; fingerboard_location = + { fingerboard_position = Cello.find_fingerboard_position_exn t `M3_e19 + ; string_number = III + } + } +;; + +let%expect_test "b_major" = + let scale = make_major_scale ~from:lower_b in + print_s [%sexp (List.length scale : int)]; + [%expect {| 25 |}]; + print_s [%sexp (scale |> Located_note.to_scale_abbrev : Located_note.Scale_abbrev.t)]; + [%expect + {| + ((III ( + (B2 M3-e19) + (C#3 A4-e19))) + (II ( + (D#3 A1-e19) + (E3 M2-e19) + (F#3 M3-e19) + (G#3 A4-e19))) + (I ( + (A#3 A1-e19) + (B3 M2-e19) + (C#4 M3-e19) + (D#4 A4-e19) + (E4 5-e19) + (F#4 M6-e19) + (G#4 M7-e19) + (A#4 A1-e19-1) + (B4 M2-e19-1) + (C#5 M3-e19-1) + (D#5 A4-e19-1) + (E5 5-e19-1) + (F#5 M6-e19-1) + (G#5 M7-e19-1) + (A#5 A1-e19-2) + (B5 M2-e19-2) + (C#6 M3-e19-2) + (D#6 A4-e19-2) + (E6 5-e19-2)))) |}]; + () +;; diff --git a/systems/cello/e19/scales.mli b/systems/cello/e19/scales.mli new file mode 100644 index 0000000..0c4c510 --- /dev/null +++ b/systems/cello/e19/scales.mli @@ -0,0 +1,33 @@ +(*_*********************************************************************************) +(*_ Fingerboard - a microtonal geography of the cello fingerboard *) +(*_ Copyright (C) 2022-2024 Mathieu Barbin *) +(*_ *) +(*_ This file is part of Fingerboard. *) +(*_ *) +(*_ Fingerboard is free software: you can redistribute it and/or modify it under *) +(*_ the terms of the GNU Affero General Public License as published by the Free *) +(*_ Software Foundation, either version 3 of the License, or any later version. *) +(*_ *) +(*_ Fingerboard is distributed in the hope that it will be useful, but WITHOUT *) +(*_ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *) +(*_ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License *) +(*_ for more details. *) +(*_ *) +(*_ You should have received a copy of the GNU Affero General Public License *) +(*_ along with Fingerboard. If not, see . *) +(*_*********************************************************************************) + +val lower_c : Located_note.t +val lower_c_sharp : Located_note.t +val lower_d_flat : Located_note.t +val lower_d : Located_note.t +val lower_e_flat : Located_note.t +val lower_e : Located_note.t +val lower_f : Located_note.t +val lower_f_sharp : Located_note.t +val lower_g_flat : Located_note.t +val lower_g : Located_note.t +val lower_a_flat : Located_note.t +val lower_a : Located_note.t +val lower_b_flat : Located_note.t +val lower_b : Located_note.t diff --git a/systems/cello/e19/sixths.ml b/systems/cello/e19/sixths.ml new file mode 100644 index 0000000..a44ec7b --- /dev/null +++ b/systems/cello/e19/sixths.ml @@ -0,0 +1,528 @@ +(**********************************************************************************) +(* Fingerboard - a microtonal geography of the cello fingerboard *) +(* Copyright (C) 2022-2024 Mathieu Barbin *) +(* *) +(* This file is part of Fingerboard. *) +(* *) +(* Fingerboard is free software: you can redistribute it and/or modify it under *) +(* the terms of the GNU Affero General Public License as published by the Free *) +(* Software Foundation, either version 3 of the License, or any later version. *) +(* *) +(* Fingerboard is distributed in the hope that it will be useful, but WITHOUT *) +(* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *) +(* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License *) +(* for more details. *) +(* *) +(* You should have received a copy of the GNU Affero General Public License *) +(* along with Fingerboard. If not, see . *) +(**********************************************************************************) + +let make_scale ~characterized_scale ~from = + let t = force E19.t in + System.Double_stops.make_scale + t + ~characterized_scale + ~interval_number:Sixth + ~from + ~to_:Cello.fingerboard_highest_note +;; + +let make_major_scale ~from = + make_scale ~characterized_scale:Characterized_scale.major_e19 ~from +;; + +let%expect_test "c_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_c in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ C2 │ IV │ 0 │ 0 │ A2 │ III │ M2-e19 │ 189 │ M6 - 14-19edo │ 884 │ + │ D2 │ IV │ M2-e19 │ 189 │ B2 │ III │ M3-e19 │ 379 │ M6 - 14-19edo │ 884 │ + │ E2 │ IV │ M3-e19 │ 379 │ C3 │ III │ 4-e19 │ 505 │ m6 - 13-19edo │ 821 │ + │ F2 │ IV │ 4-e19 │ 505 │ D3 │ III │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ G2 │ III │ 0 │ 0 │ E3 │ II │ M2-e19 │ 189 │ M6 - 14-19edo │ 884 │ + │ A2 │ III │ M2-e19 │ 189 │ F3 │ II │ m3-e19 │ 316 │ m6 - 13-19edo │ 821 │ + │ B2 │ III │ M3-e19 │ 379 │ G3 │ II │ 4-e19 │ 505 │ m6 - 13-19edo │ 821 │ + │ C3 │ III │ 4-e19 │ 505 │ A3 │ II │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ D3 │ II │ 0 │ 0 │ B3 │ I │ M2-e19 │ 189 │ M6 - 14-19edo │ 884 │ + │ E3 │ II │ M2-e19 │ 189 │ C4 │ I │ m3-e19 │ 316 │ m6 - 13-19edo │ 821 │ + │ F3 │ II │ m3-e19 │ 316 │ D4 │ I │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ G3 │ II │ 4-e19 │ 505 │ E4 │ I │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ A3 │ II │ 5-e19 │ 695 │ F4 │ I │ m6-e19 │ 821 │ m6 - 13-19edo │ 821 │ + │ B3 │ II │ M6-e19 │ 884 │ G4 │ I │ m7-e19 │ 1011 │ m6 - 13-19edo │ 821 │ + │ C4 │ II │ m7-e19 │ 1011 │ A4 │ I │ 0-1 │ 1200 │ M6 - 14-19edo │ 884 │ + │ D4 │ II │ 0-1 │ 1200 │ B4 │ I │ M2-e19-1 │ 1389 │ M6 - 14-19edo │ 884 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ C5 │ I │ m3-e19-1 │ 1516 │ m6 - 13-19edo │ 821 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ D5 │ I │ 4-e19-1 │ 1705 │ M6 - 14-19edo │ 884 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ E5 │ I │ 5-e19-1 │ 1895 │ M6 - 14-19edo │ 884 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ F5 │ I │ m6-e19-1 │ 2021 │ m6 - 13-19edo │ 821 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ G5 │ I │ m7-e19-1 │ 2211 │ m6 - 13-19edo │ 821 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ A5 │ I │ 0-2 │ 2400 │ M6 - 14-19edo │ 884 │ + │ D5 │ II │ 0-2 │ 2400 │ B5 │ I │ M2-e19-2 │ 2589 │ M6 - 14-19edo │ 884 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ C6 │ I │ m3-e19-2 │ 2716 │ m6 - 13-19edo │ 821 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ D6 │ I │ 4-e19-2 │ 2905 │ M6 - 14-19edo │ 884 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ E6 │ I │ 5-e19-2 │ 3095 │ M6 - 14-19edo │ 884 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "c_sharp_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_c_sharp in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ C#2 │ IV │ A1-e19 │ 63 │ A#2 │ III │ A2-e19 │ 253 │ M6 - 14-19edo │ 884 │ + │ D#2 │ IV │ A2-e19 │ 253 │ B#2 │ III │ A3-e19 │ 442 │ M6 - 14-19edo │ 884 │ + │ E#2 │ IV │ A3-e19 │ 442 │ C#3 │ III │ A4-e19 │ 568 │ m6 - 13-19edo │ 821 │ + │ F#2 │ IV │ A4-e19 │ 568 │ D#3 │ III │ A5-e19 │ 758 │ M6 - 14-19edo │ 884 │ + │ G#2 │ III │ A1-e19 │ 63 │ E#3 │ II │ A2-e19 │ 253 │ M6 - 14-19edo │ 884 │ + │ A#2 │ III │ A2-e19 │ 253 │ F#3 │ II │ M3-e19 │ 379 │ m6 - 13-19edo │ 821 │ + │ B#2 │ III │ A3-e19 │ 442 │ G#3 │ II │ A4-e19 │ 568 │ m6 - 13-19edo │ 821 │ + │ C#3 │ III │ A4-e19 │ 568 │ A#3 │ II │ A5-e19 │ 758 │ M6 - 14-19edo │ 884 │ + │ D#3 │ II │ A1-e19 │ 63 │ B#3 │ I │ A2-e19 │ 253 │ M6 - 14-19edo │ 884 │ + │ E#3 │ II │ A2-e19 │ 253 │ C#4 │ I │ M3-e19 │ 379 │ m6 - 13-19edo │ 821 │ + │ F#3 │ II │ M3-e19 │ 379 │ D#4 │ I │ A4-e19 │ 568 │ M6 - 14-19edo │ 884 │ + │ G#3 │ II │ A4-e19 │ 568 │ E#4 │ I │ A5-e19 │ 758 │ M6 - 14-19edo │ 884 │ + │ A#3 │ II │ A5-e19 │ 758 │ F#4 │ I │ M6-e19 │ 884 │ m6 - 13-19edo │ 821 │ + │ B#3 │ II │ d7-e19 │ 947 │ G#4 │ I │ M7-e19 │ 1074 │ m6 - 13-19edo │ 821 │ + │ C#4 │ II │ M7-e19 │ 1074 │ A#4 │ I │ A1-e19-1 │ 1263 │ M6 - 14-19edo │ 884 │ + │ D#4 │ II │ A1-e19-1 │ 1263 │ B#4 │ I │ A2-e19-1 │ 1453 │ M6 - 14-19edo │ 884 │ + │ E#4 │ II │ A2-e19-1 │ 1453 │ C#5 │ I │ M3-e19-1 │ 1579 │ m6 - 13-19edo │ 821 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ D#5 │ I │ A4-e19-1 │ 1768 │ M6 - 14-19edo │ 884 │ + │ G#4 │ II │ A4-e19-1 │ 1768 │ E#5 │ I │ A5-e19-1 │ 1958 │ M6 - 14-19edo │ 884 │ + │ A#4 │ II │ A5-e19-1 │ 1958 │ F#5 │ I │ M6-e19-1 │ 2084 │ m6 - 13-19edo │ 821 │ + │ B#4 │ II │ d7-e19-1 │ 2147 │ G#5 │ I │ M7-e19-1 │ 2274 │ m6 - 13-19edo │ 821 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ A#5 │ I │ A1-e19-2 │ 2463 │ M6 - 14-19edo │ 884 │ + │ D#5 │ II │ A1-e19-2 │ 2463 │ B#5 │ I │ A2-e19-2 │ 2653 │ M6 - 14-19edo │ 884 │ + │ E#5 │ II │ A2-e19-2 │ 2653 │ C#6 │ I │ M3-e19-2 │ 2779 │ m6 - 13-19edo │ 821 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ D#6 │ I │ A4-e19-2 │ 2968 │ M6 - 14-19edo │ 884 │ + │ G#5 │ II │ A4-e19-2 │ 2968 │ E#6 │ I │ A5-e19-2 │ 3158 │ M6 - 14-19edo │ 884 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "d_flat_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_d_flat in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ Db2 │ IV │ m2-e19 │ 126 │ Bb2 │ III │ m3-e19 │ 316 │ M6 - 14-19edo │ 884 │ + │ Eb2 │ IV │ m3-e19 │ 316 │ C3 │ III │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ F2 │ IV │ 4-e19 │ 505 │ Db3 │ III │ d5-e19 │ 632 │ m6 - 13-19edo │ 821 │ + │ Gb2 │ IV │ d5-e19 │ 632 │ Eb3 │ III │ m6-e19 │ 821 │ M6 - 14-19edo │ 884 │ + │ Ab2 │ III │ m2-e19 │ 126 │ F3 │ II │ m3-e19 │ 316 │ M6 - 14-19edo │ 884 │ + │ Bb2 │ III │ m3-e19 │ 316 │ Gb3 │ II │ A3-e19 │ 442 │ m6 - 13-19edo │ 821 │ + │ C3 │ III │ 4-e19 │ 505 │ Ab3 │ II │ d5-e19 │ 632 │ m6 - 13-19edo │ 821 │ + │ Db3 │ III │ d5-e19 │ 632 │ Bb3 │ II │ m6-e19 │ 821 │ M6 - 14-19edo │ 884 │ + │ Eb3 │ II │ m2-e19 │ 126 │ C4 │ I │ m3-e19 │ 316 │ M6 - 14-19edo │ 884 │ + │ F3 │ II │ m3-e19 │ 316 │ Db4 │ I │ A3-e19 │ 442 │ m6 - 13-19edo │ 821 │ + │ Gb3 │ II │ A3-e19 │ 442 │ Eb4 │ I │ d5-e19 │ 632 │ M6 - 14-19edo │ 884 │ + │ Ab3 │ II │ d5-e19 │ 632 │ F4 │ I │ m6-e19 │ 821 │ M6 - 14-19edo │ 884 │ + │ Bb3 │ II │ m6-e19 │ 821 │ Gb4 │ I │ d7-e19 │ 947 │ m6 - 13-19edo │ 821 │ + │ C4 │ II │ m7-e19 │ 1011 │ Ab4 │ I │ d8-e19 │ 1137 │ m6 - 13-19edo │ 821 │ + │ Db4 │ II │ d8-e19 │ 1137 │ Bb4 │ I │ m2-e19-1 │ 1326 │ M6 - 14-19edo │ 884 │ + │ Eb4 │ II │ m2-e19-1 │ 1326 │ C5 │ I │ m3-e19-1 │ 1516 │ M6 - 14-19edo │ 884 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ Db5 │ I │ A3-e19-1 │ 1642 │ m6 - 13-19edo │ 821 │ + │ Gb4 │ II │ A3-e19-1 │ 1642 │ Eb5 │ I │ d5-e19-1 │ 1832 │ M6 - 14-19edo │ 884 │ + │ Ab4 │ II │ d5-e19-1 │ 1832 │ F5 │ I │ m6-e19-1 │ 2021 │ M6 - 14-19edo │ 884 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ Gb5 │ I │ d7-e19-1 │ 2147 │ m6 - 13-19edo │ 821 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ Ab5 │ I │ d8-e19-1 │ 2337 │ m6 - 13-19edo │ 821 │ + │ Db5 │ II │ d8-e19-1 │ 2337 │ Bb5 │ I │ m2-e19-2 │ 2526 │ M6 - 14-19edo │ 884 │ + │ Eb5 │ II │ m2-e19-2 │ 2526 │ C6 │ I │ m3-e19-2 │ 2716 │ M6 - 14-19edo │ 884 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ Db6 │ I │ A3-e19-2 │ 2842 │ m6 - 13-19edo │ 821 │ + │ Gb5 │ II │ A3-e19-2 │ 2842 │ Eb6 │ I │ d5-e19-2 │ 3032 │ M6 - 14-19edo │ 884 │ + │ Ab5 │ II │ d5-e19-2 │ 3032 │ F6 │ I │ m6-e19-2 │ 3221 │ M6 - 14-19edo │ 884 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "d_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_d in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ D2 │ IV │ M2-e19 │ 189 │ B2 │ III │ M3-e19 │ 379 │ M6 - 14-19edo │ 884 │ + │ E2 │ IV │ M3-e19 │ 379 │ C#3 │ III │ A4-e19 │ 568 │ M6 - 14-19edo │ 884 │ + │ F#2 │ IV │ A4-e19 │ 568 │ D3 │ III │ 5-e19 │ 695 │ m6 - 13-19edo │ 821 │ + │ G2 │ III │ 0 │ 0 │ E3 │ II │ M2-e19 │ 189 │ M6 - 14-19edo │ 884 │ + │ A2 │ III │ M2-e19 │ 189 │ F#3 │ II │ M3-e19 │ 379 │ M6 - 14-19edo │ 884 │ + │ B2 │ III │ M3-e19 │ 379 │ G3 │ II │ 4-e19 │ 505 │ m6 - 13-19edo │ 821 │ + │ C#3 │ III │ A4-e19 │ 568 │ A3 │ II │ 5-e19 │ 695 │ m6 - 13-19edo │ 821 │ + │ D3 │ II │ 0 │ 0 │ B3 │ I │ M2-e19 │ 189 │ M6 - 14-19edo │ 884 │ + │ E3 │ II │ M2-e19 │ 189 │ C#4 │ I │ M3-e19 │ 379 │ M6 - 14-19edo │ 884 │ + │ F#3 │ II │ M3-e19 │ 379 │ D4 │ I │ 4-e19 │ 505 │ m6 - 13-19edo │ 821 │ + │ G3 │ II │ 4-e19 │ 505 │ E4 │ I │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ A3 │ II │ 5-e19 │ 695 │ F#4 │ I │ M6-e19 │ 884 │ M6 - 14-19edo │ 884 │ + │ B3 │ II │ M6-e19 │ 884 │ G4 │ I │ m7-e19 │ 1011 │ m6 - 13-19edo │ 821 │ + │ C#4 │ II │ M7-e19 │ 1074 │ A4 │ I │ 0-1 │ 1200 │ m6 - 13-19edo │ 821 │ + │ D4 │ II │ 0-1 │ 1200 │ B4 │ I │ M2-e19-1 │ 1389 │ M6 - 14-19edo │ 884 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ C#5 │ I │ M3-e19-1 │ 1579 │ M6 - 14-19edo │ 884 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ D5 │ I │ 4-e19-1 │ 1705 │ m6 - 13-19edo │ 821 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ E5 │ I │ 5-e19-1 │ 1895 │ M6 - 14-19edo │ 884 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ F#5 │ I │ M6-e19-1 │ 2084 │ M6 - 14-19edo │ 884 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ G5 │ I │ m7-e19-1 │ 2211 │ m6 - 13-19edo │ 821 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ A5 │ I │ 0-2 │ 2400 │ m6 - 13-19edo │ 821 │ + │ D5 │ II │ 0-2 │ 2400 │ B5 │ I │ M2-e19-2 │ 2589 │ M6 - 14-19edo │ 884 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ C#6 │ I │ M3-e19-2 │ 2779 │ M6 - 14-19edo │ 884 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ D6 │ I │ 4-e19-2 │ 2905 │ m6 - 13-19edo │ 821 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ E6 │ I │ 5-e19-2 │ 3095 │ M6 - 14-19edo │ 884 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "e_flat_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_e_flat in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ Eb2 │ IV │ m3-e19 │ 316 │ C3 │ III │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ F2 │ IV │ 4-e19 │ 505 │ D3 │ III │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ G2 │ III │ 0 │ 0 │ Eb3 │ II │ m2-e19 │ 126 │ m6 - 13-19edo │ 821 │ + │ Ab2 │ III │ m2-e19 │ 126 │ F3 │ II │ m3-e19 │ 316 │ M6 - 14-19edo │ 884 │ + │ Bb2 │ III │ m3-e19 │ 316 │ G3 │ II │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ C3 │ III │ 4-e19 │ 505 │ Ab3 │ II │ d5-e19 │ 632 │ m6 - 13-19edo │ 821 │ + │ D3 │ II │ 0 │ 0 │ Bb3 │ I │ m2-e19 │ 126 │ m6 - 13-19edo │ 821 │ + │ Eb3 │ II │ m2-e19 │ 126 │ C4 │ I │ m3-e19 │ 316 │ M6 - 14-19edo │ 884 │ + │ F3 │ II │ m3-e19 │ 316 │ D4 │ I │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ G3 │ II │ 4-e19 │ 505 │ Eb4 │ I │ d5-e19 │ 632 │ m6 - 13-19edo │ 821 │ + │ Ab3 │ II │ d5-e19 │ 632 │ F4 │ I │ m6-e19 │ 821 │ M6 - 14-19edo │ 884 │ + │ Bb3 │ II │ m6-e19 │ 821 │ G4 │ I │ m7-e19 │ 1011 │ M6 - 14-19edo │ 884 │ + │ C4 │ II │ m7-e19 │ 1011 │ Ab4 │ I │ d8-e19 │ 1137 │ m6 - 13-19edo │ 821 │ + │ D4 │ II │ 0-1 │ 1200 │ Bb4 │ I │ m2-e19-1 │ 1326 │ m6 - 13-19edo │ 821 │ + │ Eb4 │ II │ m2-e19-1 │ 1326 │ C5 │ I │ m3-e19-1 │ 1516 │ M6 - 14-19edo │ 884 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ D5 │ I │ 4-e19-1 │ 1705 │ M6 - 14-19edo │ 884 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ Eb5 │ I │ d5-e19-1 │ 1832 │ m6 - 13-19edo │ 821 │ + │ Ab4 │ II │ d5-e19-1 │ 1832 │ F5 │ I │ m6-e19-1 │ 2021 │ M6 - 14-19edo │ 884 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ G5 │ I │ m7-e19-1 │ 2211 │ M6 - 14-19edo │ 884 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ Ab5 │ I │ d8-e19-1 │ 2337 │ m6 - 13-19edo │ 821 │ + │ D5 │ II │ 0-2 │ 2400 │ Bb5 │ I │ m2-e19-2 │ 2526 │ m6 - 13-19edo │ 821 │ + │ Eb5 │ II │ m2-e19-2 │ 2526 │ C6 │ I │ m3-e19-2 │ 2716 │ M6 - 14-19edo │ 884 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ D6 │ I │ 4-e19-2 │ 2905 │ M6 - 14-19edo │ 884 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ Eb6 │ I │ d5-e19-2 │ 3032 │ m6 - 13-19edo │ 821 │ + │ Ab5 │ II │ d5-e19-2 │ 3032 │ F6 │ I │ m6-e19-2 │ 3221 │ M6 - 14-19edo │ 884 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "e_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_e in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ E2 │ IV │ M3-e19 │ 379 │ C#3 │ III │ A4-e19 │ 568 │ M6 - 14-19edo │ 884 │ + │ F#2 │ IV │ A4-e19 │ 568 │ D#3 │ III │ A5-e19 │ 758 │ M6 - 14-19edo │ 884 │ + │ G#2 │ III │ A1-e19 │ 63 │ E3 │ II │ M2-e19 │ 189 │ m6 - 13-19edo │ 821 │ + │ A2 │ III │ M2-e19 │ 189 │ F#3 │ II │ M3-e19 │ 379 │ M6 - 14-19edo │ 884 │ + │ B2 │ III │ M3-e19 │ 379 │ G#3 │ II │ A4-e19 │ 568 │ M6 - 14-19edo │ 884 │ + │ C#3 │ III │ A4-e19 │ 568 │ A3 │ II │ 5-e19 │ 695 │ m6 - 13-19edo │ 821 │ + │ D#3 │ II │ A1-e19 │ 63 │ B3 │ I │ M2-e19 │ 189 │ m6 - 13-19edo │ 821 │ + │ E3 │ II │ M2-e19 │ 189 │ C#4 │ I │ M3-e19 │ 379 │ M6 - 14-19edo │ 884 │ + │ F#3 │ II │ M3-e19 │ 379 │ D#4 │ I │ A4-e19 │ 568 │ M6 - 14-19edo │ 884 │ + │ G#3 │ II │ A4-e19 │ 568 │ E4 │ I │ 5-e19 │ 695 │ m6 - 13-19edo │ 821 │ + │ A3 │ II │ 5-e19 │ 695 │ F#4 │ I │ M6-e19 │ 884 │ M6 - 14-19edo │ 884 │ + │ B3 │ II │ M6-e19 │ 884 │ G#4 │ I │ M7-e19 │ 1074 │ M6 - 14-19edo │ 884 │ + │ C#4 │ II │ M7-e19 │ 1074 │ A4 │ I │ 0-1 │ 1200 │ m6 - 13-19edo │ 821 │ + │ D#4 │ II │ A1-e19-1 │ 1263 │ B4 │ I │ M2-e19-1 │ 1389 │ m6 - 13-19edo │ 821 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ C#5 │ I │ M3-e19-1 │ 1579 │ M6 - 14-19edo │ 884 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ D#5 │ I │ A4-e19-1 │ 1768 │ M6 - 14-19edo │ 884 │ + │ G#4 │ II │ A4-e19-1 │ 1768 │ E5 │ I │ 5-e19-1 │ 1895 │ m6 - 13-19edo │ 821 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ F#5 │ I │ M6-e19-1 │ 2084 │ M6 - 14-19edo │ 884 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ G#5 │ I │ M7-e19-1 │ 2274 │ M6 - 14-19edo │ 884 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ A5 │ I │ 0-2 │ 2400 │ m6 - 13-19edo │ 821 │ + │ D#5 │ II │ A1-e19-2 │ 2463 │ B5 │ I │ M2-e19-2 │ 2589 │ m6 - 13-19edo │ 821 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ C#6 │ I │ M3-e19-2 │ 2779 │ M6 - 14-19edo │ 884 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ D#6 │ I │ A4-e19-2 │ 2968 │ M6 - 14-19edo │ 884 │ + │ G#5 │ II │ A4-e19-2 │ 2968 │ E6 │ I │ 5-e19-2 │ 3095 │ m6 - 13-19edo │ 821 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "f_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_f in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ F2 │ IV │ 4-e19 │ 505 │ D3 │ III │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ G2 │ III │ 0 │ 0 │ E3 │ II │ M2-e19 │ 189 │ M6 - 14-19edo │ 884 │ + │ A2 │ III │ M2-e19 │ 189 │ F3 │ II │ m3-e19 │ 316 │ m6 - 13-19edo │ 821 │ + │ Bb2 │ III │ m3-e19 │ 316 │ G3 │ II │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ C3 │ III │ 4-e19 │ 505 │ A3 │ II │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ D3 │ II │ 0 │ 0 │ Bb3 │ I │ m2-e19 │ 126 │ m6 - 13-19edo │ 821 │ + │ E3 │ II │ M2-e19 │ 189 │ C4 │ I │ m3-e19 │ 316 │ m6 - 13-19edo │ 821 │ + │ F3 │ II │ m3-e19 │ 316 │ D4 │ I │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ G3 │ II │ 4-e19 │ 505 │ E4 │ I │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ A3 │ II │ 5-e19 │ 695 │ F4 │ I │ m6-e19 │ 821 │ m6 - 13-19edo │ 821 │ + │ Bb3 │ II │ m6-e19 │ 821 │ G4 │ I │ m7-e19 │ 1011 │ M6 - 14-19edo │ 884 │ + │ C4 │ II │ m7-e19 │ 1011 │ A4 │ I │ 0-1 │ 1200 │ M6 - 14-19edo │ 884 │ + │ D4 │ II │ 0-1 │ 1200 │ Bb4 │ I │ m2-e19-1 │ 1326 │ m6 - 13-19edo │ 821 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ C5 │ I │ m3-e19-1 │ 1516 │ m6 - 13-19edo │ 821 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ D5 │ I │ 4-e19-1 │ 1705 │ M6 - 14-19edo │ 884 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ E5 │ I │ 5-e19-1 │ 1895 │ M6 - 14-19edo │ 884 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ F5 │ I │ m6-e19-1 │ 2021 │ m6 - 13-19edo │ 821 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ G5 │ I │ m7-e19-1 │ 2211 │ M6 - 14-19edo │ 884 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ A5 │ I │ 0-2 │ 2400 │ M6 - 14-19edo │ 884 │ + │ D5 │ II │ 0-2 │ 2400 │ Bb5 │ I │ m2-e19-2 │ 2526 │ m6 - 13-19edo │ 821 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ C6 │ I │ m3-e19-2 │ 2716 │ m6 - 13-19edo │ 821 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ D6 │ I │ 4-e19-2 │ 2905 │ M6 - 14-19edo │ 884 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ E6 │ I │ 5-e19-2 │ 3095 │ M6 - 14-19edo │ 884 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "f_sharp_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_f_sharp in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ F#2 │ IV │ A4-e19 │ 568 │ D#3 │ III │ A5-e19 │ 758 │ M6 - 14-19edo │ 884 │ + │ G#2 │ III │ A1-e19 │ 63 │ E#3 │ II │ A2-e19 │ 253 │ M6 - 14-19edo │ 884 │ + │ A#2 │ III │ A2-e19 │ 253 │ F#3 │ II │ M3-e19 │ 379 │ m6 - 13-19edo │ 821 │ + │ B2 │ III │ M3-e19 │ 379 │ G#3 │ II │ A4-e19 │ 568 │ M6 - 14-19edo │ 884 │ + │ C#3 │ III │ A4-e19 │ 568 │ A#3 │ II │ A5-e19 │ 758 │ M6 - 14-19edo │ 884 │ + │ D#3 │ II │ A1-e19 │ 63 │ B3 │ I │ M2-e19 │ 189 │ m6 - 13-19edo │ 821 │ + │ E#3 │ II │ A2-e19 │ 253 │ C#4 │ I │ M3-e19 │ 379 │ m6 - 13-19edo │ 821 │ + │ F#3 │ II │ M3-e19 │ 379 │ D#4 │ I │ A4-e19 │ 568 │ M6 - 14-19edo │ 884 │ + │ G#3 │ II │ A4-e19 │ 568 │ E#4 │ I │ A5-e19 │ 758 │ M6 - 14-19edo │ 884 │ + │ A#3 │ II │ A5-e19 │ 758 │ F#4 │ I │ M6-e19 │ 884 │ m6 - 13-19edo │ 821 │ + │ B3 │ II │ M6-e19 │ 884 │ G#4 │ I │ M7-e19 │ 1074 │ M6 - 14-19edo │ 884 │ + │ C#4 │ II │ M7-e19 │ 1074 │ A#4 │ I │ A1-e19-1 │ 1263 │ M6 - 14-19edo │ 884 │ + │ D#4 │ II │ A1-e19-1 │ 1263 │ B4 │ I │ M2-e19-1 │ 1389 │ m6 - 13-19edo │ 821 │ + │ E#4 │ II │ A2-e19-1 │ 1453 │ C#5 │ I │ M3-e19-1 │ 1579 │ m6 - 13-19edo │ 821 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ D#5 │ I │ A4-e19-1 │ 1768 │ M6 - 14-19edo │ 884 │ + │ G#4 │ II │ A4-e19-1 │ 1768 │ E#5 │ I │ A5-e19-1 │ 1958 │ M6 - 14-19edo │ 884 │ + │ A#4 │ II │ A5-e19-1 │ 1958 │ F#5 │ I │ M6-e19-1 │ 2084 │ m6 - 13-19edo │ 821 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ G#5 │ I │ M7-e19-1 │ 2274 │ M6 - 14-19edo │ 884 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ A#5 │ I │ A1-e19-2 │ 2463 │ M6 - 14-19edo │ 884 │ + │ D#5 │ II │ A1-e19-2 │ 2463 │ B5 │ I │ M2-e19-2 │ 2589 │ m6 - 13-19edo │ 821 │ + │ E#5 │ II │ A2-e19-2 │ 2653 │ C#6 │ I │ M3-e19-2 │ 2779 │ m6 - 13-19edo │ 821 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ D#6 │ I │ A4-e19-2 │ 2968 │ M6 - 14-19edo │ 884 │ + │ G#5 │ II │ A4-e19-2 │ 2968 │ E#6 │ I │ A5-e19-2 │ 3158 │ M6 - 14-19edo │ 884 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "g_flat_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_g_flat in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ Gb2 │ IV │ d5-e19 │ 632 │ Eb3 │ III │ m6-e19 │ 821 │ M6 - 14-19edo │ 884 │ + │ Ab2 │ III │ m2-e19 │ 126 │ F3 │ II │ m3-e19 │ 316 │ M6 - 14-19edo │ 884 │ + │ Bb2 │ III │ m3-e19 │ 316 │ Gb3 │ II │ A3-e19 │ 442 │ m6 - 13-19edo │ 821 │ + │ Cb3 │ III │ A3-e19 │ 442 │ Ab3 │ II │ d5-e19 │ 632 │ M6 - 14-19edo │ 884 │ + │ Db3 │ III │ d5-e19 │ 632 │ Bb3 │ II │ m6-e19 │ 821 │ M6 - 14-19edo │ 884 │ + │ Eb3 │ II │ m2-e19 │ 126 │ Cb4 │ I │ A2-e19 │ 253 │ m6 - 13-19edo │ 821 │ + │ F3 │ II │ m3-e19 │ 316 │ Db4 │ I │ A3-e19 │ 442 │ m6 - 13-19edo │ 821 │ + │ Gb3 │ II │ A3-e19 │ 442 │ Eb4 │ I │ d5-e19 │ 632 │ M6 - 14-19edo │ 884 │ + │ Ab3 │ II │ d5-e19 │ 632 │ F4 │ I │ m6-e19 │ 821 │ M6 - 14-19edo │ 884 │ + │ Bb3 │ II │ m6-e19 │ 821 │ Gb4 │ I │ d7-e19 │ 947 │ m6 - 13-19edo │ 821 │ + │ Cb4 │ II │ d7-e19 │ 947 │ Ab4 │ I │ d8-e19 │ 1137 │ M6 - 14-19edo │ 884 │ + │ Db4 │ II │ d8-e19 │ 1137 │ Bb4 │ I │ m2-e19-1 │ 1326 │ M6 - 14-19edo │ 884 │ + │ Eb4 │ II │ m2-e19-1 │ 1326 │ Cb5 │ I │ A2-e19-1 │ 1453 │ m6 - 13-19edo │ 821 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ Db5 │ I │ A3-e19-1 │ 1642 │ m6 - 13-19edo │ 821 │ + │ Gb4 │ II │ A3-e19-1 │ 1642 │ Eb5 │ I │ d5-e19-1 │ 1832 │ M6 - 14-19edo │ 884 │ + │ Ab4 │ II │ d5-e19-1 │ 1832 │ F5 │ I │ m6-e19-1 │ 2021 │ M6 - 14-19edo │ 884 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ Gb5 │ I │ d7-e19-1 │ 2147 │ m6 - 13-19edo │ 821 │ + │ Cb5 │ II │ d7-e19-1 │ 2147 │ Ab5 │ I │ d8-e19-1 │ 2337 │ M6 - 14-19edo │ 884 │ + │ Db5 │ II │ d8-e19-1 │ 2337 │ Bb5 │ I │ m2-e19-2 │ 2526 │ M6 - 14-19edo │ 884 │ + │ Eb5 │ II │ m2-e19-2 │ 2526 │ Cb6 │ I │ A2-e19-2 │ 2653 │ m6 - 13-19edo │ 821 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ Db6 │ I │ A3-e19-2 │ 2842 │ m6 - 13-19edo │ 821 │ + │ Gb5 │ II │ A3-e19-2 │ 2842 │ Eb6 │ I │ d5-e19-2 │ 3032 │ M6 - 14-19edo │ 884 │ + │ Ab5 │ II │ d5-e19-2 │ 3032 │ F6 │ I │ m6-e19-2 │ 3221 │ M6 - 14-19edo │ 884 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "g_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_f in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ F2 │ IV │ 4-e19 │ 505 │ D3 │ III │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ G2 │ III │ 0 │ 0 │ E3 │ II │ M2-e19 │ 189 │ M6 - 14-19edo │ 884 │ + │ A2 │ III │ M2-e19 │ 189 │ F3 │ II │ m3-e19 │ 316 │ m6 - 13-19edo │ 821 │ + │ Bb2 │ III │ m3-e19 │ 316 │ G3 │ II │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ C3 │ III │ 4-e19 │ 505 │ A3 │ II │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ D3 │ II │ 0 │ 0 │ Bb3 │ I │ m2-e19 │ 126 │ m6 - 13-19edo │ 821 │ + │ E3 │ II │ M2-e19 │ 189 │ C4 │ I │ m3-e19 │ 316 │ m6 - 13-19edo │ 821 │ + │ F3 │ II │ m3-e19 │ 316 │ D4 │ I │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ G3 │ II │ 4-e19 │ 505 │ E4 │ I │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ A3 │ II │ 5-e19 │ 695 │ F4 │ I │ m6-e19 │ 821 │ m6 - 13-19edo │ 821 │ + │ Bb3 │ II │ m6-e19 │ 821 │ G4 │ I │ m7-e19 │ 1011 │ M6 - 14-19edo │ 884 │ + │ C4 │ II │ m7-e19 │ 1011 │ A4 │ I │ 0-1 │ 1200 │ M6 - 14-19edo │ 884 │ + │ D4 │ II │ 0-1 │ 1200 │ Bb4 │ I │ m2-e19-1 │ 1326 │ m6 - 13-19edo │ 821 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ C5 │ I │ m3-e19-1 │ 1516 │ m6 - 13-19edo │ 821 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ D5 │ I │ 4-e19-1 │ 1705 │ M6 - 14-19edo │ 884 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ E5 │ I │ 5-e19-1 │ 1895 │ M6 - 14-19edo │ 884 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ F5 │ I │ m6-e19-1 │ 2021 │ m6 - 13-19edo │ 821 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ G5 │ I │ m7-e19-1 │ 2211 │ M6 - 14-19edo │ 884 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ A5 │ I │ 0-2 │ 2400 │ M6 - 14-19edo │ 884 │ + │ D5 │ II │ 0-2 │ 2400 │ Bb5 │ I │ m2-e19-2 │ 2526 │ m6 - 13-19edo │ 821 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ C6 │ I │ m3-e19-2 │ 2716 │ m6 - 13-19edo │ 821 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ D6 │ I │ 4-e19-2 │ 2905 │ M6 - 14-19edo │ 884 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ E6 │ I │ 5-e19-2 │ 3095 │ M6 - 14-19edo │ 884 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "a_flat_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_a_flat in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ Ab2 │ III │ m2-e19 │ 126 │ F3 │ II │ m3-e19 │ 316 │ M6 - 14-19edo │ 884 │ + │ Bb2 │ III │ m3-e19 │ 316 │ G3 │ II │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ C3 │ III │ 4-e19 │ 505 │ Ab3 │ II │ d5-e19 │ 632 │ m6 - 13-19edo │ 821 │ + │ Db3 │ III │ d5-e19 │ 632 │ Bb3 │ II │ m6-e19 │ 821 │ M6 - 14-19edo │ 884 │ + │ Eb3 │ II │ m2-e19 │ 126 │ C4 │ I │ m3-e19 │ 316 │ M6 - 14-19edo │ 884 │ + │ F3 │ II │ m3-e19 │ 316 │ Db4 │ I │ A3-e19 │ 442 │ m6 - 13-19edo │ 821 │ + │ G3 │ II │ 4-e19 │ 505 │ Eb4 │ I │ d5-e19 │ 632 │ m6 - 13-19edo │ 821 │ + │ Ab3 │ II │ d5-e19 │ 632 │ F4 │ I │ m6-e19 │ 821 │ M6 - 14-19edo │ 884 │ + │ Bb3 │ II │ m6-e19 │ 821 │ G4 │ I │ m7-e19 │ 1011 │ M6 - 14-19edo │ 884 │ + │ C4 │ II │ m7-e19 │ 1011 │ Ab4 │ I │ d8-e19 │ 1137 │ m6 - 13-19edo │ 821 │ + │ Db4 │ II │ d8-e19 │ 1137 │ Bb4 │ I │ m2-e19-1 │ 1326 │ M6 - 14-19edo │ 884 │ + │ Eb4 │ II │ m2-e19-1 │ 1326 │ C5 │ I │ m3-e19-1 │ 1516 │ M6 - 14-19edo │ 884 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ Db5 │ I │ A3-e19-1 │ 1642 │ m6 - 13-19edo │ 821 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ Eb5 │ I │ d5-e19-1 │ 1832 │ m6 - 13-19edo │ 821 │ + │ Ab4 │ II │ d5-e19-1 │ 1832 │ F5 │ I │ m6-e19-1 │ 2021 │ M6 - 14-19edo │ 884 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ G5 │ I │ m7-e19-1 │ 2211 │ M6 - 14-19edo │ 884 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ Ab5 │ I │ d8-e19-1 │ 2337 │ m6 - 13-19edo │ 821 │ + │ Db5 │ II │ d8-e19-1 │ 2337 │ Bb5 │ I │ m2-e19-2 │ 2526 │ M6 - 14-19edo │ 884 │ + │ Eb5 │ II │ m2-e19-2 │ 2526 │ C6 │ I │ m3-e19-2 │ 2716 │ M6 - 14-19edo │ 884 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ Db6 │ I │ A3-e19-2 │ 2842 │ m6 - 13-19edo │ 821 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ Eb6 │ I │ d5-e19-2 │ 3032 │ m6 - 13-19edo │ 821 │ + │ Ab5 │ II │ d5-e19-2 │ 3032 │ F6 │ I │ m6-e19-2 │ 3221 │ M6 - 14-19edo │ 884 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "a_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_a in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ A2 │ III │ M2-e19 │ 189 │ F#3 │ II │ M3-e19 │ 379 │ M6 - 14-19edo │ 884 │ + │ B2 │ III │ M3-e19 │ 379 │ G#3 │ II │ A4-e19 │ 568 │ M6 - 14-19edo │ 884 │ + │ C#3 │ III │ A4-e19 │ 568 │ A3 │ II │ 5-e19 │ 695 │ m6 - 13-19edo │ 821 │ + │ D3 │ II │ 0 │ 0 │ B3 │ I │ M2-e19 │ 189 │ M6 - 14-19edo │ 884 │ + │ E3 │ II │ M2-e19 │ 189 │ C#4 │ I │ M3-e19 │ 379 │ M6 - 14-19edo │ 884 │ + │ F#3 │ II │ M3-e19 │ 379 │ D4 │ I │ 4-e19 │ 505 │ m6 - 13-19edo │ 821 │ + │ G#3 │ II │ A4-e19 │ 568 │ E4 │ I │ 5-e19 │ 695 │ m6 - 13-19edo │ 821 │ + │ A3 │ II │ 5-e19 │ 695 │ F#4 │ I │ M6-e19 │ 884 │ M6 - 14-19edo │ 884 │ + │ B3 │ II │ M6-e19 │ 884 │ G#4 │ I │ M7-e19 │ 1074 │ M6 - 14-19edo │ 884 │ + │ C#4 │ II │ M7-e19 │ 1074 │ A4 │ I │ 0-1 │ 1200 │ m6 - 13-19edo │ 821 │ + │ D4 │ II │ 0-1 │ 1200 │ B4 │ I │ M2-e19-1 │ 1389 │ M6 - 14-19edo │ 884 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ C#5 │ I │ M3-e19-1 │ 1579 │ M6 - 14-19edo │ 884 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ D5 │ I │ 4-e19-1 │ 1705 │ m6 - 13-19edo │ 821 │ + │ G#4 │ II │ A4-e19-1 │ 1768 │ E5 │ I │ 5-e19-1 │ 1895 │ m6 - 13-19edo │ 821 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ F#5 │ I │ M6-e19-1 │ 2084 │ M6 - 14-19edo │ 884 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ G#5 │ I │ M7-e19-1 │ 2274 │ M6 - 14-19edo │ 884 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ A5 │ I │ 0-2 │ 2400 │ m6 - 13-19edo │ 821 │ + │ D5 │ II │ 0-2 │ 2400 │ B5 │ I │ M2-e19-2 │ 2589 │ M6 - 14-19edo │ 884 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ C#6 │ I │ M3-e19-2 │ 2779 │ M6 - 14-19edo │ 884 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ D6 │ I │ 4-e19-2 │ 2905 │ m6 - 13-19edo │ 821 │ + │ G#5 │ II │ A4-e19-2 │ 2968 │ E6 │ I │ 5-e19-2 │ 3095 │ m6 - 13-19edo │ 821 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "b_flat_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_b_flat in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ Bb2 │ III │ m3-e19 │ 316 │ G3 │ II │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ C3 │ III │ 4-e19 │ 505 │ A3 │ II │ 5-e19 │ 695 │ M6 - 14-19edo │ 884 │ + │ D3 │ II │ 0 │ 0 │ Bb3 │ I │ m2-e19 │ 126 │ m6 - 13-19edo │ 821 │ + │ Eb3 │ II │ m2-e19 │ 126 │ C4 │ I │ m3-e19 │ 316 │ M6 - 14-19edo │ 884 │ + │ F3 │ II │ m3-e19 │ 316 │ D4 │ I │ 4-e19 │ 505 │ M6 - 14-19edo │ 884 │ + │ G3 │ II │ 4-e19 │ 505 │ Eb4 │ I │ d5-e19 │ 632 │ m6 - 13-19edo │ 821 │ + │ A3 │ II │ 5-e19 │ 695 │ F4 │ I │ m6-e19 │ 821 │ m6 - 13-19edo │ 821 │ + │ Bb3 │ II │ m6-e19 │ 821 │ G4 │ I │ m7-e19 │ 1011 │ M6 - 14-19edo │ 884 │ + │ C4 │ II │ m7-e19 │ 1011 │ A4 │ I │ 0-1 │ 1200 │ M6 - 14-19edo │ 884 │ + │ D4 │ II │ 0-1 │ 1200 │ Bb4 │ I │ m2-e19-1 │ 1326 │ m6 - 13-19edo │ 821 │ + │ Eb4 │ II │ m2-e19-1 │ 1326 │ C5 │ I │ m3-e19-1 │ 1516 │ M6 - 14-19edo │ 884 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ D5 │ I │ 4-e19-1 │ 1705 │ M6 - 14-19edo │ 884 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ Eb5 │ I │ d5-e19-1 │ 1832 │ m6 - 13-19edo │ 821 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ F5 │ I │ m6-e19-1 │ 2021 │ m6 - 13-19edo │ 821 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ G5 │ I │ m7-e19-1 │ 2211 │ M6 - 14-19edo │ 884 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ A5 │ I │ 0-2 │ 2400 │ M6 - 14-19edo │ 884 │ + │ D5 │ II │ 0-2 │ 2400 │ Bb5 │ I │ m2-e19-2 │ 2526 │ m6 - 13-19edo │ 821 │ + │ Eb5 │ II │ m2-e19-2 │ 2526 │ C6 │ I │ m3-e19-2 │ 2716 │ M6 - 14-19edo │ 884 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ D6 │ I │ 4-e19-2 │ 2905 │ M6 - 14-19edo │ 884 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ Eb6 │ I │ d5-e19-2 │ 3032 │ m6 - 13-19edo │ 821 │ + │ A5 │ II │ 5-e19-2 │ 3095 │ F6 │ I │ m6-e19-2 │ 3221 │ m6 - 13-19edo │ 821 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; + +let%expect_test "b_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_b in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬───────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼───────────────┼───────┤ + │ B2 │ III │ M3-e19 │ 379 │ G#3 │ II │ A4-e19 │ 568 │ M6 - 14-19edo │ 884 │ + │ C#3 │ III │ A4-e19 │ 568 │ A#3 │ II │ A5-e19 │ 758 │ M6 - 14-19edo │ 884 │ + │ D#3 │ II │ A1-e19 │ 63 │ B3 │ I │ M2-e19 │ 189 │ m6 - 13-19edo │ 821 │ + │ E3 │ II │ M2-e19 │ 189 │ C#4 │ I │ M3-e19 │ 379 │ M6 - 14-19edo │ 884 │ + │ F#3 │ II │ M3-e19 │ 379 │ D#4 │ I │ A4-e19 │ 568 │ M6 - 14-19edo │ 884 │ + │ G#3 │ II │ A4-e19 │ 568 │ E4 │ I │ 5-e19 │ 695 │ m6 - 13-19edo │ 821 │ + │ A#3 │ II │ A5-e19 │ 758 │ F#4 │ I │ M6-e19 │ 884 │ m6 - 13-19edo │ 821 │ + │ B3 │ II │ M6-e19 │ 884 │ G#4 │ I │ M7-e19 │ 1074 │ M6 - 14-19edo │ 884 │ + │ C#4 │ II │ M7-e19 │ 1074 │ A#4 │ I │ A1-e19-1 │ 1263 │ M6 - 14-19edo │ 884 │ + │ D#4 │ II │ A1-e19-1 │ 1263 │ B4 │ I │ M2-e19-1 │ 1389 │ m6 - 13-19edo │ 821 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ C#5 │ I │ M3-e19-1 │ 1579 │ M6 - 14-19edo │ 884 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ D#5 │ I │ A4-e19-1 │ 1768 │ M6 - 14-19edo │ 884 │ + │ G#4 │ II │ A4-e19-1 │ 1768 │ E5 │ I │ 5-e19-1 │ 1895 │ m6 - 13-19edo │ 821 │ + │ A#4 │ II │ A5-e19-1 │ 1958 │ F#5 │ I │ M6-e19-1 │ 2084 │ m6 - 13-19edo │ 821 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ G#5 │ I │ M7-e19-1 │ 2274 │ M6 - 14-19edo │ 884 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ A#5 │ I │ A1-e19-2 │ 2463 │ M6 - 14-19edo │ 884 │ + │ D#5 │ II │ A1-e19-2 │ 2463 │ B5 │ I │ M2-e19-2 │ 2589 │ m6 - 13-19edo │ 821 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ C#6 │ I │ M3-e19-2 │ 2779 │ M6 - 14-19edo │ 884 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ D#6 │ I │ A4-e19-2 │ 2968 │ M6 - 14-19edo │ 884 │ + │ G#5 │ II │ A4-e19-2 │ 2968 │ E6 │ I │ 5-e19-2 │ 3095 │ m6 - 13-19edo │ 821 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴───────────────┴───────┘ |}] +;; diff --git a/systems/cello/e19/sixths.mli b/systems/cello/e19/sixths.mli new file mode 100644 index 0000000..145ea10 --- /dev/null +++ b/systems/cello/e19/sixths.mli @@ -0,0 +1,18 @@ +(*_*********************************************************************************) +(*_ Fingerboard - a microtonal geography of the cello fingerboard *) +(*_ Copyright (C) 2022-2024 Mathieu Barbin *) +(*_ *) +(*_ This file is part of Fingerboard. *) +(*_ *) +(*_ Fingerboard is free software: you can redistribute it and/or modify it under *) +(*_ the terms of the GNU Affero General Public License as published by the Free *) +(*_ Software Foundation, either version 3 of the License, or any later version. *) +(*_ *) +(*_ Fingerboard is distributed in the hope that it will be useful, but WITHOUT *) +(*_ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *) +(*_ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License *) +(*_ for more details. *) +(*_ *) +(*_ You should have received a copy of the GNU Affero General Public License *) +(*_ along with Fingerboard. If not, see . *) +(*_*********************************************************************************) diff --git a/systems/cello/e19/thirds.ml b/systems/cello/e19/thirds.ml new file mode 100644 index 0000000..a49c98c --- /dev/null +++ b/systems/cello/e19/thirds.ml @@ -0,0 +1,561 @@ +(**********************************************************************************) +(* Fingerboard - a microtonal geography of the cello fingerboard *) +(* Copyright (C) 2022-2024 Mathieu Barbin *) +(* *) +(* This file is part of Fingerboard. *) +(* *) +(* Fingerboard is free software: you can redistribute it and/or modify it under *) +(* the terms of the GNU Affero General Public License as published by the Free *) +(* Software Foundation, either version 3 of the License, or any later version. *) +(* *) +(* Fingerboard is distributed in the hope that it will be useful, but WITHOUT *) +(* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *) +(* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License *) +(* for more details. *) +(* *) +(* You should have received a copy of the GNU Affero General Public License *) +(* along with Fingerboard. If not, see . *) +(**********************************************************************************) + +let make_scale ~characterized_scale ~from = + let t = force E19.t in + System.Double_stops.make_scale + t + ~characterized_scale + ~interval_number:Third + ~from + ~to_:Cello.fingerboard_highest_note +;; + +let make_major_scale ~from = + make_scale ~characterized_scale:Characterized_scale.major_e19 ~from +;; + +let%expect_test "c_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_c in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ E2 │ IV │ M3-e19 │ 379 │ G2 │ III │ 0 │ 0 │ m3 - 5-19edo │ 316 │ + │ F2 │ IV │ 4-e19 │ 505 │ A2 │ III │ M2-e19 │ 189 │ M3 - 6-19edo │ 379 │ + │ G2 │ IV │ 5-e19 │ 695 │ B2 │ III │ M3-e19 │ 379 │ M3 - 6-19edo │ 379 │ + │ A2 │ IV │ M6-e19 │ 884 │ C3 │ III │ 4-e19 │ 505 │ m3 - 5-19edo │ 316 │ + │ B2 │ III │ M3-e19 │ 379 │ D3 │ II │ 0 │ 0 │ m3 - 5-19edo │ 316 │ + │ C3 │ III │ 4-e19 │ 505 │ E3 │ II │ M2-e19 │ 189 │ M3 - 6-19edo │ 379 │ + │ D3 │ III │ 5-e19 │ 695 │ F3 │ II │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ E3 │ III │ M6-e19 │ 884 │ G3 │ II │ 4-e19 │ 505 │ m3 - 5-19edo │ 316 │ + │ F3 │ II │ m3-e19 │ 316 │ A3 │ I │ 0 │ 0 │ M3 - 6-19edo │ 379 │ + │ G3 │ II │ 4-e19 │ 505 │ B3 │ I │ M2-e19 │ 189 │ M3 - 6-19edo │ 379 │ + │ A3 │ II │ 5-e19 │ 695 │ C4 │ I │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ B3 │ II │ M6-e19 │ 884 │ D4 │ I │ 4-e19 │ 505 │ m3 - 5-19edo │ 316 │ + │ C4 │ II │ m7-e19 │ 1011 │ E4 │ I │ 5-e19 │ 695 │ M3 - 6-19edo │ 379 │ + │ D4 │ II │ 0-1 │ 1200 │ F4 │ I │ m6-e19 │ 821 │ m3 - 5-19edo │ 316 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ G4 │ I │ m7-e19 │ 1011 │ m3 - 5-19edo │ 316 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ A4 │ I │ 0-1 │ 1200 │ M3 - 6-19edo │ 379 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ B4 │ I │ M2-e19-1 │ 1389 │ M3 - 6-19edo │ 379 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ C5 │ I │ m3-e19-1 │ 1516 │ m3 - 5-19edo │ 316 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ D5 │ I │ 4-e19-1 │ 1705 │ m3 - 5-19edo │ 316 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ E5 │ I │ 5-e19-1 │ 1895 │ M3 - 6-19edo │ 379 │ + │ D5 │ II │ 0-2 │ 2400 │ F5 │ I │ m6-e19-1 │ 2021 │ m3 - 5-19edo │ 316 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ G5 │ I │ m7-e19-1 │ 2211 │ m3 - 5-19edo │ 316 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ A5 │ I │ 0-2 │ 2400 │ M3 - 6-19edo │ 379 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ B5 │ I │ M2-e19-2 │ 2589 │ M3 - 6-19edo │ 379 │ + │ A5 │ II │ 5-e19-2 │ 3095 │ C6 │ I │ m3-e19-2 │ 2716 │ m3 - 5-19edo │ 316 │ + │ B5 │ II │ M6-e19-2 │ 3284 │ D6 │ I │ 4-e19-2 │ 2905 │ m3 - 5-19edo │ 316 │ + │ C6 │ II │ m7-e19-2 │ 3411 │ E6 │ I │ 5-e19-2 │ 3095 │ M3 - 6-19edo │ 379 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "c_sharp_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_c_sharp in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ E#2 │ IV │ A3-e19 │ 442 │ G#2 │ III │ A1-e19 │ 63 │ m3 - 5-19edo │ 316 │ + │ F#2 │ IV │ A4-e19 │ 568 │ A#2 │ III │ A2-e19 │ 253 │ M3 - 6-19edo │ 379 │ + │ G#2 │ IV │ A5-e19 │ 758 │ B#2 │ III │ A3-e19 │ 442 │ M3 - 6-19edo │ 379 │ + │ A#2 │ IV │ d7-e19 │ 947 │ C#3 │ III │ A4-e19 │ 568 │ m3 - 5-19edo │ 316 │ + │ B#2 │ III │ A3-e19 │ 442 │ D#3 │ II │ A1-e19 │ 63 │ m3 - 5-19edo │ 316 │ + │ C#3 │ III │ A4-e19 │ 568 │ E#3 │ II │ A2-e19 │ 253 │ M3 - 6-19edo │ 379 │ + │ D#3 │ III │ A5-e19 │ 758 │ F#3 │ II │ M3-e19 │ 379 │ m3 - 5-19edo │ 316 │ + │ E#3 │ III │ d7-e19 │ 947 │ G#3 │ II │ A4-e19 │ 568 │ m3 - 5-19edo │ 316 │ + │ F#3 │ II │ M3-e19 │ 379 │ A#3 │ I │ A1-e19 │ 63 │ M3 - 6-19edo │ 379 │ + │ G#3 │ II │ A4-e19 │ 568 │ B#3 │ I │ A2-e19 │ 253 │ M3 - 6-19edo │ 379 │ + │ A#3 │ II │ A5-e19 │ 758 │ C#4 │ I │ M3-e19 │ 379 │ m3 - 5-19edo │ 316 │ + │ B#3 │ II │ d7-e19 │ 947 │ D#4 │ I │ A4-e19 │ 568 │ m3 - 5-19edo │ 316 │ + │ C#4 │ II │ M7-e19 │ 1074 │ E#4 │ I │ A5-e19 │ 758 │ M3 - 6-19edo │ 379 │ + │ D#4 │ II │ A1-e19-1 │ 1263 │ F#4 │ I │ M6-e19 │ 884 │ m3 - 5-19edo │ 316 │ + │ E#4 │ II │ A2-e19-1 │ 1453 │ G#4 │ I │ M7-e19 │ 1074 │ m3 - 5-19edo │ 316 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ A#4 │ I │ A1-e19-1 │ 1263 │ M3 - 6-19edo │ 379 │ + │ G#4 │ II │ A4-e19-1 │ 1768 │ B#4 │ I │ A2-e19-1 │ 1453 │ M3 - 6-19edo │ 379 │ + │ A#4 │ II │ A5-e19-1 │ 1958 │ C#5 │ I │ M3-e19-1 │ 1579 │ m3 - 5-19edo │ 316 │ + │ B#4 │ II │ d7-e19-1 │ 2147 │ D#5 │ I │ A4-e19-1 │ 1768 │ m3 - 5-19edo │ 316 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ E#5 │ I │ A5-e19-1 │ 1958 │ M3 - 6-19edo │ 379 │ + │ D#5 │ II │ A1-e19-2 │ 2463 │ F#5 │ I │ M6-e19-1 │ 2084 │ m3 - 5-19edo │ 316 │ + │ E#5 │ II │ A2-e19-2 │ 2653 │ G#5 │ I │ M7-e19-1 │ 2274 │ m3 - 5-19edo │ 316 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ A#5 │ I │ A1-e19-2 │ 2463 │ M3 - 6-19edo │ 379 │ + │ G#5 │ II │ A4-e19-2 │ 2968 │ B#5 │ I │ A2-e19-2 │ 2653 │ M3 - 6-19edo │ 379 │ + │ A#5 │ II │ A5-e19-2 │ 3158 │ C#6 │ I │ M3-e19-2 │ 2779 │ m3 - 5-19edo │ 316 │ + │ B#5 │ II │ d7-e19-2 │ 3347 │ D#6 │ I │ A4-e19-2 │ 2968 │ m3 - 5-19edo │ 316 │ + │ C#6 │ II │ M7-e19-2 │ 3474 │ E#6 │ I │ A5-e19-2 │ 3158 │ M3 - 6-19edo │ 379 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "d_flat_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_d_flat in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ F2 │ IV │ 4-e19 │ 505 │ Ab2 │ III │ m2-e19 │ 126 │ m3 - 5-19edo │ 316 │ + │ Gb2 │ IV │ d5-e19 │ 632 │ Bb2 │ III │ m3-e19 │ 316 │ M3 - 6-19edo │ 379 │ + │ Ab2 │ IV │ m6-e19 │ 821 │ C3 │ III │ 4-e19 │ 505 │ M3 - 6-19edo │ 379 │ + │ Bb2 │ IV │ m7-e19 │ 1011 │ Db3 │ III │ d5-e19 │ 632 │ m3 - 5-19edo │ 316 │ + │ C3 │ III │ 4-e19 │ 505 │ Eb3 │ II │ m2-e19 │ 126 │ m3 - 5-19edo │ 316 │ + │ Db3 │ III │ d5-e19 │ 632 │ F3 │ II │ m3-e19 │ 316 │ M3 - 6-19edo │ 379 │ + │ Eb3 │ III │ m6-e19 │ 821 │ Gb3 │ II │ A3-e19 │ 442 │ m3 - 5-19edo │ 316 │ + │ F3 │ III │ m7-e19 │ 1011 │ Ab3 │ II │ d5-e19 │ 632 │ m3 - 5-19edo │ 316 │ + │ Gb3 │ II │ A3-e19 │ 442 │ Bb3 │ I │ m2-e19 │ 126 │ M3 - 6-19edo │ 379 │ + │ Ab3 │ II │ d5-e19 │ 632 │ C4 │ I │ m3-e19 │ 316 │ M3 - 6-19edo │ 379 │ + │ Bb3 │ II │ m6-e19 │ 821 │ Db4 │ I │ A3-e19 │ 442 │ m3 - 5-19edo │ 316 │ + │ C4 │ II │ m7-e19 │ 1011 │ Eb4 │ I │ d5-e19 │ 632 │ m3 - 5-19edo │ 316 │ + │ Db4 │ II │ d8-e19 │ 1137 │ F4 │ I │ m6-e19 │ 821 │ M3 - 6-19edo │ 379 │ + │ Eb4 │ II │ m2-e19-1 │ 1326 │ Gb4 │ I │ d7-e19 │ 947 │ m3 - 5-19edo │ 316 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ Ab4 │ I │ d8-e19 │ 1137 │ m3 - 5-19edo │ 316 │ + │ Gb4 │ II │ A3-e19-1 │ 1642 │ Bb4 │ I │ m2-e19-1 │ 1326 │ M3 - 6-19edo │ 379 │ + │ Ab4 │ II │ d5-e19-1 │ 1832 │ C5 │ I │ m3-e19-1 │ 1516 │ M3 - 6-19edo │ 379 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ Db5 │ I │ A3-e19-1 │ 1642 │ m3 - 5-19edo │ 316 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ Eb5 │ I │ d5-e19-1 │ 1832 │ m3 - 5-19edo │ 316 │ + │ Db5 │ II │ d8-e19-1 │ 2337 │ F5 │ I │ m6-e19-1 │ 2021 │ M3 - 6-19edo │ 379 │ + │ Eb5 │ II │ m2-e19-2 │ 2526 │ Gb5 │ I │ d7-e19-1 │ 2147 │ m3 - 5-19edo │ 316 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ Ab5 │ I │ d8-e19-1 │ 2337 │ m3 - 5-19edo │ 316 │ + │ Gb5 │ II │ A3-e19-2 │ 2842 │ Bb5 │ I │ m2-e19-2 │ 2526 │ M3 - 6-19edo │ 379 │ + │ Ab5 │ II │ d5-e19-2 │ 3032 │ C6 │ I │ m3-e19-2 │ 2716 │ M3 - 6-19edo │ 379 │ + │ Bb5 │ II │ m6-e19-2 │ 3221 │ Db6 │ I │ A3-e19-2 │ 2842 │ m3 - 5-19edo │ 316 │ + │ C6 │ II │ m7-e19-2 │ 3411 │ Eb6 │ I │ d5-e19-2 │ 3032 │ m3 - 5-19edo │ 316 │ + │ Db6 │ II │ d8-e19-2 │ 3537 │ F6 │ I │ m6-e19-2 │ 3221 │ M3 - 6-19edo │ 379 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "d_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_d in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ E2 │ IV │ M3-e19 │ 379 │ G2 │ III │ 0 │ 0 │ m3 - 5-19edo │ 316 │ + │ F#2 │ IV │ A4-e19 │ 568 │ A2 │ III │ M2-e19 │ 189 │ m3 - 5-19edo │ 316 │ + │ G2 │ IV │ 5-e19 │ 695 │ B2 │ III │ M3-e19 │ 379 │ M3 - 6-19edo │ 379 │ + │ A2 │ IV │ M6-e19 │ 884 │ C#3 │ III │ A4-e19 │ 568 │ M3 - 6-19edo │ 379 │ + │ B2 │ III │ M3-e19 │ 379 │ D3 │ II │ 0 │ 0 │ m3 - 5-19edo │ 316 │ + │ C#3 │ III │ A4-e19 │ 568 │ E3 │ II │ M2-e19 │ 189 │ m3 - 5-19edo │ 316 │ + │ D3 │ III │ 5-e19 │ 695 │ F#3 │ II │ M3-e19 │ 379 │ M3 - 6-19edo │ 379 │ + │ E3 │ III │ M6-e19 │ 884 │ G3 │ II │ 4-e19 │ 505 │ m3 - 5-19edo │ 316 │ + │ F#3 │ II │ M3-e19 │ 379 │ A3 │ I │ 0 │ 0 │ m3 - 5-19edo │ 316 │ + │ G3 │ II │ 4-e19 │ 505 │ B3 │ I │ M2-e19 │ 189 │ M3 - 6-19edo │ 379 │ + │ A3 │ II │ 5-e19 │ 695 │ C#4 │ I │ M3-e19 │ 379 │ M3 - 6-19edo │ 379 │ + │ B3 │ II │ M6-e19 │ 884 │ D4 │ I │ 4-e19 │ 505 │ m3 - 5-19edo │ 316 │ + │ C#4 │ II │ M7-e19 │ 1074 │ E4 │ I │ 5-e19 │ 695 │ m3 - 5-19edo │ 316 │ + │ D4 │ II │ 0-1 │ 1200 │ F#4 │ I │ M6-e19 │ 884 │ M3 - 6-19edo │ 379 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ G4 │ I │ m7-e19 │ 1011 │ m3 - 5-19edo │ 316 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ A4 │ I │ 0-1 │ 1200 │ m3 - 5-19edo │ 316 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ B4 │ I │ M2-e19-1 │ 1389 │ M3 - 6-19edo │ 379 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ C#5 │ I │ M3-e19-1 │ 1579 │ M3 - 6-19edo │ 379 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ D5 │ I │ 4-e19-1 │ 1705 │ m3 - 5-19edo │ 316 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ E5 │ I │ 5-e19-1 │ 1895 │ m3 - 5-19edo │ 316 │ + │ D5 │ II │ 0-2 │ 2400 │ F#5 │ I │ M6-e19-1 │ 2084 │ M3 - 6-19edo │ 379 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ G5 │ I │ m7-e19-1 │ 2211 │ m3 - 5-19edo │ 316 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ A5 │ I │ 0-2 │ 2400 │ m3 - 5-19edo │ 316 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ B5 │ I │ M2-e19-2 │ 2589 │ M3 - 6-19edo │ 379 │ + │ A5 │ II │ 5-e19-2 │ 3095 │ C#6 │ I │ M3-e19-2 │ 2779 │ M3 - 6-19edo │ 379 │ + │ B5 │ II │ M6-e19-2 │ 3284 │ D6 │ I │ 4-e19-2 │ 2905 │ m3 - 5-19edo │ 316 │ + │ C#6 │ II │ M7-e19-2 │ 3474 │ E6 │ I │ 5-e19-2 │ 3095 │ m3 - 5-19edo │ 316 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "e_flat_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_e_flat in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ Eb2 │ IV │ m3-e19 │ 316 │ G2 │ III │ 0 │ 0 │ M3 - 6-19edo │ 379 │ + │ F2 │ IV │ 4-e19 │ 505 │ Ab2 │ III │ m2-e19 │ 126 │ m3 - 5-19edo │ 316 │ + │ G2 │ IV │ 5-e19 │ 695 │ Bb2 │ III │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ Ab2 │ IV │ m6-e19 │ 821 │ C3 │ III │ 4-e19 │ 505 │ M3 - 6-19edo │ 379 │ + │ Bb2 │ III │ m3-e19 │ 316 │ D3 │ II │ 0 │ 0 │ M3 - 6-19edo │ 379 │ + │ C3 │ III │ 4-e19 │ 505 │ Eb3 │ II │ m2-e19 │ 126 │ m3 - 5-19edo │ 316 │ + │ D3 │ III │ 5-e19 │ 695 │ F3 │ II │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ Eb3 │ III │ m6-e19 │ 821 │ G3 │ II │ 4-e19 │ 505 │ M3 - 6-19edo │ 379 │ + │ F3 │ III │ m7-e19 │ 1011 │ Ab3 │ II │ d5-e19 │ 632 │ m3 - 5-19edo │ 316 │ + │ G3 │ II │ 4-e19 │ 505 │ Bb3 │ I │ m2-e19 │ 126 │ m3 - 5-19edo │ 316 │ + │ Ab3 │ II │ d5-e19 │ 632 │ C4 │ I │ m3-e19 │ 316 │ M3 - 6-19edo │ 379 │ + │ Bb3 │ II │ m6-e19 │ 821 │ D4 │ I │ 4-e19 │ 505 │ M3 - 6-19edo │ 379 │ + │ C4 │ II │ m7-e19 │ 1011 │ Eb4 │ I │ d5-e19 │ 632 │ m3 - 5-19edo │ 316 │ + │ D4 │ II │ 0-1 │ 1200 │ F4 │ I │ m6-e19 │ 821 │ m3 - 5-19edo │ 316 │ + │ Eb4 │ II │ m2-e19-1 │ 1326 │ G4 │ I │ m7-e19 │ 1011 │ M3 - 6-19edo │ 379 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ Ab4 │ I │ d8-e19 │ 1137 │ m3 - 5-19edo │ 316 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ Bb4 │ I │ m2-e19-1 │ 1326 │ m3 - 5-19edo │ 316 │ + │ Ab4 │ II │ d5-e19-1 │ 1832 │ C5 │ I │ m3-e19-1 │ 1516 │ M3 - 6-19edo │ 379 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ D5 │ I │ 4-e19-1 │ 1705 │ M3 - 6-19edo │ 379 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ Eb5 │ I │ d5-e19-1 │ 1832 │ m3 - 5-19edo │ 316 │ + │ D5 │ II │ 0-2 │ 2400 │ F5 │ I │ m6-e19-1 │ 2021 │ m3 - 5-19edo │ 316 │ + │ Eb5 │ II │ m2-e19-2 │ 2526 │ G5 │ I │ m7-e19-1 │ 2211 │ M3 - 6-19edo │ 379 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ Ab5 │ I │ d8-e19-1 │ 2337 │ m3 - 5-19edo │ 316 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ Bb5 │ I │ m2-e19-2 │ 2526 │ m3 - 5-19edo │ 316 │ + │ Ab5 │ II │ d5-e19-2 │ 3032 │ C6 │ I │ m3-e19-2 │ 2716 │ M3 - 6-19edo │ 379 │ + │ Bb5 │ II │ m6-e19-2 │ 3221 │ D6 │ I │ 4-e19-2 │ 2905 │ M3 - 6-19edo │ 379 │ + │ C6 │ II │ m7-e19-2 │ 3411 │ Eb6 │ I │ d5-e19-2 │ 3032 │ m3 - 5-19edo │ 316 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "e_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_e in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ E2 │ IV │ M3-e19 │ 379 │ G#2 │ III │ A1-e19 │ 63 │ M3 - 6-19edo │ 379 │ + │ F#2 │ IV │ A4-e19 │ 568 │ A2 │ III │ M2-e19 │ 189 │ m3 - 5-19edo │ 316 │ + │ G#2 │ IV │ A5-e19 │ 758 │ B2 │ III │ M3-e19 │ 379 │ m3 - 5-19edo │ 316 │ + │ A2 │ IV │ M6-e19 │ 884 │ C#3 │ III │ A4-e19 │ 568 │ M3 - 6-19edo │ 379 │ + │ B2 │ III │ M3-e19 │ 379 │ D#3 │ II │ A1-e19 │ 63 │ M3 - 6-19edo │ 379 │ + │ C#3 │ III │ A4-e19 │ 568 │ E3 │ II │ M2-e19 │ 189 │ m3 - 5-19edo │ 316 │ + │ D#3 │ III │ A5-e19 │ 758 │ F#3 │ II │ M3-e19 │ 379 │ m3 - 5-19edo │ 316 │ + │ E3 │ III │ M6-e19 │ 884 │ G#3 │ II │ A4-e19 │ 568 │ M3 - 6-19edo │ 379 │ + │ F#3 │ II │ M3-e19 │ 379 │ A3 │ I │ 0 │ 0 │ m3 - 5-19edo │ 316 │ + │ G#3 │ II │ A4-e19 │ 568 │ B3 │ I │ M2-e19 │ 189 │ m3 - 5-19edo │ 316 │ + │ A3 │ II │ 5-e19 │ 695 │ C#4 │ I │ M3-e19 │ 379 │ M3 - 6-19edo │ 379 │ + │ B3 │ II │ M6-e19 │ 884 │ D#4 │ I │ A4-e19 │ 568 │ M3 - 6-19edo │ 379 │ + │ C#4 │ II │ M7-e19 │ 1074 │ E4 │ I │ 5-e19 │ 695 │ m3 - 5-19edo │ 316 │ + │ D#4 │ II │ A1-e19-1 │ 1263 │ F#4 │ I │ M6-e19 │ 884 │ m3 - 5-19edo │ 316 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ G#4 │ I │ M7-e19 │ 1074 │ M3 - 6-19edo │ 379 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ A4 │ I │ 0-1 │ 1200 │ m3 - 5-19edo │ 316 │ + │ G#4 │ II │ A4-e19-1 │ 1768 │ B4 │ I │ M2-e19-1 │ 1389 │ m3 - 5-19edo │ 316 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ C#5 │ I │ M3-e19-1 │ 1579 │ M3 - 6-19edo │ 379 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ D#5 │ I │ A4-e19-1 │ 1768 │ M3 - 6-19edo │ 379 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ E5 │ I │ 5-e19-1 │ 1895 │ m3 - 5-19edo │ 316 │ + │ D#5 │ II │ A1-e19-2 │ 2463 │ F#5 │ I │ M6-e19-1 │ 2084 │ m3 - 5-19edo │ 316 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ G#5 │ I │ M7-e19-1 │ 2274 │ M3 - 6-19edo │ 379 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ A5 │ I │ 0-2 │ 2400 │ m3 - 5-19edo │ 316 │ + │ G#5 │ II │ A4-e19-2 │ 2968 │ B5 │ I │ M2-e19-2 │ 2589 │ m3 - 5-19edo │ 316 │ + │ A5 │ II │ 5-e19-2 │ 3095 │ C#6 │ I │ M3-e19-2 │ 2779 │ M3 - 6-19edo │ 379 │ + │ B5 │ II │ M6-e19-2 │ 3284 │ D#6 │ I │ A4-e19-2 │ 2968 │ M3 - 6-19edo │ 379 │ + │ C#6 │ II │ M7-e19-2 │ 3474 │ E6 │ I │ 5-e19-2 │ 3095 │ m3 - 5-19edo │ 316 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "f_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_f in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ F2 │ IV │ 4-e19 │ 505 │ A2 │ III │ M2-e19 │ 189 │ M3 - 6-19edo │ 379 │ + │ G2 │ IV │ 5-e19 │ 695 │ Bb2 │ III │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ A2 │ IV │ M6-e19 │ 884 │ C3 │ III │ 4-e19 │ 505 │ m3 - 5-19edo │ 316 │ + │ Bb2 │ III │ m3-e19 │ 316 │ D3 │ II │ 0 │ 0 │ M3 - 6-19edo │ 379 │ + │ C3 │ III │ 4-e19 │ 505 │ E3 │ II │ M2-e19 │ 189 │ M3 - 6-19edo │ 379 │ + │ D3 │ III │ 5-e19 │ 695 │ F3 │ II │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ E3 │ III │ M6-e19 │ 884 │ G3 │ II │ 4-e19 │ 505 │ m3 - 5-19edo │ 316 │ + │ F3 │ II │ m3-e19 │ 316 │ A3 │ I │ 0 │ 0 │ M3 - 6-19edo │ 379 │ + │ G3 │ II │ 4-e19 │ 505 │ Bb3 │ I │ m2-e19 │ 126 │ m3 - 5-19edo │ 316 │ + │ A3 │ II │ 5-e19 │ 695 │ C4 │ I │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ Bb3 │ II │ m6-e19 │ 821 │ D4 │ I │ 4-e19 │ 505 │ M3 - 6-19edo │ 379 │ + │ C4 │ II │ m7-e19 │ 1011 │ E4 │ I │ 5-e19 │ 695 │ M3 - 6-19edo │ 379 │ + │ D4 │ II │ 0-1 │ 1200 │ F4 │ I │ m6-e19 │ 821 │ m3 - 5-19edo │ 316 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ G4 │ I │ m7-e19 │ 1011 │ m3 - 5-19edo │ 316 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ A4 │ I │ 0-1 │ 1200 │ M3 - 6-19edo │ 379 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ Bb4 │ I │ m2-e19-1 │ 1326 │ m3 - 5-19edo │ 316 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ C5 │ I │ m3-e19-1 │ 1516 │ m3 - 5-19edo │ 316 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ D5 │ I │ 4-e19-1 │ 1705 │ M3 - 6-19edo │ 379 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ E5 │ I │ 5-e19-1 │ 1895 │ M3 - 6-19edo │ 379 │ + │ D5 │ II │ 0-2 │ 2400 │ F5 │ I │ m6-e19-1 │ 2021 │ m3 - 5-19edo │ 316 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ G5 │ I │ m7-e19-1 │ 2211 │ m3 - 5-19edo │ 316 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ A5 │ I │ 0-2 │ 2400 │ M3 - 6-19edo │ 379 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ Bb5 │ I │ m2-e19-2 │ 2526 │ m3 - 5-19edo │ 316 │ + │ A5 │ II │ 5-e19-2 │ 3095 │ C6 │ I │ m3-e19-2 │ 2716 │ m3 - 5-19edo │ 316 │ + │ Bb5 │ II │ m6-e19-2 │ 3221 │ D6 │ I │ 4-e19-2 │ 2905 │ M3 - 6-19edo │ 379 │ + │ C6 │ II │ m7-e19-2 │ 3411 │ E6 │ I │ 5-e19-2 │ 3095 │ M3 - 6-19edo │ 379 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "f_sharp_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_f_sharp in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ F#2 │ IV │ A4-e19 │ 568 │ A#2 │ III │ A2-e19 │ 253 │ M3 - 6-19edo │ 379 │ + │ G#2 │ IV │ A5-e19 │ 758 │ B2 │ III │ M3-e19 │ 379 │ m3 - 5-19edo │ 316 │ + │ A#2 │ IV │ d7-e19 │ 947 │ C#3 │ III │ A4-e19 │ 568 │ m3 - 5-19edo │ 316 │ + │ B2 │ III │ M3-e19 │ 379 │ D#3 │ II │ A1-e19 │ 63 │ M3 - 6-19edo │ 379 │ + │ C#3 │ III │ A4-e19 │ 568 │ E#3 │ II │ A2-e19 │ 253 │ M3 - 6-19edo │ 379 │ + │ D#3 │ III │ A5-e19 │ 758 │ F#3 │ II │ M3-e19 │ 379 │ m3 - 5-19edo │ 316 │ + │ E#3 │ III │ d7-e19 │ 947 │ G#3 │ II │ A4-e19 │ 568 │ m3 - 5-19edo │ 316 │ + │ F#3 │ II │ M3-e19 │ 379 │ A#3 │ I │ A1-e19 │ 63 │ M3 - 6-19edo │ 379 │ + │ G#3 │ II │ A4-e19 │ 568 │ B3 │ I │ M2-e19 │ 189 │ m3 - 5-19edo │ 316 │ + │ A#3 │ II │ A5-e19 │ 758 │ C#4 │ I │ M3-e19 │ 379 │ m3 - 5-19edo │ 316 │ + │ B3 │ II │ M6-e19 │ 884 │ D#4 │ I │ A4-e19 │ 568 │ M3 - 6-19edo │ 379 │ + │ C#4 │ II │ M7-e19 │ 1074 │ E#4 │ I │ A5-e19 │ 758 │ M3 - 6-19edo │ 379 │ + │ D#4 │ II │ A1-e19-1 │ 1263 │ F#4 │ I │ M6-e19 │ 884 │ m3 - 5-19edo │ 316 │ + │ E#4 │ II │ A2-e19-1 │ 1453 │ G#4 │ I │ M7-e19 │ 1074 │ m3 - 5-19edo │ 316 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ A#4 │ I │ A1-e19-1 │ 1263 │ M3 - 6-19edo │ 379 │ + │ G#4 │ II │ A4-e19-1 │ 1768 │ B4 │ I │ M2-e19-1 │ 1389 │ m3 - 5-19edo │ 316 │ + │ A#4 │ II │ A5-e19-1 │ 1958 │ C#5 │ I │ M3-e19-1 │ 1579 │ m3 - 5-19edo │ 316 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ D#5 │ I │ A4-e19-1 │ 1768 │ M3 - 6-19edo │ 379 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ E#5 │ I │ A5-e19-1 │ 1958 │ M3 - 6-19edo │ 379 │ + │ D#5 │ II │ A1-e19-2 │ 2463 │ F#5 │ I │ M6-e19-1 │ 2084 │ m3 - 5-19edo │ 316 │ + │ E#5 │ II │ A2-e19-2 │ 2653 │ G#5 │ I │ M7-e19-1 │ 2274 │ m3 - 5-19edo │ 316 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ A#5 │ I │ A1-e19-2 │ 2463 │ M3 - 6-19edo │ 379 │ + │ G#5 │ II │ A4-e19-2 │ 2968 │ B5 │ I │ M2-e19-2 │ 2589 │ m3 - 5-19edo │ 316 │ + │ A#5 │ II │ A5-e19-2 │ 3158 │ C#6 │ I │ M3-e19-2 │ 2779 │ m3 - 5-19edo │ 316 │ + │ B5 │ II │ M6-e19-2 │ 3284 │ D#6 │ I │ A4-e19-2 │ 2968 │ M3 - 6-19edo │ 379 │ + │ C#6 │ II │ M7-e19-2 │ 3474 │ E#6 │ I │ A5-e19-2 │ 3158 │ M3 - 6-19edo │ 379 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "g_flat_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_g_flat in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ Gb2 │ IV │ d5-e19 │ 632 │ Bb2 │ III │ m3-e19 │ 316 │ M3 - 6-19edo │ 379 │ + │ Ab2 │ IV │ m6-e19 │ 821 │ Cb3 │ III │ A3-e19 │ 442 │ m3 - 5-19edo │ 316 │ + │ Bb2 │ IV │ m7-e19 │ 1011 │ Db3 │ III │ d5-e19 │ 632 │ m3 - 5-19edo │ 316 │ + │ Cb3 │ III │ A3-e19 │ 442 │ Eb3 │ II │ m2-e19 │ 126 │ M3 - 6-19edo │ 379 │ + │ Db3 │ III │ d5-e19 │ 632 │ F3 │ II │ m3-e19 │ 316 │ M3 - 6-19edo │ 379 │ + │ Eb3 │ III │ m6-e19 │ 821 │ Gb3 │ II │ A3-e19 │ 442 │ m3 - 5-19edo │ 316 │ + │ F3 │ III │ m7-e19 │ 1011 │ Ab3 │ II │ d5-e19 │ 632 │ m3 - 5-19edo │ 316 │ + │ Gb3 │ II │ A3-e19 │ 442 │ Bb3 │ I │ m2-e19 │ 126 │ M3 - 6-19edo │ 379 │ + │ Ab3 │ II │ d5-e19 │ 632 │ Cb4 │ I │ A2-e19 │ 253 │ m3 - 5-19edo │ 316 │ + │ Bb3 │ II │ m6-e19 │ 821 │ Db4 │ I │ A3-e19 │ 442 │ m3 - 5-19edo │ 316 │ + │ Cb4 │ II │ d7-e19 │ 947 │ Eb4 │ I │ d5-e19 │ 632 │ M3 - 6-19edo │ 379 │ + │ Db4 │ II │ d8-e19 │ 1137 │ F4 │ I │ m6-e19 │ 821 │ M3 - 6-19edo │ 379 │ + │ Eb4 │ II │ m2-e19-1 │ 1326 │ Gb4 │ I │ d7-e19 │ 947 │ m3 - 5-19edo │ 316 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ Ab4 │ I │ d8-e19 │ 1137 │ m3 - 5-19edo │ 316 │ + │ Gb4 │ II │ A3-e19-1 │ 1642 │ Bb4 │ I │ m2-e19-1 │ 1326 │ M3 - 6-19edo │ 379 │ + │ Ab4 │ II │ d5-e19-1 │ 1832 │ Cb5 │ I │ A2-e19-1 │ 1453 │ m3 - 5-19edo │ 316 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ Db5 │ I │ A3-e19-1 │ 1642 │ m3 - 5-19edo │ 316 │ + │ Cb5 │ II │ d7-e19-1 │ 2147 │ Eb5 │ I │ d5-e19-1 │ 1832 │ M3 - 6-19edo │ 379 │ + │ Db5 │ II │ d8-e19-1 │ 2337 │ F5 │ I │ m6-e19-1 │ 2021 │ M3 - 6-19edo │ 379 │ + │ Eb5 │ II │ m2-e19-2 │ 2526 │ Gb5 │ I │ d7-e19-1 │ 2147 │ m3 - 5-19edo │ 316 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ Ab5 │ I │ d8-e19-1 │ 2337 │ m3 - 5-19edo │ 316 │ + │ Gb5 │ II │ A3-e19-2 │ 2842 │ Bb5 │ I │ m2-e19-2 │ 2526 │ M3 - 6-19edo │ 379 │ + │ Ab5 │ II │ d5-e19-2 │ 3032 │ Cb6 │ I │ A2-e19-2 │ 2653 │ m3 - 5-19edo │ 316 │ + │ Bb5 │ II │ m6-e19-2 │ 3221 │ Db6 │ I │ A3-e19-2 │ 2842 │ m3 - 5-19edo │ 316 │ + │ Cb6 │ II │ d7-e19-2 │ 3347 │ Eb6 │ I │ d5-e19-2 │ 3032 │ M3 - 6-19edo │ 379 │ + │ Db6 │ II │ d8-e19-2 │ 3537 │ F6 │ I │ m6-e19-2 │ 3221 │ M3 - 6-19edo │ 379 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "g_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_f in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ F2 │ IV │ 4-e19 │ 505 │ A2 │ III │ M2-e19 │ 189 │ M3 - 6-19edo │ 379 │ + │ G2 │ IV │ 5-e19 │ 695 │ Bb2 │ III │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ A2 │ IV │ M6-e19 │ 884 │ C3 │ III │ 4-e19 │ 505 │ m3 - 5-19edo │ 316 │ + │ Bb2 │ III │ m3-e19 │ 316 │ D3 │ II │ 0 │ 0 │ M3 - 6-19edo │ 379 │ + │ C3 │ III │ 4-e19 │ 505 │ E3 │ II │ M2-e19 │ 189 │ M3 - 6-19edo │ 379 │ + │ D3 │ III │ 5-e19 │ 695 │ F3 │ II │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ E3 │ III │ M6-e19 │ 884 │ G3 │ II │ 4-e19 │ 505 │ m3 - 5-19edo │ 316 │ + │ F3 │ II │ m3-e19 │ 316 │ A3 │ I │ 0 │ 0 │ M3 - 6-19edo │ 379 │ + │ G3 │ II │ 4-e19 │ 505 │ Bb3 │ I │ m2-e19 │ 126 │ m3 - 5-19edo │ 316 │ + │ A3 │ II │ 5-e19 │ 695 │ C4 │ I │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ Bb3 │ II │ m6-e19 │ 821 │ D4 │ I │ 4-e19 │ 505 │ M3 - 6-19edo │ 379 │ + │ C4 │ II │ m7-e19 │ 1011 │ E4 │ I │ 5-e19 │ 695 │ M3 - 6-19edo │ 379 │ + │ D4 │ II │ 0-1 │ 1200 │ F4 │ I │ m6-e19 │ 821 │ m3 - 5-19edo │ 316 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ G4 │ I │ m7-e19 │ 1011 │ m3 - 5-19edo │ 316 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ A4 │ I │ 0-1 │ 1200 │ M3 - 6-19edo │ 379 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ Bb4 │ I │ m2-e19-1 │ 1326 │ m3 - 5-19edo │ 316 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ C5 │ I │ m3-e19-1 │ 1516 │ m3 - 5-19edo │ 316 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ D5 │ I │ 4-e19-1 │ 1705 │ M3 - 6-19edo │ 379 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ E5 │ I │ 5-e19-1 │ 1895 │ M3 - 6-19edo │ 379 │ + │ D5 │ II │ 0-2 │ 2400 │ F5 │ I │ m6-e19-1 │ 2021 │ m3 - 5-19edo │ 316 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ G5 │ I │ m7-e19-1 │ 2211 │ m3 - 5-19edo │ 316 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ A5 │ I │ 0-2 │ 2400 │ M3 - 6-19edo │ 379 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ Bb5 │ I │ m2-e19-2 │ 2526 │ m3 - 5-19edo │ 316 │ + │ A5 │ II │ 5-e19-2 │ 3095 │ C6 │ I │ m3-e19-2 │ 2716 │ m3 - 5-19edo │ 316 │ + │ Bb5 │ II │ m6-e19-2 │ 3221 │ D6 │ I │ 4-e19-2 │ 2905 │ M3 - 6-19edo │ 379 │ + │ C6 │ II │ m7-e19-2 │ 3411 │ E6 │ I │ 5-e19-2 │ 3095 │ M3 - 6-19edo │ 379 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "a_flat_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_a_flat in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ Ab2 │ IV │ m6-e19 │ 821 │ C3 │ III │ 4-e19 │ 505 │ M3 - 6-19edo │ 379 │ + │ Bb2 │ IV │ m7-e19 │ 1011 │ Db3 │ III │ d5-e19 │ 632 │ m3 - 5-19edo │ 316 │ + │ C3 │ III │ 4-e19 │ 505 │ Eb3 │ II │ m2-e19 │ 126 │ m3 - 5-19edo │ 316 │ + │ Db3 │ III │ d5-e19 │ 632 │ F3 │ II │ m3-e19 │ 316 │ M3 - 6-19edo │ 379 │ + │ Eb3 │ III │ m6-e19 │ 821 │ G3 │ II │ 4-e19 │ 505 │ M3 - 6-19edo │ 379 │ + │ F3 │ III │ m7-e19 │ 1011 │ Ab3 │ II │ d5-e19 │ 632 │ m3 - 5-19edo │ 316 │ + │ G3 │ II │ 4-e19 │ 505 │ Bb3 │ I │ m2-e19 │ 126 │ m3 - 5-19edo │ 316 │ + │ Ab3 │ II │ d5-e19 │ 632 │ C4 │ I │ m3-e19 │ 316 │ M3 - 6-19edo │ 379 │ + │ Bb3 │ II │ m6-e19 │ 821 │ Db4 │ I │ A3-e19 │ 442 │ m3 - 5-19edo │ 316 │ + │ C4 │ II │ m7-e19 │ 1011 │ Eb4 │ I │ d5-e19 │ 632 │ m3 - 5-19edo │ 316 │ + │ Db4 │ II │ d8-e19 │ 1137 │ F4 │ I │ m6-e19 │ 821 │ M3 - 6-19edo │ 379 │ + │ Eb4 │ II │ m2-e19-1 │ 1326 │ G4 │ I │ m7-e19 │ 1011 │ M3 - 6-19edo │ 379 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ Ab4 │ I │ d8-e19 │ 1137 │ m3 - 5-19edo │ 316 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ Bb4 │ I │ m2-e19-1 │ 1326 │ m3 - 5-19edo │ 316 │ + │ Ab4 │ II │ d5-e19-1 │ 1832 │ C5 │ I │ m3-e19-1 │ 1516 │ M3 - 6-19edo │ 379 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ Db5 │ I │ A3-e19-1 │ 1642 │ m3 - 5-19edo │ 316 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ Eb5 │ I │ d5-e19-1 │ 1832 │ m3 - 5-19edo │ 316 │ + │ Db5 │ II │ d8-e19-1 │ 2337 │ F5 │ I │ m6-e19-1 │ 2021 │ M3 - 6-19edo │ 379 │ + │ Eb5 │ II │ m2-e19-2 │ 2526 │ G5 │ I │ m7-e19-1 │ 2211 │ M3 - 6-19edo │ 379 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ Ab5 │ I │ d8-e19-1 │ 2337 │ m3 - 5-19edo │ 316 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ Bb5 │ I │ m2-e19-2 │ 2526 │ m3 - 5-19edo │ 316 │ + │ Ab5 │ II │ d5-e19-2 │ 3032 │ C6 │ I │ m3-e19-2 │ 2716 │ M3 - 6-19edo │ 379 │ + │ Bb5 │ II │ m6-e19-2 │ 3221 │ Db6 │ I │ A3-e19-2 │ 2842 │ m3 - 5-19edo │ 316 │ + │ C6 │ II │ m7-e19-2 │ 3411 │ Eb6 │ I │ d5-e19-2 │ 3032 │ m3 - 5-19edo │ 316 │ + │ Db6 │ II │ d8-e19-2 │ 3537 │ F6 │ I │ m6-e19-2 │ 3221 │ M3 - 6-19edo │ 379 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "a_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_a in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ A2 │ IV │ M6-e19 │ 884 │ C#3 │ III │ A4-e19 │ 568 │ M3 - 6-19edo │ 379 │ + │ B2 │ III │ M3-e19 │ 379 │ D3 │ II │ 0 │ 0 │ m3 - 5-19edo │ 316 │ + │ C#3 │ III │ A4-e19 │ 568 │ E3 │ II │ M2-e19 │ 189 │ m3 - 5-19edo │ 316 │ + │ D3 │ III │ 5-e19 │ 695 │ F#3 │ II │ M3-e19 │ 379 │ M3 - 6-19edo │ 379 │ + │ E3 │ III │ M6-e19 │ 884 │ G#3 │ II │ A4-e19 │ 568 │ M3 - 6-19edo │ 379 │ + │ F#3 │ II │ M3-e19 │ 379 │ A3 │ I │ 0 │ 0 │ m3 - 5-19edo │ 316 │ + │ G#3 │ II │ A4-e19 │ 568 │ B3 │ I │ M2-e19 │ 189 │ m3 - 5-19edo │ 316 │ + │ A3 │ II │ 5-e19 │ 695 │ C#4 │ I │ M3-e19 │ 379 │ M3 - 6-19edo │ 379 │ + │ B3 │ II │ M6-e19 │ 884 │ D4 │ I │ 4-e19 │ 505 │ m3 - 5-19edo │ 316 │ + │ C#4 │ II │ M7-e19 │ 1074 │ E4 │ I │ 5-e19 │ 695 │ m3 - 5-19edo │ 316 │ + │ D4 │ II │ 0-1 │ 1200 │ F#4 │ I │ M6-e19 │ 884 │ M3 - 6-19edo │ 379 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ G#4 │ I │ M7-e19 │ 1074 │ M3 - 6-19edo │ 379 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ A4 │ I │ 0-1 │ 1200 │ m3 - 5-19edo │ 316 │ + │ G#4 │ II │ A4-e19-1 │ 1768 │ B4 │ I │ M2-e19-1 │ 1389 │ m3 - 5-19edo │ 316 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ C#5 │ I │ M3-e19-1 │ 1579 │ M3 - 6-19edo │ 379 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ D5 │ I │ 4-e19-1 │ 1705 │ m3 - 5-19edo │ 316 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ E5 │ I │ 5-e19-1 │ 1895 │ m3 - 5-19edo │ 316 │ + │ D5 │ II │ 0-2 │ 2400 │ F#5 │ I │ M6-e19-1 │ 2084 │ M3 - 6-19edo │ 379 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ G#5 │ I │ M7-e19-1 │ 2274 │ M3 - 6-19edo │ 379 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ A5 │ I │ 0-2 │ 2400 │ m3 - 5-19edo │ 316 │ + │ G#5 │ II │ A4-e19-2 │ 2968 │ B5 │ I │ M2-e19-2 │ 2589 │ m3 - 5-19edo │ 316 │ + │ A5 │ II │ 5-e19-2 │ 3095 │ C#6 │ I │ M3-e19-2 │ 2779 │ M3 - 6-19edo │ 379 │ + │ B5 │ II │ M6-e19-2 │ 3284 │ D6 │ I │ 4-e19-2 │ 2905 │ m3 - 5-19edo │ 316 │ + │ C#6 │ II │ M7-e19-2 │ 3474 │ E6 │ I │ 5-e19-2 │ 3095 │ m3 - 5-19edo │ 316 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "b_flat_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_b_flat in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ Bb2 │ III │ m3-e19 │ 316 │ D3 │ II │ 0 │ 0 │ M3 - 6-19edo │ 379 │ + │ C3 │ III │ 4-e19 │ 505 │ Eb3 │ II │ m2-e19 │ 126 │ m3 - 5-19edo │ 316 │ + │ D3 │ III │ 5-e19 │ 695 │ F3 │ II │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ Eb3 │ III │ m6-e19 │ 821 │ G3 │ II │ 4-e19 │ 505 │ M3 - 6-19edo │ 379 │ + │ F3 │ II │ m3-e19 │ 316 │ A3 │ I │ 0 │ 0 │ M3 - 6-19edo │ 379 │ + │ G3 │ II │ 4-e19 │ 505 │ Bb3 │ I │ m2-e19 │ 126 │ m3 - 5-19edo │ 316 │ + │ A3 │ II │ 5-e19 │ 695 │ C4 │ I │ m3-e19 │ 316 │ m3 - 5-19edo │ 316 │ + │ Bb3 │ II │ m6-e19 │ 821 │ D4 │ I │ 4-e19 │ 505 │ M3 - 6-19edo │ 379 │ + │ C4 │ II │ m7-e19 │ 1011 │ Eb4 │ I │ d5-e19 │ 632 │ m3 - 5-19edo │ 316 │ + │ D4 │ II │ 0-1 │ 1200 │ F4 │ I │ m6-e19 │ 821 │ m3 - 5-19edo │ 316 │ + │ Eb4 │ II │ m2-e19-1 │ 1326 │ G4 │ I │ m7-e19 │ 1011 │ M3 - 6-19edo │ 379 │ + │ F4 │ II │ m3-e19-1 │ 1516 │ A4 │ I │ 0-1 │ 1200 │ M3 - 6-19edo │ 379 │ + │ G4 │ II │ 4-e19-1 │ 1705 │ Bb4 │ I │ m2-e19-1 │ 1326 │ m3 - 5-19edo │ 316 │ + │ A4 │ II │ 5-e19-1 │ 1895 │ C5 │ I │ m3-e19-1 │ 1516 │ m3 - 5-19edo │ 316 │ + │ Bb4 │ II │ m6-e19-1 │ 2021 │ D5 │ I │ 4-e19-1 │ 1705 │ M3 - 6-19edo │ 379 │ + │ C5 │ II │ m7-e19-1 │ 2211 │ Eb5 │ I │ d5-e19-1 │ 1832 │ m3 - 5-19edo │ 316 │ + │ D5 │ II │ 0-2 │ 2400 │ F5 │ I │ m6-e19-1 │ 2021 │ m3 - 5-19edo │ 316 │ + │ Eb5 │ II │ m2-e19-2 │ 2526 │ G5 │ I │ m7-e19-1 │ 2211 │ M3 - 6-19edo │ 379 │ + │ F5 │ II │ m3-e19-2 │ 2716 │ A5 │ I │ 0-2 │ 2400 │ M3 - 6-19edo │ 379 │ + │ G5 │ II │ 4-e19-2 │ 2905 │ Bb5 │ I │ m2-e19-2 │ 2526 │ m3 - 5-19edo │ 316 │ + │ A5 │ II │ 5-e19-2 │ 3095 │ C6 │ I │ m3-e19-2 │ 2716 │ m3 - 5-19edo │ 316 │ + │ Bb5 │ II │ m6-e19-2 │ 3221 │ D6 │ I │ 4-e19-2 │ 2905 │ M3 - 6-19edo │ 379 │ + │ C6 │ II │ m7-e19-2 │ 3411 │ Eb6 │ I │ d5-e19-2 │ 3032 │ m3 - 5-19edo │ 316 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; + +let%expect_test "b_major" = + let t = force E19.t in + let scale = make_major_scale ~from:Scales.lower_b in + print_endline (System.Double_stops.to_ascii_table t scale); + [%expect + {| + ┌─────┬────────┬──────────┬───────┬──────┬────────┬──────────┬───────┬──────────────┬───────┐ + │ Low │ String │ Pos │ Cents │ High │ String │ Pos │ Cents │ Interval │ Cents │ + ├─────┼────────┼──────────┼───────┼──────┼────────┼──────────┼───────┼──────────────┼───────┤ + │ B2 │ III │ M3-e19 │ 379 │ D#3 │ II │ A1-e19 │ 63 │ M3 - 6-19edo │ 379 │ + │ C#3 │ III │ A4-e19 │ 568 │ E3 │ II │ M2-e19 │ 189 │ m3 - 5-19edo │ 316 │ + │ D#3 │ III │ A5-e19 │ 758 │ F#3 │ II │ M3-e19 │ 379 │ m3 - 5-19edo │ 316 │ + │ E3 │ III │ M6-e19 │ 884 │ G#3 │ II │ A4-e19 │ 568 │ M3 - 6-19edo │ 379 │ + │ F#3 │ II │ M3-e19 │ 379 │ A#3 │ I │ A1-e19 │ 63 │ M3 - 6-19edo │ 379 │ + │ G#3 │ II │ A4-e19 │ 568 │ B3 │ I │ M2-e19 │ 189 │ m3 - 5-19edo │ 316 │ + │ A#3 │ II │ A5-e19 │ 758 │ C#4 │ I │ M3-e19 │ 379 │ m3 - 5-19edo │ 316 │ + │ B3 │ II │ M6-e19 │ 884 │ D#4 │ I │ A4-e19 │ 568 │ M3 - 6-19edo │ 379 │ + │ C#4 │ II │ M7-e19 │ 1074 │ E4 │ I │ 5-e19 │ 695 │ m3 - 5-19edo │ 316 │ + │ D#4 │ II │ A1-e19-1 │ 1263 │ F#4 │ I │ M6-e19 │ 884 │ m3 - 5-19edo │ 316 │ + │ E4 │ II │ M2-e19-1 │ 1389 │ G#4 │ I │ M7-e19 │ 1074 │ M3 - 6-19edo │ 379 │ + │ F#4 │ II │ M3-e19-1 │ 1579 │ A#4 │ I │ A1-e19-1 │ 1263 │ M3 - 6-19edo │ 379 │ + │ G#4 │ II │ A4-e19-1 │ 1768 │ B4 │ I │ M2-e19-1 │ 1389 │ m3 - 5-19edo │ 316 │ + │ A#4 │ II │ A5-e19-1 │ 1958 │ C#5 │ I │ M3-e19-1 │ 1579 │ m3 - 5-19edo │ 316 │ + │ B4 │ II │ M6-e19-1 │ 2084 │ D#5 │ I │ A4-e19-1 │ 1768 │ M3 - 6-19edo │ 379 │ + │ C#5 │ II │ M7-e19-1 │ 2274 │ E5 │ I │ 5-e19-1 │ 1895 │ m3 - 5-19edo │ 316 │ + │ D#5 │ II │ A1-e19-2 │ 2463 │ F#5 │ I │ M6-e19-1 │ 2084 │ m3 - 5-19edo │ 316 │ + │ E5 │ II │ M2-e19-2 │ 2589 │ G#5 │ I │ M7-e19-1 │ 2274 │ M3 - 6-19edo │ 379 │ + │ F#5 │ II │ M3-e19-2 │ 2779 │ A#5 │ I │ A1-e19-2 │ 2463 │ M3 - 6-19edo │ 379 │ + │ G#5 │ II │ A4-e19-2 │ 2968 │ B5 │ I │ M2-e19-2 │ 2589 │ m3 - 5-19edo │ 316 │ + │ A#5 │ II │ A5-e19-2 │ 3158 │ C#6 │ I │ M3-e19-2 │ 2779 │ m3 - 5-19edo │ 316 │ + │ B5 │ II │ M6-e19-2 │ 3284 │ D#6 │ I │ A4-e19-2 │ 2968 │ M3 - 6-19edo │ 379 │ + │ C#6 │ II │ M7-e19-2 │ 3474 │ E6 │ I │ 5-e19-2 │ 3095 │ m3 - 5-19edo │ 316 │ + └─────┴────────┴──────────┴───────┴──────┴────────┴──────────┴───────┴──────────────┴───────┘ |}] +;; diff --git a/systems/cello/e19/thirds.mli b/systems/cello/e19/thirds.mli new file mode 100644 index 0000000..145ea10 --- /dev/null +++ b/systems/cello/e19/thirds.mli @@ -0,0 +1,18 @@ +(*_*********************************************************************************) +(*_ Fingerboard - a microtonal geography of the cello fingerboard *) +(*_ Copyright (C) 2022-2024 Mathieu Barbin *) +(*_ *) +(*_ This file is part of Fingerboard. *) +(*_ *) +(*_ Fingerboard is free software: you can redistribute it and/or modify it under *) +(*_ the terms of the GNU Affero General Public License as published by the Free *) +(*_ Software Foundation, either version 3 of the License, or any later version. *) +(*_ *) +(*_ Fingerboard is distributed in the hope that it will be useful, but WITHOUT *) +(*_ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *) +(*_ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License *) +(*_ for more details. *) +(*_ *) +(*_ You should have received a copy of the GNU Affero General Public License *) +(*_ along with Fingerboard. If not, see . *) +(*_*********************************************************************************) diff --git a/test/dune b/test/dune index d961130..c233d69 100644 --- a/test/dune +++ b/test/dune @@ -17,6 +17,7 @@ expect-test-helpers fingerboard fingerboard_cello_system_e12 + fingerboard_cello_system_e19 fingerboard_cello_system_e31 fingerboard_cello_system_e53 fingerboard_cello_system_e55 diff --git a/test/test__cello_systems.ml b/test/test__cello_systems.ml index 6567795..c6a0593 100644 --- a/test/test__cello_systems.ml +++ b/test/test__cello_systems.ml @@ -18,6 +18,7 @@ (**********************************************************************************) open! Fingerboard_cello_system_e12 +open! Fingerboard_cello_system_e19 open! Fingerboard_cello_system_e31 open! Fingerboard_cello_system_e53 open! Fingerboard_cello_system_e55 @@ -771,6 +772,398 @@ let%expect_test "E53.sexp_of_t" = () ;; +let%expect_test "E19.sexp_of_t" = + let t = force E19.t in + print_s [%sexp (t : System.t)]; + [%expect + {| + ((vibrating_strings ( + ((open_string ( + (letter_name A) + (symbol Natural) + (octave_designation 3))) + (pitch 220) + (roman_numeral I)) + ((open_string ( + (letter_name D) + (symbol Natural) + (octave_designation 3))) + (pitch 147.27945113469193) + (roman_numeral II)) + ((open_string ( + (letter_name G) + (symbol Natural) + (octave_designation 2))) + (pitch 98.596530575164124) + (roman_numeral III)) + ((open_string ( + (letter_name C) + (symbol Natural) + (octave_designation 2))) + (pitch 66.005649576795662) + (roman_numeral IV)))) + (intervals_going_down ( + ((interval ( + (number Fifth) + (quality Perfect) + (additional_octaves 0))) + (acoustic_interval ( + Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 11)))) + ((interval ( + (number Fifth) + (quality Perfect) + (additional_octaves 0))) + (acoustic_interval ( + Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 11)))) + ((interval ( + (number Fifth) + (quality Perfect) + (additional_octaves 0))) + (acoustic_interval ( + Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 11)))))) + (fingerboard_positions ( + ((name 0) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string Zero)) + ((name A1-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 1)))) + ((name m2-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 2)))) + ((name M2-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 3)))) + ((name A2-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 4)))) + ((name m3-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 5)))) + ((name M3-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 6)))) + ((name A3-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 7)))) + ((name 4-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 8)))) + ((name A4-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 9)))) + ((name d5-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 10)))) + ((name 5-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 11)))) + ((name A5-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 12)))) + ((name m6-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 13)))) + ((name M6-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 14)))) + ((name d7-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 15)))) + ((name m7-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 16)))) + ((name M7-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 17)))) + ((name d8-e19) + (at_octave 0) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 18)))) + ((name 0) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string Zero)) + ((name A1-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 1)))) + ((name m2-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 2)))) + ((name M2-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 3)))) + ((name A2-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 4)))) + ((name m3-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 5)))) + ((name M3-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 6)))) + ((name A3-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 7)))) + ((name 4-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 8)))) + ((name A4-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 9)))) + ((name d5-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 10)))) + ((name 5-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 11)))) + ((name A5-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 12)))) + ((name m6-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 13)))) + ((name M6-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 14)))) + ((name d7-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 15)))) + ((name m7-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 16)))) + ((name M7-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 17)))) + ((name d8-e19) + (at_octave 1) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 18)))) + ((name 0) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string Zero)) + ((name A1-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 1)))) + ((name m2-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 2)))) + ((name M2-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 3)))) + ((name A2-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 4)))) + ((name m3-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 5)))) + ((name M3-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 6)))) + ((name A3-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 7)))) + ((name 4-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 8)))) + ((name A4-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 9)))) + ((name d5-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 10)))) + ((name 5-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 11)))) + ((name A5-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 12)))) + ((name m6-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 13)))) + ((name M6-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 14)))) + ((name d7-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 15)))) + ((name m7-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 16)))) + ((name M7-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 17)))) + ((name d8-e19) + (at_octave 2) + (basis_acoustic_interval_to_the_open_string + (Equal_division_of_the_octave + (divisor 19) + (number_of_divisions 18))))))) |}]; + () +;; + let%expect_test "E31.sexp_of_t" = let t = force E31.t in print_s [%sexp (t : System.t)]; diff --git a/test/test__fingerboard_position.ml b/test/test__fingerboard_position.ml index 4536460..0453824 100644 --- a/test/test__fingerboard_position.ml +++ b/test/test__fingerboard_position.ml @@ -53,6 +53,7 @@ let%expect_test "positions and cents" = │ Position │ Cents │ ├──────────┼─────────┤ │ 0 │ 0.00 │ + │ A1-e19 │ 63.16 │ │ A1-e31 │ 77.42 │ │ A1-e55 │ 87.27 │ │ m2p │ 90.22 │ @@ -64,9 +65,11 @@ let%expect_test "positions and cents" = │ m2z-e53 │ 113.21 │ │ A1p │ 113.69 │ │ m2-e31 │ 116.13 │ + │ m2-e19 │ 126.32 │ │ d3p │ 180.45 │ │ M2z-e53 │ 181.13 │ │ M2z │ 182.40 │ + │ M2-e19 │ 189.47 │ │ M2-e31 │ 193.55 │ │ M2-e55 │ 196.36 │ │ M2e │ 200.00 │ @@ -75,6 +78,7 @@ let%expect_test "positions and cents" = │ M2p │ 203.91 │ │ d3-e55 │ 218.18 │ │ d3-e31 │ 232.26 │ + │ A2-e19 │ 252.63 │ │ A2-e31 │ 270.97 │ │ A2-e55 │ 283.64 │ │ m3p │ 294.13 │ @@ -83,8 +87,10 @@ let%expect_test "positions and cents" = │ m3-e55 │ 305.45 │ │ m3-e31 │ 309.68 │ │ m3z │ 315.64 │ + │ m3-e19 │ 315.79 │ │ m3z-e53 │ 316.98 │ │ A2p │ 317.60 │ + │ M3-e19 │ 378.95 │ │ d4p │ 384.36 │ │ M3z-e53 │ 384.91 │ │ M3z │ 386.31 │ @@ -96,6 +102,7 @@ let%expect_test "positions and cents" = │ M3p │ 407.82 │ │ d4-e55 │ 414.55 │ │ d4-e31 │ 425.81 │ + │ A3-e19 │ 442.11 │ │ A3-e31 │ 464.52 │ │ A3-e55 │ 480.00 │ │ 4p │ 498.04 │ @@ -103,9 +110,11 @@ let%expect_test "positions and cents" = │ 4e │ 500.00 │ │ 4-e55 │ 501.82 │ │ 4-e31 │ 503.23 │ + │ 4-e19 │ 505.26 │ │ 4z │ 519.55 │ │ 4z-e53 │ 520.75 │ │ A3p │ 521.51 │ + │ A4-e19 │ 568.42 │ │ A4-e31 │ 580.65 │ │ d5p │ 588.27 │ │ A4z-e53 │ 588.68 │ @@ -117,14 +126,17 @@ let%expect_test "positions and cents" = │ d5z-e53 │ 611.32 │ │ A4p │ 611.73 │ │ d5-e31 │ 619.35 │ + │ d5-e19 │ 631.58 │ │ d6p │ 678.49 │ │ 5z-e53 │ 679.25 │ │ 5z │ 680.45 │ + │ 5-e19 │ 694.74 │ │ 5-e31 │ 696.77 │ │ 5-e55 │ 698.18 │ │ 5e │ 700.00 │ │ 5p-e53 │ 701.89 │ │ 5p │ 701.96 │ + │ A5-e19 │ 757.89 │ │ A5-e31 │ 774.19 │ │ A5-e55 │ 785.45 │ │ m6p │ 792.18 │ @@ -136,8 +148,10 @@ let%expect_test "positions and cents" = │ m6z │ 813.69 │ │ m6z-e53 │ 815.09 │ │ A5p │ 815.64 │ + │ m6-e19 │ 821.05 │ │ d7p │ 882.40 │ │ M6z-e53 │ 883.02 │ + │ M6-e19 │ 884.21 │ │ M6z │ 884.36 │ │ M6-e31 │ 890.32 │ │ M6-e55 │ 894.55 │ @@ -147,13 +161,16 @@ let%expect_test "positions and cents" = │ M6p │ 905.87 │ │ d7-e55 │ 916.36 │ │ d7-e31 │ 929.03 │ + │ d7-e19 │ 947.37 │ │ m7p │ 996.09 │ │ m7p-e53 │ 996.23 │ │ m7e │ 1000.00 │ │ m7-e55 │ 1003.64 │ │ m7-e31 │ 1006.45 │ + │ m7-e19 │ 1010.53 │ │ m7z-e53 │ 1018.87 │ │ A6p │ 1019.55 │ + │ M7-e19 │ 1073.68 │ │ M7-e31 │ 1083.87 │ │ d8p │ 1086.31 │ │ M7z-e53 │ 1086.79 │ @@ -165,6 +182,7 @@ let%expect_test "positions and cents" = │ M7p │ 1109.78 │ │ d8-e55 │ 1112.73 │ │ d8-e31 │ 1122.58 │ + │ d8-e19 │ 1136.84 │ │ 8z-e53 │ 1177.36 │ │ 8z │ 1178.49 │ └──────────┴─────────┘ |}];