ふくふくHukuhuku Inc.
EP.02STEM対象: 中3以上 12分公開: 2026-05-10

三角関数で円を描き、ドレミを鳴らす

sin と cos で円が描ける。さらに sin は音にもなる。数学と音楽が同じ式で表現できることを体感する回。

#中高生#三角関数#音楽#
CO📔 Google Colab で開く(上から順にセルを実行)
シェア

高校数学で「三角関数」を習うと、最初は「で、これ何の役に立つの?」と思いがち。実は、この世のあらゆる『振動するもの』 ── 音、光、電気、波 ── がすべて三角関数で表現できます。今回は、自分のパソコンで実際に音を鳴らして、それを実感してみましょう。

Step 1: sin/cos で円を描く

媒介変数表示で円
Python
import numpy as npimport matplotlib.pyplot as plt
t = np.linspace(0, 2 * np.pi, 100)x = np.cos(t)y = np.sin(t)
plt.figure(figsize=(6, 6))plt.plot(x, y, linewidth=2)plt.scatter([np.cos(np.pi/4)], [np.sin(np.pi/4)], color="red", s=100, label="t = π/4")plt.axhline(0, color="gray", linewidth=0.5)plt.axvline(0, color="gray", linewidth=0.5)plt.gca().set_aspect("equal")plt.legend()plt.title("単位円: (cos t, sin t)")plt.show()

媒介変数 t が時間だと思うと、点 (cos t, sin t) は単位円上を回っていく。教科書の「単位円」が、時間とともに動く点として理解できます。

Step 2: sin を「音」として鳴らす

音は空気の振動。振動の周波数(Hz) が音の高さを決めます。Aの音(ラ)は 440Hz = 1秒に440回振動。これを sin で作ります。

colab で音を鳴らす
Python
import numpy as npfrom IPython.display import Audio
sample_rate = 44100  # 1秒に44100回サンプル(CD品質)duration = 2         # 2秒freq = 440           # Aの音(ラ)
t = np.linspace(0, duration, int(sample_rate * duration), False)wave = 0.5 * np.sin(2 * np.pi * freq * t)
Audio(wave, rate=sample_rate)
440Hzの単音波形と、ド・ミ・ソの和音波形
上:単音は綺麗な正弦波/下:3音の和音はsinの足し算で複雑な形に
実行すると

セルの下にプレーヤーが出て、▶ で「ぴーー」というラの音が鳴ります。これが本当に sin から来ているのを確認するには、波形を plt.plot で描いてみましょう。

Step 3: ドレミファソラシドを作る

音階の周波数比は 2の12乗根(半音ごと)で決まる。基準のラ(440Hz)から、各音の周波数を計算:

ドレミファソラシド
Python
import numpy as npfrom IPython.display import Audio
sample_rate = 44100
# 各音の周波数(4オクターブのドレミ)notes = {    "ド": 261.63, "レ": 293.66, "ミ": 329.63, "ファ": 349.23,    "ソ": 392.00, "ラ": 440.00, "シ": 493.88, "ド↑": 523.25,}
# 各音 0.4秒ずつduration = 0.4melody = []for note_name, freq in notes.items():    t = np.linspace(0, duration, int(sample_rate * duration), False)    wave = 0.3 * np.sin(2 * np.pi * freq * t)    melody.append(wave)melody = np.concatenate(melody)Audio(melody, rate=sample_rate)

Step 4: 和音 = 重ね合わせ

ド・ミ・ソ を同時に鳴らすと「ハ長調の主和音(C major chord)」になる。これは sin の足し算で作れます。

和音 = sin の足し算
Python
freqs = [261.63, 329.63, 392.00]  # ド、ミ、ソduration = 2t = np.linspace(0, duration, int(sample_rate * duration), False)
chord = sum(0.3 * np.sin(2 * np.pi * f * t) for f in freqs)Audio(chord, rate=sample_rate)
3つの音を足すと和音になる= 和音(複雑な波)
和音は3つの sin の重ね合わせ

Step 5: 不協和音と協和音

周波数の比が単純な整数」ほど、人間の耳に協和音と感じる:

音程周波数比印象
完全1度(同じ音)1:1完全に重なる
完全5度(ド・ソ)2:3綺麗、安定
完全4度(ド・ファ)3:4綺麗
長3度(ド・ミ)4:5明るい
短3度(ラ・ド)5:6暗い
増4度(ド・ファ#)32:45(複雑)不協和、緊張

活用:自分の好きな曲を作る

prompt
Pythonで「きらきら星」のメロディを作って Colab で再生したいです。
1音ずつ周波数と長さを設定するコードを書いてください。
音は sin 波で、初心者にも分かりやすくコメントもお願いします。
想定される実行結果(例示)
```python
import numpy as np
from IPython.display import Audio

sample_rate = 44100

# きらきら星: ド ド ソ ソ ラ ラ ソ ファ ファ ミ ミ レ レ ド
melody = [
    ("ド", 0.5), ("ド", 0.5), ("ソ", 0.5), ("ソ", 0.5),
    ("ラ", 0.5), ("ラ", 0.5), ("ソ", 1.0),
    ("ファ", 0.5), ("ファ", 0.5), ("ミ", 0.5), ("ミ", 0.5),
    ("レ", 0.5), ("レ", 0.5), ("ド", 1.0),
]
notes = {"ド":261.63,"レ":293.66,"ミ":329.63,"ファ":349.23,"ソ":392,"ラ":440,"シ":493.88}

waves = []
for note, dur in melody:
    t = np.linspace(0, dur, int(sample_rate * dur), False)
    # フェードイン・アウトで音をなめらかに
    envelope = np.minimum(np.ones_like(t), np.minimum(t * 30, (dur - t) * 30))
    wave = 0.4 * np.sin(2 * np.pi * notes[note] * t) * envelope
    waves.append(wave)
song = np.concatenate(waves)
Audio(song, rate=sample_rate)
```

実行するときらきら星が再生されます。`envelope` で各音の最初と最後を滑らかにすることで、ぶつ切りの音を防いでます。

次回予告

EP.03 では、力学のシミュレーション。落下・斜面・振り子を Python で動かして、運動方程式 F = ma を体感します。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp