Juliaでオーディオプログラミング入門

このNotebookは Wanoグループ Advent Calendar 2019 の8日目の記事です。

0. はじめに

〆切当日になってもネタが思い浮かばなかったので、 今年も趣味のオーディオプログラミングの話をします。
ちなみに、去年は、Faust Lang.とWeb Audio APIによるオーディオプログラミング入門について取り扱いました。
今年は、Julia Lang.とJupyaterLabを組み合わせた、オーディオデータの取り扱い(生成・再生・加工・可視化)について触れていきます。

1. Julia Languageの紹介

Julia Languageは2018年にVersion 1.0がリリースされた比較的新しい汎用プログラミング言語です。
動的型付き言語にあるまじき実行速度を叩きだせる点が大きな魅力ですが、そのシンタックスも非常に魅力的な言語です。
ちょっとだけ、Juliaの魅力を紹介しましょう。以下のコードを見てください。

In [1]:
# 回転行列
function rot(θ::AbstractFloat)
    [
        cos(θ) -sin(θ)
        sin(θ)  cos(θ)
    ]
end

# r₀(1, 0)を+90度回転させる
@show r₀ = [1., 0.]
@show r₁ = rot(0.5π) * r₀
r₀ = [1.0, 0.0] = [1.0, 0.0]
r₁ = rot(0.5π) * r₀ = [6.123233995736766e-17, 1.0]
Out[1]:
2-element Array{Float64,1}:
 6.123233995736766e-17
 1.0                  

たったこれだけのコードからでも、他のプログラミング言語にはないユニークかつ魅力的な特徴がいくつか見てとれます。

  • ベクトルや行列の記述が簡単(見た目もかなり直感的!)
  • 特別な記述なしに行列の四則演算ができる
  • 動的型付き言語でありながら、必要な部分で型システムの恩恵を受けられる
  • ASCII文字以外でも変数に使える
  • etc...

同等の記述をここまでシンプルかつ直感的な形で表現できる汎用プログラミング言語は、なかなか無いのでないでしょうか。
また、見ての通りJupyter上で実行できるので、データの可視化周りのライブラリも充実しています。
例えば、グラフ描画用のライブラリ(Plots.jl)を使えば、以下のようにさくっとNotebook上でグラフを描画できます。

In [2]:
using Plots
gr()

θ = LinRange(0, 8π, 200)
A = LinRange(0, 1, 200)
r = hcat((A .* map(x -> rot(x) * r₀, θ))...)
plot(r[1, :], r[2, :], st=:scatter, legend=false, xlim=(-1, 1), ylim=(-1, 1))
Out[2]:
-1.0 -0.5 0.0 0.5 1.0 -1.0 -0.5 0.0 0.5 1.0

楽しい!! ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

1. Juliaで生成した波形データの音を鳴らす

オーディオプログラミングの初手といえば、Hello, sineこと440 Hzのサイン波を鳴らすことでしょうか (※要出典)
以下は、440 HzのSineを生成・再生するコードスニペットです。

In [3]:
fs = 48000.0 # sampling rate
f = 440.0 # 440 Hz
sec = 10 # 10 sec分の長さのデータを生成 
n = [i for i in 0:sec*fs]
y = sin.(2π*f*n/fs)
plot(n[1:400] / fs, y[1:400], legend=false)
Out[3]:
0.000 0.002 0.004 0.006 0.008 -1.0 -0.5 0.0 0.5 1.0

SampledSignals.jlを使えばNotebook上で音を聞くことができます。

In [17]:
using SampledSignals

# mono
println("音量注意")
SampleBuf(0.4y, fs)
音量注意
Out[17]: