はじめに
ふと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で音を奏でるのは初めてだったのでとても面白い体験でした。
ぜひ手元で実行して、サンプルコードの少し不安になる音のきらきら星聞いてみてください!
