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

18 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
Reply all
Reply to author
Forward
0 new messages