走進音樂世界!!

音樂 = □ + □

白居易琵琶行

……
千呼萬喚始出來,猶抱琵琶半遮面。
轉軸撥絃三兩聲,未成曲調先有情。
絃絃掩抑聲聲思,似訴平生不得志。
低眉信手續續彈,說盡心中無限事。
輕攏慢撚抹復挑,初為《霓裳》後《六么》。
大絃嘈嘈如急雨,小絃切切如私語。
嘈嘈切切錯雜彈,大珠小珠落玉盤。
間關鶯語花底滑,幽咽泉流水下灘。
水泉冷澀絃凝絕,凝絕不通聲暫歇。
別有幽愁暗恨生,此時無聲勝有聲。
銀瓶乍破水漿迸,鐵騎突出刀槍鳴。
曲終收撥當心畫,四絃一聲如裂帛。
東舟西舫悄無言,唯見江心秋月白。
……

過去唐朝的大詩人白樂天,文章功深力厚又精音通律,於琵琶行一文中描寫著一位『彈著琵琶的女子』,文本直叫能『音聲』透出筆端奪字而來。現今跨海英國劍橋的 Dr Sam Aaron 博士寫作 Sonic  π 要想讓『電腦科學變成聽得到的』!Sonic  π 是用『音符寫程式的電腦語言,用著MIDI ── Music Instrument Digital Interface ──  樂器數位介面的『數字碼』表示各種『聲音合成器』上的音符的『音高』,以『四分音符』為中心,表達著音長的『節拍』與『旋律』。目前雖是個簡單的視窗程式,然而它的功能實足以媲美許多『音樂學習』的電腦輔助系統,更重要的是,你可以用它來『實驗』,證實『樂理』上說的諸諸種種── 那些不靠『聽覺』去親身體驗理解的事──。當下它的使用文件只有『提示紙』幾頁──  Cheat Sheet  ──,故此為著嚐鮮的讀者,癹上 了MIDI 音符碼對照表

sonicpi-midicode

 

音樂的『感染力』眾所周知,世界各國的『粉絲fans 正在述說著這件事。

但如果想『走進音樂世界』,或須知︰

音樂的世界的理解包含著物理數學心理等等,其中最重要的還是『心理』。為什麼呢?因為它是人的聽覺系統的『感受』,所以自然而然要成為決定的因素 ── 這是人類的音樂 ──。假使離開感覺而談音樂,就像離開顏色來談光波光子一般的不可行。正由於這是個『』的世界,『耳朵』才是最好的學習工具;也就是說如果能讓『樂理』看得見聽的着,那學習將更能得手應心事半功倍了!!

CPU 機器語言的『解譯器』

電腦裡的『中央處理器CPU Central Processing Unit,是計算機的心臟,從開機後就『不停的』執行著指令,這些 指令構成了 CPU 懂得的指令集,按照  CPU 硬體設計架構分成了複雜指令集 CISC ,比如 PC 上用的 Intelx86,和精簡指令集 RISC ,就像樹莓派上用的 ARM。這些指令資料構成的程式存放在隨機記憶體 RAM ── 可以想像成『編了地址』,可以用任意地址讀寫的『記憶單元』 ── 上,由 CPU 依序『解譯』執行程式裡的指令,存取程式裡的資料。這種『儲存程式』的計算機模型依循著 Von Neumann 先生的計算機『建築學』architecture 而設計。在這個 CPU 指令解譯器裡,有一個『指令地址指標』── 稱作程式計數器 Program Counter ── 告訴 CPU 『下一個』指令在 RAM 上的哪個地址。每個指令不論是『算術邏輯運算』、『記憶體資料存取』和『控制陳述』 …等等的指令執行時,都會『更新』這個程式計數器。於是 CPU 就能從硬體設計上開機時所固有『起始的』地址上『讀取』fetch 第一個指令,然後開始『執行』execution,再讀取下一個指令再執行,一直的讀取.執行持續不停。由於指令與資料並不區分,都放在相同的記憶體上,就可能發生把資料當作指令或是將指令當成資料的情況,一般會導致『當機』。這個前面說的指令集,就是 CPU 唯一會的『機器語言』── 以二進制方式儲存在記憶體上的一長排位元組。即使最簡單的『組合語言Assembler 功能僅僅提供機器語言的『助憶碼』Assembly Mnemonic ,也得把用它寫的程式『組譯』成機器碼 Machine Code,CPU 才能執行;更不要說這個組合語言自己也得能執行才能進行組譯。假使你覺得組合語言很有意思,你可以看看劍橋大學開的烘焙 Pi 開發作業系統公開課;或是裸裸金屬樹莓派編程打算寫的一本書;以及樹莓派組合碼部落客。這裡藉著簡單介紹『思考著的極客』一文上用 Gnu as 組譯程式寫的 first.s 原始碼欣賞程式組譯這回事︰

