見出し画像

Python で応援歌を作ろう (東大編)

こんにちは、今回は佐藤(4年/佐世保北)がお送りします。
今回で僕の記事は最終回です。もっと書きたかったこともあり名残惜しいですが、これから後輩たちによる楽しいnote が発信されると思うので、今後は読む側として楽しんでいきます!

さて、佐藤の 前々回 はお絵描きをしました。前回 はたくさん走りました。
つまり教科で言うと 美術→体育ときています。
と、いうことで、
今回は音楽をします。題して、

Python で応援歌を作ろう!

です。
プログラミング言語 Python を使って神宮球場で応援部の方々が演奏してくださる応援歌、チャンスパターンを作っていこうという記事です。
東大編となっていますが、のちのことを考えず「前編」と書いた前々回と違って、今回は後輩から続編があると思います。お楽しみに。


<参考>

今回の記事を作成するのにあたって、以下のロボ太さんの記事を参考にしました。コードもこちらから引用・改変してきたものがあります。

<ソースコード>

今回は、実際に実行しながら楽しんでいただきたいので、Google Colab のノートブックを準備しました。上から順番に実行していくと、音が出ると思います。
(⚠️ PC推奨です。)

<音楽>

こちらの再生リストにまとめました。

説明編1. 音の仕組み

はじめに、音の仕組みについて軽く説明します。

まず、前提として音は波です。音高をもつ楽器の音はもちろん、音高のない人の声や動物の鳴き声、「ゴォー」といった雑音なども全て、「波形」を持っています。そして、それらの「波形」は特定の周波数や振幅の成分を持っている正弦波の重ね合わせによって表すことができます(下図)。
周波数は音の高さ(「ド」とか「ラ」とか)、音の振幅は音の大きさに影響します。

音は正弦波の重ね合わせ
元の画像はこちらから持ってきました

つまり、もっとも単純には、ある周波数を持った正弦波を指定することで、音を出すことができるようになります。

説明編2. 音を出してみる

ということで実際に音を出してみましょう。
基本的な「ラ」の音は440Hz の周波数を持ちます。
以下のコードで実行することで、440Hz の音を出してみます。

import numpy as np
import IPython

# 鳴らす秒数を指定 (今回は5秒)
duration = 5 
# 鳴らす周波数を指定 (今回は440Hz, ラの音)
freq = 440 

# サンプリングレート「どのくらい時間を細かく区切るか」を指定 
# あまり気にせず鳴らしたい周波数域に対して十分にデカい値であれば良い
rate = 48000 

# 時間軸 を作成
# 0から5秒 の間の 240000個 のx座標の集まり
t = np.linspace(0., duration, int(rate*duration)) 

## 音を再生
IPython.display.Audio(np.sin(2*np.pi*freq*t), rate = rate) 

波形はこのようになっています。

波形

コードの説明は省略するので、もし気になる方は、上の<参考>の記事をご参照ください。 波形データを IPython.display.Audio という関数に渡すことで、簡単に音を鳴らすことができます。

説明編3. 曲を作る関数を作成する

先ほど作成した波形データは一つの音を作成するものでした。
今度はこれを応用して、音の順番とその長さを与えることで、曲を作成するコードを書いてみます。

### 関数の定義 ### 
import numpy as np
import IPython

def sound_maker(note = "A", duration = 1, high = 0, bpm = 120, rate = 48000):
    qn_duration = 60/bpm * duration
    t = np.linspace(.0, qn_duration, int(rate*qn_duration))
    list_notes = ["C","c","D","d","E","F","f","G","g","A","a","B"]
    if note == "R":
        sound = np.sin(0*t)
    elif note not in list_notes:
        print(f'{note}は音階に含まれていません。')
        sound = np.sin(0*t)
    else:
        f = 440 * 2.0**(high + ((list_notes.index(note)-9)/12.0))
        sound = np.sin(2.0*np.pi*f*t)
    return sound

def return_key_and_height(key):
    if len(key) != 1:
        h = int(key[1:])
    else:
        h = 0
    return key[0], h

def music_maker(key_list, dur_list, bpm, rate = 48000):
    music = np.array([])
    for key, dur in zip(key_list, dur_list):
        qn_duration = 60/bpm * dur
        sound = np.linspace(0., qn_duration, int(rate*qn_duration))
        if type(key) != list:
            key = [key]
        for key_i in key:
            k, h = return_key_and_height(key_i)
            sound += sound_maker(high=h, note=k, duration=dur, bpm = bpm)
        music = np.append(music, sound)
    return music

今回も説明は省略しますが、上では music_maker という関数を作成しました。
この music_maker を利用し、
① 音名とその高さ (下参照) のリスト[key_list]
② 音の長さ のリスト[dur_list]
③ 曲のテンポ[bpm]
を指定することによって、曲の波形を作ることができるようになります。

音名の指定方法

音名の指定ルール

  • 白鍵の音はA〜Gの大文字で指定する

  • 黒鍵の音は白鍵近くの小文字[c, d, f, g, a]で指定する

  • 高い音が出したい場合は、その度合いに応じて音名の後に 1,2,3… と付ける

  • 低い音が出したい場合は、その度合いに応じて音名の後に -1,-2,-3 … と付ける

  • 休符は「R」を指定する

説明編4. 曲を作って鳴らしてみる

以上で準備は整いました!
ということで実際に曲を作成してみます。

かえるの歌

### かえるの歌 
key_list = ["C", "D", "E", "F", "E", "D", "C", "R",
            "E", "F", "G", "A", "G", "F", "E", "R", 
            "C", "R", "C", "R", "C", "R", "C", "R", 
            "C", "D", "E", "F", "E", "D", "C", "R"]
