2018/12/22

1秒以下の音のクラスタリング


1秒以下の音のクラスタリングを読む (github.io)

GollyのGenerationsルールから生成した音のクラスタリングが意外とうまく行ったので、1秒以下の音のクラスタリングを試しました。

なんとなく似たような音が集まっている気がしますが、ラベルなしのデータセットでのクラスタリングは無謀でした。

2018/12/20

自己相関関数に基づくピッチ推定アルゴリズムYINとMPM

自己相関関数に基づくピッチ推定アルゴリズムYINとMPMを読む (github.io)

ピッチ推定に関するプロットギャラリーを見る (github.io)

音のクラスタリングに使う特徴量としてピッチがあると良さそうだと思ったのでピッチ推定アルゴリズムのYINMPM (McLeod Pitch Method) について調べました。MPMという名前は今回参考にしたsevaghさんのリポジトリでの表記にならっています。

いろいろ試した結果としてはMPMで使われる差分関数と自己相関関数の組み合わせが良さそうな気がしました。条件がいいときはYINで使われる差分関数とMPMで使われる自己相関関数の組み合わせのほうが誤差が少なかったです。

2018/11/29

GollyのGenerationsで作った音のクラスタリング

GollyのGenerationsで作った音のクラスタリングを読む (github.io)

GollyのGenerationsで作った音を分類したくなったので、音のMFCCを特徴としてK-Meansでクラスタリングしました。

クラスタリングから得られたデータでファンシーなプロットも作りました。上の図はMFCCによるクラスタリングの結果をt-SNEで視覚化しています。

2018/11/17

GollyのGenerationsアルゴリズムで音を生成

コードを見る (github.com)

GollyGenerationsアルゴリズムを使って、ランダムなルールと初期状態から得た人口の推移をそのまま音にしました。

2018/11/13

Singen0.3

Singen0.3を試す (github.io)

Singen0.3はPADsynthをモジュレータに使ったFMシンセサイザです。

次のリンクのデモ曲のような音が出ます。デモ曲はSingen0.3で作った音をFL StudioのSamplerに読み込ませて作っています。

デモ曲を聴く (Google Drive)

以下はおおまかな信号の流れ図です。


2018/10/20

Canvas038

デモを見る (github.io)

⋁が流れます。

2018/10/19

WebAudioを試す

「WebAudioについて」を読む (github.io)

WebAudioでよく使いそうな機能を一通り試して文章にまとめました。

今のところはAudioWorkletが使えないので複雑なことはできなさそうです。

DelayNodeで簡単なシンセサイザを作って遊ぶつもりだったのですが、Karplus-Strongを実装して delayTime = 1 / pitch としたところ音程がずれました。一定の値を加えることでチューニングできたので、何らかの理由で想定外の遅延が加えられているようです。

Firefox 62ではBiquadFilterNodeのtypeが "lowpass" または "highpass" のときQに負の値を設定できないこともわかりました。

追記 2019-10-27: Firefox 71 でBiquadFilterNodeのバグが修正されました。 https://bugzilla.mozilla.org/show_bug.cgi?id=1499597

2018/10/09

PADchoir2

デモを試す(github.io)

PADchoir2はPADsynthに直接、倍音を入力して音をレンダリングできるシンセサイザです。

以前作ったPADchoirで「あ」以外の母音を作れるようにできないか試していたところ、PADsynthに直接倍音を入力した方が早いような気がしたのでインターフェイスを少し変えてPADchoir2としました。いろいろ試した後でPADchoirも多少改良しました。

母音のフォルマントは声のピッチによって変動しないようです。PADchoir2のパラメータで言うと、Overtoneを上手く設定して母音の「い」に聞こえる音ができても、Basefreqを変えると別の母音に聞こえることがあります。

Canvas037

デモを見る (github.io)

ランダムな線を適当に並べました。何となく面が見えます。

2018/07/25

DR-110風のシンバル



