本帖最后由 highflybird 于 2022-8-10 23:12 编辑
自动LISP的隐藏函数被诸多大神发掘出来,LISP又开始焕发青春活力了!
我一不小心,挖到了一个隐藏的函数Beep.
关于隐藏函数,请参见:Make Lisp Great Again-利用隐藏函数恢复isp的活力!
呵呵,先抄一段: C++中发声函数Beep详解
- 其实啊,Windows API 就提供了一个这样奇妙的发音函数,它就是Beep函数。Beep可以通过控制主板扬声器的发声频率和节拍来演奏美妙的旋律,本文根据音乐简谱来演奏几首优美的歌曲,用以展现Beep的疯狂魅力。
- 首先我们来Beep的函数原型:
- BOOL Beep( DWORD dwFreq; DWORD dwDuration; );
参数说明:
- dwFreq 指定要发出的频率(HZ)
- dwDuration 指定发音的时长,以毫秒为单位。
下面是用LISP的实现--播放生日快乐歌。
- (defun c:HappyBirthday ()
- (princ "\n开始为你播放生日歌:")
- (beep 523 200)
- (beep 523 200)
- (beep 578 400)
- (beep 523 400)
- (beep 698 400)
- (beep 659 800)
- (beep 523 200)
- (beep 523 200)
- (beep 578 400)
- (beep 523 400)
- (beep 784 400)
- (beep 698 800)
- (beep 523 200)
- (beep 523 200)
- (beep 1046 400)
- (beep 880 400)
- (beep 698 400)
- (beep 659 400)
- (beep 578 400)
- (beep 932 200)
- (beep 932 200)
- (beep 880 400)
- (beep 698 400)
- (beep 784 400)
- (beep 698 800)
- (princ "\n播放完毕!")
- (princ)
- )
加载命令是happybirthday.
当然你可以用它来播放其它任何歌曲,只要你懂音乐。
是不是心动了?用它来撩妹也不错哦!
尽管上面已经给出了如何挖掘隐藏函数的链接,还是有人问 Beep函数为何找不到。好吧,既然是隐藏函数,必须要隐藏。需要回帖可见!
- ;;激活一个系统隐藏的函数 作者:tryhi-大海
- ;;参数为一个函数名的字符串
- ;;如果这个函数并非隐藏函数,则返回nil
- ;;例子:(try-load-hide-fun "get-logical-drives")
- (defun try-load-hide-fun (fun / dat file fo len)
- (setq len (+ (* 2 (strlen fun)) 28)) ;长度
- (setq file (vl-filename-mktemp "tryhi.fas"))
- (setq dat
- (append
- '(266 70 65 83 52 45 70 73 76 69 32
- 59 98 121 58 116 114 121 104 105 32 13
- 266 49 13 266 49 32 36 32 36 13 266
- )
- (vl-string->list (itoa len))
- '(32 52 32 36 20 1 1 1 256 219)
- (vl-string->list fun)
- '(256 256 214)
- (vl-string->list fun)
- '(256 256 1 67 256 256 2 256 266 266 131
- 1 256 160 134 256 256 1 22 36 59 98
- 121 58 180 243 186 163
- )
- )
- )
- (setq fo (open file "w"))
- (foreach x dat (write-char x fo))
- (close fo)
- (load file)
- (vl-file-delete file) ;删除临时文件
- (eval (read fun)) ;如果函数不存在则返回nil
- )
激活隐藏函数Beep就用 (try-load-hide-fun "beep")
补充音阶频率表:
根据上面音阶频率对照表,编写了《上海滩》:
- (defun c:sht (/ 1H 1P 2H 2P 3H 3P 4P C0 C1 C1+ C2 C3 C5 C5- C6 C6- C7 C7- I JP P0 P2 P4 S X Y Z JD)
- (setq JP 30) ;(/ 60. 88)? 速度
- (setq 1P (/ 15000 JP))
- (setq 1H (/ 22500 JP))
- (setq 2P (/ 30000 JP))
- (setq 2H (/ 37500 JP))
- (setq 3P (/ 45000 JP))
- (setq 3H (/ 52500 JP))
- (setq 4P (/ 60000 JP))
- (setq P2 (/ 7500 JP))
- (setq P4 (/ 3750 JP))
- (setq P0 10)
- (setq C0 10)
- (setq JD 261.23);基调
- (setq i 0.0)
- (foreach l '("-" "" "+")
- (foreach n '("1" "1#" "2" "2#" "3" "4" "4#" "5" "5#" "6" "6#" "7")
- (setq s (read (strcat "C" n l)))
- (set s (fix (* JD (expt 2 (/ i 12)))))
- (setq i (1+ i))
- )
- )
- (setq i 0)
- (SETQ X (LIST C3 C5 C6 C3 C5 C2 C3 C5 C6 C1+ C6 C5 C1 C3 C2 C2 C3 C5 C2 C3 C6- C6- C1 C2 C3 C2 C7- C6- C1 C5- C3 C5 C2 C3 C2 C7- C6- C5- C1 C0 C1+ C1+ C6 C1+ C0 C6 C1+ C6 C5 C5 C3 C6 C5 C1 C2 C1 C2 C3 C0 C3 C3 C2 C3 C0 C1+ C1+ C7 C6 C3 C3 C2 C3 C1+ C7 C6 C3 C5 C3 C5 C2 C3 C2 C7- C6- C5- C1))
- (SETQ Y (LIST P2 P2 3P P2 P2 3P P2 P2 P2 1P P2 1P P2 P2 3P P2 P2 3P P2 P2 3P P2 P2 1H P2 P2 P2 P2 P2 3P P2 P2 1H P2 P2 P2 P2 P2 2P P2 P2 P2 P2 2p P2 p2 p2 p2 3P P2 P2 1H P2 1P P4 P4 P2 2P P2 P2 P2 P2 2P P2 P2 P2 P2 3P P2 P2 1H P2 P2 P2 P2 P2 3P P2 P2 1H P2 P2 P2 P2 P2 3P))
- (SETQ Z (MAPCAR 'CONS X Y))
- (foreach e z
- (beep (car e) (cdr e))
- )
- (princ)
- )
通过此程序可以调整速度和key,但是听起来感觉有点怪怪的。不知道自己弄得对不对?
可能是通过喇叭来发声,大打折扣了,也可能是我的音乐知识太差了吧。
玩玩而已,不可当真。
|