dur_list = [1, 1, 1, 1, 1, 1, 1, 1, 
            1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1, 1, 
            1, 1, 1, 1, 1, 1, 1, 1]

music = music_maker(key_list, dur_list, bpm = 120)
IPython.display.Audio(music, rate=rate)

いかがでしょうか。

かえるの歌 β

同じ音が続くときやスタッカートを入れたいときは、
適宜休符["R"]を音の後に入れるとうまくいきます。

### β版かえるの歌 
key_list = ["C", "D", "E", "F", "E", "D", "C", "R",
            "E", "F", "G", "A", "G", "F", "E", "R", 
            "C", "R", "C", "R", "C", "R", "C", "R", 
            "C", "R", "C", "R", "D", "R", "D", "R",
            "E", "R", "E", "R", "F", "R", "F", "R",
            "E", "R", "D", "R", "C", "R"]
dur_list = [1, 1, 1, 1, 1, 1, 1, 1, 
            1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1, 1, 
            .45, .05, .45, .05, .45, .05, .45, .05, 
            .45, .05, .45, .05, .45, .05, .45, .05, 
            .5, .5, .5, .5, 1, 1]

music = music_maker(key_list, dur_list, bpm = 120)
IPython.display.Audio(music, rate=rate)

かえるの歌 γ

和音を出したい時は、音名を表す文字ではなく、音名の文字のリストで音を指定してください。

### γ版 かえるの歌
key_list = ["C", "D", "E", "F", "E", "D", "C", "R",
            ["E", "C"], ["F", "D"], ["G", "E"], ["A", "F"],
            ["G", "E"], ["F", "D"], ["E", "C"], "R",
            ["C", "E"], "F", ["C", "G"], "A",
            ["C", "G"], "F", ["C", "E"], "R",
            ["C", "C"], "D", ["E", "C"], "F",
            ["E", "C"], "D", ["C", "C"], "R",
            "C", "D", "E", "F", "E", "D", "C", "R"]
dur_list = [1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1, 1]

music = music_maker(key_list, dur_list, bpm = 120)
IPython.display.Audio(music, rate=rate)

さて、ここまでで準備は以上です。実際に応援歌を作っていきましょう!

実践編1. 闘魂は

1曲目は「闘魂は」です。
初回に流れることが多いです。また、最終攻撃回にはエンドレスで流れます。
楽譜はこちらにありますが、普段聞く曲よりも半音低いので調整してあります。
これは今後の曲にも言えることですが、細かいところは楽譜準拠というよりは耳コピ準拠になっています。

# 闘魂は
# シ♭ a, レ♭ c, ミ♭ d, ラ♭ g,

tokon_bpm = 140
tokon_intro_key = [
    "R", "C1",
    "d1", "C1", "R", "a", "R", "g", "F", "R", "c1", "R", "c1", "R", "C1", "c1",
    "d1", "R", "d1", "c1", "C1", "a", "G",
    "R", "g", "a", "C1", "c1", "d1", "c1", "C1", "a", "g", "R"]
tokon_music_key = [
    "d", "R", "d", "F", "d", "C1", "R", "C1", "R", "C1", "a", "g", "R",
    "F", "g", "F", "d", "C", "d", "R", "d",
    "F", "R", "F", "G", "g", "d", "R", "d", "g", "G", "g", "a", "C1", "R",
    "c1", "C1", "F", "a", "C1", "a", "R", "g", "G", "F",
    "d", "C", "c", "d", "C1", "a", "g", "R", "d", "R",
    "d", "R", "d", "F", "d", "R", "F", "G", "g", "a", "g", "F", "d", "R", "d",
    "F", "G", "g", "R", "g", "G", "g", "a", "R", "d",
    "C1", "R", "C1", "R", "C1", "g", "a", "C1",
    "a", "R", "C1",
    "d1", "C1", "R", "a", "R", "g", "F", "R", "c1", "R", "c1", "R", "C1", "c1",
    "d1", "C1", "a", "R", "a", "R", "a", "g", "R",
    "d", "F", "G", ["C", "d", "g"],]
tokon_intro_dur = [
    3,  1,
    2.5, .49, .01, .49, .01, .5, .95, .05, .95, .05, .3, .7, .75, .25,
    .3, .2, 1, 1, .5, .5, .5,
    .06, .23, .23, .23, .23, .23, .23, .23, .23, .5, 1.6]
tokon_music_dur = [
    .35, .15, 1, .5, 1, 1, .05, .35, .1, 1, .5, 1.5, .5,
    1, 1, 1, .75, .25, 2.5, .5, 1,
    .95, .05, .75, .25, 1, .7, .05, .25, .75, .25, .5, .5, 1.5, .5,
    1, 1, 1, .75, .25, 2, .5, .5, .5, .5,
    1, .75, .25, 1, .75, .25, 2, 1, .95, .05,
    1.95, .05, 1, 1, 2.5, .5, .7, .3,  1.5, .5, 1, 1, 2, 1, 1,
    1.5, .5, 1, .05, .95, 1.5, .5, .3, .7, 1,
    1.45, .05, .45, .05, .5, .5, .5, .5,
    2, 1, 1,
    2.5, .49, .01, .49, .01, .5, .95, .05, .95, .05, .3, .7, .75, .25,
    1.5, .5, .95, .05, .7, .05, .25, 2.5, .5,
    .1, .05, .05, .8]
tokon_key = tokon_intro_key + tokon_music_key
tokon_dur = tokon_intro_dur + tokon_music_dur
tokon_music = music_maker(tokon_key, tokon_dur, tokon_bpm)

IPython.display.Audio(tokon_music, rate=48000)

こういう音が出ます。

