public TimeEffect getEffect(int hours, int minutes, int seconds) {

    TimeEffect newEffect = new TimeEffect(hours, minutes);
    Bracket effects = getEffectBracket(hours, minutes);

    int minPrev = effects.prior.minutesSince(hours, minutes);
    minPrev *= 60;
    minPrev += seconds;
    int minNext = effects.next.minutesUntil(hours, minutes);
    minNext *= 60;
    minNext -= seconds;

    float percentComplete = (float) (minPrev / (double) (minPrev + minNext));
    //        System.out.println(minPrev + ":" + minNext + ":" + percentComplete);

    // set colors
    for (Integer cid : effects.prior.colors.keySet()) {
      Color newColor = getColor(effects.prior, effects.next, cid, percentComplete);

      newEffect.colors.put(cid, newColor);
    }

    // entropy
    newEffect.entropy =
        easingFunction.valueAt(percentComplete, effects.prior.entropy, effects.next.entropy);

    return newEffect;
  }
  private Color getColor(TimeEffect prior, TimeEffect next, int cid, float percentComplete) {

    Color priorColor = prior.getColor(cid);
    Color nextColor = next.getColor(cid);

    float r1 = priorColor.getRed();
    float r2 = nextColor.getRed();

    float g1 = priorColor.getGreen();
    float g2 = nextColor.getGreen();

    float b1 = priorColor.getBlue();
    float b2 = nextColor.getBlue();

    float r3 = easingFunction.valueAt(percentComplete, r1, r2);
    float g3 = easingFunction.valueAt(percentComplete, g1, g2);
    float b3 = easingFunction.valueAt(percentComplete, b1, b2);

    return new Color((int) r3, (int) g3, (int) b3);
  }
  // unit tests
  public static void main(String args[]) {

    System.out.println(TimeEffectSet.getTime(new Date())[0]);

    TimeEffectSet set = new TimeEffectSet(new Linear());

    ElectrolandProperties ep = new ElectrolandProperties("Gotham-global.properties");

    for (String name : ep.getObjectNames("west")) {
      if (name.startsWith("timeEffect")) {
        set.add(new TimeEffect(ep.getParams("west", name), null));
      }
    }

    for (TimeEffect effect : set.effects) {
      System.out.println(effect);
      TimeEffect first = set.effects.get(0);
      System.out.println("effect is before first " + effect.isBefore(first.hours, first.minutes));
      System.out.println("first is effect first " + first.isBefore(effect.hours, effect.minutes));
      System.out.println("");
    }

    for (int hour = 0; hour < 24; hour++) {
      int minutes = 25;
      Bracket b = set.getEffectBracket(hour, minutes);
      System.out.println("for " + hour + ":" + minutes + "...");
      System.out.println("last:  " + b.prior);
      System.out.println("next: " + b.next);
      //            System.out.println("blended: " + set.getEffect(hour, minutes));
      System.out.println();
    }

    int[] now = TimeEffectSet.getTime(new Date());
    System.out.println(set.getEffectBracket(now[0], now[1]).prior);
    System.out.println(set.getEffectBracket(now[0], now[1]).next);

    // get color
  }
  private Bracket getEffectBracket(int hours, int minutes) {

    Bracket bracket = new Bracket();

    for (TimeEffect effect : effects) {
      if (effect.isBefore(hours, minutes)) {
        bracket.prior = effect;
      } else {
        bracket.next = effect;
        break;
      }
    }

    TimeEffect first = effects.get(0);

    if (bracket.prior == null) { // prior effect was yesterday
      bracket.prior = effects.get(effects.size() - 1);
    }
    if (bracket.next == null) { // next effect is tomorrow
      bracket.next = first;
    }

    return bracket;
  }