2010年7月28日 星期三

Polyphonic Computer Music Authoring Tool - 仕偉

-----------------------------------------------------
2010/10/5
-----------------------------------------------------

目前AuthoringTool主要功能說明:

1.讀入wave檔可用程式抓出f0.
2.讀入wave檔可畫出spectrum.
3.使用者可以畫出f0,音量可由java或cuda合成聲音.
4.可由讀入的spectrum,由使用者畫出大概基頻,程式會自動找出對應的spectrum能量並修正頻率.
5.data可存為xml檔方便存取.
6.合成音樂時可調整音高,音量,合成partial比例.如用cuda合成時以上可為real-time.

連結網址:http://cmslab.csie.ncku.edu.tw/index.php/research/asp

-----------------------------------------------------
2010/8/19
-----------------------------------------------------

完成抓取spectrum的功能,不過抓到的數值要轉換成dB,
轉換的公式要再調整.
介面變更許多,待確定再一次貼圖.

-----------------------------------------------------
2010/7/28
-----------------------------------------------------

主畫面:



已將檔案結構換成Vector.
已完成移植:
spectrum
wav
midi
新增pitch
修改pitch
刪除pitch
java聲音合成
選擇partial
選擇group
pitch table
help-about

about :



新增兩功能的GUI,尚未實作內容:






-----------------------------------------------------
2010/7/2
-----------------------------------------------------

為了改善畫圖的效率,捨棄原本的畫圖方式,改用新的方法:

舊的方法:
在panel中用paintcomponent,由於paintcomponent是對整個panel繪圖,因此只要修改到panel的內容,整張panel就會重繪.

新的方法 :
在panel中建一個label,將已存的資料畫在bufferedimage放入label中當背景,上面架一層玻璃(GlassPane)當畫布。
1. 如果要畫新的pitch會畫在玻璃上,確定畫完再更新bufferedimage->放入label中當背景。
2. 刪除pitch時會在玻璃上畫背景顏色,等確定後再刪除資料->更新bufferedimage->放入label中當背景.
此方法優點是每次在新增或刪除pitch時畫面只會重畫GlassPane的部分,不會影響到背景label的圖形,因此效率會大幅改善,以下為圖例:



-----------------------------------------------------
2010/6/18
-----------------------------------------------------

新增demo影片




-----------------------------------------------------
2010/5/27
-----------------------------------------------------

1.讀檔可由xml讀入已編輯好的檔案.

2.在讀檔,合成,修改pitch,新增顯示進度條.

3.可指定要合成的時間片段,按"SlelectRange",滑鼠點第一下為開始時間,
第二下結束時間,第三下取消選取.

4.未選擇時間片段則預設合成全部.

-----------------------------------------------------
2010/5/25
-----------------------------------------------------

1.修改wav spectrum,使明暗更明顯.



2.可對單一partial或 partial group編輯,會跳出視窗.



3.視窗內可編輯音高,按"drawVolume"可用滑鼠畫出指定音量,單位是db,
按下"Synthesis"就可合成此段pitch並播放.



-----------------------------------------------------
2010/5/20
-----------------------------------------------------

語音合成與研究

1. 了解語音合成過程

目前語音合成
--用LPC model vocal tract
--程式中的model vocal tract部分希望改成sine

2. 如何用HMM輔助合成

showmin的合成
--音色庫先建好
--LPC+sine是用來Model Harmonics
--HMM只是來輔助合成的

3. 目標

了解語音合成的程式碼,
將showmin之LPC model sine的方法修改或套用至語音合成,
再用HMM輔助合成,並整合到authingtool.
希望能用CUDA加速.

-----------------------------------------------------
2010/5/19
-----------------------------------------------------

matlab with hmm example

http://zwe0405.blogspot.com/2010/05/hmm-matlab-example.html

matlab with hmm 函數說明

http://zwe0405.blogspot.com/2010/05/hidden-markov-models-with-matlab.html

-----------------------------------------------------
2010/5/14
-----------------------------------------------------

增加了顯示wav檔的orginal spectrum.

做法:
程式讀入wav檔->分析格式取出data部分->data bytes轉成數字->
將數字標準化後經FFT計算得frequency,amp.

亮度變化用java的函式gradientpaint(x1,y1,color1,x2,y2,color2),
意思是從(x1,y1)的顏色color1漸層至(x2,y2)座標的color2,
再搭配畫線函式畫出.

因amp大小不同須調整gradient兩座標的距離來改變亮度.

FFT window:8192, 取樣頻率用44100Hz算的話,
每隔441根bin計算一次,使得時間剛好相差0.01 second.

截圖如下:








-----------------------------------------------------
2010/4/27
-----------------------------------------------------

在小聽的筆電上跑authoringtool會有error,
經過多次試驗總算找出原因.
結果居然是visual studio 2005與visual studio 2008不相容的關係.
我是用visual studio 2005編譯dll檔,在有裝visual studio 2008的環境
下會error.

解決辦法:
1.將visual studio 2005移除掉重新裝visual studio 2008.
2.裝完後跑authoringtool果真error,於是重新編譯dll.
3.在編譯dll時多了錯誤,原來裡面有段程式碼free了已經free過的變數,
於是把這段程式碼拿掉,重新編譯dll.
4.執行authoringtool,可以work了.

在visual studio 2005下那段程式碼是ok的,
visual studio 2008下卻不work,真令人感到奇怪.

-----------------------------------------------------
2010/4/22
-----------------------------------------------------

Features :
1. When open wav file the program will show progressbar which always on top.





2. Can select Partial or Partial Group.



-----------------------------------------------------
2010/4/15
-----------------------------------------------------

Features :
1. Highlight partial. ( Just move mouse then highlight automatically. )
2. Mouse tooltip shows Pitch and Pitch picture. ( Last week done. )
3. Mouse dragged on specific field can zoom-In or zoom-Out.






-----------------------------------------------------
2010/4/14
-----------------------------------------------------

Bwv 1007



Bwv 992



Bwv 846



小步舞曲



Mozart KV.545


在8度音也是有很多錯誤, Total錯誤0.29, 8度音錯誤0.19, 非8度音錯誤0.097.

-----------------------------------------------------
2010/4/7
-----------------------------------------------------

1.新增點與點之間的連線.
2.修正xml顯示格式,可存成xml檔案.
3.解決將partial從中間刪除之後分為兩段partial的問題.
4.解決畫harmonic的連線問題.



-----------------------------------------------------
2010/3/29
-----------------------------------------------------

新增畫partial的方法,工具列圖示如下:



圖示由左至右分別為
1.畫f0
2.畫泛音
3.畫出整個partial結構
4.擦掉partial
5.擦掉整個partial結構

畫出整個partial結構就是只要畫出基頻, 其基頻產生的泛音就會自動產生;
目前泛音的算法是取基頻的2倍頻,3倍頻直到8倍頻.

擦掉整個partial結構就是只要擦掉某一partial,其泛音結構也會一併去掉.

以下是1,2,3方法的截圖:



-----------------------------------------------------
2010/3/2
-----------------------------------------------------

實驗Bach - Prelude 1, BVW 846第1,2小節.

結果:基頻找錯 8%, 多找音 2%, 少找音 5.5%.



註1.基頻找錯:共三個錯誤.兩個錯誤是應為基頻卻標示成泛音,
一個是同一trajectory在某段標示是基頻某段又標成泛音.

原樂譜:



對譜圖:



對譜圖說明:綠色是少找音,黃色是基頻找錯,重藍色是多找音.

====================================

