Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: replace ALL let* locals with *np-* defvars in native notepat

SBCL standalone binary loses lexical bindings through unwind-protect.
Convert screen, graph, input, audio to *np-screen*, *np-graph*,
*np-input*, *np-audio* defvars (86 references).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+78 -78
+78 -78
fedac/native/cl/main.lisp
··· 348 348 (dh (ac-native.drm:display-height display)) 349 349 (scale (compute-pixel-scale dw)) 350 350 (sw (floor dw scale)) 351 - (sh (floor dh scale)) 352 - (screen (fb-create sw sh)) 353 - (graph (make-graph :fb screen :screen screen)) 354 - (input (ac-native.input:input-init dw dh scale)) 355 - (audio (ac-native.audio:audio-init))) 356 - (setf *np-frame* 0) 351 + (sh (floor dh scale))) 352 + (setf *np-screen* (fb-create sw sh) 353 + *np-graph* (make-graph :fb *np-screen* :screen *np-screen*) 354 + *np-input* (ac-native.input:input-init dw dh scale) 355 + *np-audio* (ac-native.audio:audio-init) 356 + *np-frame* 0) 357 357 358 358 (format *error-output* "[notepat] ~Dx~D scale:~D → ~Dx~D~%" 359 359 dw dh scale sw sh) 360 360 (format *error-output* "[notepat] audio: ~A~%" 361 - (if audio "OK" "FAILED")) 361 + (if *np-audio* "OK" "FAILED")) 362 362 (force-output *error-output*) 363 363 364 364 (font-init) ··· 379 379 (setf *boot-handle* (if has-handle handle nil)) 380 380 ;; Show splash for 3 seconds or until keypress 381 381 (loop while (< (- (monotonic-time-ms) splash-start) 3000) do 382 - (let ((events (ac-native.input:input-poll input))) 382 + (let ((events (ac-native.input:input-poll *np-input*))) 383 383 (when (some (lambda (ev) (eq (ac-native.input:event-type ev) :key-down)) events) 384 384 (return))) 385 385 ;; Paint splash 386 - (graph-wipe graph (make-color :r 10 :g 12 :b 18)) 386 + (graph-wipe *np-graph* (make-color :r 10 :g 12 :b 18)) 387 387 (let ((cy (floor sh 3))) 388 388 (if has-handle 389 389 (progn 390 390 ;; Greeting 391 - (graph-ink graph (make-color :r 140 :g 160 :b 200 :a 220)) 392 - (font-draw graph greeting 391 + (graph-ink *np-graph* (make-color :r 140 :g 160 :b 200 :a 220)) 392 + (font-draw *np-graph* greeting 393 393 (- (floor sw 2) (floor (font-measure greeting) 2)) cy) 394 394 ;; @handle 395 395 (let ((htxt (format nil "@~A" handle))) 396 - (graph-ink graph (make-color :r 80 :g 255 :b 140 :a 255)) 397 - (font-draw graph htxt 396 + (graph-ink *np-graph* (make-color :r 80 :g 255 :b 140 :a 255)) 397 + (font-draw *np-graph* htxt 398 398 (- (floor sw 2) (floor (font-measure htxt) 2)) (+ cy 14))) 399 399 ;; Subtitle 400 - (graph-ink graph (make-color :r 80 :g 80 :b 100 :a 160)) 401 - (font-draw graph "aesthetic.computer" 400 + (graph-ink *np-graph* (make-color :r 80 :g 80 :b 100 :a 160)) 401 + (font-draw *np-graph* "aesthetic.computer" 402 402 (- (floor sw 2) (floor (font-measure "aesthetic.computer") 2)) (+ cy 32))) 403 403 (progn 404 404 ;; No handle: just show name 405 - (graph-ink graph (make-color :r 80 :g 255 :b 140 :a 255)) 406 - (font-draw graph "aesthetic.computer" 405 + (graph-ink *np-graph* (make-color :r 80 :g 255 :b 140 :a 255)) 406 + (font-draw *np-graph* "aesthetic.computer" 407 407 (- (floor sw 2) (floor (font-measure "aesthetic.computer") 2)) cy) 408 - (graph-ink graph (make-color :r 140 :g 160 :b 200 :a 180)) 409 - (font-draw graph "notepat" 408 + (graph-ink *np-graph* (make-color :r 140 :g 160 :b 200 :a 180)) 409 + (font-draw *np-graph* "notepat" 410 410 (- (floor sw 2) (floor (font-measure "notepat") 2)) (+ cy 18))))) 411 411 ;; Build name (bottom center) 412 - (graph-ink graph (make-color :r 60 :g 60 :b 80 :a 120)) 413 - (font-draw graph *build-name* 412 + (graph-ink *np-graph* (make-color :r 60 :g 60 :b 80 :a 120)) 413 + (font-draw *np-graph* *build-name* 414 414 (- (floor sw 2) (floor (font-measure *build-name*) 2)) (- sh 20)) 415 415 ;; LISP tag (top right) when CL variant 416 416 (when (string= *build-variant* "cl") 417 - (graph-ink graph (make-color :r 255 :g 200 :b 80 :a 200)) 418 - (font-draw graph "LISP" (- sw (font-measure "LISP") 6) 6))) 419 - (ac-native.drm:drm-present display screen scale) 417 + (graph-ink *np-graph* (make-color :r 255 :g 200 :b 80 :a 200)) 418 + (font-draw *np-graph* "LISP" (- sw (font-measure "LISP") 6) 6))) 419 + (ac-native.drm:drm-present display *np-screen* scale) 420 420 (frame-sync-60fps))) 421 421 422 422 ;; Start Swank server for remote REPL ··· 447 447 (setf *fps-last-time* now)) 448 448 449 449 ;; ── Metronome tick ── 450 - (when (and *metronome-on* (> *metronome-bpm* 0) audio) 450 + (when (and *metronome-on* (> *metronome-bpm* 0) *np-audio*) 451 451 (let* ((now-ms (monotonic-time-ms)) 452 452 (ms-per-beat (/ 60000.0d0 *metronome-bpm*)) 453 453 (beat-number (floor now-ms ms-per-beat)) ··· 458 458 (setf *metronome-last-beat* beat-number) 459 459 (setf *metronome-flash* 1.0) 460 460 (let ((downbeat (zerop (mod beat-number 4)))) 461 - (audio-synth audio :type 3 ; square 461 + (audio-synth *np-audio* :type 3 ; square 462 462 :tone (if downbeat 1200.0d0 800.0d0) 463 463 :duration 0.03d0 464 464 :volume (if downbeat 0.4d0 0.25d0) ··· 470 470 (when (< *metronome-flash* 0.0) (setf *metronome-flash* 0.0))) 471 471 472 472 ;; ── Input ── 473 - (dolist (ev (ac-native.input:input-poll input)) 473 + (dolist (ev (ac-native.input:input-poll *np-input*)) 474 474 (let ((type (ac-native.input:event-type ev)) 475 475 (code (ac-native.input:event-code ev))) 476 476 ··· 480 480 (when (> (- *np-frame* *esc-last-frame*) 90) (setf *esc-count* 0)) 481 481 (incf *esc-count*) 482 482 (setf *esc-last-frame* *np-frame*) 483 - (when (and audio (< *esc-count* 3)) 484 - (audio-synth audio :type 3 483 + (when (and *np-audio* (< *esc-count* 3)) 484 + (audio-synth *np-audio* :type 3 485 485 :tone (if (= *esc-count* 1) 440.0d0 660.0d0) 486 486 :duration 0.08d0 :volume 0.15d0 487 487 :attack 0.002d0 :decay 0.06d0)) ··· 511 511 (<= code ac-native.input:+key-9+)) 512 512 (let ((new-oct (1+ (- code ac-native.input:+key-1+)))) 513 513 (unless (= new-oct *octave*) 514 - (kill-all-voices audio) 514 + (kill-all-voices *np-audio*) 515 515 (setf *octave* new-oct)))) 516 516 517 517 ;; Arrow up/down: octave 518 518 (when (= code ac-native.input:+key-up+) 519 519 (when (< *octave* 9) 520 - (kill-all-voices audio) 520 + (kill-all-voices *np-audio*) 521 521 (incf *octave*))) 522 522 (when (= code ac-native.input:+key-down+) 523 523 (when (> *octave* 1) 524 - (kill-all-voices audio) 524 + (kill-all-voices *np-audio*) 525 525 (decf *octave*))) 526 526 527 527 ;; Tab / Arrow left/right: cycle wave type 528 528 (when (or (= code ac-native.input:+key-tab+) 529 529 (= code ac-native.input:+key-right+)) 530 - (kill-all-voices audio) 530 + (kill-all-voices *np-audio*) 531 531 (setf *wave-index* (mod (1+ *wave-index*) 5)) 532 - (when audio 532 + (when *np-audio* 533 533 (let ((tones #(660.0d0 550.0d0 440.0d0 330.0d0 220.0d0))) 534 - (audio-synth audio :type *wave-index* 534 + (audio-synth *np-audio* :type *wave-index* 535 535 :tone (aref tones *wave-index*) 536 536 :duration 0.07d0 :volume 0.18d0 537 537 :attack 0.002d0 :decay 0.06d0)))) 538 538 (when (= code ac-native.input:+key-left+) 539 - (kill-all-voices audio) 539 + (kill-all-voices *np-audio*) 540 540 (setf *wave-index* (mod (+ *wave-index* 4) 5)) 541 - (when audio 541 + (when *np-audio* 542 542 (let ((tones #(660.0d0 550.0d0 440.0d0 330.0d0 220.0d0))) 543 - (audio-synth audio :type *wave-index* 543 + (audio-synth *np-audio* :type *wave-index* 544 544 :tone (aref tones *wave-index*) 545 545 :duration 0.07d0 :volume 0.18d0 546 546 :attack 0.002d0 :decay 0.06d0)))) 547 547 548 548 ;; Note keys 549 549 (let ((mapping (gethash code *key-note-map*))) 550 - (when (and mapping (not (gethash code *active-voices*)) audio) 550 + (when (and mapping (not (gethash code *active-voices*)) *np-audio*) 551 551 (let* ((note-name (car mapping)) 552 552 (oct-delta (cdr mapping)) 553 553 (actual-octave (+ *octave* oct-delta)) ··· 556 556 (semitones (+ (* (- actual-octave 4) 12) (or idx 0))) 557 557 (pan (max -0.8d0 (min 0.8d0 (/ (- semitones 12) 15.0d0)))) 558 558 (attack (if *quick-mode* 0.002d0 0.005d0)) 559 - (voice-id (audio-synth audio 559 + (voice-id (audio-synth *np-audio* 560 560 :type *wave-index* 561 561 :tone freq 562 562 :volume 0.7d0 ··· 571 571 ;; Key up 572 572 (when (eq type :key-up) 573 573 (let ((voice-id (gethash code *active-voices*))) 574 - (when (and voice-id audio) 575 - (audio-synth-kill audio voice-id) 574 + (when (and voice-id *np-audio*) 575 + (audio-synth-kill *np-audio* voice-id) 576 576 (remhash code *active-voices*) 577 577 (let ((note-info (gethash code *active-notes*))) 578 578 (when note-info ··· 619 619 (setf *bg-b* (min 255 (+ *bg-b* boost))))) 620 620 621 621 ;; ══════════════ PAINT ══════════════ 622 - (graph-wipe graph (make-color :r *bg-r* :g *bg-g* :b *bg-b*)) 622 + (graph-wipe *np-graph* (make-color :r *bg-r* :g *bg-g* :b *bg-b*)) 623 623 624 624 ;; ── Trails ── 625 625 (maphash (lambda (trail-key val) ··· 634 634 (bar-w (max 1 (floor (* val sw)))) 635 635 (bar-x (floor (- sw bar-w) 2)) 636 636 (alpha (max 1 (min 255 (floor (* val 200)))))) 637 - (graph-ink graph (make-color :r (first rgb) 637 + (graph-ink *np-graph* (make-color :r (first rgb) 638 638 :g (second rgb) 639 639 :b (third rgb) 640 640 :a alpha)) 641 - (graph-box graph bar-x bar-y bar-w bar-h))) 641 + (graph-box *np-graph* bar-x bar-y bar-w bar-h))) 642 642 *trails*) 643 643 644 644 ;; ── Active note bars ── ··· 652 652 (total-semitones (* 9 12)) 653 653 (bar-h (max 2 (floor (- sh 30) total-semitones))) 654 654 (bar-y (+ 14 (floor (* semi (- sh 30)) total-semitones)))) 655 - (graph-ink graph (make-color :r (min 255 (+ (first rgb) 40)) 655 + (graph-ink *np-graph* (make-color :r (min 255 (+ (first rgb) 40)) 656 656 :g (min 255 (+ (second rgb) 40)) 657 657 :b (min 255 (+ (third rgb) 40)) 658 658 :a 220)) 659 - (graph-box graph 0 bar-y sw bar-h))) 659 + (graph-box *np-graph* 0 bar-y sw bar-h))) 660 660 *active-notes*) 661 661 662 662 ;; ── Metronome pendulum ── ··· 667 667 (bx (+ cx (floor (* *metronome-phase* arm-len)))) 668 668 (bright (floor (* *metronome-flash* 255)))) 669 669 ;; Arm line 670 - (graph-ink graph (make-color :r 180 :g 180 :b 180 :a 120)) 671 - (graph-line graph cx cy bx (- cy arm-len)) 670 + (graph-ink *np-graph* (make-color :r 180 :g 180 :b 180 :a 120)) 671 + (graph-line *np-graph* cx cy bx (- cy arm-len)) 672 672 ;; Bob 673 - (graph-ink graph (make-color :r (min 255 (+ 180 bright)) 673 + (graph-ink *np-graph* (make-color :r (min 255 (+ 180 bright)) 674 674 :g (min 255 (+ 100 bright)) 675 675 :b 60 :a 220)) 676 - (graph-circle graph bx (- cy arm-len) 3))) 676 + (graph-circle *np-graph* bx (- cy arm-len) 3))) 677 677 678 678 ;; ── Wave type indicators (bottom bar) ── 679 679 (let* ((bar-y (- sh 14)) ··· 690 690 ;; Button background 691 691 (if selected 692 692 (progn 693 - (graph-ink graph (make-color :r 60 :g 50 :b 80 :a 200)) 694 - (graph-box graph bx bar-y btn-w 12)) 693 + (graph-ink *np-graph* (make-color :r 60 :g 50 :b 80 :a 200)) 694 + (graph-box *np-graph* bx bar-y btn-w 12)) 695 695 (progn 696 - (graph-ink graph (make-color :r 30 :g 28 :b 35 :a 150)) 697 - (graph-box graph bx bar-y btn-w 12))) 696 + (graph-ink *np-graph* (make-color :r 30 :g 28 :b 35 :a 150)) 697 + (graph-box *np-graph* bx bar-y btn-w 12))) 698 698 ;; Wave name (abbreviated to 3 chars) 699 - (graph-ink graph col) 699 + (graph-ink *np-graph* col) 700 700 (let ((abbr (subseq (aref *wave-names* i) 0 (min 3 (length (aref *wave-names* i)))))) 701 - (font-draw graph abbr 701 + (font-draw *np-graph* abbr 702 702 (+ bx (floor (- btn-w (* (length abbr) 6)) 2)) 703 703 (+ bar-y 2)))))) 704 704 705 705 ;; ── Status text ── 706 706 ;; Top-left: piece name + mode indicators 707 - (graph-ink graph (make-color :r 100 :g 100 :b 110 :a 150)) 708 - (font-draw graph "notepat" 3 3) 707 + (graph-ink *np-graph* (make-color :r 100 :g 100 :b 110 :a 150)) 708 + (font-draw *np-graph* "notepat" 3 3) 709 709 710 710 ;; Quick mode indicator 711 711 (when *quick-mode* 712 - (graph-ink graph (make-color :r 255 :g 200 :b 50 :a 200)) 713 - (font-draw graph "Q" (+ 3 (* 8 6)) 3)) 712 + (graph-ink *np-graph* (make-color :r 255 :g 200 :b 50 :a 200)) 713 + (font-draw *np-graph* "Q" (+ 3 (* 8 6)) 3)) 714 714 715 715 ;; Handle (top-left, after piece name) 716 716 (when *boot-handle* 717 717 (let ((htxt (format nil "@~A" *boot-handle*))) 718 - (graph-ink graph (make-color :r 80 :g 255 :b 140 :a 140)) 719 - (font-draw graph htxt (+ 3 (* (if *quick-mode* 10 8) 6)) 3))) 718 + (graph-ink *np-graph* (make-color :r 80 :g 255 :b 140 :a 140)) 719 + (font-draw *np-graph* htxt (+ 3 (* (if *quick-mode* 10 8) 6)) 3))) 720 720 721 721 ;; Octave (top-left, below title) 722 - (graph-ink graph (make-color :r 160 :g 160 :b 170 :a 180)) 723 - (font-draw graph (format nil "OCT ~D" *octave*) 3 14) 722 + (graph-ink *np-graph* (make-color :r 160 :g 160 :b 170 :a 180)) 723 + (font-draw *np-graph* (format nil "OCT ~D" *octave*) 3 14) 724 724 725 725 ;; Metronome BPM (if on) 726 726 (when *metronome-on* 727 - (graph-ink graph (make-color :r 180 :g 140 :b 60 :a 200)) 728 - (font-draw graph (format nil "~DBPM" *metronome-bpm*) 727 + (graph-ink *np-graph* (make-color :r 180 :g 140 :b 60 :a 200)) 728 + (font-draw *np-graph* (format nil "~DBPM" *metronome-bpm*) 729 729 (+ 3 (* 7 6)) 14)) 730 730 731 731 ;; FPS (top-right) 732 732 (let ((fps-txt (format nil "~D" *fps-display*))) 733 - (graph-ink graph (make-color :r 80 :g 80 :b 90 :a 120)) 734 - (font-draw graph fps-txt (- sw (* (length fps-txt) 6) 3) 3)) 733 + (graph-ink *np-graph* (make-color :r 80 :g 80 :b 90 :a 120)) 734 + (font-draw *np-graph* fps-txt (- sw (* (length fps-txt) 6) 3) 3)) 735 735 736 736 ;; Voice count (top-right, below FPS) 737 737 (let ((vc (hash-table-count *active-voices*))) 738 738 (when (> vc 0) 739 739 (let ((txt (format nil "~Dv" vc))) 740 - (graph-ink graph (make-color :r 200 :g 200 :b 200 :a 180)) 741 - (font-draw graph txt (- sw (* (length txt) 6) 3) 14)))) 740 + (graph-ink *np-graph* (make-color :r 200 :g 200 :b 200 :a 180)) 741 + (font-draw *np-graph* txt (- sw (* (length txt) 6) 3) 14)))) 742 742 743 743 ;; IP + Swank (top center) 744 744 (when (> (length *ip-address*) 0) 745 745 (let ((txt (format nil "~A:4005" *ip-address*))) 746 - (graph-ink graph (make-color :r 60 :g 180 :b 60 :a 160)) 747 - (font-draw graph txt (- (floor sw 2) (floor (font-measure txt) 2)) 3))) 746 + (graph-ink *np-graph* (make-color :r 60 :g 180 :b 60 :a 160)) 747 + (font-draw *np-graph* txt (- (floor sw 2) (floor (font-measure txt) 2)) 3))) 748 748 749 749 ;; Refresh IP every ~5 seconds 750 750 (when (zerop (mod *np-frame* 300)) (refresh-ip)) 751 751 752 752 ;; ── Present ── 753 - (ac-native.drm:drm-present display screen scale) 753 + (ac-native.drm:drm-present display *np-screen* scale) 754 754 (frame-sync-60fps)) 755 755 756 756 ;; ── Cleanup ── 757 - (when audio (ignore-errors (kill-all-voices audio))) 758 - (when audio (ignore-errors (audio-destroy audio))) 759 - (when input (ignore-errors (ac-native.input:input-destroy input))) 760 - (when screen (ignore-errors (fb-destroy screen))) 757 + (when *np-audio* (ignore-errors (kill-all-voices *np-audio*))) 758 + (when *np-audio* (ignore-errors (audio-destroy *np-audio*))) 759 + (when *np-input* (ignore-errors (ac-native.input:input-destroy *np-input*))) 760 + (when *np-screen* (ignore-errors (fb-destroy *np-screen*))) 761 761 (ignore-errors (ac-native.drm:drm-destroy display)) 762 762 (format *error-output* "[notepat] shutdown~%") 763 763 (force-output *error-output*))))