「DR-110風のシンバル」を読む (github.io)

レンダリングした音を聞く (github.com)

DR-110のシンバルに似た音を書き出すPython3のコードを書きました。画像は実装した音の信号の流れ図です。レンダリングした音のリンク先にある *_mixed.wav と *_noisy.wav が合成した音です。

2018/07/21

Burgers方程式でN波


「Burgers方程式でN波」を読む (github.io)

Burgers方程式の厳密解を実装してN波の振る舞いをプロットしました。Vincent TOURNATによるIntroductory Lecture on Nonlinear Acousticsで紹介されていた式を使っています。

似たような波形が出るmdaDX10のオシレータについても調べました。

2018/06/25

2018/05/19

FDNCymbal

デモを見る (github.io)

FDNCymbal は feedback delay network を使ったシンバルのような音が出るシンセサイザです。

仕組み

下図はFDNCymbal の大まかな信号の流れです。

Input はインパルスです。

FDN(n) の *.Time は FDN.Time、Atk.Time、Tick.Time に基づいていますが、カスケードの深さに比例して変更されます。

加算(、プラスの記号に丸)の部分に表示したパラメータは2つの信号を混ぜ合わせる比率を調整します。

2018/04/23

PADchoir


デモを見る (github.io)

PADchoirは合唱のような音をランダムボタンで簡単に作れるようにYoshimiPADsynthから機能を抜粋したシンセサイザです。

2018/04/19

WaveBox

デモを見る (github.io)

WaveBoxは3次元の波のシミュレーションから音を合成するシンセサイザです。

レンダリングに長い時間がかかります。

WaveCymbal2

デモを見る (github.io)

WaveCymbal2はシンバルというより空き缶のような音が出るシンセサイザです。

2018/04/15

2次元のばね-ダンパ波動方程式





「2次元のばね-ダンパ波動方程式」を読む (github.io)

ばねとダンパの項を加えた波動方程式を2次元にしました。

動画は上が固定端、下が自由端でのシミュレーションです。ソルバに使っているガウス-ザイデル法の反復回数を最大で16回に抑えています。従って厳密な結果ではありません。値が高い部分は明るく、値が低い部分は暗くなります。値が高すぎる部分は赤、低すぎる部分は緑で表しています。

2018/04/07

Newmark-β法で1次元の波動方程式

「Newmark-β法で1次元の波動方程式を読む」 (github.io)

Schweickart, James, Marschner の "Animating Elastic Rods with Sound" によると、Backward Euler法で弾性ロッドの音のシミュレーションを行うと、ダンピングによって受け入れられないほどミュートされた音が出るそうです。そこで論文で紹介されていたNewmark-β法から立てた画像の方程式について離散化と実装を行いました。

画像の一番上の式は、ばねとダンパの項を加えた波動方程式です。

2018/03/29

1次元の分数階Zener波動方程式


「1次元の分数階Zener波動方程式」を読む (github.io)

1次元の分数階Zener波動方程式 (fractional Zener model wave equation) のシミュレーションです。パラメータの組み合わせによっては発散します。

分数階Zener波動方程式はHolmとNäsholmによる "A causal and fractional all-frequency wave equation for lossy media" で紹介されていました。

2018/03/26

分数階微分で1次元の熱伝導-波動方程式


「分数階微分で1次元の熱伝導-波動方程式」を読む (github.io)

分数階微分を使って1次元の熱伝導方程式波動方程式をくっつけました。

Implicit FDMGrünwald-Letnikovの分数階微分を組み合わせて離散化したのですが、パラメータによっては発散することがあります。

2018/03/21

分数階微積分の数値計算


「 分数階微積分の数値計算」を読む (github.io)

分数階微積分Grünwald–Letnikovの定義を使って数値計算します。画像は今回の数値計算に使った分数階微分と分数階積分の式です。

分数階微積分が物理的にどういう意味を持つのかはよくわかりませんが、波動方程式への応用が提案されています。