實驗Bach Minuet NO.1:小步舞曲找parital tracking,
音源是由人工方式看譜貼音組成的wav檔.

結果:沒有發現錯誤情形



原樂譜:



對譜圖:



-----------------------------------------------------
2010/3/1
-----------------------------------------------------

修改音高的功能實作完成.
使用者可以用橡皮擦將不要的音擦掉,
也可以用筆劃出想要的音高,如圖:



還需要修改一下xml部分始能完整的存寫檔.

-----------------------------------------------------
2010/2/25
-----------------------------------------------------

將巴哈無伴奏BWV 1007的用HMM分析並人工對譜看錯誤率.

結果:多找音的情形較多,錯誤率達15.6%,其他情形錯誤率都在6%以下.



註1.基頻找錯:應為基頻但顯示為泛音.
註2.多找音:找到不在樂譜上所標記的音高.
註3.少找音:樂譜上有標記音高但對譜結果無顯示.

附錄:對譜時的圖。

原樂譜1,2小節:


partial tracking結果並標示音高:


標示出錯誤,綠色為多找音,黃色為少找音,這兩小節沒有基頻找錯:


-----------------------------------------------------

加入pitch detection的格線,隨時間或頻率範圍不同,
顯示的細密程度也不同.



-----------------------------------------------------
2009/12/21
-----------------------------------------------------

將wav波形,pitch detection,五線譜3個panel嵌入主視窗,
各個panel可拉中間分隔線調大小.




-----------------------------------------------------
2009/12/09
-----------------------------------------------------

程式說明 :

wav檔只須讀入1次,之後調整大小,顯示waveform等都不須再次讀取檔案.

之後還要做的 :

xml格式加入
pitch detection的時間軸,頻率軸,放大縮小倍率
wav波形的時間軸,頻率軸
wav頻譜顯示
HMM包成dll
修改五線譜顯示
debug midi parser

-----------------------------------------------------
2009/12/07
-----------------------------------------------------

將pitch detection與五線譜合併視窗,加入可看Wave波形,
pitch detection可調整可視時間範圍,頻率.






尚未完成:pitch detection的時間軸,頻率軸,放大縮小倍率;wav波形的時間軸,頻率軸;wav頻譜顯示;HMM包成dll.

-----------------------------------------------------
2009/11/20
-----------------------------------------------------
加入wave 的 pitch detection.



-----------------------------------------------------
2009/10/22
-----------------------------------------------------

修改繪製音符細節.



-----------------------------------------------------
2009/10/19
-----------------------------------------------------

已在程式中畫出樂譜,由midi讀檔自動畫出.




如何將midi資料畫成樂譜:由delta time與pitch來畫出。

以下為與五線譜的對應關係。




接下來要做:將五線譜畫的更完善,xml,pitch detection包近來,會儘快完成.

-----------------------------------------------------
2009/09/04
-----------------------------------------------------

現在程式加入midi播放功能,並可分析出Track數目,

但要從Track中提取資料畫譜,目前還找不到可用程式碼.


有找到關於midi以16進位開啟的資料分析的ppt,

裡面有這樣的解說







我只是舉出其中的兩張投影片,全部ppt在此 .

如果真的找不到可用的code話可能要自己利用16進位分析midi再來畫譜,這是最後的方法.

附上目前程式圖:

















點file->open midi file














開啟midi音樂檔












播放時紅圈處顯示此midi檔有9個tracks.

-----------------------------------------------------
2009/08/15
-----------------------------------------------------

我新開一個討論串並把舊的文章移到這。

根據許多軟體的設計我畫了這個草圖:

功能列下面是工具列,就是有一格一格方塊的。
Wave視窗裡面的軌道要有frequency, frequency的Harmonics,波形圖,看還需要什麼.
Property可以顯示樂器,及一些詳細資料.
功能要有修改五線譜,修改FF0.
















另外附上其他軟體的介面圖供參考

學長的二胡軟體


-----------------------------------------------------
2009/07/11
-----------------------------------------------------
不免俗的,先來說一下故事。

由於維城、文森及冠廷近年來在polyphonic music的研究上有了卓越的成果,Cuda的普及正好可解決合成上計算量過高的問題,因此老師便計畫著如何利用它來呈現大家的研究成果。此外,電機系有個同學願意幫我們完成電腦動畫,使其可在畫面上呈現提琴演奏的樣子,還有師大音樂系同學的加入,他們願意幫我們修正分析完錯誤的部份結果,並標記提琴的弓法。最後也最重要的,是冠廷跟小聽加入實作的行列。在天時、地利、人和的條件都滿足的情況下,這個編曲工具的專案便問世了。

昨天跟冠廷和小聽已討論出大概的系統架構、初步實作之資料格式及功能等等,因此開條Thread來紀錄一下工作事項及進度。目前工作的分配如下:

冠廷:

先實作資料格式的I/O,也就是先將文森的結果,按照以下格式紀錄在程式中,輸出的格式暫定為 XML 與 Binary,時間的最小單位是 10ms。註: Track外還會包一層 Group,來代表是同一組 partial group。

class Track

{
-----------------------------------------------------

int 樂器id;
float[] 頻率;

float[] 能量;

int 起始單位時間;
int 持續單位時間;

Control[] control;


----------------------------------------------------------------
}

class Control

{
-----------------------------------------------------

int type; //紀錄 control種類, ex: vibrato 就填1
int subType; //紀錄 是哪一個子類, ex: vibrato有三種,如果要第二種,就填2

string tablePath; //如果type是user define, 會由使用者指定這個路徑

int 起始單位時間; //在這個Track的單位時間多少時發生
int 持續單位時間;

-----------------------------------------------------
}

小聽:

使用Java Swing製作GUI,先尋找一下網路上是否已有寫好的函式庫有提供我們所需要的功能。需要的功能細項待補。(我寫的字條放在 Lab …)

1. 畫waveform的panel (time domain、FFT)

2. 在波形圖上選取區段,變色效果。

3. 經由畫筆改變waveform

4. 可以自由配置視窗的功能

5. 隨不同視窗,改變工具列。

6. 屬性頁

7. midi檔的note number用樂譜形式呈現

showmin:

實作擷取一段聲音的 partials 並另存成樂器庫及 OLA additive synthesis。

2010年7月20日 星期二

點字樂譜計劃

2010/7/15

這周起,薇慈開始教博丞MusicXML,本來對視障者來說,讀MusicXML是不必要的,雖說規則不複雜,但是檔案會太大,用觸摸器來讀很吃力,不過未來要身為程式設記者的博丞來說,卻是必須的,因為MusicXML才是真正用來記錄樂譜的工具,而不是MIDI與點字樂譜,所以我跟博丞再難也要學。

我們預定再用三星期把MusicXML教完,然後做一次測驗,然後再開始教點字樂譜,同時博丞要專為視障者寫一份MusicXML的教學文件。

以下是會議記錄:

【討論事項】

博丞媽媽A4紙上寫的Q&A

musicXML檔案太大notepad開不起來的問題:基本上太大的musicXML不是要拿來整篇閱讀的,如果是要學習musicXML的格式,拿小的樂曲來看就可以了,其他的就交給轉格式吧。

輔助學習的方法:一小節為單位,先聽音樂,再導讀

【每人待做事項】

博丞:學習musicXML、ultraedit 觸摸機是否能正確顯示,改進遊戲規則。

昇翰:點字樂譜教學文件、自由軟體競賽網站、增加程式功能讓它能無誤轉換巴哈chorales所有的標記

薇慈:準備musicXML教學文件與測驗、樂譜導讀(文字)

