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;
  }