public static ArrayList<PitchCandidate> harmonicChecks( ArrayList<PitchCandidate> pitch_candidates, MelodicNote CF_note, Boolean CFnoteRoot, Integer previous_cf_pitch, Integer previous_cp_pitch, MelodicNote CP_note, int voice_pitch_count, int cf_voice_index) { // begin Harmonic checks boolean cand_prev_cf_diss = true; // Will need to evaluate each CP pitch candidate against the counterpoint notes // in each previously built voice // Evaluate Pitch Candidates Against these checke for (PitchCandidate myPC : pitch_candidates) { Integer cand_pitch = myPC.getPitch(); Integer cf_pitch = CF_note.getPitch(); if (previous_cp_pitch == 9999) previous_cp_pitch = cand_pitch; // 9999 means the CP is held over to multiple cfs Integer melody_motion_to_cand = cand_pitch - previous_cp_pitch; int this_interval = abs(myPC.getPitch() - CF_note.getPitch()) % 12; // if (myPC.getLatestInterval(cf_voice_index) != null) previous_cf_pitch = // myPC.getLatestInterval(cf_voice_index); //NEW System.out.println("this interval = " + this_interval); Integer melodic_motion_to_ = cf_pitch - previous_cf_pitch; Integer previous_interval = abs(previous_cp_pitch - previous_cf_pitch) % 12; System.out.println("previous interval = " + previous_interval); Double cp_start_time = CP_note.getStartTime(); Double cf_start_time = CF_note.getStartTime(); // compute interval whether consonant boolean this_interval_consonant = false; for (Integer consonance : consonances) { if (this_interval == consonance) { this_interval_consonant = true; System.out.println( "this_interval == " + consonance + " means this_interval_consonant == " + this_interval_consonant); break; } } if (this_interval_consonant) { System.out.println("this interval consonant"); if (this_interval == 0) { myPC.decrementRank(Decrements.octave); System.out.println("octave"); } } else { if (this_interval == 1 && (abs(myPC.getPitch() - CF_note.getPitch()) < 14 || large_dissonance_bad)) { myPC.decrementRank(Decrements.minor_9th); System.out.println("minor 9th"); } if (CP_note.getAccent() && (abs(myPC.getPitch() - CF_note.getPitch()) < 36 || large_dissonance_bad)) { // if (CP_note.getAccent() && CP_note.getStartTime()<= CF_note.getStartTime() ) { myPC.decrementRank(Decrements.accented_dissonance); System.out.println("dissonant accent"); } } // compute previous_interval consonant boolean previous_interval_consonant = false; for (Integer consonance : consonances) { if (previous_interval == consonance) previous_interval_consonant = true; } if (previous_interval_consonant) System.out.println("previous interval consonant"); if (cp_start_time > cf_start_time) { System.out.println("CP starts after CF"); if (melody_motion_to_cand == 0) { myPC.decrementRank(Decrements.seq_of_same_cons); } if (previous_interval_consonant) { if (!this_interval_consonant && abs(melody_motion_to_cand) > 2) { myPC.decrementRank(Decrements.bad_diss_approach_from_cons); } } else if (this_interval_consonant) { if (abs(melody_motion_to_cand) > 2) { myPC.decrementRank(Decrements.bad_cons_approach_from_diss); } } else { if (abs(melody_motion_to_cand) > 4) { // New_Interval is dissonant myPC.decrementRank(Decrements.bad_diss_approach_from_diss); } } } else if (cp_start_time < cf_start_time) { System.out.println("CP starts before CF"); if (previous_interval_consonant) { if (previous_interval == this_interval) { myPC.decrementRank(Decrements.seq_same_type_cons); } } else { // ie Previous_Interval is dissonant if (this_interval_consonant) { if (abs(melodic_motion_to_) > 2) myPC.decrementRank(Decrements.bad_cons_approach_from_diss); } else // New_Interval is dissonant if (abs(melodic_motion_to_) > 4) myPC.decrementRank(Decrements.bad_diss_approach_from_diss); } } else { System.out.println("CP and CF start at the same time"); if (previous_interval_consonant) { if (this_interval_consonant) { for (Integer consonance : consonances) { if ((cand_pitch - previous_cf_pitch) % 12 == consonance) { cand_prev_cf_diss = false; } } if (cand_prev_cf_diss == true) myPC.decrementRank(Decrements.diss_cp_previous_cf); if (previous_interval == this_interval) { same_consonant_count++; if (same_consonant_count > same_consonant_threshold) myPC.decrementRank(Decrements.seq_of_same_cons); } // Too many of same type of interval for (Integer perfect_consonance : perfect_consonances) { if (this_interval == perfect_consonance) { if (this_interval == previous_interval) { myPC.decrementRank(Decrements.seq_same_type_cons); if (melody_motion_to_cand > 0) if (melodic_motion_to_ > 0) myPC.decrementRank(Decrements.parallel_perf_consonance); if (melody_motion_to_cand < 0) if (melodic_motion_to_ < 0) myPC.decrementRank(Decrements.parallel_perf_consonance); } } else { if (melody_motion_to_cand > 0) if (melodic_motion_to_ > 0) myPC.decrementRank(Decrements.direct_motion_perf_cons); if (melody_motion_to_cand < 0) if (melodic_motion_to_ < 0) myPC.decrementRank(Decrements.direct_motion_perf_cons); } } // If dissonance between CP1 and CF2 is this resolved? } else // New_Interval is dissonant myPC.decrementRank(Decrements.motion_into_diss_both_voices_change); } else // ie Previous_Interval is dissonant if (this_interval_consonant) { for (Integer consonance : consonances) { if ((cand_pitch - previous_cp_pitch) % 12 == consonance) { cand_prev_cf_diss = false; } } if (cand_prev_cf_diss == true) myPC.decrementRank(Decrements.diss_cp_previous_cf); if (melody_motion_to_cand > 0) if (melodic_motion_to_ > 0) myPC.decrementRank(Decrements.direct_motion_perf_cons); if (melody_motion_to_cand < 0) if (melodic_motion_to_ < 0) myPC.decrementRank(Decrements.direct_motion_perf_cons); } else { // this interval is dissonant myPC.decrementRank(Decrements.motion_into_diss_both_voices_change); myPC.decrementRank(Decrements.seq_of_diss); if (this_interval == previous_interval) { myPC.decrementRank(Decrements.seq_same_type_diss); if (melody_motion_to_cand > 0) if (melodic_motion_to_ > 0) myPC.decrementRank(Decrements.direct_motion_into_diss); if (melody_motion_to_cand < 0) if (melodic_motion_to_ < 0) myPC.decrementRank(Decrements.direct_motion_into_diss); } } } myPC.setLatestInterval(cf_pitch, cf_voice_index); } return pitch_candidates; }