櫻芳:從musicXML中拿取資訊,播放一小截的示範教學片段,右手→左手,和絃的話先播個別單音再播和絃。

接著是昇瀚問博丞一些問題與博丞的解答:

Q1:圖片在點字樂譜上是會直接被忽略嗎?

Ans:

1.目前的技術只能做到被直接忽略圖的部份,也就是遇到圖就拉倒導盲鼠JAWS晴光皆如此。

2.jaws會告訴你有關圖形但無法辨識是啥圖形。

3.所有screen(螢幕)報讀軟體都無法辨識圖形。

4.不會顯示成亂碼顯示 grathic 的字。

5.word在存檔過程中會產生讀到圖形無法處理的狀況。

Q2.符號以及字母有分成半形和全形想問這兩者在數字機上顯示出來是一樣的嗎?

Ans:

1半形和全形所佔的空間不一樣所以兩者在點字機上顯示出來是不一樣的。

2.中文全部是全形英文本來是半形,全形的英文可能是華人發明的為了排版對齊漂亮。

3.全形佔的空間是半形的2倍。

Q3.點字機一行最多可以顯示多少個中文字呢?如果一行裡面的字數太多的話會發生什麼事情?

Ans:

1.要看是什麼種類的點字機,以『超點』為例要從大小去討論博丞使用的那台一行有40格(方),也可以從字注音去討論,超點40格、JAWS 20格、晴光25格。

2.點字靠注音顯示中文字,中文字分聲母、韻母、音調三種各佔一格,故中文字平均每字要3格但也有例外者。

A沒聲母的字(聲母ㄅ~ㄙ):沒ㄅ~ㄙ的字只有兩格。

B沒韻母的字:如『師』因點字規定要補上ㄦ韻,所以這種字佔3格。

C 有2個韻母的字:如『我』點字把2個韻母音造成結合韻所以2個韻母只用一格表示因此這種字算2格。

補充:

1. 點字機也會有window的概念,如果碰到這種情況要將視窗向右移動,這個通常由螢幕報讀軟體來為你處理,不過我們可以要求點字樂譜一行不要超過點字機的格數。

2. 英文:在點字顯示的規定中,全形就是半形的字後面加一格空白,數字也是如此規定。

最後是博丞設計的點字樂譜教學用的小遊戲的規則,不過還有待討論。

1.遊戲說明(instruction)
2.練習模式(practice mode):
(1)針對章節練習,章節分段依據為國際視障聯盟點字音樂記譜法委員會主編之新國際點字樂譜教材
(2)從樂曲中挑選一小節練習,無限制範圍
(3)完整樂曲練習,無限制範圍
(4)克服弱點練習,由程式統計出錯率最高的前n種樂譜記號,從裡面隨機挑選練習,且出現機率與出錯率成正向關係
練習模式讓使用者選擇是否限制時間,以及限制時間長度
3.生存模式(survival mode)
讓玩家選擇難度,難度取決於譜的複雜度及答題時間,遊戲方法為程式播出音樂並同步顯示點字樂譜,使用者必須在反映時間內按下正確對應的音方可得分,若連續得分有紅利,歌曲播玩則遊戲結束
4.挑戰模式(challenging mode)
使用者選擇難度,程式會配給一個總答題時間,難度越高則總答題時間越短,且重複播放樂曲的次數越少,樂曲越複雜,使用者按鈕指令程式才播放樂曲,時間內答對幾題算幾題分數,單題得分根據南度成正向關係,連續答對有紅利
5.關卡模式(block mode)
讓使用者以挑戰模式,但無法命令程式播放樂曲,把樂譜從簡單到難分成n關,在時間內答隊過關,答錯遊戲結束,不過可以有一些答錯機會,得分隨關卡上升而上升
6.紀錄(records)
針對每個模式做最佳紀錄,關卡模式中每個關卡也可擁有自己的最佳紀錄,得分與時間有關,就可以列出答題時間與分數

----------------------------------------------------------



2010/6/8  點字樂譜計劃的新起點

點字樂譜的計劃從這一次更新起進入一個新的起點。原因有以下幾點:

1. 薇慈已經將MusicXML的格式標準看完,並且將她對MusicXML的了解寫成一份投影片,我們將在六月底開始請薇慈教給博丞,然後我們會請博丞就他的理解寫一份專門給視障者看的。MusicXML是一種標準的樂譜檔案流通的標準格式,在點字樂譜資訊不足的情況下,這是另一個來源。容易解讀,規則簡單且國際通用是它的優點,缺點是檔案大,視障者要看要多摸很多字才行。

2. 昇瀚已經可以將比較簡單的 MusicXML所記錄的樂譜轉成音層式的點字樂譜,我要感謝他的努力。

3. 七月底時,昇瀚也會產出一份有關音程式點字樂譜投影片,這一分教材與我們看到的書不同的是他將以範例的方式為主,對一般學習者來說,單調的說明規則是很難有趣的學的。同樣的,我們會開始教給博丞,並請他自己重寫一份專門給視障者看的。

4. 我們團隊以參加今年的資策會的2010開放原始碼創新應用開發大賽為目標,項目是給視障者用的點字樂譜,應該歸類在電子書的應用方面,請大家努力。

我們的目標很清楚,那就是一方面訓練博丞可以學會這些技術,然後由博丞靠自己的努力轉化成真正符合視障者的需求的軟體,博丞可以就相關的研究繼續走下去,這不僅豐富他自己的生命,同時也照亮與鼓勵更多人,這其中當然包含我這個明眼人在內。

以下是昇瀚的程式的流程:

程式流程圖(Xml to Braille score)

步驟一:使用musicxml的library去對一個.xml檔案做trace

之後把trace後的物件存在一個vector裡面,

簡單的說,我們把本來的樹狀結構變得像是線性結構。

clip_image001

這個vector裡面的物件目前基本上有3種類型

(1) Attribute :記錄樂譜的屬性(調性,拍子)

(2) Note:紀錄一個音符的資訊

(3) Barline:紀錄特別的小節線記號

步驟二:從頭到尾trace先前存放物件的vector,並將其對應的點字樂譜輸出。

clip_image002

以下是昇瀚整理出來的點字字元的對照表:

數字點字: #

上位:A~I

下位:1~9

音符符號 C D E F G A B rest

8,128th D E F G H I J X