2018/03/15

ギブス現象を抑える



「ギブス現象を抑える」を読む (github.io)

GottleibとShuの論文 "ON THE GIBBS PHENOMENON AND ITS RESOLUTION" を基にギブス現象を抑える方法を試しました。

ギブス現象が発生している信号からGegenbauer polynomialの係数を取り出して再合成するという方法です。再合成する区間に不連続な部分が含まれていると上手くいかないので、実際に使うときは信号を不連続な部分で区切って分割する必要があります。

2018/03/11

Implicit FDM を用いた1次元の波のシミュレーション


 「Implicit FDM を用いた1次元の波のシミュレーション」を読む (github.io)

前回のシミュレーション では Explicit FDM を用いていたので、パラメータの値によっては発散するという問題がありました。 Implicit FDM を使えば計算コストと引き換えに発散しなくなります。

動画は前回と今回のシミュレーションの比較です。左が Implicit FDM 、右が Explicit FDM です。

2018/03/03

1次元の波のシミュレーション



「1次元の波のシミュレーション」を読む (github.io)

1次元の波のシミュレーションについてまとめました。

以前に波をシミュレーションしたときは、時間や長さといったパラメータについては適当でした。今回はパラメータの設定を行いたかったので、波動方程式から有限差分法で離散化する手順について調べました。

2018/02/25

n dB/octのスロープを持つフィルタ



「n dB/octのスロープを持つフィルタ」を読む (github.io)

IDFTを利用した任意のスロープを持つフィルタの作り方と、 n dB/oct のスロープを持つフィルタの解析解について調べたことをまとめました。

2018/02/24

お手軽なFIRフィルタのレシピ


 
「お手軽なFIRフィルタのレシピ」を読む (github.io)

FIRのローパス、ハイパス、バンドパス、バンドリジェクトフィルタの作り方をまとめました。

元は WaveCymbal のバンドパスとして試したのですが、切れすぎて Karplus-Strong 間の干渉がほとんど無くなり面白くない音になることが分かりました。

2018/02/17

WaveCymbal

デモを見る (github.io)

WaveCymbal は Banded Waveguides を利用したシンセサイザです。シンバルというよりは空き缶のような音がでます。

仕組み


下図はWaveCymbal の大まかな信号の流れです。



まずインパルスをコムフィルタに通して衝突音を作ります。これが Input になります。

Input は 1D Wave へと入力されます。1D Wave では1次元の波のシミュレーションを行っています。

1D Wave の複数の地点からの出力を、それぞれバンドパスフィルタに通して並列に並べた Karplus-Strong へと送ります。Karplus-Strong からの出力はそれぞれ対応する 1D Wave の地点へとフィードバックされます。

並列に並べた Karplus-Strong からの出力を加算したものが Output になります。

問題点


1D Wave のシミュレーションが適当なので、システムのサンプリング周波数によってピッチが変わる問題があります。

2018/02/02

KSCymbal


デモを見る (github.io)

Karplus-Strongアルゴリズムを応用したシンバルの音を合成するシンセサイザです。

閉じたハイハットを叩くと上下のシンバルが複雑にぶつかりあいます。KSCymbalではこのぶつかる部分をシミュレーションに組み込みました。ただ、あくまでもKarplus-Strongなのでシンバルというよりギターの弦をたくさん並べてぶつけあっているというイメージの方が近いです。

デモのDistanceがシンバル間の距離を表しています。この値を小さくするとぶつかる回数が多くなります。

発振する場合はDistanceの値を上げるかSeedを変更してみてください。

Pluck


デモを見る (github.io)

Karplus-Strongアルゴリズムを用いたシンセサイザです。

Karplus-Strongアルゴリズムはギターなどの撥弦楽器のような音が出せます。デモページのCutoffの値を1にすると素朴なKarplus-Strongの音になります。

フィルタのかけ方はmrahtzさんの実装を参考にしました。