32blogby Studio Mitsu

Ren'Pyの音声・BGM管理ガイド

Ren'Py 8.5でBGM・効果音・ボイスを扱う方法を解説。フォーマット選択、チャンネルの仕組み、ループポイント設定、音声ファイルの整理まで。

by omitsu13 min read
目次

ビジュアルノベルの没入感を決めるのは、テキストでも画像でもなく音だ。BGMが途切れたり、効果音のタイミングがずれたりすると、一気に現実に引き戻される。

この記事では、Ren'Py 8.5.2 でBGM・効果音・ボイスを扱う方法を基礎から解説する。

音声フォーマットの選び方

Ren'Py は複数の音声フォーマットに対応しているが、何でもいいわけではない。

フォーマットループサイズ推奨用途
OGG Vorbis (.ogg)シームレスBGM・SE(最も実績あり)
Opus (.opus)シームレス最小BGM・SE(高圧縮)
FLAC (.flac)シームレスアーカイブ用(ゲーム配布には不向き)
WAV (.wav)短い効果音のみ
MP3 (.mp3)ギャップあり非推奨

WAV は非圧縮のため、ファイルサイズが大きい。BGMに使うとゲームの配布サイズが膨らむ。ドアの開閉音や足音のような短い効果音なら問題ない。

BGM・SE・ボイスの再生

Ren'Py には3つの再生文がある。

play music — BGMを流す

renpy
# BGMを再生(デフォルトでループ)
play music "audio/main_theme.ogg"

# フェードアウト → フェードインで切り替え
play music "audio/battle.ogg" fadeout 1.0 fadein 0.5

# ループしない
play music "audio/ending.ogg" noloop

# すでに同じ曲が流れていれば再起動しない
play music "audio/main_theme.ogg" if_changed

play musicmusic チャンネルで再生する。デフォルトでループする。

play sound — 効果音を鳴らす

renpy
# 効果音を再生(1回だけ)
play sound "audio/explosion.ogg"

# 音量を調整
play sound "audio/rain.ogg" volume 0.3

# ループする効果音(環境音など)
play sound "audio/rain.ogg" loop

play soundsound チャンネルで再生する。デフォルトではループしない。

voice — ボイスを再生する

renpy
voice "voice/001.ogg"
e "こんにちは。"

voice "voice/002.ogg"
e "今日はいい天気ですね。"

voicevoice チャンネルで再生する。次のインタラクション(セリフ送りなど)で自動的に停止する。ボイス付きゲームではセリフごとに1行ずつ voice を書く。

停止する

renpy
# BGMを停止
stop music

# フェードアウトしてから停止
stop music fadeout 2.0

# 効果音を停止
stop sound

# ボイスを停止
stop voice

チャンネルの仕組み

Ren'Py の音声は チャンネル で管理される。各チャンネルは独立して再生・停止・音量調整ができる。

デフォルトチャンネル

チャンネルミキサーループ用途
musicmusicありBGM
soundsfxなし効果音
voicevoiceなしボイス(次のインタラクションで自動停止)
audiosfxなし複数音の同時再生(queue/stop 不可)

music チャンネルに新しい曲を流すと、前の曲は自動的に停止する。同時に2曲流したい場合はカスタムチャンネルを作る。

audio チャンネルは1つのチャンネルで複数の音声を同時に再生できる特殊なチャンネルだ。play audio を呼ぶたびに前の音を止めずに新しい音が追加される。ただし queue audiostop audio は使えない。同時再生+停止制御が必要なら、カスタムチャンネルを使おう。

カスタムチャンネルを作る

環境音(雨音、風の音)を BGM と独立して制御したい場合、カスタムチャンネルを登録する。

renpy
init python:
    renpy.music.register_channel("ambient", "sfx", loop=True)

label start:
    play music "audio/main_theme.ogg"
    play ambient "audio/rain.ogg"

    "雨の中、旅は続く。"

    stop ambient fadeout 2.0

    "雨が止んだ。"

register_channel の第2引数はミキサー名。"sfx" を指定すると、設定画面の SE 音量スライダーで制御される。

queue で次の曲を予約する

renpy
# 現在の曲が終わったら次の曲を再生
play music "audio/intro.ogg" noloop
queue music "audio/main_theme.ogg"

queue は現在再生中の曲が終了したタイミングで次の曲を開始する。イントロ → メインテーマの切り替えに使える。

フェードとループポイント

フェードイン・フェードアウト

renpy
# 現在のBGMを2秒かけてフェードアウト → 新しいBGMを1秒かけてフェードイン
play music "audio/battle.ogg" fadeout 2.0 fadein 1.0

# BGMを3秒かけてフェードアウトして停止
stop music fadeout 3.0

fadeout現在再生中の曲 に適用される。fadein新しい曲 に適用される。この区別を間違えると期待通りの効果にならない。

ループポイントの指定

多くのBGMには「イントロ → ループ部分」の構成がある。ループポイントを指定すると、イントロは1回だけ再生し、以降はループ部分だけを繰り返す。

renpy
# 6.333秒地点からループ(それ以前はイントロとして1回だけ再生)
play music "<loop 6.333>audio/main_theme.ogg"

