search
LoginSignup
6

More than 1 year has passed since last update.

posted at

updated at

データ収集からAI開発、Webアプリ公開まで全てPythonで済ませた話(0.設計編)

はじめに

今回の記事はシリーズ物です。他の記事はこちら↓

0.設計編(キーを判別するAIとは?)←この記事です。
1.データ収集(クローリング)
2.データ整形(スクレイピング)
3.機械学習を用いたAIの開発
4.Djangoを用いたWebアプリ開発

この記事では、今回の目的である「キーを判別するAI」をプログラムに落とし込む過程を書いていきます。「そもそもコード進行とかキーってなんぞや?」という方のために、その辺の音楽理論についても軽く触れています。

必要な音楽理論の知識

音楽理論と聞くと、難しそうなイメージがしますが、今回の記事を理解するのに必要な理論は、全体に対してほんの一部だけです。かなーり端折りながら書くので、安心してお読みください。それでも読みたくないな~という人は「本題」まで飛ばしてもらっても大丈夫です!笑

音の名前(音名)

音の高さを表すために、音には名前が付けられています。これを音名と言います。ドレミファソラシドのことです。実はこれはイタリア語の呼び方で、英語と日本語では別の呼び方があります。

国名 ファ
日本
英米 C D E F G A B C
イタリア Do Re Mi Fa Sol La Si Do

今回の目的は「コード進行からキーを判別する」です。コードの表現は一般的に英語表記なので、以後音名は英語表記(CとかDとか)で書いていきます

また、上の表には7種類しかありませんが、#や♭を使うことで全部で12種類の音を表すことができます

C,C#orD♭,D,D#orE♭,E,F,F#orG♭,G,G#orG♭,A,A#orA♭,B

これから「音」という言葉を使っていきますが、上記の12種類の音のうちのどれかを指したものと思ってください。

コード(和音)

コードとは12種類の音の中から3つ以上選んで重ねたものです。
3つ以上選んで重ねるのですが、テキトーに選んで良いわけではなく、選び方には規則があります。

コードの表し方、作り方

コードは3つ以上の音が重なっています。ではコードを表す時はどうやって表すのでしょうか?毎回、使用する音の組み合わせを(G,B,D)や(C,E,G)のように書くのでしょうか?
コードの表し方を知るには、コードを作るための音の選び方規則を知る必要があります。
音の選び方ですが、ルート音と呼ばれる基準となる音から、適当な間隔で音を選んでいきます。

たとえばメジャーコードは
ルート音 + ルート音から**半音4つ分**高い音 + ルート音から半音7つ分高い音
という規則で表されます。

マイナーコードは
ルート音 + ルート音から**半音3つ分**高い音 + ルート音から半音7つ分高い音
という規則で表されます。

上記のようにコードは、ルート音とルート音からの間隔の規則で再現できます。そのため、コードを文字で表す際は、ルート音と組み合わせ方の規則(メジャーコード、マイナーコード、7thコードなどなど)で表記されます。


E ・・・ ルート音がE組み合わせ規則がメジャーコードであることを表します。
F#m ・・・ ルート音がF#組み合わせ規則がマイナーコードであることを表します。
D♭mM7 ・・・ 仰々しく感じるかもしれませんが、これはルート音がD♭組み合わせ規則がマイナーメジャー7thであることを表します。

長々書いてきましたが、コードはルート音と呼ばれる基準の音と、ルート音から適当な間隔だけ離れた音を重ねているということを理解してもらえれば大丈夫です!

キー

お待ちかね、キーの話です。
皆さん、カラオケでキーを変更したことがあるのではないでしょうか?今回説明するキーは、カラオケで出てくるキーのことです!
ピアノ経験者の方だと長調とか短調とか聞いたことあるでしょう。それです。

キーの定義は様々ありますが、この記事では以下の定義で進めたいと思います(厳密なキーの定義とは異なっています。音楽理論ガチ勢の方、ごめんなさい)。

キーの定義は
12種類の音のうち、曲中で頻繁に使用することができる「1軍」となる7つの音を決めるルール
です。

例えばキーがCの場合、1軍の音は C,D,E,F,G,A,B(ドレミファソラシ)です。
キーがGの場合、1軍の音はG,A,B,C,D,E,F#(ソラシドレミファ#)となります。
キーがBの場合、1軍の音はB,C#,D#,E,F#,G#,A#(シド#レ#ミファ#ソ#ラ#)となります。
このようにキーによって、1軍の音は変わっていきます。

音楽は音が重なったり、連続して鳴り続けることで成立しています。この音の重ね方、鳴る順番はテキトーであってはいけません。ある一定のルールに従って鳴ることで、我々の耳が気持ちよく感じることができます。しかし、ルールを脱線してしまうと不協和音のような、我々の耳にとって不快な音が鳴ってしまいます。

我々が「気持ちよく感じるルール」は沢山あるのですが、1番安全なのは「1軍」となる7つの音を鳴らし続けることです。(「気持ちよく感じるルール」の中には、1軍以外の音をここぞという時にたまに鳴らす!というものもあります。実際、我々が耳にする楽曲のほとんどで、1軍以外の音は使用されています。)

キーが決まると

キーが決まると1軍となる7つの音が決まります。すると曲中で使用できるコードにも変化が出ます。
コードは音を重ねたものなので、1軍の音だけを重ねたコードと1軍じゃない音が混ざったコードが出てきます。
当然、1軍の音だけを重ねたコードを使ったほうが安全ですから、コードの中でも1軍のコードとそうでないコードの分類ができます。したがって、キーが決まることで1軍となる7つの音が決まったように、キーが決まることで頻繁に使用することができる「1軍」コードが決まります。これは沢山あるのですが、その中でも特に使用頻度が高い7種類のコードがあり、これはダイアトニックコードと呼ばれています。

本題

大変長くなってしまいましたが、曲のキーが決まることで頻繁に使用できる1軍コードが決まることが分かりました。ここから以下の仮説が導き出せます。

曲のキーによって、頻繁に使われるコードとそうでないコードがある。つまり曲中に出てくるコードの数とキーには何かしらの関係があるのではないか?

ここで実際にコード譜を見てみましょう。下はスピッツのチェリーのコード譜です。
image.png

この曲はキーがCです。キーCの1軍コード(ダイアトニックコード)はC,Dm,Em,F,G,Am,Bm7-5なのですが、上で使用されているコードは、全てキーCのダイアトニックコードであることが分かります。

もう一つ例を見てみましょう。米津玄師のLemonのコード譜です。
image.png

この曲はキーがBで、キーBのダイアトニックコードは B,C#m,D#m,E,F#,G#m,A#m7-5なのですが、ダイアトニックコードが多く使用されているのがわかると思います(DdimやD#など、ダイアトニックコードでないコードも出てきています)。

実際、僕がコード譜からキーを判別する際は、使用されているコードを眺めて「あのキーのダイアトニックコードが多く使われているから、あのキーだな」というふうにしています。

というわけで、今回作るAI(機械学習モデル)は

入力:曲中で使用されているコードをカウントしたデータ
出力:曲のキー

というふうに作っていこうと思います。

注意点

曲中で転調する曲は、キーを一意に定めることができません(曲の中にキーが複数存在するため)。しかし今回作成するモデルでは、出力するキーは1つだけとします。予めご了承ください。

次の記事はこちら

次の記事からは、技術的なことを中心に書いていきます。

1.データ収集(クローリング)←次の記事です
2.データ整形(スクレイピング)
3.xgboostを用いたAIの開発
4.Djangoを用いたWebアプリ開発

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6