闘魂は 今ぞ極まる
逞しく 力競いて
掲げなん 勝利の旗を
淡青の この空の下
おおわが東大 栄えある学府
おおわが東大 栄えある学府

闘魂は

実践編2. 不死鳥の如く + イントロビクトリー

2曲目は熱く盛り上がるチャンステーマ「不死鳥の如く」です。
淡青タオルを振り回しながらお聞きください。
これは私の感想なのですが、最初の「オー」の音程は低いのに(標準でレの低音)、サビは高いので(標準でソ)、最初の音の入りが難しいです。気持ち込めて歌うためにめちゃくちゃ声出したいのに、低音のせいで声が出しにくいからです。かといって1オクターブあげるとサビで死にます。
「イントロビクトリー」とセットで流れますので、2曲続けてどうぞ。

# 不死鳥の如く
fushicho_bpm = 140
fushicho_key = [
    "R", "A",
    "D1", "R", "G", "C1", "R", "F",
    "a", "C1", "a", "F", "G",
    "A", "a", "C1", "R", "G", "R", "F", "R", "G", "R", "A", "R", "A-1",
    "D", "R", "D", "F", "A", "C1", "A", "C1", "R", "C1", "a", "R",
    "a", "A", "G", "A", "R", "A-1",
    "D", "R", "D", "F", "A", "C1", "A", "C1", "R", "C1", "a",
    "D1", "c1", "R", "E1", "F1", "E1", "F1", "E1", "D1", "R", "A-1", "R", "a-1", "R",
    "C", "R", "A-1", "C", "F", "E", "C", "A-1", "R", "C", "a-1", "R",
    "a-1", "D", "F", "E", "R",  "E", "F", "G", "R", "G", "g", "A", "R","A",
    "F1", "E1", "F1", "R",
    "F1", "G1", "F1", "E1", "C1", "E1", "R", "E1", "D1", "F1", "E1", "R",
    "E1", "F1", "E1", "F1", "E1", "D1", "R", "D1", "A", "F", "D", "R"]

fushicho_dur = [
    3.5, .5,
    6.5, 1, .5, 6.5, 1, .5,
    5, 1, .7, .7, .6,
    4, .25, .25, .25, .45, .05,
    .4, .05, .2, .05, .5, .55, 1,
    4, 1, 1, 1, 1, 1.5, .5, 4, 1, 1, 4, 1, 1, 1, 1, 4, 3, 1,
    4, 1, 1, 1, 1, 1.5, .5, 4, 1, 1, 3, 1, .5, 1.5, .7, .7, .6,
    .22, .22, 5.06, 1.5, .45, .05, .45, .05,
    5, 1, .7, .7, .6, 1.5, .5, 4, 1, 1, 4, 1, 1, 1, 1, .5, 1,
    .25, .25, .5, 1, .25, .25, 2.5, .5, 1,
    1.5, .5, 2.5, .5, 1, 1, 1, 1.5, .5,  4,  1, 1, 3, 1, .5, 1.5,
    .7, .8, .5, .22, .22, 3.56, 1, .3, .3, .3, .3, 1.8]

fushicho_music = music_maker(fushicho_key, fushicho_dur, fushicho_bpm)
# イントロビクトリー
#  ミ♭ d, ラ♭ g, シ♭ a,
intro_bpm = 140
intro_intro_key = [
    "d", "R", "d", "F", "G", "a", "A", "a", "C1", "a", "R",
    "g", "R", "g", "a", "C1", "d1", "D1", "d1", "F1", "d1", "R",
    "a", "R", "a", "C1", "D1", "F1", "d1", "C1", "g", "F",
    "a", "R", "a", "R", "a","R", "a", "R", "a", "R", "a", "R", "a", "R",
    "a", "d1",]
intro_music_key = [
    "R", "a", "A", "g",
    "G", "R", "G", "R", "G", "g", "A", "a", "R", "a", "A", "a",
    "C1", "R", "C1", "R", "C1", "D1", "d1", "G1", "R", "g1", "R", "G1", "R", "F1",
    "R", "G1", "R", "F1", "R", "d1", "R",
    "a", "A", "a", "C1", "R", "C1", "D1", "C1", "a", "d1",]
intro_outro_key = ["d1", "R", "a", "C1", "D1", ["d", "G", "a", "d1"]]

intro_intro_dur = [
    .75, .25, 1/3, 1/3, 1/3, 1, 1/3, 1/3, 1/3, 3, 1,
    .75, .25, 1/3, 1/3, 1/3, 1, 1/3, 1/3, 1/3, 3, 1,
    .75, .25, .75, .25, 1, 1, 1, 1, 1, 1,
    .3, .3, .15, .05, .15, .05, .75, .25, .3, .3, .15, .05, .15, .05,
    1, 2,]
intro_music_dur = [
    .5, .5, .5, .5,
    .75, .25, .75, .25, .5, 1, .5, 2.25, .25, .5, .5, .5,
    .75, .25, .75, .25, .5, 1, .5, 2.5, .5, .45, .05, .45, .05,
    .5, 2.5, .45, .05, .45, .05, .5, 1.5, 1, .5, .5,
    .75, .25, 1, .5, 1, .5, 2]
intro_outro_dur = [.5, .5, .1, .1, .1, .7]

intro_key = intro_intro_key + intro_music_key * 3 + intro_outro_key
intro_dur = intro_intro_dur + intro_music_dur * 3 + intro_outro_dur
intro_music = music_maker(intro_key, intro_dur, intro_bpm)
## 合体!
IPython.display.Audio(np.append(fushicho_music, intro_music), rate=48000)

