iT邦幫忙

1

librosa找歌曲大調疑問

大家好:
在python上做音樂分析時,遇到了兩個問題想請教

from __future__ import print_function
import numpy as np
import matplotlib.pyplot as plt # matplotlib for displaying the output
%matplotlib inline
import IPython.display # IPython.display for audio output
import librosa # Librosa for audio
import librosa.display # display module for visualization
y, sr = librosa.load('\abc.wav')
y_harmonic, y_percussive = librosa.effects.hpss(y)
C = librosa.feature.chroma_cqt(y=y_harmonic, sr=sr, bins_per_octave=36)
  1. 想請問"bins_per_octave=36"的意思:看了原文跟中文翻譯都不是很懂,每八度36個bins?
  2. 網路上僅找到輸出視覺化的code,想請問只要顯示出這首歌的大調的話,code要怎麼寫 print('chord: ',C....)
fillano iT邦超人 1 級 ‧ 2020-03-11 15:11:02 檢舉
猜測C是一個頻譜的陣列,試試print(C.head())看看能不能印出什麼。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
fillano
iT邦超人 1 級 ‧ 2020-03-12 08:27:01
最佳解答

我試跑了一下,觀察了librosa.feature.chroma_cqt回傳的結果,看起來是一個二維的陣列,總共12個元素。12這個數字應該很明顯。每個元素也是一個陣列,而且長度都一樣,所以這個長度應該是代表時間。不過我看不出時間單位怎麼算就是了。

陣列的值是從0到1,越高可能是該音頻的音量統計值越高,bins_per_octave設越大,看起來會凸顯這個值,可以減少泛音的干擾。

跟圖對照的話,可以發現12個元素,第一個是C,第二個是C#,第三個是D...

1
一級屠豬士
iT邦大師 1 級 ‧ 2020-03-11 15:03:34

https://librosa.github.io/librosa/generated/librosa.feature.chroma_cqt.html

從這裡看到 bins_per_octave : int > 0

Number of bins per octave in the CQT. Default: matches n_chroma

Octave -> 8.
然後查看 CQT
https://en.wikipedia.org/wiki/Constant-Q_transform
這裡有一些解釋與公式

https://dsp.stackexchange.com/questions/54883/how-can-i-calculate-the-number-of-bins-per-octave

這裡有人問與你類似的問題

https://dsp.stackexchange.com/questions/26927/what-is-a-frequency-bin

這裡討論了 bin.
之前有幫友寫了這篇
https://ithelp.ithome.com.tw/articles/10195763

你可以向他請教.我只是搬運工而已,幫你google.

fillano iT邦超人 1 級 ‧ 2020-03-11 17:49:42 檢舉

用在音樂的分析上,感覺bins_per_octave應該用預設值就好了,畢竟目前主流的調律法,一個八度之間就是平均分成十二個音。

其實~我就是看了版上code大的MIR,才覺得超酷/images/emoticon/emoticon07.gif,剛好本身在音樂產業做數據分析,就來玩看看

拍謝花了點時間在讀英文,透過兩位的幫助我大概理出頭緒了,f大說的沒錯,1個8度12顆音,bins_per_octave=12代表1個8度,若=36,代表3個8度,通常流行歌曲都是介於1~2個八度間

我要發表回答

立即登入回答