Open Firmware 程序編寫 第四集 演奏音樂

13 views
Skip to first unread message

胡松涛

unread,
May 31, 2011, 12:20:50 AM5/31/11
to figt...@googlegroups.com, cn...@googlegroups.com

《Open Firmware 程序編寫 第四集 演奏音樂》

在OFW裏面有個tone字,您可以通過它演奏音樂。

=============演奏音符=====================

tone字的使用方式是 頻率 長度(ms) tone

select /sound \ 打開聲音通道
d# 200 d# 1000 tone \ 演奏 200Hz頻率的音符1秒

裏面的d# 是把後面的數字用十進制表示。 為什麽?因為OFW的默認進制是hex嘛。

=============定義音符=====================

我們要演奏音樂,需要多下一點功夫

首先要找到do re me 等等的頻率數字。參考下面參數表
http://qqhack8.blog.163.com/blog/static/114147985201122624025880/

我們可以定義do re me等等音符了:

: do d# 262 d# 1000 ;
: re d# 294 d# 1000 ;
: me d# 329 d# 1000 ;
寫了好多的d#,後面還要定義更多的音符,太麻煩了,能不能簡化呢? 可以。

decimal
: do 262 1000 ;
: re 294 1000 ;
: me 329 1000 ;
decimal把默認的hex變成我們熟悉的十進制,這樣就方便多了。

等等,好像1000也重復了。這個好辦, 可以定義一個新的 tick 字。

: tick 1000 ;
: do 262 tick ;
: re 294 tick ;
: me 329 tick ;
把1000替換成tick沒省略多少嘛!不過,這樣寫,靈活很多。Forth最讚的地方就是,我們可以慢慢優化程序。

=============處理長短音=====================

我們發現 當轉化簡譜的時候, tick 是會變化的。 比如 1 代表一個tick, 1--
代表三個tick。
好,我們需要把tick從do re me裏面分開:

: do 262 ;
: re 294 ;
: me 329 ;
為了方便,我們還可以定義:

: 1 do tick ;
: 2 re tick ;
: 3 me tick ;
再增加幾個新定義:

: - tick 2 * ;
: -- tick 3 * ;
: 1- do - ;
: 1-- do -- ;

=============演奏簡譜=====================

這樣,我們就可以把簡譜用forth直接表達了:
3 tone 1-- tone
但是 簡譜沒有這麽麻煩,每個後面的tone,太麻煩。好,我們繼續省略:

: - tick 2 * tone ;
: -- tick 3 * tone ;
: 1- do - tone ;
: 1-- do -- tone ;
這樣,更接近簡譜了:
3 1-- 3 1-

播放一下,發現問題了! 聲音好像有點亂,停頓也不對。為什麽呢?
因為聲音播放後,如果緊跟著下一個,會如此。怎麽辦? 添加停頓!

ms是添加停頓的字: 毫秒數字 ms


: play ( hz ms -- ) \ 播放tone,同時停頓相應的長度。
( ms hz ) swap
( ms hz ms ) over
( ms ) tone
( ) ms
;
=============即興演奏=====================

好啦,都差不多了,我們來一首:
通過Qemu進入OFW:
qemu -L . -bios emuofw.rom -hda fat:. -soundhw sb16
注:裏面的sb16
可以根據您的情況選擇,有的機器可能是別的,比如ac97。如何找到適合自己的配制?
qemu -L . -bios emuofw.rom -hda fat:. -soundhw sb
qemu會給你一些選項。

進入OFW後,輸入:
fload c:\music.fth
如果您聽到一個一秒的聲音,說明您的聲音配制ok。

最後,您可以試試自己來演奏一曲:

1 2 3 4 5 6 7 1‘

或者:

1 3- 1

=============演奏結尾曲=====================

最後,用一首雪絨花結束這一集。請輸入: edelweiss


--
Hu Songtao
works as an English Teacher in weekends
Skype: idisblueflash
Beijing, China
music.fth

爽 Suan陳 Chen

unread,
May 31, 2011, 1:30:06 AM5/31/11
to figt...@googlegroups.com
松涛兄您好

