前回に続き「シェパード・トーン」(Shepard tone)のサンプルを作成してみました.今回は,無限に登り続ける音階です.
作り方の詳細は前回の記事を参照してください (それほど詳しくありませんが).
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を,音として保存すれば無限音階になります