/* — first.s */
/* This is a comment */
.global main /* ‘main’ is our entry point and must be global */
.func main /* ‘main’ is a function */

main: /* This is main */
mov r0, #2 /* Put a 2 inside the register r0 */
bx lr /* Return from main */

作者費心的在短短的八行裡試圖說明 as 的語法,此處把他文中詳細的說明節錄簡譯如下︰『/* …… */』是註解,as 會忽略;『 . 』起頭的字是 as 的宣告 directive,『.global main』 告訴 as main 是像 C main 程式一樣的主程式進入點 ── 開始執行的地址 ──;『.func main』 說明 main 是一個函數 function;as 會忽略『空白行』;『main:main 函數標籤 label;這個函數只有兩行指令,『mov r0, #2』,將 2 移入 move 到 ro 暫存器;和『bx lr』分支交換  branch and exchange 跳到 lr 暫存器所指的地址

首先用 as 組譯程式,將 first.s 組譯成 first.o 目的碼 object code ── 尚未『連接』link 成執行檔 ──︰

as -o first.o first.s

然後用 Gnu C 編譯程式 gcc 連接成 first 執行檔

gcc -o first first.o

測試 first ,這裡的『 $? 』是 bash 外殼程式代表程式傳回值的符號,而『 ; 』是接續執行多個寫在一行上的命令︰

./first ; echo $?

想必你早已猜到輸出的結果是『2』。從前述的 first.s 內容來看,應當可以了解組合語言,為什麼叫做低階程式語言 low level 了,因為它偏向機器語言,人們必須清楚了解所用的 CPU 硬體架構,才能好好的掌握它。

雖說第一個高階程式語言是德國Konrad Zuse 先生的 Plankalkül,大約構想於第二次世界大戰末期,然而第一個廣為使用的卻是福傳 Fortran ── Formula Translation 的縮寫。1957 年IBM 當時的工程師約翰·華納·巴克斯 John Warner Backus 因深切體會到編寫程式困難,需要更好的程式語言所創。他也就是知名的『 BNF 』巴科斯-諾爾範式 Backus–Naur Form 的創始者之一,這個範式 是一種表示無上下文脈絡關係 Context Free 文法語言,可以用來描述 CF 這一類的形式語言,這包括了絕大部分的電腦程式語言。其後又有了 1969 年在 Bell Labs circa 由 Ken ThompsonDennis Ritchie 所發展的 B 語言,然後於 1971 年之際演變成 New B,最終於 1972 年變成了今天的 C 語言 ── After B ──,形成了美麗的『ABC』語言傳奇

事實上 Von Neumann 的計算機架構,對於電腦程式語言的發展,有著極為深遠的影響,產生了現在叫做 Von Neumann 程式語言,與Von Neumann 的計算機架構,同形 isomorphism 同構

program variables ↔ computer storage cells
程式變數 對映  計算機的儲存單元

control statements ↔ computer test-and-jump instructions
控制陳述  計算機的『測試.跳至』指令

assignment statements ↔ fetching, storing instructions
賦值陳述  計算機的取得、儲存指令

expressions ↔ memory reference and arithmetic instructions.
表達式  記憶體參照和算術指令

John Warner Backus 曾經斷言,由於電腦圈長期過度強調 Von Neumann 的程式語言與計算機架構,已經產生了『惡性循環』,使得非此類的語言由於不符合經濟而日漸式微,比方 APL 語言 ── 註︰有興趣的,可以參照這裡在 Raspbian 上安裝 ──。

行文至此,不得不提及 Charles H. Moore 先生,他認為像 asgcc 那樣的程式語言,依循著 compile-link-go 編譯.連接.執行的步驟都該叫做『第三代』的電腦語言,因而想發明『第四代 FOURTH』語言,但由於 IBM 1130 電腦作業系統,限制檔案名稱長度最多個字元,以至於 FOURTH 被迫變成了現今稱作『Forth』的電腦程式語言。這是一個以『堆疊 Stack』為中心,用『字典』定義『』方式的一種交互式 interactive 的編譯.解譯寫程式的環境,十分有趣獨特。有時還真不好說它算是低階還是高階語言,彷彿是種『由低到高』的程式編寫世界。你可以參考這份文件的說明,進到 Forth 的國度裡『逍遙遊』!!

 

 

刀筆契刻︰nano 編輯