我用 qemu.exe 啟動了 open firmware 後想要開始做點事
就在 open firmware 試著載入 music.fth, 但 fload 指令竟然說不能開啟
我試著在 open firmware 直接執行 music.fth 中的第一個指令 select /sound
這下可好, 怎麼 open firmware 就都不動了
執行狀況我取了影像檔, 如附圖 music.jpg
不知道問題在哪, 敬請指教
--
祝 平安喜樂 健康順利

陳爽 敬上

在 11/5/31,胡松涛 <idisbl...@gmail.com> 撰寫:

music.jpg

H.C. Chen

unread,
May 31, 2011, 2:31:33 AM5/31/11
to figt...@googlegroups.com
爽哥,要 fload c:\music.fth 才行。
但結果一樣,當在 select /sound , same here !!

2011/5/31 爽 Suan陳 Chen <samsu...@gmail.com>
--
您已訂閱「Google 網上論壇」的「符式協會」群組,因此我們特別傳送這封郵件通知您。
如要在此群組張貼留言,請傳送電子郵件至 figt...@googlegroups.com
如要取消訂閱此群組,請傳送電子郵件至 figtaiwan+...@googlegroups.com
如需更多選項,請造訪此群組:http://groups.google.com/group/figtaiwan?hl=zh-TW


阿貴 albert

unread,
May 31, 2011, 2:49:38 AM5/31/11
to figt...@googlegroups.com
bat file 要改哦。
qemu  -L . -bios emuofw.rom  -hda fat:. -soundhw sb16

要指定 soundhw
但我的沒當,可是沒聲音 (用ac97 也沒有聲音輸出)
還不知該指定什麼soundhw

--
BR.

阿貴 Albert

胡松涛

unread,
May 31, 2011, 3:55:17 AM5/31/11
to figt...@googlegroups.com
在 Tue, 31 May 2011 14:49:38 +0800,阿貴 albert <lu.a...@gmail.com> 写道:

> bat file 要改哦。
> qemu -L . -bios emuofw.rom -hda fat:. -soundhw sb16
>
> 要指定 soundhw
> 但我的沒當,可是沒聲音 (用ac97 也沒有聲音輸出)
> 還不知該指定什麼soundhw

是這樣的,需要指定soundhw。 我在linux下會出現很多選項

