はじめに
ふとPythonで音を生成して奏でたいと思ったためchatGPTさんに教えてもらいました。
sounddevice
というライブラリとnumpy
を組み合わせて使えばできるみたいなので、インストール
pip install sounddevice numpy
まずはドレミファソラシドを奏でてみる
import numpy as np
import sounddevice as sd
def generate_sound(frequency, duration, sample_rate=44100):
"""
1つの音を作る関数
- frequency: 音の高さ(Hz)
- duration: 音の長さ(秒)
"""
t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)
# 音を作る(正弦波を使う)
sound = 0.5 * np.sin(2 * np.pi * frequency * t)
return sound
# ドレミファソラシの音階と周波数
notes = {
"ド (C)": 261.63,
"レ (D)": 293.66,
"ミ (E)": 329.63,
"ファ (F)": 349.23,
"ソ (G)": 392.00,
"ラ (A)": 440.00,
"シ (B)": 493.88,
"高いド (C5)": 523.25
}
# 各音を1秒ずつ鳴らす
for note, freq in notes.items():
print(f"Playing {note}")
sound = generate_sound(freq, duration=1.0) # 音を生成
sd.play(sound, samplerate=44100) # 再生
sd.wait() # 再生終了まで待機
コードの流れ
-
generate_sound
という関数で1つの音を作ります。これは「正弦波」という波を使って音を作っているみたいです。 -
notes
には、音階とその周波数(Hz)が登録されています。 - インストールした
sounddevice
を使って、作った音をスピーカーで再生します。
実行するとドレミファソラシドが奏でられている!
きらきら星を奏でてみた。
最終的なコード
import numpy as np
import sounddevice as sd
def generate_sound(frequency, duration, sample_rate=44100):
"""
1つの音を作る関数
- frequency: 音の高さ(Hz)
- duration: 音の長さ(秒)
"""
t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)
sound = 0.5 * np.sin(2 * np.pi * frequency * t) # 正弦波
return sound
# 音階と周波数 (ド~高いド)
notes = {
"ド": 261.63,
"レ": 293.66,
"ミ": 329.63,
"ファ": 349.23,
"ソ": 392.00,
"ラ": 440.00,
"シ": 493.88,
"高いド": 523.25
}
# きらきら星のメロディ (音階と長さのリスト)
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),
("ソ", 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),
("ド", 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),
]
# メロディを再生する
for note, duration in melody:
if note in notes:
print(f"Playing {note}")
sound = generate_sound(notes[note], duration)
sd.play(sound, samplerate=44100)
sd.wait() # 再生終了を待機
少し不安になる音ですが奏でられてます
まとめ
Pythonで音を奏でるのは初めてだったのでとても面白い体験でした。
ぜひ手元で実行して、サンプルコードの少し不安になる音のきらきら星聞いてみてください!