PHPを使用した音楽の作成

私は確率論、人工知能、または機械学習の専門家ではありません。基本音楽のレッスンは長い間忘れられてきました。 しかし、10分かかると、わずかな知識でも創造的に適用した場合に印象的な結果が得られることがわかります。 PHPで音楽を作る方法を教える方法を共有したいと思います。



たとえば、これ:



生成されたメロディ



PHPで生成されたメロディが表示されます。 はい、もちろん、このメロディーは最も記憶に残るものではありませんが、いものではありません。 そして驚くことに、この一連のノートを生成するコードは非常に短いです。



それで何が起こっているのでしょうか? 要するに、音楽データは、どの間隔が心地よいメロディーを構成しているかを「学習」するために、スクリプトによって分析されます。 次に、スクリプトは新しいコンポジションを作成し、知識に基づいて高さを選択します。 技術的に言えば、スクリプトはメロディー間隔の確率マップを計算し、 マルコフ過程を適用して新しいシーケンスを生成します。



巨人の肩の上に立って



音楽を作曲することは、何もないからではありません。 バッハはブクステフーデとヴィヴァルディに感銘を受けました。 ショパンはリストとワグナーの影響を受けました。 モーツァルトとハイドンはベートーベンを教えました。 同じメロディーフレーズは、作品のさまざまな部分で見つけることができます。 OrpheusとEurydice Gluckおよび国歌Non Dignusの動機には、一般的な音楽フレーズが含まれています。



OrpheusとEurydice Gluckの一般的な音楽フレーズと国歌Non Dignusの動機



PHPを盲目的に書くように依頼すると、結果はあまり良くありません。 証拠として、 rand()



関数への呼び出しのランダムな値をノートと比較することで構成されたメロディを提供します。



ランダム曲



ドデカフォニアの技法がわからない場合は、インスピレーションと理解のために、古典的な作曲から始める方が良いでしょう。



これを行うために、私は最初に科学的なピッチ指定システムを使用して音楽作品のいくつかの部分のメロディーを書き直しました。 私は音符の長さを気にしませんでした。 代わりに、私は音のピッチそのものに注目しました。 「前」は通常の音の最初のオクターブがC4(Cは音の名前、4はオクターブ)として入力され、音は「C#4」の上半分の音、D4の上半分の音、などです。その結果、メロディ(ここではTantum Ergoの最初の8つのメジャーを示しています)は次のように書かれています:



ボッタッツォ、タンツムエルゴからの最初の8小節



A4 C5 G4 A4 G4 A#4 D5 A4 B4 A4 C5 D5 C5 G4 B4 B4 C5







これで、解析しやすく、分析にも簡単に使用できる一連のメモができました。 たとえば、A4の後に続く可能性が最も高いメモはどれですか?



A4 C5



G4



A4 G4



A#4 D5



A4 B4



A4 C5



D5 C5 G4 B4 B4 C5







最終的に以下を提供します:



C5 G4 B4 C5







ケースの50%でメモがC5、ケースの25%でC4、ケースの25%でB4であることがわかります。



このプロセスは、温かく生き生きとした音楽を、コンピューターが冷たくて鈍感な数学的本質でしか理解できないものにします。



呼び出し医師マルコフ



決定論的なシステム-同じ入力が常に同じ結果を返すシステムに精通しています。 加算は、入力での2と4が常に6を与える決定論的関数です。これに対して、確率システムは、一定レベルのランダム性で動作します。 同じ入力でも、たとえばarray_rand()



関数を使用すると、まったく異なる結果になる可能性があります。 音楽の作曲には偶然の要素があります。 そうでない場合、ノートF4に出会ったどの作曲家も同じように続け、ポップシンガーの飽くなき王朝に新たなヒットをもたらします。 しかし、潜在意識レベルでは、作曲家はどの組み合わせが聴覚に喜ばれるかを理解しているという事実にもかかわらず、それでもチャンスはそれ自身の修正を行います。



音楽を構成する台本にも関連する確率システムの鮮明な例は、マルコフ過程です(数学者のアンドレイ・マルコフにちなんで名付けられただけでなく、素晴らしいひげを生やしました)。 ニックディドコフスキーの説明は次のとおりです。



マルコフ分析は、イベントのシーケンスを調べ、それに続く単一のイベントの傾向を分析します。 この分析を使用すると、元のイベントに似た、ランダムで同時に関連するイベントの新しいシーケンスを作成できます。 マルコフプロセスは、関連するランダムイベントの分析に役立ちます。 過去のイベントに関連するイベント。


概念を説明するために使用される伝統的な例は、天気予報グラフです。 晴れた日の翌日は90%の晴れの可能性があり、雨の日の翌日は50%の雨の可能性があるとします。 グラフは次のようになります。



カウントトマルコフサニー/雨



5回の反復の列を通過する確率を見つけるために使用されるメカニズムに応じて、最初の日は晴れ、次の日は雨、再び晴れた後、まだ晴れて晴れ、または晴れ、晴れ、晴れに行くことがわかります雨が降っていて、繰り返し通過します。



これで、私が得ているものが明確になったことを願っています。メロディーの分析によって決定された重み付き確率を使用して、「次の音を選択する」ランダムなプロセスを制限する機会があります。