(ファイト ファイト東大!)×2
(ハーイ ハーイ!)×2
オー! オー! オー!
(かっせ かっせ [選手名] !)×4
オー!

不死鳥の如く

Let's Go! Let's Go!
今がチャンスだ かっとばせ!
( [選手名] ! [選手名] !勝つぞ! 勝つぞ! [相手校] 倒せ オー!)×3

イントロビクトリー

楽譜がなかったので応援部のサイトなどから耳コピしました。


実践編3. 嗚呼玉杯に花うけて

3曲目は応援歌らしからぬ(?)短調の曲、「嗚呼玉杯に花うけて」です。
wikipediaによると元々は長調だったとか。ほんとかしら。
神宮応援では 1, 2, 5 番を歌います。3, 4番を歌わない理由は内容的な問題でしょうか、それとも長すぎるとかいう単純な理由でしょうか。
ちなみに、二外ドイツ語選択者の豆知識を披露すると、ドイツ国歌の一番は歌詞的な問題で歌われないそうです。(ドイツが世界の中で一番上とか歌っているため)

# 玉杯
# シ♭ a, レ♭ c, ミ♭ d, ラ♭ g,
gyoku_bpm = 88
gyoku_intro_key = [
    "F1", "R", "F1", "a", "R", "a", "c1", "C1", "R", "C1", "a", "F" , "G",
    "g", "R", "g", "G", "d", "G", "F", "d", "c", "C", "F", "d", "c", "C"]
gyoku_music_key = [
    "F", "g", "R", "g", "G", "g" , "C1",
    "c1", "R", "c1", "C1", "c1", "F1", "R",
    "C1", "R", "C1", "c1", "F1", "c1", "R", "c1", "C1",
    "g", "R", "g", "G", "g", "F", "R",
    "g", "R", "g", "G", "F", "c", "F", "G",
    "F", "R", "F", "G", "g", "C1", "R",
    "c1", "R", "c1", "C1", "R", "C1", "F", "G", "g",
    "g", "R", "g", "G", "g", "F", "R",
    "c1", "F1", "c1", "C1", "c1", "F1", "G1",
    "g1", "G1", "F1", "c1", "F1", "R",
    "c1", "F1", "G1", "F1", "c1", "R", "c1", "C1",
    "c1", "C1", "g", "G", "F", "R"]
gyoku_outro_key =["c1", "F1", "G1", "F1", "c1", "R", "c1", "C1",
                  "c1", "C1", "g", "G", "F",]

gyoku_intro_dur = [
    .95, .05, 1, .95, .05, 2/3, 1/3, .95, .05, 1, 1, 2/3, 1/3,
    .95, .05, 1, 1, 2/3, 1/3, 1, 1, 1, 1, 1, 1, 1, 1]
gyoku_music_dur =[
    1, 2/3-.05, .05, 1/3, 2/3, 1/3, 1,
    2/3-.05, .05, 1/3, 2/3, 1/3, 4/3, 2/3,
    2/3-.05, .05, 1/3, 2/3, 1/3, 2/3-.05, .05, 1/3, 1,
    2/3-.05, .05, 1/3, 2/3, 1/3, 4/3, 2/3,
    2/3-.05, .05, 1/3, 2/3, 1/3, 2/3, 1/3, 1,
    2/3-.05, .05, 1/3, 2/3, 1/3, 4/3, 2/3,
    2/3-.05, .05, 1/3, 2/3-.05, .05, 1/3, 2/3, 1/3, 1,
    2/3-.05, .05, 1/3, 2/3, 1/3, 4/3, 2/3,
    2/3, 1/3, 2/3, 1/3, 2/3, 1/3, 1,
    2/3, 1/3, 2/3, 1/3, 4/3, 2/3,
    2/3, 1/3, 2/3, 1/3, 2/3-.05, .05, 1/3, 1,
    5/3, 1/3, 2/3, 1/3, .95, .05]
gyoku_outro_dur = [2/3, 1/3, 2/3, 1/3, 2/3-.05, .05, 1/3, 1,
                   5/3, 1/3, 2/3, 1/3, 1]

gyoku_key = gyoku_intro_key + gyoku_music_key * 3 + gyoku_outro_key
gyoku_dur = gyoku_intro_dur + gyoku_music_dur * 3 + gyoku_outro_dur

gyoku_music = music_maker(gyoku_key, gyoku_dur, gyoku_bpm)

IPython.display.Audio(gyoku_music, rate=48000)

嗚呼玉杯に花うけて 緑酒に月の影やどし
治安の夢に耽りたる 栄華の巷低く見て
向ヶ岡にそゝりたつ 五寮の健児意気高し

芙蓉の雪の精をとり 芳野の花の華を奪ひ
清き心の益良雄が 剣と筆とをとり持ちて
一たび起たば何事か 人生の偉業成らざらん

行途を拒むものあらば 斬りて捨つるに何かある
破邪の剣を抜き持ちて 舳に立ちて我呼べば
魑魅魍魎も影ひそめ 金波銀波の海静か

嗚呼玉杯に花うけて

実践編4. 足音を高めよ

4曲目は「足音を高めよ」です。
誠に恥ずかしながら私は、この曲の歌詞を覚えていませんでした。
ただこの作成過程で引退間近にして幸い1番は覚えることができたので、今度歌ってみようと思います。
楽譜はこちらです。楽譜よりも1音低いです。(初音 ファ→ミ♭)
↓拍をできるだけ整数値にしたいと思い、BPM がバカデカくなっていますが、実際はその2分の1の133 くらいだと思います。

# 足音を高めよ
# シ♭ a, レ♭ c, ミ♭ d, ラ♭ g,

