源起

會寫這篇小廢文主要是因為,因緣際會下找到 tuneRseewave 這2個package,赫然發現原來去年(2017)就已經有大神為音樂串流資料寫了套件,供廣大分析愛好者可直接讀進音訊檔,並以 “Wave” 這種 Object 作存取,方便大家進行分析。結果問了谷歌大神;發覺國外只有寥寥可數幾篇有在分享這2個套件的使用,然後找中文(繁體)竟一無所獲,頓時靈光一閃 ! 反正也沒有人寫嘛 ~ 正所謂 “前無古人” …“後來者可亂寫”XD 那乾脆我就稍微來玩一玩這個package(tuneR),把亂玩的心得分享一下 ! 多少騙些分析師入坑,後續廢材我才有機會找到神文分享啊~(踹飛)

資料來源 & 儲存容量單位

  1. 聲音檔格式音質與容量 連結
  2. 儲存容量單位

Let’s Go !

getwd()
## [1] "C:/Users/USER/Documents"
library(tuneR)
track1 <- readMP3("Honey Lemon.mp3")
class(track1)
## [1] "Wave"
## attr(,"package")
## [1] "tuneR"
track1
## 
## Wave Object
##  Number of Samples:      2939904
##  Duration (seconds):     66.66
##  Samplingrate (Hertz):   44100
##  Channels (Mono/Stereo): Stereo
##  PCM (integer format):   TRUE
##  Bit (8/16/24/32/64):    16

嗚~ ~ ~這到底是什麼東西…看不懂啦

沒關係 ! 問谷歌大神 ~

大神有解:

  1. 聲音是聲波在大氣中的震動,需轉化成訊號才有類比或數位之分:
  1. 數位訊號由三個基本條件構成,這也是影響其音質的因素:
## [1] "聲音檔大小=取樣頻率(Hz) × 樣本大小(bits) × 聲道數 × 秒數"
Data

Data

44100 * 16 * 2 * 66.66 / 8 / 1024 / 1024 * 2
## [1] 22.42818

綜合以上,可以得出1個結論

Number of Samples 是 Samplingrate × Duration(seconds) 而來

好喔 ~ 嗯……那知道這兒可以幹嘛 ?

嘿嘿 ~ 那我不就可以用 “44100 × 幾秒” 來剪輯1首歌曲了 !!

立馬來試試

從 Channels 可以知道 track1 是 stereo(雙聲道)

P.S 由於 tuneR 是屬於 S4 的class,所以記得 $ -> @ 喔! Picture

signal_vector_1 <- track1@left
44100 * 23
## [1] 1014300
signal_vector_1 <- signal_vector_1[1014301:length(signal_vector_1)] # 把前面22秒部分剪掉
track1@left <- signal_vector_1 # 會有Error不必理會,因為是雙聲道的關係,會要求左右必須是等長的,等下一行執行完後就不會有問題了
track1@right <- signal_vector_1
44100 * 25
## [1] 1102500
signal_vector_1 <- signal_vector_1[1:1102500] # 把第25秒後的部分剪掉
track1@left <- signal_vector_1
track1@right <- signal_vector_1
# play(track1)

來試聽看看 連結

第二首歌,如法炮製

track2 <- readMP3("The bold and the beautiful.mp3")
signal_vector_2 <- track2@left
44100 * (60 + 59)
## [1] 5247900
signal_vector_2 <- signal_vector_2[5247901:length(signal_vector_2)] # 把前面1分58秒部分剪掉
track2@left <- signal_vector_2 # 一樣 ! 會有Error不必理會,因為是雙聲道的關係,會要求左右必須是等長的,等下一行執行完後就不會有問題了
track2@right <- signal_vector_2
44100 * 24
## [1] 1058400
signal_vector_2 <- signal_vector_2[1:1058400] # 把第24秒後的部分剪掉
track2@left <- signal_vector_2
track2@right <- signal_vector_2
# play(track2)

來試聽看看 連結

那麼……既然剪可以;那接行不行 ?

track3 <- track1
signal_vector_3 <- c(signal_vector_1,signal_vector_2)
track3@left <- signal_vector_3 # Error...應該不用再打1次了啦
track3@right <- signal_vector_3
Picture

Picture

喔喔 ~ 看這Data和Values顯示的結果,好像可以耶 !

趕緊來試聽看看 連結

喔耶 !! Perfect ~ 能剪又能接

誰說 R 只能用來做分析建模 ~ 現在還能拿來搞音樂嘞 ~ Cool

以上版權非我個人所有 客官要翻我也不會bird you 翻到千里之外才是我的本意