function assessMelodicMotion(pitches:Array):Number { var totalStepMagnitude:int = 0; var totalSkipMagnitude:int = 0; for (var i:int = 1; i < pitches.length; i++) { var semitoneDiff:int = Math.abs(pitches[i] - pitches[i - 1]); if (semitoneDiff <= 2) { totalStepMagnitude += semitoneDiff; // Collect step semitones } else { totalSkipMagnitude += semitoneDiff; // Collect skip semitones } } var normalizedSkipMagnitude:Number = totalSkipMagnitude / (totalStepMagnitude + totalSkipMagnitude); var score:Number = 1 - normalizedSkipMagnitude; return score; } // Example usage var melody:Array = [60, 62, 63, 67, 65, 70, 72]; var motionScore:Number = assessMelodicMotion(melody); trace("Melodic Motion Score:", motionScore);