ashi_bpm = 266
ashi_intro_key = [
    "R", "g", "R", "g", "R", "g", "R", "g", "R", "g", "R", "g", "R",
    "g", "R", "C1", "R", "C1", "R", "d1",  "R", "C1", "R",  "d1", "R",
    "d1", "R", "d1", "c1", "R", "c1", "C1", "a", "R", "a", "g", "G", "F", "E"]
ashi_music_key = [
    "d", "F", "d", "R", "d", "C", "g", "R", "g", "a", "C1", "R",
    "c1", "C1", "a", "g", "G", "g", "a", "R",
    "d", "F", "d", "R", "d", "C", "g", "R", "g", "a", "C1", "R",
    "a", "R", "a", "R", "a", "C1", "g", "R",
    "G", "R", "G", "g", "a", "R", "g", "R", "g", "a", "C1", "R",
    "a", "R", "a", "R", "a", "C1", "D1", "d1",  "c1", "C1", "a",
    "d", "R", "d", "C", "d", "C1", "a",
    "g", "R","g", "G", "F", "R", "F", "g", "d", "c", "C", "a-1",
    "F", "G", "g", "F", "d", "g", "C1", "d1", "R",
    "a", "C1", "c1", "R", "c1", "C1", "a", "g", "R"]

ashi_intro_dur = [
    4, 2.5, .5, .4, .1, .4, .1, 2.5, .5, .4, .1, .4, .1,
    .5, .5, .4, .1, .4, .1, .5, .5, .5, .5, .5, 1.5,
    1.4, .1, .5, 2.5, .5, 1, 2, 1.4, .1, .5, 5, 1, 1, 1]
ashi_music_dur = [
    3, 1, 1, .1, .9, 2, 1, .1, 1.9, 1, 3, 1,
    1.5, .5, 1, 1, 2, 2, 6, 2,
    3, 1, 1, .1, .9, 2, 1, .1, 1.9, 1, 3, 1,
    2.9, .1, .9, .1, 2, 2, 6, 2,
    .9, .1, 2, 1, 3, 1, .9, .1, 2, 1, 3, 1,
    .9, .1, 1.9, .1, 1, 2, 2, 5, 1, 1, 1,
    2.9, .1, 1, 2, 2, 3, 1,
    1.5, .5, 1.5, .5, 3, 1, 2, 2, 5, 1, 1, 1,
    3, 1, 2, 2, 1, 2, 1, 1, 1,
    1.5, .5, 2.9, .1, 1, 2, 2, 6, 2]

ashi_key = ashi_intro_key + ashi_music_key
ashi_dur = ashi_intro_dur + ashi_music_dur
ashi_music = music_maker(ashi_key, ashi_dur, ashi_bpm)

IPython.display.Audio(ashi_music, rate=48000)

足音を高めよ 雄々しきひびき
地の果てにとどきて 限りなき
生命燃えたり ひたぶるの
情熱かけて 友よ友よ
その火絶やすな自由の火を

足音を高めよ


実践編5. 美しく夜は明けて

5曲目は「美しく夜は明けて」、【2024新】応援歌です。調べてみると曲自体は昭和32年とかにできたっぽくて、応援部として2024年から演奏している、ということのようです。
作曲家を調べたら有名らしい経済学者の方で驚きました。多才ですね。
楽譜もなかったので、耳で聴きました。神宮では基本的に5回に流れるんですが、5回だと相手の守備回のダンスの音楽と被るので非常に聴き取り辛く苦戦しました。間違ってたらごめんなさい。

# 美しく夜は明けて
yoake_bpm = 125

yoake_intro_key = [
    "R", "G", "A",
    "a", "G", "D1", "R", "D1", "C1", "R", "F", "A",
    "C1", "R", "C1", "R", "C1", "R", "C1", "R", "C1",
    "F", "R"]
yoake_music_key = [ "C",
    "A", "R", "A", "R", "A", "F", "R", "F",
    "G", "R", "F", "E", "D", "R", "D",
    "a", "R", "a", "R", "a" ,"G", "R", "G", "R", "G", "R",
    "C1", "D1", "C1", "a", "A", "R", "F",
    "A", "R", "A", "R", "A", "F", "R", "F", "R", "F", "R",
    "G", "R", "G", "F", "E", "D", "R", "D",
    "a", "A", "G", "D1", "C1", "G", "a", "A", "G", "F", "R", "F", "E",
    "D", "R", "D", "E", "F", "G", "R", "A", "R", "A", "g",
    "G", "R", "G", "A", "B", "C1", "R", "A", "R", "A", "R", "A", "R",
    "A", "a", "C1", "D1", "C1", "R",
    "F", "G", "A", "a", "G", "R", "G", "R", "G",
    "F", "R", "F", "R", "F", "G", "R", "G", "R", "G",
    "D", "R", "F", "G",
    "A", "R", "A", "R", "A", "R", "A", "a",
    "A", "R", "G", "A",
    "a", "G", "D1", "R", "D1", "C1", "R", "F", "A",
    "C1", "R", "C1", "R", "C1", "R", "C1", "R", "C1",
    ["F", "F1"], "R"]

yoake_intro_dur = [
    3, .75, .25,
    2, 1, .7, .05, .25, 2, 1, .75, .25,
    1.45, .05, .45, .05, .95, .05, .7, .05, .25,
    3, .5,]
