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。

47 則留言:

SCREAMLab 提到...

有時我們改變音高時不會改到半音這麼多, 所以這部分要再討論一下多一點圖型表示的方法, 也就是不只五線譜一種.

Wayne 提到...

那就再加個簡譜囉,例如像這樣:
原始五線譜
簡譜
這樣簡譜表示可以嗎?

SCREAMLab 提到...

簡譜一樣是量會之後的結果, 所以AL的版本是show出一般記譜方式的音高, 但是可以看到他真正的頻率變化的.

87showmin 提到...

下面的五線譜是用來show MIDI的音高的,而非原始音檔的音高哦。

87showmin 提到...

提醒一下meeting討論後的初步結論,下方的五線譜除了展現midi note外,也要展現出輸入音檔經pitch detection後所對應到的位置,使用者如果要修改音高,我們會提供像義崧二胡工具那樣的畫筆功能讓他直接改頻譜,改完後同步更新五線譜。

SCREAMLab 提到...

Thx for showmin's addition.

SCREAMLab 提到...

不太懂: "關於midi以16進位開啟的資料分析"

冠廷學長有做一版MIDI Parser, 不能用嗎?

Wayne 提到...

有這個東西歐!
因為不知道有學長做過所以才沒有用,我再問學長看看.

Vivian 提到...

16進位只是一種表示方法,讀檔的時候還是用byte去讀。

學長有給我他的程式,可以跟我拿。

Wayne 提到...

ok我在跟妳拿,謝謝.

SCREAMLab 提到...

"但要從Track中提取資料畫譜,目前還找不到可用程式碼." 是什麼意思呢?

Based on 冠廷學長's work, one can also use MIDI to draw chroma feature for MIDI generated Wav.

Another simple to draw TRACK information is piano rol. Piano roll si very similar to the pitch contour we plan to use. 五線譜(staff) is less useful to us.

Wayne 提到...

有的,已經在修改程式中。

SCREAMLab 提到...

Phantom partials的paper請你暫緩看, 先實做一下Friction noise好嗎? 也就是下次輪到報告時講一下你的做法.

Wayne 提到...

好的

87showmin 提到...

請問,你五線譜之後會改成正確的音符表示法嗎?目前看來大家都是全音符。其實都全音符也沒關係,只要音符的位置跟上方將呈現的time-frequency spectrum對得上就好。

Wayne 提到...

會再加升降記號,不然無法看出是哪個音。

SCREAMLab 提到...

整合完pitch tracking後可以來個demo嗎?

Wayne 提到...

ok.

ARWEN 提到...

那音長怎麼表示?

Wayne 提到...

因為五線譜是用來對譜用的,看wav檔的音有沒有錯誤,基本上只要知道音高即可.
另外如果要看的話現在只能看出音符的相對音長,因為音符的間距是依音的長短所繪製,間隔愈大代表此音的音長愈長.

87showmin 提到...

請問可以試著將 pitch detection 的結果與MIDI樂譜顯示在同一個畫面中嗎?切割成兩個子視窗這樣。

Wayne 提到...

好的我修改看看.

87showmin 提到...

多找音不見得是錯的,有時候因為reverberation或演奏手法的關係導致某一個frame同時存在兩個以上音,但譜上卻是單音。

Wayne 提到...

有的那類的音並不算錯.這邊的多找音是指沒有泛音結構且樂譜上也沒有標示的音.

SCREAMLab 提到...

太棒了, 不過都沒錯太夢幻了, 請試一下Bach 平均律 Book1, C大調.

另外修改音高功能完成後demo一下給我看. Thx.

SCREAMLab 提到...

請跟showmin要BWV992來跑跑看. 假如這個檔案OK. 那麼我們就有四個檔案, 請選16個小節跑一下結果.

再把f0+PT與PT的結果分開.

希望在下星期完成.

Wayne 提到...

ok

SCREAMLab 提到...

今天有幾個議題:

1. Partial或整個Group是否可以被highlight後再另一個視窗編輯完再寫回呢?

2. 加入選擇音色庫以便play

3. 小聽設法GPU player接上去。

4. 利用原始音檔建音色庫

有要補充的嗎?

87showmin 提到...

5. 合成音量判定,以前五個partials的平均為準。

6. 承1, 在編輯某一partial group的音量時,提供畫envelope的功能,畫完後套至指定樂器的音色庫以進一步算出每個partials的能量。

7. 能否highlight一段時間後,只播放某一partial或某一partial group的聲音?

D. N. A. 提到...

如果可以做到第七點,就可以之後考慮改變partial group的f0了 像是Melodyne的招牌功能一樣!!

87showmin 提到...

DNA要的是否第一點就算可以滿足了呢?:p

D. N. A. 提到...

ㄟ 有一點點不同 在介面上

Melodyne會在 time domain把個聲部放在不同track上 你可以隨時把某個waveform拉去別的track並更改他的音高 就 ㄟ 沒有新開視窗 然後當然他可能聲部有分錯可能 ㄎㄎ~~

SCREAMLab 提到...

20%的錯誤還可以,在論文中可以說明假如Pitch的部分換成更好的做法,也行。DNA可以試一下將K.545用ircam的tool早一下pitch嗎? 然後論文可以寫了,請再跟我說你論文要怎麼配置!請參考一下YL那篇文章。

請仕偉將其他部分的結果也post出來。

K.545這麼多小節好像也沒幾個音,看來Bach比較多話。

SCREAMLab 提到...

