高校数学で「三角関数」を習うと、最初は「で、これ何の役に立つの?」と思いがち。実は、この世のあらゆる『振動するもの』 ── 音、光、電気、波 ── がすべて三角関数で表現できます。今回は、自分のパソコンで実際に音を鳴らして、それを実感してみましょう。
Step 1: sin/cos で円を描く
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 で作ります。
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)
セルの下にプレーヤーが出て、▶ で「ぴーー」というラの音が鳴ります。これが本当に sin から来ているのを確認するには、波形を plt.plot で描いてみましょう。
Step 3: ドレミファソラシドを作る
音階の周波数比は 2の12乗根(半音ごと)で決まる。基準のラ(440Hz)から、各音の周波数を計算:
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 の足し算で作れます。
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)Step 5: 不協和音と協和音
「周波数の比が単純な整数」ほど、人間の耳に協和音と感じる:
| 音程 | 周波数比 | 印象 |
|---|---|---|
| 完全1度(同じ音) | 1:1 | 完全に重なる |
| 完全5度(ド・ソ) | 2:3 | 綺麗、安定 |
| 完全4度(ド・ファ) | 3:4 | 綺麗 |
| 長3度(ド・ミ) | 4:5 | 明るい |
| 短3度(ラ・ド) | 5:6 | 暗い |
| 増4度(ド・ファ#) | 32:45(複雑) | 不協和、緊張 |
活用:自分の好きな曲を作る
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 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。