yoake_music_dur = [ .5,
    .95, .05, .7, .05, .25, 1.25, .25, .5,
    .95, .05, .75, .25, 1.25, .25, .5,
    .95, .05, .7, .05, .25, 1, .05, .4, .05, .45, .05,
    .75, .25, .5, .5, 1.25, .25, .5,
    .95, .05, .7, .05, .25, 1, .05, .4, .05, .45, .05,
    .7, .05, .25, .5, .5, 1.25, .25, .5,
    1, .5, .5, 1, 1, .75, .25, .5, .5, .75, .25, .75, .25,
    1.45, .05, .5, 1, 1, 2, .5, .5, .05, .45, .5,
    1.45, .05, .5, 1, 1, 2, .5, .45, .05, .45, .05, .45, .05,
    1.5, .5, 1, 1, 2, 1,
    .75, .25, 1.5, .5, 1, .05, .7, .05, .2,
    2.5, .5, .7, .05, .25, 2.5, .5, .7, .05, .25,
    2.5, .5, .75, .25,
    .95, .05, .95, .05, .95, .05, .5, .5,
    2.5, .5, .75, .25, 2, 1, .7, .05, .25, 2, 1, .75, .25,
    1.45, .05, .45, .05, .95, .05, .7, .05, .25,
    3, 1,]

yoake_key =yoake_intro_key + yoake_music_key
yoake_dur =yoake_intro_dur + yoake_music_dur
yoake_music = music_maker(yoake_key, yoake_dur, yoake_bpm)

IPython.display.Audio(yoake_music, rate=48000)

美しく夜は明けて 新しき生命(いのち)輝く
大いなる光を受けて 選ばれて立つ若人よ
今ここに集いて歌え 淡青の旗の下
誇りあれ!若人の胸に
栄(さかえ)あれ!東大の上に

美しく夜は明けて

実践編6. 燃ゆる獅子

6曲目は「燃ゆる獅子」、前奏だと思っていたところに歌詞があって驚きました。東大のサイトに行くと楽譜が載っていますが、神宮で流れる音は楽譜より1音低い[レ→ド]です。曲の入りは少しゆっくりなので、その部分だけduration に1.35 をかけて変化をつけています。

# 燃ゆる獅子
# シ♭ a, レ♭ c, ミ♭ d, ラ♭ g,

shishi_bpm = 135

shishi_music1_key = [
   "C", "R", "C",
    "F", "R", "C", "F", "A", "R", "F", "A", "C1",]
shishi_music2_key = [
    "F", "E", "D",
    "C", "A", "G", "F", "A-1", "a-1", "C",  "B-1", "D", "C", "R",
    "D", "R", "D", "R", "D", "F", "E", "R", "E", "F", "R", "F",
    "G", "C1", "B", "C1", "R",
    "D1", "R", "D1", "C1", "a", "D",
    "E", "F", "E", "D", "C", "R", "C", "G", "F", "R",
    "E", "F", "G", "R", "G", "A", "G", "F", "G", "A", "D",
    "a", "G", "C1", "a", "A", "F", "A", "G", "R", "A", "R", "A", "R",
    "A", "G", "F", "A", "C1", "R", "D1", "R", "D1", "C1", "R", "a", "A", "G",
    "C1", "R", "C1", "a", "A", "F", "G", "A", "G", "F", "R",
    ]
shishi_music1_dur = [
    .7, .05, .25,
    2.5, .5, .75, .25, 2.5, .5, .75, .25, 2.5]
shishi_music2_dur = [
    .5, .5, .5,
    1, .75, .25, 1, .75, .25, .5, 1, .5, 1.5, .5,
    .7, .05, .2, .05, .5, .5, .7, .05, .25, .45, .05, .5,
    .5, 1, .5, 1, 1,
    .45, .05, 1, .5, 1, 1,
    .75, .25, .5, .5, .45, .05, 1, .5, 2, 1,
    .75, .25, 1.95, .05, 1, .75, .25, 1.5, .5, 1, 1,
    2, 1, .75, .25, .5, 1, .5, .5, .5, .7, .05, .2, .05,
    1.5, .5, 1, 1, 2.5, .5, .7, .05, .25, 2, .5, .5, .75, .25,
    2.5, .5, .75, .25, 1.5, .5, 1, .75, .25, 2, 1
]


shishi_key = ["R"] + (shishi_music1_key + shishi_music2_key)* 2
shishi_dur = [3 * 1.35] + [dur*1.35 for dur in shishi_music1_dur]\
    + shishi_music2_dur + shishi_music1_dur + shishi_music2_dur
shishi_music = music_maker(shishi_key, shishi_dur, shishi_bpm)

IPython.display.Audio(shishi_music, rate=48000)

見よ 見よ 見よ
暁の天つきて 天馬の羽音も高く
東大の杜にのぼる
若きアポロンの 猛きアポロンの
生命の火を 東大 東大
アポロンの子 東大

行け 行け 行け
旗影地に濃くて 戦士は力に充てり
早鐘の大気を揺らし
若き獅子の子の 猛き獅子の子の
血はたぎりて 東大 東大
燃ゆる獅子 東大

燃ゆる獅子

実践編7. 大空と

7曲目は運動会歌「大空と」です。楽譜はこちら。実はこの曲だけ私が作成したものではありません。不死鳥の如くを作ったー!と部内でコードを共有したところ、後輩のひらしほさん(平松アナリスト/1年/洛南)が楽譜を見ながら作ってくれました。嬉しかったです。神宮で流れる時は半音高い[レ→ミ♭]です。

# 大空と
# シ♭ a, レ♭ c, ミ♭ d, ラ♭ g,
ozora_bpm = 75

