        :args [{:name "trig" :doc "trigger. Trigger can be any signal. A trigger happens when the signal changes from non-positive to positive."}
               {:name "array", :array true :doc "list of probabilities"}
               {:name "normalize", :default 0 :doc "normalise flag - 0 off, 1 on"}]
+       :default-rate :kr
        :doc "When triggered, returns a random index value based on array as a list of probabilities. By default the list of probabilities should sum to 1.0, when the normalize flag is set to 1, the values get normalized by the ugen (less efficient)"}
 
       {:name "Trig1"
        :args [{:name "trig", :default 0.0 :doc "trigger. Trigger can be any signal. A trigger happens when the signal changes from non-positive to positive."}
               {:name "dur", :default 0.1 :doc "duration of the trigger output."}]
        :signal-range :unipolar
+       :default-rate :kr
        :doc "outputs one for dur seconds whenever the input goes from negative to positive"}
 
       {:name "Trig", :extends "Trig1"

       :args [{:name "in", :default 0.0 :doc "input trigger signal"}
              {:name "id", :default 0 :doc "an integer that will be passed with the trigger message. This is useful if you have more than one SendTrig in a SynthDef"}
              {:name "value", :default 0.0 :doc "a UGen or float that will be polled at the time of trigger, and its value passed with the trigger message"}]
       :num-outs 0
       :check [same-rate-as-first-input]
       :doc "on receiving a trigger sends a :trigger event with id and value. This command is the mechanism that synths can use to trigger events in clients.

              {:name "step", :default 1 :doc "step value each trigger. May be negative."}
              {:name "resetval" :default 1 :doc "value to which the counter is reset when it receives a reset trigger."}] ; TODO MAYBE? allow :default :min
       :check [same-rate-as-first-input]
       :default-rate :kr
       :doc "triggers increment a counter which is output as a signal. The counter loops around from max to min by step increments"}

      {:name "PulseDivider"
       :args [{:name "trig", :default 0.0 :doc "trigger. Trigger can be any signal. A trigger happens when the signal changes from non-positive to positive."}
              {:name "div", :default 2.0 :doc "number of pulses to divide by."}
              {:name "start-val", :default 0.0 :doc "starting value for the trigger count. This lets you start somewhere in the middle of a count, or if startCount is negative it adds that many counts to the first time the output is triggers."}]
       :default-rate :kr
       :doc "outputs a trigger every div input triggers"}

      {:name "ToggleFF"
       :args [{:name "trig", :default 0.0 :doc "trigger input"}]
       :default-rate :kr
       :doc "flip-flops between zero and one each trigger"}

      {:name "ZeroCrossing"
       :args [{:name "in", :default 0.0 :doc "input signal"}]
       :default-rate :kr
       :check [same-rate-as-first-input]
       :doc "Outputs a frequency based upon the distance between interceptions of the X axis. The X intercepts are determined via linear interpolation so this gives better than just integer wavelength resolution. This is a very crude pitch follower, but can be useful in some situations."}

      {:name "Timer"
       :args [{:name "trig", :default 0.0 :doc "trigger input"}]
       :check [same-rate-as-first-input]
       :default-rate :kr
       :doc "outputs time since last trigger"}

      {:name "Sweep"
       :args [{:name "trig", :default 0.0 :doc "trigger input"}
              {:name "rate", :default 1.0 :doc "rate in seconds"}]
       :default-rate :kr
       :doc "outputs a linear increasing signal by rate/second on trigger"}

      {:name "Phasor"