A4楽譜



この簡単なプロセスにより、サルがオルガンの鍵を誤ってたたいてメスの完全な作品を演奏するよりもはるかに短い時間で、許容できるメロディを作成できます。



ロボット作曲家(特異点が近い)



まあ、一般的な言葉で、あなたが私が音楽を作るのに使用した重要な原則を理解することを望みます。 そうでなくても、あなたは少なくとも私のユーモアに苦しみ、いくつかのコードを見るに値します。



 <?php namespace Zaemis; class Composer { private $pitchProb; public function __construct() { $this->pitchProb = []; } public function train($noteData) { $numNotes = count($noteData); for ($i = 0; $i < $numNotes - 1; $i++) { $current = $noteData[$i]; $next = $noteData[$i + 1]; $this->pitchProb[$current][] = $next; } } public function compose($note, $numNotes) { $melody = [$note]; while (--$numNotes) { $i = array_rand($this->pitchProb[$note], 1); $note = $this->pitchProb[$note][$i]; $melody[] = $note; } return $melody; } }
      
      







 <?php require_once '../include/Zaemis/Composer.php'; use Zaemis\Composer; $noteData = trim(file_get_contents('../data.txt')); $noteData = explode(' ', $noteData); $c = new Composer(); $c->train($noteData); $melody = $c->compose($_GET['note'], $_GET['count']); echo '<img src="img/notes/clef.png" alt="Treble Clef">'; foreach ($melody as $note) { echo '<img src="img/notes/' . urlencode($note) . '.png" alt="' . $note . '">'; }
      
      







学習プロセスはtrain()



メソッドで記述されます。このメソッドは、トレーニング用のノートの入力配列を受け取ります(エンコードされたメロディはスペースで区切られます)。 コードはシンプル、高速、不器用です。 メモは、要素の数によって間接的に暗示される確率で2次元配列に格納されます。



塗りつぶされた状態では、配列は次のようになります。



 array(9) { ["A4"]=> array(13) { [0]=> string(2) "C5" [1]=> string(2) "G4" [2]=> string(3) "A#4" [3]=> string(2) "C5" [4]=> string(2) "B4" [5]=> string(3) "A#4" [6]=> string(2) "G4" [7]=> string(2) "A4" [8]=> string(2) "D5" [9]=> string(2) "G4" [10]=> string(2) "C5" [11]=> string(2) "C5" [12]=> string(2) "G4" } ["C5"]=> array(11) { ...
      
      







データを見ると、A4に続いてランダムに選択されたノートは、C5になる可能性が約31%あることがわかります。 13個のリスト項目のうち4個にこの値が含まれています。 (はい、私は知っています、作曲に含まれる可能性のあるすべての音符のリストを念頭に置くよりも、確率を操作する方が良いのですが、私は意図をよりよく説明するために意図的にしました。)



compose()



メソッドは、メロディシーケンスを生成するためのロジックをカプセル化します。 最初の音符に続く音符のシーケンスの希望する持続時間を入力で受信すると、このメソッドは、必要な数だけ受信するまで、配列から音符の値をランダムに選択します。



当然、私たちは人間であり、その結果を通常の楽譜で見たいと思っています。 そこで、スクリプトを支援する一連の画像を作成しました。 各画像は、他のメモの中で対応する場所のメモを反映しています。 ファイル名は音名に対応しています。 メロディーを歩いてIMG要素をレンダリングすることは、私にとって非常に良いことです。



より速く、より高く、より強く!



振る舞うことのできるスクリプトを書くときに使用されたアイデアが、実際の作曲家のように単純だったことは非常に印象的です。 もちろん、完璧に制限はなく、さらに多くを追加して修正できます。 これは、音楽インテリジェンスをマスターする最初の経験と考えることができます。 1981年以来コンピューター音楽作曲家のDavid Copeは次のように述べています。



音楽を小さな曲に分割し、それらを新しい順序でランダムに結合するだけで、ほぼ間違いなくナンセンスになります。 効果的な再構築には、最も基本的なレベルでも効果を維持するために、広範な音楽分析と非常に慎重な再構築が必要です。


確率を維持するためのマトリックスの高さの変更などの明らかな変更に加えて、どのような改善を行いますか? この素朴なアプローチを、音楽を分析するためのまったく異なるメカニズムに置き換えることもできますか? MIDIファイルからの入力を分析しますか? 調和を明らかにするには何が必要ですか? コードはどうですか? メモの長さは? 作曲家の「手書き」? スクリプトは、独自の優れたメロディーの分析に基づいて学習し、知識ベースを補充するために使用できますか? サンプルを再配布して新しい作品を作成するにはどうすればよいですか?



音楽の制御された作曲の人工知能の分野での実験の結果についてのあなたのコメントを読んでください。






翻訳者から :私は本当に結果のメロディーを聞きたかった。 savostin、PHPのライブラリを使用してMIDIで出力することを提案しました。 そして、私には思えたように、メロディ自体はインターネットからRTTTL形式で取得するのが最も簡単です。 彼は急いで記事の例をスケッチしましたが、RTTTLを操作するために鋭くし、出力をMIDIに接続しました。 これで、この記事の著者が行った作業を誰もが認めることができます。



デモ



All Articles