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

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

[0.設計編(キーを判別するAIとは？)](https://qiita.com/hanata/items/38163b6dddbc2ec8812e)←この記事です。
[1.データ収集(クローリング)](https://qiita.com/hanata/items/cbc6cc377321a2880f5b)
[2.データ整形(スクレイピング)](https://qiita.com/hanata/items/692f98ee83295614599f)
[3.機械学習を用いたAIの開発](https://qiita.com/hanata/items/d1fb6241cccf405bbc58)
[4.Djangoを用いたWebアプリ開発](https://qiita.com/hanata/items/968040a366c9bb1dbc93)



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


# 必要な音楽理論の知識

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



## 音の名前(音名)

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

<table>
<thead> 
<tr> 
<th>国名</th>
<th>ド</th>
<th>レ</th>
<th>ミ</th>
<th>ファ</th>
<th>ソ</th>
<th>ラ</th>
<th>シ</th>
<th>ド</th>
</tr>
</thead> <tbody> 
<tr> 
<th>日本</th>
<td>ハ</td>
<td>ニ</td>
<td>ホ</td>
<td>ヘ</td>
<td>ト</td>
<td>イ</td>
<td>ロ</td>
<td>ハ</td>
</tr>
<tr> 
<th>英米</th>
<td>C</td>
<td>D</td>
<td>E</td>
<td>F</td>
<td>G</td>
<td>A</td>
<td>B</td>
<td>C</td>
</tr>
<tr> 
<th>イタリア</th>
<td>Do</td>
<td>Re</td>
<td>Mi </td>
<td>Fa</td>
<td>Sol</td>
<td>La</td>
<td>Si</td>
<td>Do</td>
</tr>
</tbody> 
</table>
今回の目的は「コード進行からキーを判別する」です。コードの表現は一般的に英語表記なので、以後音名は**英語表記（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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405491/535453f9-957a-7969-403d-c2c7e5bd9f34.png)

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

  
もう一つ例を見てみましょう。米津玄師のLemonのコード譜です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405491/1323a388-e104-c2e0-2611-60059e69918e.png)

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


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


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

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

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

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


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

[1.データ収集(クローリング)](https://qiita.com/hanata/items/cbc6cc377321a2880f5b)←次の記事です
[2.データ整形(スクレイピング)](https://qiita.com/hanata/items/692f98ee83295614599f)
[3.xgboostを用いたAIの開発]()
[4.Djangoを用いたWebアプリ開発](https://qiita.com/hanata/items/968040a366c9bb1dbc93)