ケィオスの時系列解析メモランダム

時系列解析,生体情報学,数学・物理などの解説です.

【Rで聴覚の不思議】無限にのぼるドレミファソラシド:シェパード・トーン

前回に続き「シェパード・トーン」(Shepard tone)のサンプルを作成してみました.今回は,無限に登り続ける音階です.


www.youtube.com

 作り方の詳細は前回の記事を参照してください (それほど詳しくありませんが).
chaos-kiyono.hatenablog.com

今回のポイント

 前回は,連続的に周波数を増加させましたが,今回は,ドレミファソラシドに対応する周波数のみを使いました.周波数の分布は下の図です.

周波数と音圧の関係

 倍音の数が多いほど,自然につながっているように感じました.倍音を6個よりも少なくすると,音程が上下して聞こえます.私はRのtuneRというパッケージを使いましたが,csvファイルをwavファイルに変換するフリーソフトもあるようです.そのようなものを使って下のRスクリプトのxを,音源ファイルに変換すれば,無限音階を作成できます.

Rスクリプト

 無限音階の信号xを生成するRスクリプトです.

# サンプリング周波数
f.s <- 48000
dt <- 1/f.s
##################
# ドレミファソラシの基本周波数
tones <- c(4.087875,4.588500,5.150375,5.456750,6.124875,6.875000,7.716875)
# 表示用
key <- c("C","D","E","F","G","A","B")
# 倍音の計算用
freq <- function(time,c){
  return(f.min*2^(c))
}
# 一つの音の継続時間
T.sub <- 0.5
# 倍音 (高調波)の総数
c.max <- 12
# 最低音圧
dB.min <- -140
# 部分時間の定義
time.sub <- seq(0,T.sub,dt) 
##########################
# 周波数分布の幅
f.min <- tones[1]
f.cut <- f.min*2^(c.max)
##########################
x <- c()
 for(i.tone in 1:7){
  f <- tones[i.tone]*2^(0:c.max)

  A <- 10^((dB.min-dB.min*(1-cos(2*pi/c.max*log(f/f.min)/log(2)))/2)/20)
 A[f > f.cut | f < f.min] <- 10^(dB.min/20-1)
  n.f <- length(f)

  for(ii in 1:n.f){
   if(ii == 1){
    x.sub <- A[ii]*sin(2*pi*f[ii]*time.sub+runif(1)*2*pi)
   }else{
    x.sub <- x.sub + A[ii]*sin(2*pi*f[ii]*time.sub+runif(1)*2*pi)
   }
  }
  x <- c(x,x.sub)
 }
##########################
# 繰り返し (例:10回)
x <- rep(x,10)
# このxを,音として保存すれば無限音階になります