ozora_intro_key = [
    "R", "d",
    "g", "R", "g", "R", "g", "R", "g", "R", "g", "R", "g", "R", "d",
    "C1", "R", "C1", "R","C1", "R","C1", "R","C1", "R", "C1", "R", "g",
    "d1", "R", "d1", "R", "d1", "R", "d1", "R", "d1", "R",
    "d1", "C1", "R", "C1", "a", "R", "a", "R", "a", "g", "R",
]
ozora_music_key = [
    "d",
    "C1", "R", "C1", "g", "a", "R", "g", "a",
    "C1", "c1", "C1", "g", "a", "R", "a", "R",
    "d1", "C1", "a", "g", "a", "g", "R",
    "g", "G", "R", "G", "F", "d", "R", "d1",
    "d", "R", "d", "F", "a", "g", "R", "g",
    "c1", "R", "c1", "R", "c1", "R", "g", "a",
    "C1", "R", "C1", "R", "C1", "R", "g",
    "c1", "R", "c1", "R", "c1", "R", "g", "a",
    "C1", "R", "C1", "R", "C1", "R", "d",
    "F", "R", "F", "G", "a",
    "d1", "C1", "R", "C1", "a", "R", "a", "R", "d",
    "d1", "R", "d1", "c1", "C1", "R", "C1", "a", "R", "a", "R", "d",
    "F", "R", "F", "G", "a",
    "d1", "C1", "R", "C1", "a", "R", "a", "R", "d",
    "d1", "R", "d1", "c1", "C1", "R", "C1", "a", "g", "R", "g", "a",
    "C1", "R", "C1", "R", "C1", "a", "C1", "c1", "R", "F1",
    "d1", "C1", "R", "C1", "g", "a", "R", "a", "R", "c1", "C1",
    "a", "R", "a", "C1", "c1", "d1", "R", "F1", "d1",
    "R", "d1", "C1", "R", "C1", "a", "R", "a", "R", "a", "g", "R",
    ]

ozora_intro_dur = [
    3, 1,
    .25, .25, .2, .05, .2, .05, .25, .25, .25, .25, .25, .75, 1,
    .25, .25, .2, .05, .2, .05, .25, .25, .25, .25, .25, .75, 1,
    .25, .25, .2, .05, .2, .05, .25, .25, .25, .25,
    .5, .5, .05, .45, .5, .05, .95, .05, .95, .5,  .5,
]
ozora_music_dur = [
    1,
    1.9, .1, 1, 1, 2.5, .5, .5, .5,
    1, 1, 1, .75, .2, .05, 2, 1, 1,
    1.5, .5, 1, .5, .45, .05,
    .5, .5, .05, .45, .5, .5, .5, 1,
    1.4, .1, .5, 1, 1, 2, 1, 1,
    1.4, .1, .4, .1, .9, .1, .5, .5,
    1.4, .1, .4, .1, .9, .1, 1,
    1.4, .1, .4, .1, .9, .1, .5, .5,
    1.4, .1, .4, .1, .9, .1, 1,
    1.4, .1, .5, 1, 1,
    .5, .45, .05, .5, .5, .05, .45, .5, 1,
    1.4, .1, .5, .5, .45, .05, .5, .45, .05, 2, 1, 1,
    1.4, .1, .5, 1, 1,
    .5, .5, .05, .45, .5, .05, .45, .5, 1,
    1.4, .1, .5, .5, .5, .05, .45, .5, 2, 1, .5, .5,
    .9, .1, .9, .1, 1, .5, .5, 2.5, .5, 1,
    1.5, .45, .05, 1, .5, .5, .05, 1.95, 1, .75, .25,
    .5, .5, 1, 1, 1, 2.5, .5, .75, .25,
    .05, .45, .5, .05, .45, .45, .05, .9, .1, 1, 2, 1,
    ]

ozora_key =ozora_intro_key + ozora_music_key
ozora_dur = ozora_intro_dur + ozora_music_dur
ozora_music = music_maker(ozora_key, ozora_dur, ozora_bpm)

IPython.display.Audio(ozora_music, rate=48000)

大空と 澄みわたる淡青
厳たり我が旗 高く開かん
仰げよ梢を 銀杏のこの道
蘊奥の窮理 応じて更に
人格の陶冶 ここに薫る
栄光の学府 巍巍たり赤門
我が赤門 高く開かん

大空と

実践編8. 淡青の空

8曲目は「淡青の空」です。淡青の日ではずっと流れている曲です。楽譜こちら。珍しく楽譜通りです。
ずっと何となくで歌っていたのですが、楽譜を見て初めて正しい音程がわかりました。「仰ぎつつ」のところ、「シ♭ラ♭ソソファ」だと思ってたんですが、「シ♭シ♭♭ソファ」って一旦低いミを挟むところです。前奏の連打がなかなか作るの難しかったです。

## 淡青の空
tansei_bpm = 142
tansei_intro_key = [
    "R", "a", "R", "a", "R", "a", "R", "a", "R", "C1", "D1", "C1",
    "a", "R", "a", "R", "a", "R", "a", "R", "a", "d", "G",
    "a", "R", "a", "R", "a", "R", "g", "R", "G", "R", "F",
    "d", "D", "C", "B-1"]
tansei_music_key = [
    "a-1", "R", "a-1", "d", "G",  "F", "d",
    "G", "d1", "C1", "a", "R", "a",
    "C1", "R", "C1", "R", "C1", "R", "C1", "R", "d1", "D1", "C1",
    "a", "R", "a", "d", "G", "F", "R",
    "d", "R", "d", "G", "R", "G", "a", "g", "G",
    "a", "d1", "D1", "C1", "R", "a",
    "d1", "D1", "C1", "a", "R", "a", "d", "g",
    "G", "R", "G", "F", "R", "F", "d", "R"]

tansei_intro_dur = [
    4, .35, .15, .2, .05, .2, .05, 1.25, .25, .5,.5, .5,
    .35, .15, .2, .05, .2, .05, 1.25, .25, .5, .5, .5,
    .35, .15, .95, .05, .45, .05, .35, .15, .95, .05, .5,
    1, 1, 1, 1]