# 特定の区間だけを再生
play music "<from 5.0 to 30.0>audio/long_track.ogg"

音量の動的制御

renpy
# チャンネル全体の音量を変更(1秒かけてフェード)
$ renpy.music.set_volume(0.3, delay=1.0, channel="music")

# 個別ファイルの音量を指定
play sound "audio/loud_explosion.ogg" volume 0.5

renpy.music.set_volume() はチャンネル全体の音量を変える。volume キーワードは個別のファイルの相対音量を設定する。

音声ファイルを整理する

ファイルが増えてくると、パスを直接書くのが面倒になる。defineaudio 名前空間にエイリアスを作ると管理しやすい。

audio名前空間

renpy
define audio.main_theme = "audio/bgm/main_theme.ogg"
define audio.battle = "audio/bgm/battle.ogg"
define audio.click = "audio/se/click.ogg"
define audio.explosion = "audio/se/explosion.ogg"

label start:
    play music main_theme
    play sound click

    "冒険が始まる。"

    play music battle fadeout 1.0
    play sound explosion

audio 名前空間に定義したエイリアスは、play 文で直接使える。ファイルパスを毎回書く必要がなくなり、タイポも防げる。

フォルダ構成の例

text
game/
└── audio/
    ├── bgm/
    │   ├── main_theme.ogg
    │   ├── battle.ogg
    │   └── ending.ogg
    ├── se/
    │   ├── click.ogg
    │   ├── explosion.ogg
    │   └── door_open.ogg
    └── voice/
        ├── 001.ogg
        ├── 002.ogg
        └── 003.ogg

BGM・SE・ボイスをサブフォルダで分けると見通しが良くなる。Ren'Py は game/audio/ とそのサブフォルダ内のファイルを自動検出する。

FAQ

Ren'PyのBGMにはどのフォーマットを使うべき?

OGG Vorbis が最も安全な選択だ。ファイルサイズが小さく、シームレスにループし、Ren'Pyプロジェクトでの実績が一番長い。Opusは同品質でさらに高圧縮だが、OGGの方が音声編集ツールとの互換性が高い。MP3はエンコーダーがパディングフレームを挿入する仕様のため、ループ時に無音のギャップが入るのでBGMには避けよう。

BGMを2曲同時に流すにはどうすればいい?

デフォルトの music チャンネルは1曲しか再生できない。renpy.music.register_channel() でカスタムチャンネルを作り、2曲目をそのチャンネルで再生する。ミキサーに "music" を指定すれば、プレイヤーのBGM音量スライダーで両方のチャンネルを制御できる。

イントロを1回だけ再生してからループさせるには?

<loop> 構文を使う: play music "<loop 6.333>audio/main_theme.ogg"。6.333秒より前はイントロとして1回だけ再生され、以降は6.333秒以降の部分だけがリピートする。正確なタイムスタンプは Audacity でゼロクロスポイントを確認して特定しよう。

効果音ごとに個別に音量を調整できる?

できる。volume キーワードを使う: play sound "audio/explosion.ogg" volume 0.5。これはそのファイルだけの相対音量で、チャンネル全体の音量には影響しない。チャンネル全体の音量を変えるには renpy.music.set_volume() を使う。

play soundplay audio は何が違う?

play soundsound チャンネルを使い、1度に1音、queuestop に対応している。play audio は特殊な audio チャンネルで複数の音を同時再生できるが、queue audiostop audio は使えない。制御が必要なら play sound、重ねて鳴らすだけなら play audio を選ぶ。

すべての音声ファイルに define audio を書く必要がある?

いいえ。game/audio/(サブフォルダ含む)に置いた対応拡張子のファイルは audio名前空間に自動登録される。例えば game/audio/bgm/battle.oggplay music battle で再生できる。明示的な define audio が必要なのは、サブフォルダ間でファイル名が重複する場合だけだ。

ボイス付きゲームを作るには?

各セリフの前に voice "voice/ファイル名.ogg" を書く。ボイスはプレイヤーがテキストを送ると自動的に停止する。大量のボイスを管理する場合は、Ren'Pyの自動ボイス機能も使える。セリフのIDに基づいてボイスファイルを自動マッピングしてくれるので、手動で voice 文を書く必要がなくなる。

まとめ

この記事で解説したこと:

  • フォーマット選択: BGMには OGG か Opus。MP3 はループギャップがあるので避ける
  • 再生文: play music(BGM)、play sound(SE)、voice(ボイス)
  • チャンネル: music / sound / voice / audio の4チャンネル。カスタムチャンネルも作れる
  • フェードとループポイント: fadeout/fadein パラメータ、<loop> 構文でイントロ+ループ
  • ファイル整理: define audio.xxx で名前空間にエイリアスを作る

Ren'Pyの基本は 入門ガイド を、画像表示は 画像表示ガイド を、UIの作り方は screen言語入門 を、ゲーム変数の管理は ステータス管理ガイド を参照してほしい。

公式リソース:

  • Audio — 音声再生の公式リファレンス
  • Voice — ボイス機能の詳細
  • Audio Formats ガイド — フォーマット比較(VNDev Wiki)
  • Audacity — ループポイント確認に使える無料音声エディタ
  • r/RenPy — コミュニティ

関連記事: