From fcc579eecbb4985a3e6f8f781c7ee5d06a37fd0a Mon Sep 17 00:00:00 2001 From: Mikayla Dobson <93477693+innocuous-symmetry@users.noreply.github.com> Date: Sun, 15 May 2022 11:13:26 -0500 Subject: [PATCH] problems deciphering intervals with octave wrap --- src/pitch_generation/helper.js | 3 ++ src/pitch_generation/melodicGeneration.js | 48 ++++++++++++++--------- 2 files changed, 32 insertions(+), 19 deletions(-) create mode 100644 src/pitch_generation/helper.js diff --git a/src/pitch_generation/helper.js b/src/pitch_generation/helper.js new file mode 100644 index 0000000..3b73200 --- /dev/null +++ b/src/pitch_generation/helper.js @@ -0,0 +1,3 @@ +import { melodicGeneration } from "./melodicGeneration.js"; + +melodicGeneration(['C3', 'G3', 'A3', 'G4']); diff --git a/src/pitch_generation/melodicGeneration.js b/src/pitch_generation/melodicGeneration.js index e525e8e..afcd29a 100644 --- a/src/pitch_generation/melodicGeneration.js +++ b/src/pitch_generation/melodicGeneration.js @@ -36,27 +36,40 @@ export const melodicGeneration = (prevPitches) => { let pitchNumTwo = musicalPitches.indexOf(pitchNameTwo); let interval = pitchNumTwo - pitchNumOne; - direction = interval > 0; - if (octaveOne === octaveTwo) console.log("OCTAVE: same"); + console.log(prevSoprano, newSoprano); + console.log(pitchNumOne, pitchNumTwo); - if (octaveOne > octaveTwo) { - console.log('OCTAVE: first is higher'); - if ((pitchNumTwo + 3) % 12 <= (pitchNumOne + 3) % 12) { - console.log('CAUGHT OCTAVE SHIFT'); - console.log(interval); - interval = Math.abs(interval) * -1; + if (octaveOne === octaveTwo) { + console.log("OCTAVE: same"); + if (pitchNumOne > pitchNumTwo || pitchNumTwo === 0) { + console.log("WRAP"); + interval += 12; } - console.log(interval); - - // interval = 12 - interval; - } else if (octaveOne < octaveTwo) { - console.log('OCTAVE: second is higher'); - console.log(`pre shift: ${interval}`); - if (interval < pitchNumOne) (interval = 12 + Math.abs(interval)); - console.log(`post shift: ${interval}`); } + // accounts for when the octave marker is different between pitches + if (octaveOne > octaveTwo) { + console.log('OCTAVE: first is higher'); + if (pitchNumOne > pitchNumTwo) { + console.log("WRAP"); + interval = Math.abs(interval) + 12; + } + } else if (octaveOne < octaveTwo) { + console.log('OCTAVE: second is higher'); + + if (pitchNumTwo === 0) { + console.log("Edge case: pitch two = 0"); + interval = Math.abs(interval - 12) + 12; + } + + if (pitchNumOne > pitchNumTwo) { + console.log("WRAP"); + interval = 12 - Math.abs(interval); + } + } + + direction = interval > 0; // this boolean evaluates first, but may be changed to false pending the following conditional flow isMelodic = preferredMotion.includes(Math.abs(interval)); @@ -65,9 +78,6 @@ export const melodicGeneration = (prevPitches) => { isMelodic = false; } - console.log(prevSoprano, newSoprano); - console.log(pitchNumOne, pitchNumTwo); - console.log(`interval: ${interval}`); console.log(`direction: ${direction ? 'ascending' : 'descending'}`); console.log(`isMelodic: ${isMelodic}`);