;;; this is obsolete -- it needs some replacement for the mus-audio* functions (when (provided? 'snd-motif) (with-let (sublet *motif*) ;; set up our user-interface (let* ((app (car (main-widgets))) (shell (let* ((xdismiss (XmStringCreate "Go away" XmFONTLIST_DEFAULT_TAG)) (xhelp (XmStringCreate "Help" XmFONTLIST_DEFAULT_TAG)) (titlestr (XmStringCreate "FM Forever!" XmFONTLIST_DEFAULT_TAG)) (dialog (XmCreateTemplateDialog (cadr (main-widgets)) "FM Forever!" (list XmNcancelLabelString xdismiss XmNhelpLabelString xhelp XmNautoUnmanage #f XmNdialogTitle titlestr XmNresizePolicy XmRESIZE_GROW XmNnoResize #f XmNtransient #f)))) (XtAddCallback dialog XmNhelpCallback (lambda (w context info) (snd-print "This dialog lets you experiment with simple FM"))) (XmStringFree xhelp) (XmStringFree xdismiss) (XmStringFree titlestr) dialog)) (dpy (XtDisplay shell)) (screen (DefaultScreenOfDisplay dpy)) ;; (cmap (DefaultColormap dpy (DefaultScreen dpy))) (black (BlackPixelOfScreen screen)) (white (WhitePixelOfScreen screen))) (define (set-flabel label value) (let ((s1 (XmStringCreate (format #f "~,3F" value) XmFONTLIST_DEFAULT_TAG))) (XtVaSetValues label (list XmNlabelString s1)) (XmStringFree s1))) (define (set-ilabel label value) (let ((s1 (XmStringCreate (format #f "~D" value) XmFONTLIST_DEFAULT_TAG))) (XtVaSetValues label (list XmNlabelString s1)) (XmStringFree s1))) (let* ((form (XtCreateManagedWidget "form" xmFormWidgetClass shell (list XmNbackground white XmNforeground black XmNresizePolicy XmRESIZE_GROW))) ;; toggle named "play" (play-button (XtCreateManagedWidget "play" xmToggleButtonWidgetClass form (list XmNleftAttachment XmATTACH_FORM XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_FORM XmNrightAttachment XmATTACH_NONE XmNbackground white))) ;; carrier freq (carrier (XtCreateManagedWidget "carrier freq:" xmLabelWidgetClass form (list XmNleftAttachment XmATTACH_FORM XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_WIDGET XmNtopWidget play-button XmNrightAttachment XmATTACH_NONE XmNrecomputeSize #f XmNbackground white))) (freq-label (XtCreateManagedWidget "label" xmLabelWidgetClass form (list XmNleftAttachment XmATTACH_WIDGET XmNleftWidget carrier XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_OPPOSITE_WIDGET XmNtopWidget carrier XmNrightAttachment XmATTACH_NONE XmNbackground white))) (freq-scale (XtCreateManagedWidget "carrier freq" xmScaleWidgetClass form (list XmNleftAttachment XmATTACH_WIDGET XmNleftWidget freq-label XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_OPPOSITE_WIDGET XmNtopWidget freq-label XmNrightAttachment XmATTACH_FORM XmNshowValue #f XmNorientation XmHORIZONTAL XmNbackground *position-color*))) ;; amp (amp-label (XtCreateManagedWidget "label" xmLabelWidgetClass form (let ((amp (XtCreateManagedWidget "amp:" xmLabelWidgetClass form (list XmNleftAttachment XmATTACH_FORM XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_WIDGET XmNtopWidget carrier XmNrightAttachment XmATTACH_NONE XmNrecomputeSize #f XmNbackground white)))) (list XmNleftAttachment XmATTACH_WIDGET XmNleftWidget amp XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_OPPOSITE_WIDGET XmNtopWidget amp XmNrightAttachment XmATTACH_NONE XmNbackground white)))) (amp-scale (XtCreateManagedWidget "amp" xmScaleWidgetClass form (list XmNleftAttachment XmATTACH_WIDGET XmNleftWidget amp-label XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_OPPOSITE_WIDGET XmNtopWidget amp-label XmNrightAttachment XmATTACH_FORM XmNshowValue #f XmNorientation XmHORIZONTAL XmNbackground *position-color*))) ;; fm index (fm-label (XtCreateManagedWidget "label" xmLabelWidgetClass form (let ((fm-index (XtCreateManagedWidget "fm index:" xmLabelWidgetClass form (list XmNleftAttachment XmATTACH_FORM XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_WIDGET XmNtopWidget amp-scale XmNrightAttachment XmATTACH_NONE XmNrecomputeSize #f XmNbackground white)))) (list XmNleftAttachment XmATTACH_WIDGET XmNleftWidget fm-index XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_OPPOSITE_WIDGET XmNtopWidget fm-index XmNrightAttachment XmATTACH_NONE XmNbackground white)))) (fm-scale (XtCreateManagedWidget "fm index" xmScaleWidgetClass form (list XmNleftAttachment XmATTACH_WIDGET XmNleftWidget fm-label XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_OPPOSITE_WIDGET XmNtopWidget fm-label XmNrightAttachment XmATTACH_FORM XmNshowValue #f XmNorientation XmHORIZONTAL XmNbackground *position-color*))) ;; c/m ratio (cm-label (XtCreateManagedWidget "label" xmLabelWidgetClass form (let ((cm-ratio (XtCreateManagedWidget "c/m ratio:" xmLabelWidgetClass form (list XmNleftAttachment XmATTACH_FORM XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_WIDGET XmNtopWidget fm-scale XmNrightAttachment XmATTACH_NONE XmNrecomputeSize #f XmNbackground white)))) (list XmNleftAttachment XmATTACH_WIDGET XmNleftWidget cm-ratio XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_OPPOSITE_WIDGET XmNtopWidget cm-ratio XmNrightAttachment XmATTACH_NONE XmNbackground white)))) (cm-scale (XtCreateManagedWidget "cm ratio" xmScaleWidgetClass form (list XmNleftAttachment XmATTACH_WIDGET XmNleftWidget cm-label XmNbottomAttachment XmATTACH_NONE XmNtopAttachment XmATTACH_OPPOSITE_WIDGET XmNtopWidget cm-label XmNrightAttachment XmATTACH_FORM XmNshowValue #f XmNorientation XmHORIZONTAL XmNbackground *position-color*)))) (let ((frequency 220.0) (low-frequency 40.0) (high-frequency 2000.0) (amplitude 0.5) (index 1.0) (high-index 3.0) (ratio 1) (high-ratio 10) (playing 0.0) (carosc (make-oscil 0.0)) (modosc (make-oscil 0.0))) (define (freq-callback w c i) (set! frequency (+ low-frequency (* (.value i) (/ (- high-frequency low-frequency) 100.0)))) (set-flabel freq-label frequency)) (define (amp-callback w c i) (set! amplitude (/ (.value i) 100.0)) (set-flabel amp-label amplitude)) (define (fm-callback w c i) (set! index (* (.value i) (/ high-index 100.0))) (set-flabel fm-label index)) (define (ratio-callback w c i) (set! ratio (floor (* (.value i) (/ high-ratio 100.0)))) (set-ilabel cm-label ratio)) ;; add scale-change (drag and value-changed) callbacks (XtAddCallback freq-scale XmNdragCallback freq-callback) (XtAddCallback freq-scale XmNvalueChangedCallback freq-callback) (XtAddCallback amp-scale XmNdragCallback amp-callback) (XtAddCallback amp-scale XmNvalueChangedCallback amp-callback) (XtAddCallback fm-scale XmNdragCallback fm-callback) (XtAddCallback fm-scale XmNvalueChangedCallback fm-callback) (XtAddCallback cm-scale XmNdragCallback ratio-callback) (XtAddCallback cm-scale XmNvalueChangedCallback ratio-callback) (XtAddCallback play-button XmNvalueChangedCallback (lambda (w c i) (set! playing (if (.set i) 1.0 0.0)))) ;; set initial values (set-flabel freq-label frequency) (set-flabel amp-label amplitude) (set-flabel fm-label index) (set-ilabel cm-label ratio) (XmScaleSetValue freq-scale (floor (* 100 (/ (- frequency low-frequency) (- high-frequency low-frequency))))) (XmScaleSetValue amp-scale (floor (* 100 amplitude))) (XmScaleSetValue fm-scale (floor (* 100 (/ index high-index)))) (XmScaleSetValue cm-scale (floor (* ratio (/ 100 high-ratio)))) (XtManageChild shell) (XtRealizeWidget shell) ;; send fm data to dac (let* ((bufsize 256) (work-proc #f) (port (mus-audio-open-output mus-audio-default 22050 1 mus-lshort (* bufsize 2)))) (if (< port 0) (format () "can't open DAC!")) (XmAddWMProtocolCallback (cadr (main-widgets)) ; shell (XmInternAtom dpy "WM_DELETE_WINDOW" #f) (lambda (w c i) (XtRemoveWorkProc work-proc) ; odd that there's no XtAppRemoveWorkProc (mus-audio-close port)) #f) (XtAddCallback shell XmNcancelCallback (lambda (w context info) (XtRemoveWorkProc work-proc) (mus-audio-close port) (XtUnmanageChild shell))) (set! work-proc (XtAppAddWorkProc app (lambda (ignored-arg) (let ((data (make-float-vector bufsize))) (do ((i 0 (+ 1 i))) ((= i bufsize)) (float-vector-set! data i (* amplitude playing (oscil carosc (+ (hz->radians frequency) (* index (oscil modosc (hz->radians (* ratio frequency))))))))) (mus-audio-write port data bufsize) #f))))))))))