fox@localhost:~/work/ofw/05-play-sound$ qemu -L . -bios emuofw.rom
-hda fat:. -soundhw sb
Unknown sound card name `sb'
Valid sound card names (comma separated):
pcspk PC speaker
sb16 Creative Sound Blaster 16
ac97 Intel 82801AA AC97 Audio
es1370 ENSONIQ AudioPCI ES1370
hda Intel HD Audio

上面的內容,我都一一嘗試過,只有sb16能聽到聲音。而其他的,不是死在那裏,就是
Invalid ihandle。

前輩們可以試試這幾個選項。

末學 胡松濤

阿貴 albert

unread,
May 31, 2011, 5:02:01 AM5/31/11
to figt...@googlegroups.com
胡先生您好,

我是在win 7 中用qemu 0.13.0  ,試了您所提的幾種soundhw ,可惜皆沒聲音。
查了一下我的系統音效是realtek , 不知該用那個 soundhw ?
在win7 +qemu0.13.0 無法用 -soundhw sb , 它不會 show 出sound card name 。

BR.

Albert

H.C. Chen

unread,
May 31, 2011, 5:10:13 AM5/31/11
to figt...@googlegroups.com
不論模擬器怎樣,以這個應用而言, PC Speaker 就綽綽有餘了。
我雖然沒試,仍心想至少改用 floppy 版(而非用模擬的),直接去
碰硬體 toggle speaker 就一定能成。



2011/5/31 阿貴 albert <lu.a...@gmail.com>

胡松涛

unread,
May 31, 2011, 6:06:33 AM5/31/11
to figt...@googlegroups.com
在 Tue, 31 May 2011 14:49:38 +0800,阿貴 albert <lu.a...@gmail.com> 写道:

> qemu -L . -bios emuofw.rom -hda fat:. -soundhw sb16

這樣寫是對的,我在windowXP下也是這個配制,可以識別sound設備。可以播放tone和音樂。
但是,聽不到!!

如果不支持聲音設備的情況,應該返回的是:
1. ok fload c:\music.fth 之後死在那邊。( 原因是沒有設置 -soundhw 選項 )
2. ok fload c:\music.fth
c:\music.fth:1: Invalid ihandle
ok
( 原因是 -soundhw es1370 選項,不是符合的設備。)

胡松涛

unread,
May 31, 2011, 6:37:00 AM5/31/11
to figt...@googlegroups.com
在 Tue, 31 May 2011 14:49:38 +0800,阿貴 albert <lu.a...@gmail.com> 写道:

> bat file 要改哦。
> qemu -L . -bios emuofw.rom -hda fat:. -soundhw sb16
>
> 要指定 soundhw
> 但我的沒當,可是沒聲音 (用ac97 也沒有聲音輸出)
> 還不知該指定什麼soundhw


终于搞定了,出声音了(windowsXP)!原来windows的qemu下面要好好配置一些参数。

我把最新的bat文件放到附近里面了。欢迎大家测试。

不过问题是: 会有噪音。


末学 胡松涛
--
使用 Opera 革命性的电子邮件客户程序: http://www.opera.com/mail/

阿貴 albert

unread,
May 31, 2011, 8:43:47 AM5/31/11
to figt...@googlegroups.com
請問哪可以找到您所說的bat 檔 ?



--
您已訂閱「Google 網上論壇」的「符式協會」群組,因此我們特別傳送這封郵件通知您。
如要在此群組張貼留言,請傳送電子郵件至 figt...@googlegroups.com
如要取消訂閱此群組,請傳送電子郵件至 figtaiwan+...@googlegroups.com
如需更多選項,請造訪此群組:http://groups.google.com/group/figtaiwan?hl=zh-TW




--
BR.

阿貴 Albert

胡松涛

unread,
May 31, 2011, 9:02:19 AM5/31/11
to figt...@googlegroups.com
在 Tue, 31 May 2011 20:43:47 +0800,阿貴 albert <lu.a...@gmail.com> 写道:

> 請問哪可以找到您所說的bat 檔 ?

看樣子google把.bat的附件都阻擋了。我把bat的內容貼下面吧:

-------------------------qemu-ofw.bat----------------------------------------
REM SDL_AUDIODRIVER=waveout or dsound can be used. Only if
QEMU_AUDIO_DRV=sdl.
SET SDL_AUDIODRIVER=dsound

REM QEMU_AUDIO_DRV=dsound or fmod or sdl or none can be used. See qemu
-audio-help.
rem SET QEMU_AUDIO_DRV=dsound
set QEMU_AUDIO_DRV=sdl

REM QEMU_AUDIO_LOG_TO_MONITOR=1 displays log messages in QEMU monitor.
SET QEMU_AUDIO_LOG_TO_MONITOR=1


qemu.exe -L . -m 128 -bios emuofw.rom -hda fat:. -soundhw sb16

---------------------------end----------------------------------------------

胡松涛

unread,
May 31, 2011, 9:39:25 AM5/31/11
to figt...@googlegroups.com
在 Tue, 31 May 2011 21:34:25 +0800,阿貴 albert <lu.a...@gmail.com> 写道:

> ps: google gmail 會擋 bat 檔案,所以要壓成rar 才可。

末學猜測也是這個問題。

阿貴 albert

unread,
May 31, 2011, 9:34:25 AM5/31/11
to figt...@googlegroups.com
謝謝!!! 聽到聲音了 (Win 7 ) . 

我的最後一音一直重覆不停。
所以加了個 : sd_end 0 - play ;
在最後做停止。(但還是有雜音,)

ps: google gmail 會擋 bat 檔案,所以要壓成rar 才可。

BR.

Albert

--
您已訂閱「Google 網上論壇」的「符式協會」群組,因此我們特別傳送這封郵件通知您。
如要在此群組張貼留言,請傳送電子郵件至 figt...@googlegroups.com
如要取消訂閱此群組,請傳送電子郵件至 figtaiwan+...@googlegroups.com
如需更多選項,請造訪此群組:http://groups.google.com/group/figtaiwan?hl=zh-TW




--
BR.

阿貴 Albert

爽 Suan陳 Chen

unread,
Jun 1, 2011, 3:41:54 AM6/1/11
to figt...@googlegroups.com
感謝明貴兄及厚成兄提示,

在我的 windows 7 那台電腦上
直接跑 qemu.exe -L . -bios emuofw.rom -hda fat:. -soundhw sb16
啟動了 open firmware
然後我 fload c:\music.fth
最後試 init edelweiss
聽到了音樂

但結束 qemu 後來再重新走一遍就聽不到聲音了
又試多次仍然無效

而且很不幸, 我的 windows 7 那台電腦也連不上網了
好像 qemu 在跑 open firmware 時控制了所有相關 I/O

現在無法上網, 連信件都發不出去
只好改用這台 vista 發出信

之前我在 windows 7 那台電腦安裝試跑 vertualbox, 好像也有類似狀況
幸好第二天重新開機, 恢復了網路連線

只是這次好像沒那麼簡單

我還是回到 windows 7 那台電腦
依松涛兄提示自設了 qemu_ofw.bat 啟動 open firmware
依明貴兄提示在 music.fth 中加了 : sd_end 0 - play ;
fload c:\music.fth 後, 試 init edelweiss sd_end
聽到了音樂, 只是尚不能讓 speaker 停下來
--
但祝大家 平安喜樂 健康順利

陳爽 敬上

胡松涛

unread,
Jun 1, 2011, 7:18:07 AM6/1/11
to figt...@googlegroups.com
在 Wed, 01 Jun 2011 15:41:54 +0800,爽 Suan陳 Chen <samsu...@gmail.com>
写道:

> 我還是回到 windows 7 那台電腦
> 依松涛兄提示自設了 qemu_ofw.bat 啟動 open firmware
> 依明貴兄提示在 music.fth 中加了 : sd_end 0 - play ;
> fload c:\music.fth 後, 試 init edelweiss sd_end
> 聽到了音樂, 只是尚不能讓 speaker 停下來

在linux不會這麽麻煩,不過OFW的作者也說QEMU的確復雜。
看來前輩們不用太糾結在這上面。等F2Com出來,這些問題都不是問題了。

末學 胡松濤

阿貴 albert

unread,
Jun 3, 2011, 7:56:55 AM6/3/11
to figt...@googlegroups.com
沒錯,我再用 ubuntu10.10 裝 qemu , make 了  emuofw.rom , 
測了 d# 200 d# 2000 tone 
一點雜音也沒有,完了就停止,也不會有重覆音的出現。


--
您已訂閱「Google 網上論壇」的「符式協會」群組,因此我們特別傳送這封郵件通知您。
如要在此群組張貼留言,請傳送電子郵件至 figt...@googlegroups.com
如要取消訂閱此群組,請傳送電子郵件至 figtaiwan+...@googlegroups.com
如需更多選項,請造訪此群組:http://groups.google.com/group/figtaiwan?hl=zh-TW




--
BR.

阿貴 Albert

胡松涛

unread,
Jun 3, 2011, 8:01:49 AM6/3/11
to figt...@googlegroups.com
在 Fri, 03 Jun 2011 19:56:55 +0800,阿貴 albert <lu.a...@gmail.com> 写道:

> 沒錯,我再用 ubuntu10.10 裝 qemu , make 了 emuofw.rom ,

Albert前輩動手真快,已經深入到linux啦!

阿貴 albert

unread,
Jun 3, 2011, 8:54:49 AM6/3/11
to figt...@googlegroups.com
沒辦法,只因為在win 7 中的雜音一直無法忍受,所以才著手試了ubuntu。
不過也好,發現 ubuntu 現在設計得十分容易上手,使用上很方便。
建議大家也可試試看。

--
您已訂閱「Google 網上論壇」的「符式協會」群組,因此我們特別傳送這封郵件通知您。
如要在此群組張貼留言,請傳送電子郵件至 figt...@googlegroups.com
如要取消訂閱此群組,請傳送電子郵件至 figtaiwan+...@googlegroups.com
如需更多選項,請造訪此群組:http://groups.google.com/group/figtaiwan?hl=zh-TW




--
BR.

阿貴 Albert

胡松涛

unread,
Jun 3, 2011, 9:01:02 AM6/3/11
to figt...@googlegroups.com
在 Fri, 03 Jun 2011 20:54:49 +0800,阿貴 albert <lu.a...@gmail.com> 写道:

> 發現 ubuntu 現在設計得十分容易上手,使用上很方便。

大概有快2年了,很容易安裝上手了。

末學 胡松濤
Reply all
Reply to author
Forward
0 new messages