自作の音楽生成AIについて以下で説明しています。
ルールベースタイプのAIで、広い意味ではAIだが、狭い意味ではAIでは無いと思っています。
というのは、機械学習(AI自身が作曲のルールを自ら獲得するような仕組み)は一切使っていないためです。 教師あり学習も教師なし学習も用いておりません。
あくまで開発者の作曲の知識に基づき、開発者が考えた作曲ルールを直接的に実装しているのみです。
学習データの著作権の問題がないという利点はあると思います。
ちなみにJavaで開発しています。といっても、特定のAPIを利用するものではなく、 フルスクラッチで全機能を作っているだけなので、他の言語でも作れる内容ではあります。
基本的にはランダムに音楽要素(音符などの)を並べるものですがただランダムに並べるだけでは当然音楽にはなりません。
そこで、以下の構成や要素について制御できる仕組みを考え、一般的な音楽として成立するように制御しながら自動生成しています。
例えば8小節や16小節といった一区切りの楽章の枠組みを内部的に用意し、これに楽曲要素(音符、拍子、コード、テンポ等)を置くようなイメージです。 また、その同じセクションを楽曲内で繰り返し利用したり、或いは全く新しいセクションを挟んだりすることで、 繰り返しと変化を適度なバランスで両立することを実現するという考えです。
主パート(主旋律パート, 伴奏パート, 和声パート, ベースパート)と副パート(オブリガード, 対旋律, ユニゾン)を内部的に管理しています。 副パートは主パートを「親パート」として参照し、親パートの動きに追従するような動きをする(或いは、ちょうど反るような動きをする)よう、確率調整しています。 これにより、パート間のまとまりを作り、複数パートによる厚みのある和音感を再現するという考えです。
楽曲を構成する基本は「繰り返し」と「変化」をバランスよく作ることであるという考え方を基本にしています。
これは、セクション構成、パート構成の変化、メロディの動き、コード進行、テンポの変化、強弱表現の変化、楽器の取り換え方など、あらゆる「変化」に対して言えると思います。 楽曲要素は、そのいずれも小節/拍といった時間軸を持つため、 この「(時間の進行に伴う)変化」を持ち、これが多すぎず、少なすぎずのちょうどよい頻度で楽曲が生成されるよう制御することを心がけて開発しています。
前述の繰り返し(同じ音型の繰り返し)はもちろん、音高の跳躍の大きさ、和声法/対位法に基づく禁則チェック、
非和声音の利用頻度、音域の高さ(楽器にもよるし、セクションの種類にもよる)、
リズム(長短の音価の利用頻度、弱拍の利用頻度、繰り返し)など、多くの要素を持ちます。
多くの要素を持つ分、それらをバランスよく自動生成するのは難しく、音楽の自動生成プログラムを
作るにあたって最も苦労する点だと思っています。
一般的な西洋音楽に基づいた進行に基づいたルールを考えています。 ドミナントモーションに基づいた進行をまずシンプルな形で一旦作り、 それを代理コードや裏コードで適宜置き換えるような方法です。
その置き換えをすると一時的な転調が起こるため、単調すぎる進行を避けられるという考えです。
また、セクションが変わったときに完全に転調させ、退屈さを避けることを心がけています。
midiの規格で用意されている128種類の楽器から選分のが基本です。 しかし、パート間の楽器の良い組み合わせを探る必要があったり、 楽器によってメロディの形や音域に違いがあったりするため、 各要素を作るにあたってこの楽器情報は重要となります。