DNA說: "Melodyne會在 time domain把個聲部放在不同track上 你可以隨時把某個waveform拉去別的track並更改他的音高 就 ㄟ 沒有新開視窗"。

我有幾個問題:
1. time domain waveform? 那是在frequency domain先分好,在用那些屬於同一個group的Fourier Coef轉回time domain嗎?

2. 改變音高時也是嗎?

3. 為何可以拉去別的track? 不是一個音高在一個track裡嗎?

4. 沒開新的Windows是因為已經分了track了嗎? 所以每一個track已經有自己的window了嗎?

SCREAMLab 提到...

有關如何使用HMM當做synthesis的Generation Model,你可以問一下吳老師實驗室的奕欽。

請注意,這時的HMM跟語音辨認時的用法不同。

此外,吳老師他們是用Vocal Tract Model,而我們用的是Sinusoidal Model,這是最大的不同點,但是對於HMM來說,只是輸入參數不同而已,HMM是不管Model是哪一種的,但是套過來用時該注意哪些事,還是需要請教他。

D. N. A. 提到...

有關老師說的,我也猜是把相關的frequency coefficients還原到time domain上

然後他每個track都是對應到一個音高 所以把內容的其中一個wavefform拉去+12格的地方 那個waveform內容的音高就會高八度 好比說鋼琴 C4就會擺在第60個track(你如果去播這個C4,可以聽到他是連同partials在裡面的)

不另開視窗只是為了一些編輯方便,而且像這樣每個track都算是不同的作業區了,因此也不用另開視窗

SCREAMLab 提到...

"每個track都是對應到一個音高 所以把內容的其中一個wavefform拉去+12格的地方 那個waveform內容的音高就會高八度 好比說鋼琴 C4就會擺在第60個track(你如果去播這個C4,可以聽到他是連同partials在裡面的)"

DNA有講我沒有懂。

D. N. A. 提到...

有圖有真相 我看我就不要再用我破爛的語言能力說明了lol


http://www.soundonsound.com/sos/nov01/images/melodyne04editdef.l.gif

87showmin 提到...

我還是很好奇DLL為什麼會depends on compiler版本,沒用到.NET的話應該會沒事才對,不過解決了就好。至於有些compiler版本抓不出memory allocation/free 的錯,這我之前在改小聽的code時也遇過 ~"~

87showmin 提到...

http://www.dev.idv.tw/mediawiki/index.php/%E5%9C%A8Microsoft_VC8%E5%AF%AB%E7%9A%84%E7%A8%8B%E5%BC%8F%E6%89%BE%E4%B8%8D%E5%88%B0%E7%9A%84DLL%E5%95%8F%E9%A1%8C

疑似可以解決DLL問題。這跟 side-by-side assembly有關。

Keiko 提到...

>> 我還是很好奇DLL為什麼會depends on compiler版本,沒用到.NET的話應該會沒事才對,

是使用 C++ 嗎?是的話, C++ 目前沒有標準的 Application Binary Interface (ABI) ,即使同一廠商的 compilers 不同版本間也可能因為 name mangling、binary location、structure alignment 等等改變了出問題, C++ 有時候不只不跨平台,還不跨同一家 compiler @@"

不過感覺 vc2005 和 vc2008 會各自使用自己的 runtime library ,理論上不會相衝才是,可以參考一下:http://stackoverflow.com/questions/1219693/can-a-c-dll-compiled-using-visual-studio-2008-be-used-with-visual-studio-2005

猜測會不會是動態配置的記憶體在不同版本的 crt 中 allocate 、 deallocate 了?像是這篇說的:http://msdn.microsoft.com/en-us/library/ms235460%28VS.80%29.aspx

>> 不過解決了就好。至於有些compiler版本抓不出memory allocation/free 的錯,這我之前在改小聽的code時也遇過 ~"~

可以試試看 release build 會不會出問題 >_<

buffett 提到...

所以OO-C才是王道嗎? XD
(我是來亂的... )

87showmin 提到...

感謝大師,第一個link有提到用statically DLL就不會用這問題,跟第二個link提到用/MD來build project說法是雷同的,而我跟小聽的程式都是用LoadLibrary這種方法來載DLL的,晚點來做實驗試試。

Wayne 提到...

用的是c++沒錯,
應該就是不同版本的crt的問題.

至於用vs2008的release build,在未拿掉free(xx)的情形下還是會出現
"發生未處理的例外狀況:0xC0000005:讀取位置0x5xxxxxxx時發生存取違規";
vs2005可以過,vs2008不會過,想必還是vs2005跟vs2008的crt的差異.

D. N. A. 提到...

這個修改不錯

IRCAM有一套AudioSculpt跟我們在發展的這套軟體類似,他們的頻譜也是很清楚 還可以自己調明暗 然後 這些audio processing的軟體 介面都在比炫的lol ... 他們也是把他們做的東西都整在那套AudioSculpt ...前端UI後端有一個引擎負責各種分析 聽說後端很大部分都是Axel Roebel自己co的 ... 我們這套tool做到一個階段後也可以像它們一樣拿去賣錢 ~

87showmin 提到...

歡迎大家提供意見,需要哪些很炫的功能。我在修改皓鈞標錯的資料時感到很痛苦,正打算把標譜/建ground truth的功能也加上去,讓皓鈞或其他人只要用滑鼠畫一畫就可以自動建完資料....

SCREAMLab 提到...

請翊臺接著更新此一專案的目前狀況,因為太久不知道狀況了,我怕你會把他擺著沒動。