   :value-create 'widget-slider-value-create
   :value-delete 'ignore
   :value-get 'widget-value-value-get
-  :size 70)
+  :size 70
   :value 0)
 
 (defun widget-slider-press (pos &optional event)


(defun ecasound-cop-add ()
  "Interactively prompt for the name and argument of a chain operator to add."
  ;; FIXME, ask for ladspa plugins too.
  (interactive)
  (unless eci-cop-register
    (eci-cop-register))
  (let* ((cop (completing-read "Chain operator: " eci-cop-register))
         (args (nth 2 (assoc cop eci-cop-register)))
         (arg (nth 1 (assoc cop eci-cop-register)))
         args2)
    (while args
      (setq args2 (cons (read-from-minibuffer (concat (car args) ": "))
                        args2))
      (setq args (cdr args)))
    (setq args2 (nreverse args2))
    (eci-cop-add (concat arg (mapconcat #'identity args2 ",")))))

;;; ChainOp Editor


;;; Utility functions for converting strings to data-structures.

(defun eci-process-cop-register (string)
  (set
   (make-local-variable 'eci-cop-register)
   (mapcar
    (lambda (cop)
      (when (string-match
             "^[0-9]+\\. \\([^,]+\\), \\(-[a-zA-Z]+\\):\\(.*\\)" cop)
        (list (match-string-no-properties 1 cop)
              (match-string-no-properties 2 cop)
              (split-string (match-string-no-properties 3 cop) ","))))
    (split-string string "\n"))))

(defun eci-process-ladspa-register (string)
  (let (result)
    (with-temp-buffer
      (insert string)
      (goto-char (point-min))
      (while (re-search-forward "[0-9]+\\. \\(.*\\)\n\t\\(-el:[^,\n]+\\),\\(.*\\)" nil t)
        (let ((full-name (match-string-no-properties 1))
              (name (match-string-no-properties 2))
              (args (split-string (concat "'," (match-string-no-properties 3)
                                          ",'") "','")))
          (setq result (cons (list full-name name args) result)))))
    (set (make-local-variable 'eci-ladspa-register)
         (nreverse result))))