如果設想以『』字為觀,其中『一豎』就是文本,而那個『』── ──,就是當下所『』。人的眼界受限於框,就像編輯軟體也有個『視窗』一般。術語上,編輯軟體的這個視窗叫做『文本窗口』text window。在這個框中,一個一個『文字符號』,依序排列,可以用著『行列』定位,以至我們可以說哪個字在哪行哪列。人們的目光總有個『焦點』,聚焦在一個特定的『位置』,就是編輯軟體上的『游標』,指示著現下的『這個字』。如此說來,一個編輯軟體需要提供哪些『功能』去完成『新創』或『修改』文本,也就不難設想了。有人說,這個行列的想法,大概只適合文字界面吧,要是圖形界面的話,比方說眼前的『這篇』文章,就更本不適用。其實你只要把行列的概念,推廣成笛卡爾座標系就行了。這樣你可以用『點定位』的不只是文字,它是圖形又何妨。然而裡頭基本的想法還是一樣的。對今天的使用者來說,『所見即所得』的文字處理程式想法,一點也不會陌生,它會『排版』而且能『呈現』出一樣的所得之所見到各種輸出裝置 ──『螢幕』、『印表機』、『網頁』…──。那麽一個簡單的文本編輯軟體又怎麽看待文本的『排版』呢?標點符號標示著文句的意義,卻不代表著最終呈現出的『一行』或是『一列』,比如說『詩詞』上斷開句子文意呈現。所以就需要一個方法來處理排版上的這個『換行』── 排版上的『分界』,這是一行的終結 End Of  Line,另一行將起『新行』符號的由來。然而這個控制符號卻引起了一場史稱『Teletype Model 33 ASR』事件︰

220px-Teletype_with_papertape_punch_and_reader

傳說於 1963 年時,這台電動打字機,打字頭由行末回到行首── 回車 Carriage Return ── 需要它個字』的時間,而移動紙張的滾輪,移動一行距離 Line Feed,只需『個字』的時間,所以軟體程式設計師為了配合著它的運作節奏,只得用 EOL = CR + LF 剛好兩個字的時間,來標示排版上的新行符號

此後,到底該用什麼代表 EOL 就各吹各的調了。直到如今頻果的 CR、\r,微軟的 CR+LF、\r\n,以及 Unix 的 LF、\n,成為三種主流,持續影響著文本於不同作業系統間的往來時,都必須要轉換 EOL 符號一事。雖然許多『跨平台』的軟體,比方騛罿 Python 讀檔案時能自動轉換,對於可執行的文本命令檔來說,最好還是注意這個問題。如果你稍稍留意,這些又稱作 ASCII 控制碼的 CR 和 LF 符號,在文本編輯時是『看不見』的,它的作用是文本呈現的『控制』,並不屬於文本的『文義』之中,雖然用於排版時,或表現出作者對『美觀』的要求,因有著一定『風格』的意思。由於它的『看不見』,作用又有點像『文言虛詞』,在一般程式語言裡稱這些看不見的叫做 white-space,或許可以譯作『留白』。

nano 10^{-9} 短小精練的文本編輯程式,非常合適在終端機命令列上使用,作者志在取代 pico 10^{-12},曾說︰完全『錯映錯bug-for-bug 般的模擬著相容於 pico。就像傳聞 Wine 的作者們 ── 在 Linux 上跑 Windows 程式的模擬器 ── 當被問到『為什麼』某某軟體不能跑時,回答的感慨一樣︰看來我們只能製造相同的錯誤』,才能解決這個問題。是為求問題解決,不得不吞下的這杯苦酒!!奈文編輯器 nano text editor 的完整使用者文件,可以到使用 nano 文本編輯器之處閱讀,在此我們將只介紹於 Raspbian 上的基本用法︰

nano 上的命令主要是以 Ctrl 為起首配上一個『表意』的字元來表達,比方 Ctrl  + O  的組合健,代表一個  OverWrite 蓋寫『…檔案名稱』的存出命令。另一是以 Alt 作起頭也配上一個表意字元的,在 nano 中常用來表示『選項開關之用,例如 Alt  + P  的組合健,啟用『顯示空格 開啟/關閉』。此處說的這個 Alt 鍵就是 Ctrl  + G  Guide 指南 ── nano 程式中的線上備忘指南裡所說的 Meta 鍵之一 ──,它在 Raspbian 的 預設值;而其他的預設項可見於 /etc/nanorc  一檔。雖然此處用的表意字元,同於指南都是用英文的『大寫』符號,事實上,奈文編輯器並不區分大小寫,所以不需要用  Ctrl  + Shift   +  g  這種打法,縱使要用也行,因為這不過是 nano 文件寫法慣例吧。

當使用 『nano 《檔案名稱》』命令時,如果沒有這個檔名,新創它;如果已有這個檔案,打開它。

【移動反白游標】︰

上一行; 下一行; 前一字; 後一字。

【刪增游標所在處的字】︰

