0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

ふと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()                                  # 再生終了まで待機

コードの流れ

  1. generate_soundという関数で1つの音を作ります。これは「正弦波」という波を使って音を作っているみたいです。
  2. notesには、音階とその周波数(Hz)が登録されています。
  3. インストールした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で音を奏でるのは初めてだったのでとても面白い体験でした。
ぜひ手元で実行して、サンプルコードの少し不安になる音のきらきら星聞いてみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?