@Since 2006:音樂學習、器材使用心得筆記,範圍包含:音樂理論、吉他、鍵盤、MIDI、編曲、音樂製作 … 等技術層次議題,內容深淺不一,僅是個人學習的心得筆記、想法,非教學,歡迎同好交流指教。文圖除非註明轉載、出處,否則均由 Rick KY Hwang (瑞克) 撰寫、繪製,未經允許,請勿私自以各種方式捷取、轉載。如有任何不當引用圖文,還請告知

最佳瀏覽環境: 解析度 1440x990 以上,建議使用 Firefox、Chrome、Safari 瀏覽器

2014/09/27

概述『和聲分析』演算法



下面這段影片介紹了一個分析和弦的工具,跟『科技與音樂』一文介紹的東西其實是類似的技術。



我曾經寫過一個小程式,目的是用來歌曲分析,當時也有做過類似的事情。最近也有朋友問我想關的問題,我把當時寫『和弦分析』程式的一些方法記錄下來給有興趣的人參考。

這個程式的主要目的用來幫忙找歌曲的調性跟和弦,雖然是描述一個『程式』,不過音樂上的思考過程,基本上還是要具備基礎的樂理知識,反而不會提到太多的程式設計的概念。

這段文字除了是在描述程式設計的和聲分析方法,其實也是在描述一般樂手『採譜』的基本概念。


※ 版權所有,謝絕轉載,請尊重著作權法 ※



要寫這種工具,要做幾件事情,分兩個部分:音頻分析和聲分析。本文著重的描述是第二個部分,第一部分偏向數位訊號處理 (DSP) 應用


和聲分析我是假設用 MIDI SMF (Standard MIDI Files) 當作輸入,而不是 Digital Audio (像是 MP3、WAVE),如此可以省去音頻分析部分。步驟如下:


一、建立基本定義資料庫

  • 定義音名 Notation 以及表示法 (Express),像是 CDEFGAB 以及八度音表示法、升降記號,像是 A1、C6、C3# ... 等,這邊的數字表示第幾個八度音。
  • 音程關係 Interval、數字系統 (Numbered)
  • 調性定義:大調音階、小調音階、其他音階的音程關係,就是音階基礎描述的東西。
  • 和弦屬性:大和弦、小和弦、增和弦、減和弦、七和弦系列、延伸和弦 ... 等。大概就是和弦基礎描述的東西。
  • 順階和弦與和弦功能:順階和弦的運算函式、定義主和弦、下屬和弦、屬和弦


二、和弦辨識函式