反白游標所在處,打入的字,將插入在這個游標之前;假如要刪除游標當下的字,可以用 Delete 鍵;如果想刪除游標之前的字,可以用 Backspace 鍵。

【剪貼文字】︰

當你在圖形視窗環境下使用視窗版終端機的程式命令列時,滑鼠是個好幫手,你可以方便的使用『剪貼』功能,它能夠將『拷貝Copy 的文句,把它貼到反白游標所在處之前

【讀寫檔案】︰

前面已經提過了要將檔案寫出,你可以用 Ctrl  + O  的命令;然而如果你想在反白的游標之前,插進另外一個檔案就得要用 Ctrl  + R   Read 讀取這個命令了。

【結束離開】︰

Ctrl  + X  EXit 出口

文化的傳承依賴著『刀筆契刻的傳播』,今天的世界,也許不是發明『造紙術』的漢朝蔡倫所能預想的吧!!

複盆子,熟了。

樹莓一名覆盆子,又叫懸鉤子,【本草綱目】上記作『複盆子』,明朝名醫李時珍說︰

五月子熟,其色烏赤,故俗名 、大麥莓、插田 ,亦曰栽秧 。甄權《本草》一名馬 ,【集解】《別錄》曰︰五月採。蓬子以八、九月熟,故謂之割田 。複盆以四、五月熟,故謂之插田 ,正與《別錄》五月採相合。二 熟時色皆烏赤,故能補腎。其四、五月熟而色紅者,乃田也,不入

【氣味】甘,平,無毒。

【主治】益氣輕身,令發不白(《別錄》)…。

覆盆子的果實是一種聚合果,成熟後有紅色金色黑色。初生時或有綠色,很少能見到白色的。在中國雖有大量分佈,卻鮮為人知,屬於野果 ── 少有種植販售 ── 卻有著多種藥物價值

古代『河圖』和『洛書』都是以『五為中央』,也就是以『大地』為的意思,強調人與大自然和諧太陽系在古人的眼中,就像個大陽鐘,推動著『春生』『夏長』『秋收』『冬藏』的循環,而為四季之,扮演著『生化』── 五行生克制化 ── 的角色,實在可以說是大自然的生命醫生。而後又將『』按照德性歸給了『』,把『』這個賦予了大地。這整個的寓意說的就是宇宙的『生生不息』!!

RPI_logo

六經之的『易經』有一個『中孚』卦,言及這個『』字︰

中孚豚魚吉,利涉大川,利貞

曰:中孚,說而巽,孚,乃化邦也。豚魚吉 ,信及豚魚也。 利涉大川,虛也。 中孚以利貞,乃應乎天也。

曰:上有,中孚﹔君子以議獄緩死。

初九吉,有不燕。
象曰:初九虞吉,志未變也。

九二鳴鶴在陰,其子和之,我有好爵吾與爾靡之。
象曰:其子和之,中心愿也。

六三得敵,或,或
象曰:可鼓或罷,位不當也。

六四:月几望,馬匹亡,無咎
象曰:馬匹亡,絕類上也。

九五:有孚攣如,無咎。
象曰:有孚攣如,位正當也。

上九翰音登于天,貞
象曰:翰音于天,何可長也。

通觀上文,即使人們能夠認識每一,如何『解讀』依然是個大『問題』;就像樹莓派基金會想把『程式』的樂趣帶給『童蒙』,將『履行』── DIY ──放進『人生』一樣。

』三字,總結人類生活的方方面面,要點貴在能有著『一致性』,勝過一般人們常說的『言行合一』。如果能夠『鉤深索隱』,其實說的就是『學問』大道。事實上『反思』是『哲學』之始,『反省』為『道德』的開端。 『思考』就是『耕耘』著心田,如果還能夠『轉識成智』,『所學』自然就會『踏實』。更何況人們一時所說的『達人』尚且問著『知之不知』的問題呢! 世間裡人與人的『對待』旨要能夠『誠信』,所以方講『人言為信』,也就是說著若合符契『無信不立』一事。假使一個人能以『正信為念』── 正確的信念 ──,如得大願力般的『心想事成』,自然會仿效立志』與『求學』。 ── 鞋子的工具、實踐 ── 履者斯人能得『格物致知』,才許其命維新。從上所說的,三個字就變化成為『三個字 ── 以『信念』為中心的『知』螺旋

……… ,以至無窮

『蜜蜂』為何不見了?

有人

天下『一切』事情,都不過是個『分類』。

有人』就『有事』,天下何得『无事』?天下能得『無人』乎?

有人

酸葡萄『沒有』想『』,甜檸檬『』卻想『不要』;

都是一種『心理』。

有人

有所謂『』與『』? 分別著『』或『』,

』其所『』,『』其所『』。

有人

蜜蜂』為何不見了?

只因『』和『』!!