見出し画像

Pythonで音楽制作 音楽を作ってみる

Fendoapです。

max for liveなどを作ったりしてます。 FDNリバーブ


Pythonで音楽を作りました。

普段maxとかpdとかで作ってるんですがそもそもこういう言語の中身が何をしてるのか知りたくてドライバのやり取りだけ用意して、できるだけ作って
みることにしました。



オーディオドライバとのやり取りでpython-sounddeviceを使っています。
コールバック関数を指定するとバッファーサイズごとにオーディオを出力してくれます。
バッファーサイズごとにオーディオ処理を行うようにしたオシレータクラスやフィルタークラス、エンベロープクラス、シーケンス用のメトロクラス、ディレイクラスなどシンセなどのパーツを書いています。組み合わせて音楽が作れるようにしています。numpyを使って書いています。



コンボリューションリバーブなども作成しています。オシレータを入れ子にして複雑なモジュレーションやディレイを組み合わせてリバーブなども作成できます。



組み合わせてポリゴナルシンセも作れます。


クラス


 例えばオシレータなどでは一つ一つに位相情報などを個別に記憶しておく必要がありました。オシレータが一層の場合は時間の変数をマスターにしてそこから計算すれば良さそうでしたがオシレータが階層になったモジュレーションなどで使う場合にずれて変な感じになるので個別に記録しておく必要がありました。

numpy配列

  forで回すと計算が遅くなるようなので出来るだけnumpy配列で渡して計算させるように書き換えていきましたが、イメージが難しいものがありました。オシレータもnumpy配列の場合は配列のそれぞれに計算をさせるのではなく累積値に対して計算する必要があり少し難しかったです。またフィルターなどは動きがイメージしにくくforで計算してnumbaで高速化する形にしました。




バッファーサイズごとに処理を繰り返すということがなんとなく理解できて良かったかもしれません。作ってみるとすごく興味深いというかこういうことが必要なんだなとイメージできて良かったです。 

今のところ一通りこれで音楽っぽい感じのが作れそうな感じですが、ここから何をしたら良いのかなと考えます。なんとなく言語としてよりライブラリとしての使い勝手が今のところ良い感じがしていますが、言語にすることの意味はどういうところにあるのかなというところがうまく掴めていません。

ある程度の機能を作るのではなく自分でシンセシスが組めるようなパーツの集合体にしたいと思っているのですが、その部分の言語化がうまく分かりません。Reverb()のような、かっこの中に信号を入れたらエフェクターになるリバーブという関数を用意するのではなくて、自分でリバーブが組めるようなディレイラインなどの部品だけ用意してある感じが良いとは思っていますが、

それの行き着くところはドライバーのやりとりだけが有り、配列を渡したら再生してくれるまっさらな環境で良いのではないかみたいな感じもあります。






よろしければサポートお願いします!