[CM] With-sound question

cristopher pierson ewing cewing@u.washington.edu
Mon, 21 Oct 2002 17:35:13 -0700 (PDT)


I have a macro that writes calls to an instrument:

(write-ins my-instrument-gen)
> (my-instrument 0 4 440)  ;;this might ba an simp-type instrument that
                           ;;   implements a simple oscilator.

If i place a call to this macro in the spot where a normal instrument call
would be in a with-sound:

(with-sound () (write-ins my-instrument-gen))

The results are rather odd.  No error is returned, but the output
soundifle is only 1 sample in length.

I tried running a macroexpand on this with-sound call, and the results
seem to indicate that my macro is never expanded.  I've included the
results of that macroexpansion below.

Does with-sound support the use of macros inside itself?  Can it expand a
macro properly before it executes it's own code, or do I need to come up
with a wrapper that expands the macro first and then inserts the results
into the with-sound.

EEEEEEEEEEKKKKK!!

********************************
the output of (macroexpand '(with-sound () (write-ins joe)),
  where "joe" is the name of an instrument I have created:

(LET ((CLM::*VERBOSE* T)
      (CLM::*OFFSET* 0)
      (CLM::*INTERRUPTED* 0)
      (CLM::*STATISTICS* NIL)
      (CLM::*CLM-SCALED-AMP* NIL)
      (CLM::*NOTEHOOK* NIL)
      (CLM::*FORCE-RECOMPUTATION* NIL)
      (CLM::*CLM-WITH-SOUND-BODY* (AND NIL '((WRITE-INS JOE))))
      (CLM::*CHANNELS* 1)
      (*SRATE* 44100)
      (CLM::*HEADER-TYPE* 56)
      (CLM::*DATA-FORMAT* 1)
      (CLM::*CLIPPED* T)
      (CLM::*EXPLODE* NIL)
      (CLM::*EXPLODE-LIST* NIL))
  (CLM-INITIALIZE-LINKS)
  (SETF *CLM-INS* NIL)
  (LET* ((CLM::OLD-OUTPUT *OUTPUT*) (CLM::OLD-REVERB *REVERB*))
    (IF CLM::OLD-OUTPUT (CLOSE-OUTPUT CLM::OLD-OUTPUT))
    (IF CLM::OLD-REVERB (CLOSE-OUTPUT CLM::OLD-REVERB))
    (UNWIND-PROTECT
        (LET* ((CLM::OUT-FILE
                (OR *OPEN-INPUT-EXPLICIT-OUTPUT*
                    (NAMESTRING (FULL-MERGE-PATHNAMES "~/SND/test.aiff"
                                                      *CLM-FILE-NAME*))))
               (CLM::*CLM-WITH-SOUND-DEPTH* (1+
CLM::*CLM-WITH-SOUND-DEPTH*))
               (CLM::OUR-SRATE 44100)
               (CLM::OUR-TYPE 56)
               (CLM::OUR-FORMAT
                (LET ((CLM::FIRST-GUESS 1))
                  (IF (AND (= CLM::FIRST-GUESS MUS-BSHORT)
                           (= CLM::OUR-TYPE MUS-RIFF))
                      MUS-LSHORT
                    (IF (AND (= CLM::FIRST-GUESS MUS-BINT)
                             (= CLM::OUR-TYPE MUS-RIFF))
                        MUS-LINT
                      CLM::FIRST-GUESS))))
               (CLM::OUR-REVERB (OR NIL 'NIL))
               (CLM::OUR-REVERB-DATA (OR NIL 'NIL))
               (CLM::REVERB-FILENAME
                (CONCATENATE 'STRING
                             (SUBSEQ CLM::OUT-FILE 0
                                     (- (LENGTH CLM::OUT-FILE)
                                        (LENGTH
                                         (PATHNAME-TYPE CLM::OUT-FILE))))
                             "reverb"))
               (CLM::REVF
                (IF (OR NIL CLM::OUR-REVERB)
                    (OR NIL *OPEN-INPUT-EXPLICIT-REVERB*
                        CLM::REVERB-FILENAME)))
               (CLM::*WS-REVERB-FILE* CLM::REVF))
          (IF (AND CLM::OLD-OUTPUT
                   (STRING= CLM::OUT-FILE (CLM::IO-NAME CLM::OLD-OUTPUT)))
              (WARN "we're about to overwrite ~A..." CLM::OUT-FILE))
          (SETF CLM::OUT-FILE
                (CLM::BEGIN-WITH-SOUND CLM::OUR-SRATE 1 NIL CLM::OUT-FILE
                                       CLM::REVF NIL NIL 1 CLM::OUR-TYPE
                                       CLM::OUR-FORMAT T NIL
                                       (CLM::MAKE-DEFAULT-COMMENT
                                        NIL
                                        NIL
                                        NIL)))
          (TAGBODY (RESTART-CASE (CATCH :FINISH (WRITE-INS JOE))
                     (NIL NIL :REPORT "close files and return to
top-level."
                      (PROGN (CLM-RESET) (GO CLM::ALL-DONE)))
                     (NIL NIL :REPORT "jump past remaining notes."
                      (GO CLM::NORMAL-FINISH)))
           CLM::NORMAL-FINISH (SETF CLM::OUT-FILE
                                    (CLM::END-WITH-SOUND NIL CLM::OUT-FILE
                                                         CLM::REVF NIL
                                                         CLM::OUR-TYPE
                                                         CLM::OUR-FORMAT
                                                         CLM::OUR-REVERB
1.0

CLM::OUR-REVERB-DATA
                                                         1 T NIL))
           CLM::ALL-DONE)
          (IF CLM::OLD-OUTPUT
              (SETF *OUTPUT* (REOPEN-OUTPUT (CLM::IO-NAME
CLM::OLD-OUTPUT))))
          (IF CLM::OLD-REVERB
              (SETF *REVERB* (REOPEN-OUTPUT (CLM::IO-NAME
CLM::OLD-REVERB)))
            (SETF *REVERB* NIL))
          CLM::OUT-FILE)
      (PROGN (SETF *CLM-INS* NIL) (SETF CLM::*FORCE-RECOMPUTATION* NIL)
             (CLM::CLM-CHECK-FOR-RESET)))))

********************************

Thanks for info,

Cris


********************************
Cris Ewing
CARTAH Assistant
University of Washington
Home Phone: (206) 365-3413
E-mail: cewing@u.washington.edu
*******************************