# Python 筆記 - Sound and Signal
## Idea (發想可以做什麼事情)
### 樂譜生成
- 輸入是一個音源檔案,產生對應主旋律的樂譜
- 可進一步分析主旋律之間的關聯
### 音樂分群
- 對於一個音樂庫,把形似的風格歸類為一
- 可用於推薦系統
## 環境
- 系統: Ubuntu 14.04
- FFmpeg:
- 安裝: https://www.faqforge.com/linux/how-to-install-ffmpeg-on-ubuntu-14-04/
- 功用:配合Pydub處理常用音訊(e.g. mp3)
- Pydub
- 安裝: sudo pip install pydub --upgrade
- 功用: 處理wav等檔案格式,簡化wave模塊
- wave
- 內建
## Pydub
- 參考:https://xin053.github.io/2016/11/05/pydub%E9%9F%B3%E9%A2%91%E5%A4%84%E7%90%86%E5%BA%93%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/
- 引入:
- AudioSegment類
```python
from pydub import AudioSegment
```
- 讀檔
- 作法一: from_format(path)
```python
AudioSegment.from_wav('path.wav')
```
- 作法二: from_file(path, format)
```python
AudioSegment.from_file('path.mp4','mp4')
```
- 作法三: from_file(file, format)
```python
with open('file.mp3','rb') as f:
AudioSegment.from_file(f, format = 'mp3')
```
- 支援格式:
```python
['wav', 'mp3', 'ogg', 'flv', 'mp4', 'wma', 'aac']
```
- 回傳型態: AudioSegment物件(immutable)
- 寫檔
- export方法
```python
sndObj.export('file.wav', format = 'wav')
```
- 存取
- slice (精度至毫秒)
```python
sndObj[begin:end]
```
- 播放
```python
from pydub.playback import play
play(sndObj)
```
## Wave
- 內建,處理wav格式:http://bigsec.net/b52/scipydoc/wave_pyaudio.html
- 引入
```python
import wave
```
- 讀取檔案
- 開關檔案:
```python
wave.open(path,'rb')
```
```python
wave.close()
```
- 取得參數: getparam()
- 回傳: (nchannels, sampwidth, framerate, nframes, comptype, compname)
```python
params = f.getparams()
```
- 抽取並解析數據:
- readframes回傳字串,以short每兩格解析
- 若有雙聲道,輪流取出(e.g. LRLRLR...)
```python
str = f.readframes(nframes)
data = np.fromstring(str_data, dtype=np.short)
```
- 寫入檔案
- 開關檔案
```python
wave.open(path,'wb')
```
```python
wave.close()
```
- 寫入
- 設置參數
```python
f.setnchannels(1)
f.setsampwidth(2)
f.setframerate(framerate)
```
- 將字串後寫入編碼
```python
f.writeframes(data.tostring())
```