4,64th ? : $ ] \ [ W U

2,32th N O P Q R S T V

1,16th Y Z & = ( ! ) M

音層符號

1 2 3 4 5 6 7

@ ^ _ " . ; ,

附點:'

圓滑線:

兩個音符之間的圓滑線 C

四個以上的音符或和弦的樂句圓滑線 begin:';B' end:'^2'

小節線;

一般小節線 (空方)

特別用途小節線 L

虛點小節線 K

結尾複縱線 <K

小節或樂段結束小節線 <K'

墨印譜反覆記號:

反覆開始記號 <7

反覆結束記號 <2

第一節束 第二結束 '#' + '下位數字'

segno反覆記號 +

結尾記號(coda) +L

最後是昇瀚用程式由MusicXML的檔案轉出來的點字樂譜。曲子最多只有24小節,請有興趣的朋友來試一下。

下面是第一首:

#F8

DJIHIJ DEJ?CH IJDIJH DJD:CF DHG$E DHG$CE #1DJD[C"F _I"FF_['<2 #2DJDIJD ZCYCEJ?' <7FEDWCI ?CE$CE DJD[CJ HIJ?CH IJDIJH DJD:CF DHG$CE DHG$CE #1D

JD[C"F _I"FF_['<2 #2DJDIJD ZCYCEJ?'<K

下面是第二首:

#B4

.?? .\\ [[ \\ ]] $$ :E'& N<K .\\ ]] $$ ::\\ ]] $F'= $: ?C? .\\ [[ \\ ]] $$ :E'& N

----------------------------------------------------------



 

2010/4/20

這星期兩位同學已經將MusicXML的程式庫裝起來,並且執行了裡面的某些簡單的程式了,看來沒有太大的問題,在執行的程式裡有幾支程式值得我們注意一下,

第一支是將以MusicXML格式所編寫的樂譜的檔案轉成MIDI檔案,範例中的曲子有一些還頗為複雜,有Faure,Mozart,Schubert,Telemann,…,等人的曲子。

第二支是將以MusicXML檔案進一步分解成基本要件,在文件中稱之為xmlelement,這是一個將音樂要素用一種比較簡單的方式呈現出來的中介格式,這會對我們以後開發應用程式有幫助。

第三支是將MusicXML的檔案以樹狀結構表示,並且可以拜訪此一樹狀結構的節點的程式,對分析檔案很有幫助。

由於昇瀚在看的音程點字的書並無點字版,除了向淡江大學反應外,我們預計最近有下面的工作要進行:

1. 昇瀚負責寫一份電子文件,利用例子,從簡單的點字樂譜規則開始介紹起,希望是有文字,有點字樂譜,以及可以聽到聲音(用MIDI)的教學文件。

2.   昇瀚與薇慈開始寫一支程式將簡單的曲子由MusicXML轉成音程點字。這份程式並非最終我們要開發的,只是在我們都不十分熟悉MusicXML與音程點字的情況下,當做是一次練習,務必在短時間內完成。希望我們可以獲得經驗以便訂出最終的系統架構。

3. 接續昇瀚的音程點字教學文件,我們將開始教博丞音程點字,然後希望博丞學會後,改寫此一文件為適合視障者學習的文件,昇瀚會慢慢的將更複雜的規則加入以產生更多更進階的文件,然後再一一由博丞改寫。

4. 薇慈開始寫MusicXML教學文件。

5. 我們現在多一個生力軍,櫻芳。櫻芳將負責寫出一份適合視障者使用的MIDI撥放器。下星期請櫻芳開始報告trace MIDI Parser程式的進度並討論此一播放器的規格。

有一件事值得一提,那就是MusicXML雖然官網上說可以支援Windows,不過目前程式在 Windows下執行不起來,所以大家以後要有心理準備就是要用Linux,而以我們做Open Source的態度,用Linux也是一件好事。



---------------------------------------------------

2010/4/13

目前昇瀚與薇慈已經很盡責的將MusicXML與音層點字樂譜的最重要的部分報告完了。我們接下去有幾個重要的工作要進行:

1. 因為目前sheet music的電腦檔案的交換的標準格式是MusicXML,所以我們希望以MusicXML為所有轉換的中心基準,不過要分解與分析一個MusicXML檔案要做的工作很多,所幸,網路上有一個開放原始碼的計畫(Open Source Project),許多要用的函式都已經有了,因此我們需要去了解一下這些函式庫有時做哪些我們需要的功能。

MusicXML Open Source Project

2. 網路上同時有許多轉換器(Converter)可以將不同格式的音樂檔案互轉,如: MusicXML,MIDI,…,等,我們需要去找一下有沒有Open Source,假如沒有,除了自己實做之外,也可以用檔案的方式來當作中介,例如,我們可以依照張育豪先生的需求做一個MIDI,但是可以用這些Open Source或者是LAME先寫到檔案去,然後我們在自己解析此一MIDI檔案即可。

3. 試著編譯並執行一些人家在Open Source 網頁上已經寫好的有關MusicXML的應用程式,或者甚至自己寫幾個看看。

4. 了解libmusicxml中的SScore的格式以及設計一個自己將來要轉換成點字樂譜時方便工作的資料結構。

5. 請博丞開始了解音層點字的規則,有困難的話可以請教昇瀚或甘老師。另外薇慈會寫一份入門的MusicXML的教材,並且用一首簡單的曲子,如Mozart K.545來教博丞有關 Music XML,未來希望由昇瀚寫程式將MusicXML轉成點字,然後由博丞將點字轉回MusicXML。

有關昇瀚與薇慈的MusicXML與音層式點字樂譜投影片可以在此看到:

MusicXML與點字樂譜



-------------------------------------------------

2010/3/26

博丞給我一封信,說明我之前對使用膠片用釘子打出的點字樂譜的說明是不正確的。正確的說法是:

“張爸爸用柏金斯點字機打在有自黏性的連續膠膜(點字紙)上”

據博丞說,這膠模很硬很難打。另外就是張紫茵小朋友的照片很模糊,他會寄一張清楚的給我。

下星期,音層式點字樂譜與MusicXML會做最後一次的規格報告,我會請昇瀚與薇慈寫一份比較易讀的文件放在網路上提供給大家參考,並且預計請博丞看完後也出一版適合視障朋友看的文件。

接下來,我們要做的工作包含MIDI軟體的開發,樂譜資料結構的確認以及討論如何呈現Parse MusicXML檔案的結果。假如博丞對於上述文件研讀後沒問題而我們也訂好呈現Parse MusicXML檔案的方式,那麼,我麼可以開始討論如何讓電腦來幫助樂譜導讀,希望這是一個用多媒體來呈現導讀的工具。

有關昇瀚與薇慈的MusicXML與音層式點字樂譜投影片可以在此看到:

MusicXML與點字樂譜



---------------------------------------------------

2009年, 成大資訊工程系裡出現一位勇士.

他自小就是一個非常聰明的學生, 但是不知道從什麼時候開始, 他的大腦開始出現不正常的跡象, 首先是視力開始模糊, 漸漸的聽力也受影響, 甚至肢體也開始變得不靈活. 不過他還是輕易地考上了南一中, 三年的高中生涯, 他的視力慢慢減退到已經接近看不見的地步, 可是他的功課還是一直是名列前茅, 今年以第一志願進入我們系就讀. 對我來說, 這是我自認為我辦不到的, 我不能不以勇士來稱呼他.

自小就學習音樂, 音樂一直是他無法割捨的喜愛, 但是因為視力的關係, 必須依賴點字樂譜, 可是一般的點字樂譜對他來說很不方便, 因為不僅是因為重量的關係, 還有就是以一個如此聰慧的人來說, 這樣的編排方式太不方便了.

母親跟我提了這個問題, 我想著這要怎麼解決呢?

最後決定找他一起來討論他所需要的功能, 為他量身打造. 同時也與他的音樂老師, 蔡宗妃老師連絡, 她很快的就答應幫忙, 並且邀請她的孩子, 同時是台大電機系的學生也是念過音樂資優班的學生, 一起來想辦法.

今年, 我預計找一組專題學生來起始這個計畫, 希望可以在一到兩年內讓我們的勇士身上多了一樣武器, 以及玩具, 讓他繼續代表我們跟命運對抗.

PS: 中央大學有關點字樂譜的研究成果

---------------------------------------------------

 2010/3/7

今天的活動是在台南大學啟明苑舉行的有關視障樂譜的演講,由美國麻州大學 (University of
Massachusetts Boston)兼任教授余月霞博士與台南大學特教系林慶仁教授主持,其他的還有一些在視障樂譜的教學上有經驗的老師一起來分享,與會的還有許多學生,我因為上午有事只好錯過余博士的演講,但是下午的分享一樣精彩。

尤其是甘光耀老師分享他多年的教學經驗以及展示的許多家長為它們的孩子們所”打造”的教具,我只能說是天下父母心,看著看著,我的眼淚都快滴出來了。

DSC02022

甘老師手上拿的是一位家長開模製出的鐵做的用來壓製泡棉而成的音樂符號的工具。壓製的結果如下:

DSC02023

DSC02028

一位家長用點字機打出點字樂譜,再一筆一劃描繪出相對的五線譜。

DSC02024

接著是另一位家長用曲線膠帶及泡泡筆製作完成的半立體五線譜 。

DSC02029

這是其中的家長與他的小朋友。

DSC02027

這位小朋友出的CD與DVD

DSC02025

台南大學的學生的作品。用Wii的遙控器定位,並且用RFID貼在與音符形狀相同的泡棉上,移動泡棉符號在劃有五線譜格線上就可以發出對的音高。

DSC02032DSC02031

拿麥克風的是余博士,她的左手邊的是林教授。最右邊是教育部的長官。

DSC02033

當天與會的人,很踴躍。

以下是廠商的教具,聽說要好幾萬。

DSC02034 DSC02035 DSC02038

會中對於點字樂譜的教學經驗有許多分享,個人覺得獲益良多。我在會中提出一些並不是非常成熟的意見,在此記錄並提供大家參考:

1. 報讀者對學習是很重要的,但是報讀者通常是老師,但是假如可以讓電腦念樂譜給視障者聽,那麼會更方便,這中間牽涉到樂譜解釋的問題以及Text-to-Speech的技術(TTS)。

2.   樂譜來源其實不是問題,我們可以在網路上找到許多MIDI檔,這是視障朋友可以接受的格式,另外還有以MusicXML為格式的檔案,我認為只要轉檔(格式轉換)的程式夠好,搭配觸摸器就可以了。

3.   多數人會希望以西方記譜方式來學音樂,從正統音樂學習方面是很好的,不過古老時代用的文字譜也是可以參考的,我認為學音樂不一定就是學西樂,而記譜方式假如是一定要用為明眼人發展出來的記譜方式,其實沒道哩,文字譜可以讓視障朋友不必多學一套系統,文字譜事實上可以容納更多音樂資訊也更自由,我當天舉的古琴用的減字譜也許不太合適,因為減字譜沒有音長的資訊,不過假如需要加上去即可,這是當天有一位小朋友舉出來的,但是也許我的說法讓與會的人以為我要取消點字樂譜或甚至西方記譜方式,其實是誤會了,制式樂譜還是我們的參考標準,文字譜可以用來輔助,因此假如結合前述解釋樂譜為文字的話,那麼文字譜與西方制式樂譜的互轉其實不是不可能的。 請大家從為視障朋友的使用上著想才是比較重要的。

4. 用掃描筆或掃描器以OCR的方式辨識樂譜是短期內比較可以做到的,在Goodfeel裡有類似功能了。

5.   2D觸摸器的開發也許可以有幫助,不過定位與格式的問題待解決以及人類觸覺解析的能力還有待研究,也許2D觸摸器開發出來後我們才會真正知道它的用途。

6. 確定點字樂譜將以音層式為主。

7. 另外與會的張育豪先生與黃靜玲小姐希望能有一個軟體可以將MIDI檔案分軌來播放, 選某幾軌一起播放以及調整播放速度。雖然很多軟體如CakeWalk都有類似功能,但是並不方便使用,這一點我們應該要幫忙。

古典音樂的MIDI檔可以在此處獲得: 古典音樂MIDI

此網站有關Mozart的在此: Mozart MIDI

最後是關於此一計畫大學部專題生的每周報告可以在此看到: 點字樂譜專題

目前最主要的工作是了解MIDI,MusicXML與音層點字規則以及Goodfeel的使用方式,期待這一年我們可以開發出轉檔程式給大家用。

---------------------------------------------------

2010/2/7

今天我們一群人一起到甘光耀老師與楊淑雅老師家裡請教有關點字樂譜的資訊.

我簡單做個結論:

1. 點字樂譜分音符式與音程式兩種, 國際上採用的是後者. 淡江大學有一套音符式的簡易做法, 國內有許多人使用.

結論: 以MusicXML與MIDI為中心,  再轉成其他格式. 初步是希望有一套音程式點字樂譜的subset, 這樣比較容易閱讀. 但是必須是電腦自動自源樂譜filter過後的.

2. 點字樂譜的排列是水平的, 而一般人讀譜是水平與垂直交互使用的. 而且是以小節為單位, 另外表情記號都夾雜在其中. 這一點連Goodfeel都是如此.

結論: 更改rendering的方式, 來支援水平與垂直交互呈現.

3. Goodfeel可以用鍵盤輸入與演奏樂器輸入, 可以幫助作曲.

結論: 應該不難, 我們可以協助. 但是Goodfeel的JAWS其實並不需要.

4.  中華民國無障礙科技協會網頁的midi檔案

結論:  我們去下載來測試.

5. 2005/2/5所討論的人機介面功能應該做進去.

6. 另外博丞對於觸摸器有幾點他的意見:

     a. 觸摸器希望是2D的. 而且此一觸摸器是由使用者決定要怎麼顯示. 這希望是透過一套語言, 或者其實應該是程式, 這一程式需要有一個好用的介面幫助使用者方便地定義他自己要的顯示方式與格式.

      b.  觸摸器應該同時也具備鍵盤的輸入功能.

      c.   將Windows的使用方式透過觸摸器來模擬, 讓視障者也可以使用類似Windows的這樣的作業系統.博丞提到希望設計一個盲人用的OS, 不過我不認為這是需要的, 因為盲人缺乏的是方便的介面而已, 而OS的功用是在管理電腦, 介面只是應用(AP)罷了. 在任一套作業系統上, 只要介面的設計有考慮到使用者就可以. 這件事其實可以用早期的Windows 3.0來解釋, 那就是Windows 3.0的核心其實還是MS-DOS, 多增加出來的圖形介面不過是架在OS上的AP而已.

        d.   將觸摸器也納入一般Windows的Utility, 如此公開化後, 要修改就容易了.

2010/2/9 昇瀚約甘光耀老師demo Goodfeel.

---------------------------------------------------



2010/2/5

今天我們開第二次會議, 決定要起頭的部分. 會議成員有小聽, 昇瀚, 薇慈, 與DNA.

我先就我之前想的說一遍, 大家都有表達一下意見. 小聽因為學過鋼琴, 所以提出的意見比較多. 另外小聽跟DNA都覺得假如能用某種方法指示演出者的對錯也是個除了譜之外可以協助的方法. 因此我們訂出幾個起頭的方向:

1. 檔案格式互換或增加格式以便未來增加功能

    這部份以了解MusicXML為主, 配合實驗室既有的MIDI Parser, 希望可以將不同格式的檔案作互換, 並希望在MusicXML裡增加可以加入MP3過其他聲音的格式的資料.

2. 人機介面的研究, 包含:

     a.  聲控

     b. 指示對錯與演奏手法

     c.  Text to Speech

     d. 聲音合成

     e. 加入解說聲音到檔案時所需考慮的操作以及軟體設計

      f. 將樂譜轉成中文解說: Score to Interpret.

3. 了解現有的Goodfeel有哪些功能

    我們初步希望做一個所謂的播放器, 或者稱之為Renderer, 來播放MusicXML的檔案. 但是我們只會做最常用的功能, 並且先以中文為主. 這部份我們決定2/6跟博丞一起到楊淑雅老師處取經.

目前暫定, Part 1由薇慈來負責, Part 2由昇瀚負責, Part 3則是兩人一起來. Score-to-Interpret希望由博丞自己來. 小聽當總負責人, 我負責做記錄.



 

---------------------------------------------------

2010/2/1

根據博承的尋訪幾位使用盲人用點字樂譜軟體, 得知目前此依軟體是師大余月霞教授在教授. 此依軟體名為: Goodfeel. 其網頁如下:

Goodfeel 點字樂譜軟體

Goodfeel必須結合幾樣軟體才可以發揮其最大效益, 如: JAWS-based Lime Aloud 6.X以上, SharpEye, Final等. 其中又以Lime Aloud為最重要.

JAWS: Screen Reader

Lime Aloud: JAWS-based Lime Aloud

Lime Aloud需要在JAW for Windows下運作. 使用Lime Aloud可以讓使用者用PC的鍵盤就可以在點字顯示機上顯示單音, 和絃, 並且以電腦來發音指示樂譜上的其他的資訊, 如表情記號與歌詞等等.

使用SharpEye可以用掃描器把樂譜掃進去, 不過我懷疑其正確率的高低, 當然這還是一個很有用的功能.

除此之外, 透過使用MusicXML的格式, Goodfeel可以讀其他軟體, 如Finale, 所產生的檔案.

MusicXML: Internet-friendly method of publishing musical scores

接下來應該是去看一下會用這套系統的人的demo.

從它可以提供的功能來說, 其實是算完備的, 我不知道這樣子我們還有什麼可以自己來的空間, 難道真的需要自己來開發這樣的一套類似的軟體嗎?

這是所有的研究開發者第一個會問自己的問題. 目前我所能想到的是:

1. 這套系統只有英文, 但是我覺得這應該不是問題.

2. 樂譜記號的說明只有英文, 德文與西班牙文發音, 不過我覺得這也不是問題, 因為學西方音樂的多半會念一點德文, 義大利文, 等.

3. Random access的功能以及呈現方式是否具備彈性

4. 自動將樂譜的資訊轉譯成文字, 再由Text to Speech念出, 這一點是吳宗憲老師建議的.

5. 合成樂器發聲

6. 將老師的解說嵌入到MusicXML的檔案裡, 也就是可能要修改一點MusicXML格式.

我們2/5先就這些來討論吧!

2010年6月28日 星期一

恭喜老師榮獲 國立成功大學99學年度全校特優教師

http://www.csie.ncku.edu.tw/new/nckucsie/index.php?content=NEWS&ID=656

恭賀 蘇文鈺 老師 榮獲 國立成功大學99學年度全校特優教師
資訊系全體同仁 賀

相關網址:無
張貼人員:系辦人員
張貼時間:2010-06-09
附加檔案:無附加檔案


http://news.secr.ncku.edu.tw/files/13-1054-67041-1.php

【台南訊】為強化導師輔導功能、鼓勵導師熱心參與學生輔導工作,國立成功大學11日公布98學年度全校特優導師及各學院優良導師得獎名單。歷史系講師廖秀真、工科系副教授侯廷偉、資訊系教授蘇文鈺等人對於輔導學生生活、學習與活動等成效卓著,足堪表率,獲選為全校特優導師,每人將獲頒獎牌乙座及獎金新台幣五萬元,頒獎典禮訂於11月8日舉行。

(略)

資訊系教授蘇文鈺認為輔導學生不是要向他們傳遞理念或者是把書讀好,而是要傾聽他們的聲音,了解他們真正需要的幫助是什麼,然後對症下藥。蘇文鈺教授成功輔導過一名日籍學生,協助他利用工程知識開創另一個事業,也關懷過有點自閉傾向的學生,透過輕鬆的談天解決他的困擾並降低他的焦慮。而對於不是自己導生的視障生,蘇文鈺教授也特別給予關懷,邀請他共同研究開發一套給視障者用的音樂工具,未來並計畫推薦該名學生到國外頂尖的研究所就讀。

(略)

成功大學於96年校務會議通過優良導師獎勵與遴選實施要點,所謂優良導師,係指擔任導師工作一年以上,對學生輔導工作熱心參與,在輔導學生生活、學習與活動等著有成效,堪為表率者。全校特優導師及各學院優良導師之遴選,每學年辦理一次,遴選流程係先由各系自行推薦一名導師(若該系導師人數達20人以上者,得推薦二位導師至各學院)。再由各學院召開審查會議,遴選「各學院優良導師」,各學院優良導師以遴選一名為原則(若全學院導師人數每達60人以上者,得增加推薦一位學院優良導師至學校)。最後,導師績效獎勵委員會從各學院推薦的優良導師中遴選「全校特優導師」三名。990611c


恭喜老師啊!雖然知道老師喜歡低調點,不過還是忍不住 XD

2010年6月14日 星期一

巴哈無伴奏音符標記 - 皓鈞

2010.04.08~2010.06.07=============================

  • 進度更新(6/14):
    1. 小明學長發現之前我標的地方,有一些地方有標錯。大部分是音量少負號,另外有一些可能是標的時候不小心打錯。已更正。
    2. 標完前68個cue(track)。
    3. 相關檔案:音檔標記Excel檔
  • 進度更新(6/7):
    1. 標完前59個cue(track)。
    2. 相關檔案:音檔標記Excel檔
  • 進度更新(5/4):
    1. 標完前50個cue(track)。
    2. 相關檔案:音檔標記Excel檔
  • 進度更新(4/28):
    1. 標完前45個cue(track)。
    2. 相關檔案:音檔標記Excel檔
  • 進度更新(4/23):
    1. 本來想標完前四十個cue(track)再一起更新,不過cue_037和cue_040比較複雜,所以先更新其他的部分。
    2. Excel的格式有點怪怪的,我畫的線和填上的顏色全部都消失了,可能要再想辦法找看看有沒有自動存檔。
    3. 沒找到自動存檔,重新畫隔線。不過有一些之前有註記的點,像是抖音的高點和低點,或是一些比較奇怪的點就不曉得在哪裡了。
    4. 相關檔案:音檔標記Excel檔
  • 進度更新(4/12):
    1. 標完前22個cue(track),約11點多秒。
    2. 相關檔案:音檔標記Excel檔
  • 進度更新(4/08):
    1. 修改cue_007前面標寄錯誤的地方。
    2. 標完前16個cue(track),約9點多秒。
    3. 相關檔案:音檔標記Excel檔








2010.03.29========================================

  • 進度更新:
    1. 標完前10秒16個cue(track)中的8個cue(track),約5點多秒。
    2. 相關檔案:音檔標記Excel檔

  • Meeting投影片
    1. 主要內容是講一下目前做的東西,以及上禮拜遇到的一些問題。不過因為meeting時間已經超過,所以就沒有報告;只放上投影片,下次meeting再一起報告。



2010.03.25========================================

  • 上禮拜老師提出來的問題〈3/17的意見〉:
    1. 我開始標記的時間點之前,就已經有聲音發出來了;也就是說我一開始是否有漏標某些音符?
    2. 哪些音該留下來,延音或殘響有沒有注意到?

  • 關於這個問題,在檢視頻譜之後發現:
    1. 因為我原本只標記F0的音高和音量,而我第一個標記的cue(track)它能量最強的一根並非F0本身,而是F0的三倍頻。所以雖然F0本身在1.3秒以後才有能量,可是它的三倍頻卻

      在1.11秒的地方就有能量;所以在1.3秒之前出現的聲音我都漏掉了。

  • 在和老師還有小明學長討論之後,決定更改標記的方式如下:
    1. 對於每個音的音高,仍然以F0的頻率來標記。
    2. 對於每個音的音量,改成標記那個音前四倍頻中最大的能量。
    3. 當一個音的能量小於-72dB時,才當做那個音已經消失(停止標記)。

  • 目前進度:
    1. 因為更改標記的方式,所以重頭標記,之前標了一部分的16個cue(track)只有起始點仍然相同。其中cue_004以前已經標記完,cue_005之後則因為還沒標記到,所以其結束點

      都還沒更改
    2. 已標完的四個cue(track),cue_004有一小段有抖音。和小明學長討論之後,抖音的地方頻率只記裡面的高點和低點的頻率,高點和低點中間的點的頻率則用內差的方法計算出

      來。
    3. 相關檔案:目前標記完的音符音檔



2010.03.17========================================
  1. 修正之前標記錯誤的地方,刪掉幾個多標的cue(track),修改後剩下16個cue(track)。
  2. 這16個cue(track)中目前只標完前三個,約占九秒鐘的四分之一,所以應該是兩秒鐘左右。
  3. 相關檔案:修改後音檔已標記音符樂譜(free-scores.com)







2010.03.12========================================
這次的工作是要練習標記一首曲子F0的音高(頻率,Hz)和音量(能量,dB),時間以10ms為單位。目標是希望兩個月內能標完2-3首曲子,標記的第一首曲子是小提琴演奏的巴哈無伴

奏。


  1. 專輯名稱:Sonatas & Partitas BWV 1001-1006
  2. 標記曲目:Sonata 1 in Sol Minor - Adagio
  3. 曲目長度:3分19秒
  4. 檔案格式:wav
目前的進度是先找出前九秒的音樂中出現的cue,共找到18個。然後用CoolEdit標記這18個cue,儲存在標記的wav檔中(在CoolEdit中可以直接按alt+8來看cue list)。接下來會針

對這18個cue分別去標記其音高和音量,目前打算用Excel來儲存標記的結果(格式);然後會重複上述的動作直到標記完整首曲目。

2010年6月3日 星期四

State-of-art Computer Music

相信大家對 Chuck 不陌生吧?老師之前常介紹到了一種On-the-fly programming,它實現了透過即時寫程式來創造音樂。



一個再好的系統,如果沒有人使用,就不會有更多的需求出現,因此在youtube上不難找到Ge Wang在公園或校園展示Chuck的影片。

Computer Music現今最流行的應用,就是Laptop Orchestra,在網路上可以查到兩個最有名的例子,一個是Perry Cook所在的PLORk - Princeton Laptop Orchestra,另一個是Ge Wang所在的SLORk - Stanford Laptop Orchestra。前者創立的時間較早,2006年便有在公開場合演出,其特色是會帶很多奇怪的機械物品接上電腦來發出特別的聲音。底下影片第一個出現的指揮家就是Cook.

 

Ge Wang在開發完Chuck後,在2008春天成立這個group,他們比較重視 user interface,所以戶外的展示是用IKEA salad bowl 做成的喇叭,看起來可愛多了;當然也少不了Chuck的賣點之一: 3D畫面的呈現。

 

後來,Ge Wang用Chuck自己出來另外做個 Smule 的產品,由於iPhone與iPad友善介面的加持,現在要表演,連打程式的省了,取而代之的是Glee, magic piano, I Am T-Pain….等不同介面的產品。不過既然是個產品了我就不多作介紹以免有打廣告之嫌。XD

 

除了這兩個group外,我後來在Cook那簡陋的首頁上找到了 KarmetiK : 一個同樣是由許多工程師跟音樂家所組成的 group,它們做的project稱之為 Machine Orchestra。

 

顧名思義,他們是支由機器所組成的交響樂團,因此所有樂器都是由現有樂器大改造而成的。

 

最後給一個Ge Wang演講的影片,時間很長,對Chuck有興趣的可以看看。

2010年5月20日 星期四

關於blogger首頁剩兩篇文章的問題

由於我自己的使用習慣是用google reader訂閱 lab blog 的文章及迴響,平時沒事不會直接開首頁,因此老師反應時我才發現有這問題。

這個問題起因於Blogger於2/18推出的自動分頁(audo pagination)機制,只要貼出來的文章含有大量佔空間的圖或HTML碼,首頁就會只顯示兩頁,修改背景的設定無用。剛好本lab貼文的習慣是會在同一篇文章持續update進度,因此一定會遇到這問題。

解決辦法是:

1. 使用官方的繼續閱讀功能。lab blog已經有使用其他版本的功能,要換成官方的會導致設定及貼文習慣變更。

2. 修改繼續閱讀Hack。(徵求強者)

References:

http://01mistery.blogspot.com/2010/02/auto-pagination.html

http://abintech.twidv.com/2010/02/blogger-auto-pagination.html

2010年4月10日 星期六

3 points about writing a paper

 剛跟另一個博班生meeting兼哈啦, 聊到關於寫paper,他提到一 些我一直漏掉的點,跟大家分享一下。
 
 先講結論:由於Reviewer都是大忙人,所以你最好不要讓他「花太多腦筋」去「想」你做的事情。也不要讓他「論文看到後頭,還要翻到前頭,才能懂你在講什麼」。
 
 在我有限的寫論文經驗裡,大概是寫關於實作的論文居多,所以很習慣把我做了什麼就寫什麼。這樣下來,基本上就是能說的東西很少,然後Reviewer看完也茫茫然。所以,你得先把你接下來要做的事情其前因後果解釋一次,然後才陳述你做了什麼事。
 
 第二點,如果一件事不是單純的「因為A,所以B」,那最好把中間曲折離奇的事情都一併交代一下(好吧,即使沒有那麼曲折,也最好解釋一下)。這樣Reviewer就不用卡住在一些奇怪的地方,更慘的是還在那兒鑽牛角尖,大作文章,而忽略了你真正想講的事情。
 
 第三點,即使很前面章節鉅細靡遺講解、描述過的理論、方法、事情,在後面章節要敘述相關實作時,還是要提點一下前因後果,重新refresh讀者的記憶。
 
 希望對大家有一點點幫助。
 

2010年4月5日 星期一

Improve MATLAB Figures And using Latex for Publication

之前在用matlab輸出論文圖檔時總覺得不漂亮, 還有就是弄成pdf後, 圖就失真很多, 究其原因是我都存成bmp/jpg, 然後再import to word, 最近才發現其實該轉成用EPS檔, 它是vector file. 然後, 該考慮用latex啦. 列一些link 給大家參考:

[Matlab]


[Latex tool]
Lyx What you see is what you mean LeTax Editor, Syntax-free (MiKTex required!)
LEd LaTex Editor Syntax required, you can see the result without converting to pdf.

MetaFile2EPS (included in Lyx package)

2010年3月27日 星期六

Multi-SPARC Virtual Platform -- 品皓

======================5/17============================
meeting投影片

利用之前完成的觀測instruction cycle執行數的功能,觀測自己寫的矩陣相乘程式。

40X40 矩陣相乘,分給四個core,切割方式是每一個task計算出一個element,也就是說每個task接收80個elements,處理40個乘加運算,最後產生一個element並送出。總共有1600個task。一個task所需的instruction cycle數:
wait input: 557
calculation: 2119
send output: 82

以上是平均的結果,但是meeting時大家疑問為什麼40個乘加需要花費這麼多instruction?

之後檢討,觀察assembly code,一個整數的乘法是呼叫一個function .umul


.umul 是在做bit的乘法(mulscc),也就是說一個32 bit的整數他需要做32次mulscc


其中的原因是sparc gcc預設是產生v7的instuction code,為了產生v8的必須加上參數-mcpu=v8。產生的結果是一個整數乘法只需一個instuction完成(smul)。



v8 task所需的instruction cycle數:
wait input: 481
calculation: 354
send output: 82

整個40x40的矩陣相乘所需的instruction cycle數
wait input: 191919 ~ 192591
calculation: 141645
send output: 32718

wait input數據有點差距的原因是程式的行為,開始是四個core同時在等待input,但是外部module送input data卻是一次只能送一個,所以才會造成這一點差距。

======================4/26============================
主要是完成上禮拜做一半的事情,完成外部module透過Multi-core’s Interface與core溝通的能力;並改寫應用程式: 矩陣相乘,改成input & output data皆由ELF sender收送。

另外一個是觀測instruction執行數的功能。
寫成一個應用程式(ELF)可呼叫的function,包在library裡。功用是回傳目前執行總cycle數。
用法跟一般timer類似,想紀錄一段測試程式執行所花費的cycle數時,在測試程式執行前紀錄當下時間,和測試程式執行結束後的當下時間,兩個數值相減就是所要的。

實作方面,此暫存值紀錄在buffer state裡(下圖的inst count),ELF裡的function call只是回傳那個暫存器的資料,實際上是由模擬器更新,也就是SPARC ISS每個cycle更新一次。



======================4/13============================

修改之前呈現的範例程式: 矩陣相乘
原本為了趕比賽把input data寫死在ELF裡,ELF sender把應用程式透過multi-core's interface把執行檔分給所有的core,不同的core自行取用運算所需的input,運算結果全部傳到其中一個core收集並結束。改成input & output data皆由ELF sender收送,core只負責收input和把運算結果output就好。

簡單的說就是需要外部module透過Multi-core’s Interface與core溝通的能力。我的想法是如同之前core之間的溝通方式;也就是增加與sc_port對應的I/O buffer,如同SPARC ISS的I/O buffer。Interface作資料讀寫看到的仍是buffers,並無多少改變。


這樣的好處是可以沿用舊有的溝通方式。不管是core還是sc_port,資料讀寫時看到的都是自己的I/O buffer,同樣interface在處理資料收送時,看到的同樣是buffers,整體上不會修改到太多。


之後還會加上別的功能如多個multi-core's interface的溝通,仍然是透過sc_port,所以應該也可以透過同樣的方式溝通。
======================3/28============================
比賽影片

比賽文件


上禮拜meeting時報告了幾個case執行的數據如下:
Case: 12X12矩陣相乘 分給四個core執行
total Instruction executed: 9,346,711 X 4
Time: 40.92 sec

Case: 12X12矩陣相乘 分給一個core執行
total Instruction executed: 34,639,538
Time: 55.29 sec

這數據蠻奇怪的,模擬34M指令需要55秒,模擬36M指令卻只要41秒?
因為明明是在同一台電腦上模擬,模擬四個core的效率竟然比一個core好。

後來找了很久才發現是systemc kernal的overhead問題,因為我的模擬器是這樣設計的,每跳一個clock所有的ISS就執行一個instruction,而模擬一個instruction的工作量比起systemc kernal小很多。也就是說模擬一個core就是每一個clock跑一個instruction和一次systemc kernal,模擬四個core就是每一個clock跑四個instruction和一個systemc kernal。

判斷這問題的方式則是增加每個instruction模擬的工作量即可,我的作法是加入很長的迴圈,之後得到的數據就比較正常了
Case: 12X12矩陣相乘 分給四個core執行
total Instruction executed: 4.2M X 4
Time: 502 sec

Case: 12X12矩陣相乘 分給一個core執行
total Instruction executed: 14.5M
Time: 436 sec


======================3/16============================

之前有提到,編譯應用程式ELF時裡面的I/O buffer的宣告和使用我是包成一個c library,使用者撰寫應用程式時必須include這個library,那麼編譯時如果有作最佳化是否會出問題?

答案是會的......

最後我避免的方式是加入attribute的設定,可以強制編譯器在處理這個function時使用指定的最佳化等級,譬如以下範例:
void foo () __attribute__ ((optimize(0)));
void foo () {
.........
}
表示foo()這個function編譯時強制使用optimization level 0,只是這方法只能在gcc上使用。

另外是把GDB的功能加到SPARC ISS上。使用ArchC產生SPARC ISS 時就有順帶產生SPARC GDB stub function,雖然ArchC文件寫GDB這段寫的不清不楚的,但是因為之前有作過8051 debugging stub,所以花了點時間trace code就知道怎麼用了。之後簡單測試了幾個指令:中斷點,單步執行,讀寫變數都沒有問題。



目前測試情況如上圖:左邊數來第一個視窗為systemC虛擬平台上兩個SPARC ISS,各一個GDB stub在跑,右邊兩個GDB視窗與之相連。由於systemc是單執行序的模擬方式,所以同時間只會有一個GDB端在與其對應的GDB stub溝通,其他的則是在等待狀態。

======================3/8============================

目前正在作多個SPARC ISS之間的資料讀寫問題,架構與溝通方式以下分段講解:
1.架構:一個中央模組ISS interface連接所有SPARC ISS,也就是全部透過sc_interface與ISS interface相連。每個SPARC ISS都會有I/O buffer各一個,和一個state buffer,ISS interface檢查每個SPARC ISS的I/O buffer並執行搬運資料的動作來達成。

那些buffer是SPARC ISS裡面執行的測試程式(test.elf)宣告在SPARC memory裡的。這裡就關係到應用程式設計者要怎麼使用I/O buffer來達成多核分工的問題。I/O buffer的宣告和使用我是包成一個c library,使用者撰寫應用程式時必須include這個library,並在程式一開始時呼叫buffer初始化的function。之後使用者就可以使用裡面的function進行多核之間的資料讀寫。

這裡比較麻煩的是buffer的位子,是由sparc gcc安排在 sparc memory,包在elf裡。因為ISS interface在存取I/O buffer時必須知道其位子,因此需要buffer初始化。

SPARC ISS載入elf後從pc = 0開始執行。elf裡一開始一定會執行buffer初始化,將I/O buffer address指定在幾個local register並等待(無限迴圈)ISS interface讀取。ISS interface讀取完後將建立一個I/O buffer address table,之後讀寫資料根據此table。ISS interface建立完table後告知SPARC ISS,跳脫等待的無限迴圈並結束buffer的初始化,之後就繼續執行elf的程式。



2. 溝通方式:假設有兩個SPARC ISS A&B,A寫資料給B,如上圖producer->consumer。
A將要寫的資料寫到自己的output buffer並註明目標為B
ISS interface檢查每個SPARC ISS的I/O buffer,知道A有資料要給B
ISS interface檢查B的input buffer是否為空
如果為空,將A的output buffer搬到B的input buffer
B檢查自己的input buffer是否為空以得知有沒有別人傳資料給他。

=====================================================
整個計畫的起始點是從一個單核SPARC simulator開始. 我找了很多模擬器, 最後決定用ArchC. ArchC為 Architecture Description Language, 我用ArchC產生SPARC V8 指令模擬器, 產生出來的模擬器是純c code, 包成一個SystemC module, 且支援gdb的樣子. 測試程式可以由sparc gcc編譯出的elf直接放到指令模擬器上執行.

有了SPARC ISS和其支援工具, 接下來是要發展成多核虛擬平台. 目的是可以將一個應用程式差成多個子程式, 放在不同的SPARC ISS上執行, 最後共同完成此應用程式的功能, 達到多核分工的目標.