         (first expanded)
         expanded))))
 
+(defn idify-args
+  "Returns a fn which idifies args (or leaves them untouched if they
+  can't be converted to an sc id)"
+  [f]
+  (fn [& args]
+    (apply f (idify args))))
+
 (defn unwrap-map-arg
   "Returns a fn which checks to see if its args is a list containing a map,
   and if so unwraps it. Otherwise applies f directly with args"

        [overtone.libs counters]
        [overtone.helpers seq]
        [overtone.sc bindings]
        [overtone.sc.machinery.ugen sc-ugen defaults specs special-ops intern-ns]
        [overtone.sc.machinery.ugen.metadata unaryopugen binaryopugen])
  (:require [overtone.sc.machinery.ugen.doc :as doc]))

  arguments, rates, etc."
  [spec rate special]
  (let [expand-flags (map #(:expands? %) (:args spec))]
    (idify-args
     (unwrap-map-arg
      (make-expanding
       (ugen-base-fn spec rate special) expand-flags)))))

;; TODO: Figure out the complete list of control types
;; This is used to determine the controls we list in the synthdef, so we need