tansei_music_dur = [
    .7, .05, .25,  1, .75, .25, 1,
    1, 1, .5, .5, .05, .95,
    .7, .05, .2, .05, .45, .05, .45, .05, .5,  1, .5,
    .7, .05, .25, .5, .5, 1.5, .5,
    .7, .05, .25, .45, .1, .45, .75, .25, 1,
    1, 1, .5, .5, .05, .95,
    1, .5, .5, .7, .05, .25, .5, .5,
    .7, .05, .25, .5, .05, .45, 1.5, .5]

tansei_key = tansei_intro_key + tansei_music_key + ["R"] + tansei_music_key*2
tansei_dur = tansei_intro_dur + tansei_music_dur + [8] + tansei_music_dur*2

tansei_music = music_maker(tansei_key, tansei_dur, tansei_bpm)
IPython.display.Audio(tansei_music, rate=48000)

ライトブルーの 天高く
飛びゆく雲を 仰ぎつつ
歌えや友よ 東大の
若きいのちの よろこびを

澎湃寄する 大波に
とわに揺るがぬ 玄地に
示せや友よ 東大の
若き血潮の たばしりを

入日の光 若き子の
頬くれないに 染むる時
挙げずや友よ 東大の
若き力の かちどきを

淡青の空

実践編9. ただ一つ

ラストは「ただ一つ」です。最後のエール交換と得点時に流れていると思います。
楽譜の音は神宮で聴く時の方が1音高い[ソ→ラ]です。これまでの曲は全てですが、基本的にduration を4の倍数とかにするように調節しています。作曲とかは全くしたことがないので、曲によってはなかなか合わなくて大変でした。

## ただ一つ
tada_bpm = 75
tada_intro_key = ["R",
    "F", "R", "F", "C", "F", "A",
    "C1", "R", "C1", "B", "C1", "D1",
    "C1", "R", "C1", "R", "C1", "R", "C1", "R",
    "C1", "R", "C1", "R", "C1", "R", "C1", "R", "C1", "R",
    "C1", "R", "F", "a", "A", "G", "F", "R"
]
tada_music_key = [
    "A", "G",
    "F", "E", "F", "A", "C1", "R", "D1", "R", "D1",
    "C1", "R", "C1", "A", "F", "A", "G", "R", "A", "G",
    "F", "R", "F", "D", "F", "C","R", "F", "A",
    "C1", "A", "G", "R", "G", "F", "R",
    "G", "A", "a", "G", "A", "a", "R",
    "C1", "D1", "R", "C1", "R", "D1", "R", "D1",
    "C1", "R", "D1", "C1", "R", "D1", "E1", "R",
    "F1", "E1", "D1", "R", "D1", "C1", "R", "D1", "R", "D1",
    "C1", "A", "F", "A", "G", "R", "G", "F", "R", "C",
    "F", "R", "F", "G", "A", "R", "F", "A",
    "C1", "R", "C1", "R", "C1", "D1", "R", "D1", "C1", "R", "D1", "E1",
    "F1", "E1", "D1", "C1", "a", "A", "R", "D1", "R", "D1",
    "C1", "R", "F", "a", "A", "G", "F", "R"]

tada_intro_dur = [2,
    .5, .5, .25, .25, .25, .25,
    .5, .5, .25, .25, .25, .25,
    .25, .25, .15, .1, .15, .1, .25, .25, .25, .25,
    .25, .25, .25, .25,.25, .25, .25, .25,
    .3, .7, .75, .25, 1, 1, 2.5, .5]
tada_music_dur = [
    .75, .25,
    1.5, .5, 1, 1, 2, 1, .70, .05, .25,
    1.4, .1, .5, .5, 1, .5, 2, 1, .75, .25,
    1.4, .1, .5, 1, 1, 2, 1, .75, .25,
    1.5, .5, .9, .1, 1, 3, 1,
    1.5, .5, 1, 1, .75, .24, .01,
    .75, .24, .01, .3, .7, .7, .05, .25,
    .3, .7, 1, .3, .7, .75, .24, .01,
    2, 1, .7, .05, .25, 2, 1, .7, .05, .25,
    1, .75, .25, 1, .7, .05, .25, 2, 1, 1,
    1.9, .1, 1, 1, 2, 1, .75, .25,
    1.5, .05, .4, .05, 1, .7, .05, .25,  2, 1, .75, .25,
    2, 1, 1, 1.5, .5, .3, .7, .7, .05, .25,
    .3, .7, .75, .25, 1, 1, 2.5, 1.5]


tada_key = tada_intro_key + tada_music_key
tada_dur = tada_intro_dur + tada_music_dur
tada_music = music_maker(tada_key, tada_dur, tada_bpm)

IPython.display.Audio(tada_music, rate=48000)

ただ一つ 旗かげ高し
いまかがやける 深空の光
天寵を 負える子ら
友よ 友
ここなる丘に 東大の旗立てり
伝統の旗 東大の光
たたえ たたえん
たたえ たたえん

ただ一つ

まとめ

いかがだったでしょうか。実は、勘の良い方はお気づきかもしれませんが、実践編は10月13日の勝利した法政戦で実際に流れた順番になっています。(番号はイニングです。)13日の法政戦はサヨナラ勝ちで幕切れという印象的な勝利でした。週末の立教戦も勝ち、勝ち点を挙げられるようにアナリストとして頑張っていきます!みなさんもぜひこの機会に神宮の応援にも耳を傾けてみてください!
僕は、多彩な音楽で溢れる神宮の応援が大好きです。応援部の皆さんいつもありがとうございます。

↑いっぱい流そう!