脱線してジャズセッションアプリ作ろうとしてる話
特にサーバの運営に関して技術的な目処がまだ立たないため未だにモヤモヤしてる.C#でソケット通信して,仮のサーバアプリからlocalhostのサーバ宛てにPOSTするという強引な方法を思いついたものの,これは本当にうまくいくんだろうかという気がしてならない.
そういうこともあって,調べてばかりで手が全く動いてなかったので,とりあえず何かいい方法を思いつくまでUnity側の実装と平行して,ジャズセッションアプリを作ろうと思った.
知っている人は知っているかもしれないけれども,僕はとりあえずバンド楽器を全部扱える.大学1年の時にジャズ研に在籍したこともあって,ある程度はジャズベースを弾ける.高校の頃は音楽理論をそれなりに勉強していたので,和音とは何かについて人並みに理解はしている.
高校の頃,AO入試の時に提示された構成音からコードを推定するコンソールアプリを作った.この時,スケールまで推定するものも作りたいなとは思ったものの,大学が始まって3DCGのほうに気を取られていたので完成することはなかった.
そんなこともあって,高校生からジャズ研をやめる大学2年生にかけて音楽理論を溜め込んでいた.定期的になにか作りたいと思ったものの,何かと時間がないと食指を伸ばすことができずにいた.
未踏期間は割りと自由な部分もあって,手が動かないより動かしたほうがいい,ということなので動かすことにした.
ちなみに,動かすことにする前に既に脱線していて,同じ未踏をやっている鈴木君のプロジェクトのSiv3Dでウェーブレット変換をやってみた.
GRGSIBERIA/wavelet-for-siv3d · GitHub
ウェーブレット変換はわかりやすくメチャクチャな解釈をすると,連続的な信号を二分探索木に変換するアルゴリズムで,信号の変化の特徴を可視化することと,その特徴を探索木で見つけやすくするところが大きな特徴になっている.
ウェーブレット変換はフーリエ変換とは異なり,スペクトルを可視化するわけではないので,変換の対象範囲を好きなだけスケールできるところが大きい.特に,フーリエで信号の特徴を捉えようとすると,標本化定理の制限を受けたり,窓関数を選んだり,色々と面倒くさいことが多い.
ウェーブレットのことはいいとして,ジャズセッションアプリの基本的な考え方としては,ジャズの中で重要なのはコードとスケールではあるものの,コードはスケールの中で多くて4〜5つの音しか埋めていない.
例えば,ハ長調のCメジャーコードの構成音はCEGの3つとなっている.モード理論の通例としてはCアイオニアンスケールで弾くことが通例となってはいる.しかし,コードだけ見てしまうとスケールを構成する7つの音のうち,たったの3つしか埋まっていない.2nd, 5th, 6th, 7thの音はCメジャーコードでは不確定となっている.
ジャズの面白いところはこれを逆手に取ってスケールをフレキシブルに変更できるところにあると思っている.ハ長調Cメジャーコードであれば,適用できるスケールはCアイオニアン,Cリディアン,Cミクソリディアンの3つになる.(ただし,CmajM7であれば,Cミクソリディアンは除外される)
一方で,構成音がCEGのとき,音名だけで考えるとCmajだけでなく,Em(+5),G6sus4の可能性も浮上してくる(ギターが手元にないので間違えてたらごめんなさい).もちろん,オンコードも考えられる.
これらのことを考えると,ベースラインは常に音を変えながら構成するコードをメチャクチャに変更し,そのうねりを楽しんでいるのではないか,と考えられなくもない.クラシックではコードはなく,和声法や対位法によって解釈される.これもある種のうねりと考えられなくもない.
とは言っても,楽曲の中からコードを抜き取ってしまい,メロディだけで解釈してしまうと混沌の極みとなってしまうため,最低限コードとメロディを材料にしてスケールを解釈し直し,自動的にコードを決めて(僕はベースなので)ギターを弾いてくれる,というものを作ろうと考えている(ピアノでもいい).
とりあえず,スケールの自動推定をするために使うであろう計算の実装をしている.そろそろ固まると思うので,その次は与えられたコードから構成音を分解し,複数のコードを再構築する,みたいなものを作ろうと思う.そこからさらにベースを入力して具体的なコードを確定する,ようなことをする.ここまでできると,ギターでもピアノでも音を鳴らすことができる.
そんなことで,並行的にこれをやっている.一日の半分はUnityで未踏の本業,もう半分は脱線みたいな形でやっていこうと考えている.ジャズっぽい感じが重要なので,僕の見立てとしては案外うまく行っている気がするし,とてつもなくうまい人はその都度聞こえた音から良い音を推定して次に繋げるような気がする.