在這之前,必須具備的條件就是,已經知道歌曲的速度、小節數、每個小節裡用到哪一些音符,但是不知道和弦、調性等。這部分都是屬於音頻分析的範疇。
在步驟一描述的,都是定義,也就是分析前需要知道的,根據音頻分析的結果,知道音符的定義名稱,像是:第五小節有音符 A4、C3、D4 等音符,這些音符個別有自己的音符長度 (Duration)、甚至是分析出強弱 (Velocity、CC#7)、各種演奏表情 (Expressions)。所以最方便的方法,就是直接用 MIDI 的 SMF (Standard MIDI Files) 分析。

基本的功能就是:輸入一堆音名,找出『可能的』和弦名稱,基本的步驟如下:
  1. 把這些音符全部放在一個八度音之內,找出他們的音程關係。例如找到一堆音符是:A3 C
  2. 根據上一步驟找出根音、三度音、五度音,影片中 (00:15) 顯示百分比大概就是這段。   實際上編曲越複雜的歌曲,所輸入的音符往往會超過一般和弦的定義,也就是, 我們聽到一小節裡面,同時會包含旋律 + 和弦 + 其他經過音/插音 (ex: 弦樂), 或者節奏樂器的噪音。如果分析的歌曲對象是單一樂器獨奏,則準確性則會高很多。
  3. 根據上一步驟的結果,判定和弦屬性是:大和弦、小和弦、減和弦、or 增和弦
  4. 找出七度音 (如果有的話), 再根據 (2.2) 的結果, 判定七和弦屬性.
  5. 找出其他的延伸音 Tension Notes or 4th, 6th.


三、調性與順階和弦分析

在 (二) 已經找出了所有的和弦名稱、和弦屬性,接下來就是要根據這些和弦分析出調性、和弦功能。
  1. 找出屬和弦,用來定義終止式。結果可能會有多個,如果兩個以上,就可能有用到次屬和弦
  2. 根據前步驟的結果,往下一小節找一級和弦,判斷調性。直到下一個屬和弦,標記調性區間。例如前八小節為 C 大調,後八小結為 F 大調。
  3. 接續上步驟結果,找出這些區間的其他和弦。標記順階和非順階的和弦。

到這裡,一首歌的輪廓差不多已經出來了。


四、和聲分析

(三) 的結果取得調性、順階和弦,接下來分析的就多了:
  • 分析 Bass Line
  • 分析調外和弦 (Outside)
  • 分析延伸和弦、Tension Notes
  • 分析次屬和弦
  • 分析和弦進行
  • 分析調式音階

這段也是最複雜的,要知道很多和聲理論,特別是 Jazz 和聲。



上述的四個步驟姑且可以稱為和弦分析的演算法,不過只是最基本的而已。我當時在寫 『調、調式與轉調』、『關係和弦?』 等文章,其實就是在寫這段分析的 code。



※ 版權所有,謝絕轉載,請尊重著作權法 ※


音頻分析

處理的是 Digital Audio Data ,像是 MP3、PCM (Wav)、Aiff 等格式。單一樂器的錄音,辨識度越高,可以做精準的分析;復音的音樂,也就是兩種樂器以上混音的音樂,像是有鼓、鋼琴、吉他等,辨識度越低。


分析重點:節奏、音符,也就是頻率分析,單一樂器可以分析音色、噪音部分。

頻率分析就是根據『樂器音階頻率表』的定義,分析出目前的音是哪一個。不過必須仰賴數學方法來分析,以 CD 音質 44.1 kHz / 16bit 的規格,每秒的資料有 44.1k 筆,在分析上每秒會同時有很多頻率 (如下圖),要分析出有哪一些音以及他們的比率關係,辨識出音符。



實際上辨識出『什麼是一個音』、『一個音的長度』、『同時間是否還有其他音』、『音色』、『表情』是不容易的,大部份會用硬體 DSP Chip 處理。軟體處理也是可以,但是 CPU 必須有對應的運算能力。

要做這種軟體,通常都會利用寫濾波器 (Filter) 做過濾,把不需要的部分,像是噪音、高低頻、利用 Compressor 強調重音、弱化噪音等技巧,達到分析『音符』的效果。


節奏部分,第一段其實都沒有提到,因為我是假設這段已經做好了。不過實際上是有難度的。因為要分析出『拍子』在什麼地方,如果是有明顯拍子的音樂,像是爵士鼓,還可以依照波型的強度、動態分析拍點,然後再計算出歌曲的速度。


『音頻分析』是不容易的,特別是複音音樂。


上述的分析,其實在『影像』處理是一樣的概念,現在智慧型手機都有內建一些濾鏡功能,可以動態加強某一些顏色、白平衡、動態、降雜訊等,意義上和這邊提到的濾波器 Filter 是一樣的,同時也都是用 DSP 在運算。



------- Copyright © 2014 Rick KY Hwang All rights reserved -------



以前很多人會問關於『Wave to MIDI』或者有沒有工具可以『MP3 轉 MIDI』這類的問題。這問題跟用電腦做翻譯是類似的,通常我的答案都是:『不行。有也只能轉單一樂器的,而且結果大多不盡人意。』

這幾年隨著『Big Data』興起,分散式運算以及人工智慧的發展,這類分析應用越來越可行,這幾年常見的像是 iPhone 上的 Siri、Facebook 的人臉辨識、指紋辨識、Google 的翻譯 ... 等。人工智慧越來越成熟、運算能力越來越強大,未來或許能夠將 MP3 分析的精準,然後產生出很漂亮的 MIDI。

不過對於一個樂手、音樂家而言,耳朵和腦袋,才是最強的分析工具。這些東西目前為止都還是輔助性質的。


後記:朋友介紹一個日本人寫的工具 "WaveTone" 可以做歌曲的分析,大概使用後,對於現在 "音頻分析" 技術的成熟,有很大的改觀。以前可能不容易做到,現在已經不難做到了。



關於我寫得小程式,其實後來沒完成,大概只做出一個工具而已。就是可以計算各種音階,取得音符的資訊。我沒有打包成執行檔,放在 github 有興趣可以參考。截一些圖如下

計算各調的音階,可以依據根音排列,像是五度圈或者半音階。

根據音程計算各種音階

計算五聲音階系統的音階

取得音符資訊,分 MIDI 和自然音符兩種

取得自然音資訊


延伸閱讀 (站內)
  1. 音樂科技概論
  2. 音階基礎
  3. 和弦基礎
  4. 關係和弦
  5. 樂器音階頻率表
  6. 調、調式與轉調
參考資料 (站外)
  1. MIDI Standard Files
  2. CD Digital Audio (Wiki)
更新紀錄
  • 20140924:初版

5 則留言 :

  1. 您好 我是一個來自台中的吉他手 最近正在思考如何以熱門歌曲為基底自動產生一首歌
    看到您的網站 讓我感覺非常熱血
    想請問您是使用甚麼語言或是平台寫出這些小工具的呢?

    回覆刪除
  2. 你好,我是大三學生目前正在製作專題,最近在蒐集這方面的資料,希望可以跟版主要程式碼來做參考,非常感謝版主的幫忙

    回覆刪除
    回覆
    1. Code 放在 github: https://github.com/rickhw/sdna

      刪除

歡迎留言討論本文內容 (為避免垃圾訊息,輸入的意見訊息會經過站長過濾才會出現,敬請見諒。或者可以使用 FB 留言討論。)