Pythonの音楽情報処理ライブラリmusic21の紹介

#始めに
music21はMITが作ったpythonの音楽情報処理ライブラリです。
musicology(音響学・音楽理論)の研究への利用を目的に作られたそうで、
結構いろいろできるらしいので、勉強がてら触ってみました。
難しいアルゴリズム等の話はほとんどしないので、プログラマでない方も出力結果だけ見て「こんなことができるんだ」と思ってもらえるような記事になればいいな、と思っています。

ちなみに、21というのはMITでの音楽コースに割り当てられた講義番号に由来するそうです。留学したい。

基本的に[公式のドキュメント](https://web.mit.edu/music21/doc/about/what.html)を順に追ってくだけです。ここの内容を実行しながら感想を書く、という記事です。
#環境
macOS(10.15.7)
python3.8.5
jupyter-notebook
Musescore　version-3.4.2.25137

Musescoreというのはフリーの楽譜作成ソフトです。たまたまインストールしていたのですが、楽譜を出力するときに呼ばれてたのでここに書いときます。
#動かしてみよう
###単音の記述
なんと、たった3行で楽譜を出力できちまうんですね。

```python

from music21 import *

n = note.Note("D#3")
n.duration.type = 'half'
n.show()
```
出力
![D#3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276336/f5cd385a-8677-f17e-106c-3847df27da09.png)

すげぇ。'half'は二分音符、'D#3'はレ＃を表してます。
前述の通り、実行した時にMusescoreがぴょんぴょんしてました。入れてなかったら別の挙動になるかも知れません。
###旋律の記述
さらにこんなこともできちゃう。

```python
littleMelody = converter.parse("tinynotation: 3/4 c4 d8 f g16 a g f#")
littleMelody.show()
```

出力
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276336/7f2c2427-fd01-1654-d91c-3b5dedef6616.png)
凄すぎる。入力は文字列で、音名だけじゃなく音符の長さも記述できるみたいです。音符の長さをいったん記述したら変更があるまで再記述しなくてもいいのは素敵ですね。c4が音名cの４分音符、g16は音名gの16分音符を表してます。

さらに、出力できるのは楽譜だけじゃあない。

```python
littleMelody.show('midi')
```
出力
![スクリーンショット 2021-03-12 20.25.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276336/3b6f085a-51d7-a8d9-db27-e80d7196a4e7.png)
jupyter-notebook上で音声として聴けます。すごすぎ。
###セリエル音楽の解析
この世の中には12音技法というものがあります。私は詳しくは知らないのでざっくりとしか書けませんが、半音含めた12個全ての音を均等に使おう、という作曲技法のことで、どうやら12*12の行列を使った解析が盛んなようです。以下では、12音技法を使ったセリエル音楽の元祖であるシューケンベルク作曲の「弦楽四重奏曲第４番」（の一部）を行列変換しています。渡す整数がその12音に対応してるんですかね。

```python
print (serial.rowToMatrix([2, 1, 9, 10, 5, 3, 4, 0, 8, 7, 6, 11]) )
```
出力
```
  0 11  7  8  3  1  2 10  6  5  4  9
  1  0  8  9  4  2  3 11  7  6  5 10
  5  4  0  1  8  6  7  3 11 10  9  2
  4  3 11  0  7  5  6  2 10  9  8  1
  9  8  4  5  0 10 11  7  3  2  1  6
 11 10  6  7  2  0  1  9  5  4  3  8
 10  9  5  6  1 11  0  8  4  3  2  7
  2  1  9 10  5  3  4  0  8  7  6 11
  6  5  1  2  9  7  8  4  0 11 10  3
  7  6  2  3 10  8  9  5  1  0 11  4
  8  7  3  4 11  9 10  6  2  1  0  5
  3  2 10 11  6  4  5  1  9  8  7  0
```
無知なのでよくわかりませんが、この辺を専攻してる方々にとっては涙が出るほど便利なんでしょう。
###曲のデータベース
有名なライセンスフリーの曲のデータ(主にクラシック)はcorpusを通して直接さわれます。提供されている曲のリストは[ここ](https://web.mit.edu/music21/doc/about/referenceCorpus.html#referencecorpus)。
公式ドキュメントではDicant nunc judeiという曲を扱っていますが、どんな曲なのか知らなかったので僕はバッハのコラールにしました。[この曲です](https://www.youtube.com/watch?v=ulOG8tfFDto)。
次のコードで当然のように楽譜を出力してくれます。

```python
bwv255 = corpus.parse('Bwv255')
bwv255.show()
```
出力
![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276336/4367c104-cdf5-1a71-d786-43ba33a63b8f.png)

もちろん楽譜の画像だけではなく音符の情報も含まれているので、次のようなこともできます。
このコラール中に含まれる音の出現頻度を見てみます。

```python
bwv255.plot('histogram', 'pitch')
```

出力
![ダウンロード (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276336/feb6fb74-35c3-09e0-8ad2-12682eb94d79.png)
音楽理論で重要なⅠとⅤの音（これはハ長調なのでCとG）が多く含まれてるように見えますね。面白いです。

データベースは、「なんでもある」状態には程遠いものの、数はだいぶあるなぁという印象です。バッハは433曲ありました。そういえばバッハのコラールは[「DeepLearningでバッハっぽい楽曲生成」みたいなプロジェクト](https://arxiv.org/abs/1612.01010)が話題になってましたね。githubをのぞいた所、これもmusic21を採用していました。

###楽譜上の情報をいじる
さっき出力した楽譜の音符に音名を書きます。楽譜をまだ読めない初心者の人が最初にやるやつです。

```python
for thisNote in bwv255.recurse().notes:
  thisNote.addLyric(thisNote.pitch.german)
bwv255.show()
```
![ダウンロード (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276336/6d04d9c7-6996-51e7-65bb-748e4226bf55.png)

既に歌詞がついてるからか、ソプラノには音名がつきませんでした。公式ドキュメントの例でもこうなってるんですが、僕の場合はソプラノでも歌詞がついてない音符がちょっとあるので飛び飛びで付いちゃってます。しかしライブラリに軽く触れるのがこの記事の目的なのでスルー。

たぶん、金管楽器の運指番号を振るとかも似た要領でできますね。音名と運指の辞書を書いてやるだけで動きそうな雰囲気があって凄い。

ここでは詳しく触れませんが、曲リストの中から3/4拍子のものだけ抽出、とかもできるみたいです。おそらく我々が思いつくようなことはなんでもできる。
#終わりに
music21の強力さを実感するために公式ドキュメントの最初の１ページだけ触りました。
音符をはじめとする音楽的シンボルを対象とするなら、ほとんど不自由しなさそう。逆に言えば、生の波形データを扱うような音響信号処理は他に譲ってますね。
公式ドキュメントの他のページでは、ここで紹介したオブジェクトの詳細な仕様が丁寧に書かれているので、僕の興味に合わせて抜粋した解説記事をまた書くと思います。