ビジュアルノベルの没入感を決めるのは、テキストでも画像でもなく音だ。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を流す
# 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 music は music チャンネルで再生する。デフォルトでループする。
play sound — 効果音を鳴らす
# 効果音を再生(1回だけ)
play sound "audio/explosion.ogg"
# 音量を調整
play sound "audio/rain.ogg" volume 0.3
# ループする効果音(環境音など)
play sound "audio/rain.ogg" loop
play sound は sound チャンネルで再生する。デフォルトではループしない。
voice — ボイスを再生する
voice "voice/001.ogg"
e "こんにちは。"
voice "voice/002.ogg"
e "今日はいい天気ですね。"
voice は voice チャンネルで再生する。次のインタラクション(セリフ送りなど)で自動的に停止する。ボイス付きゲームではセリフごとに1行ずつ voice を書く。
停止する
# BGMを停止
stop music
# フェードアウトしてから停止
stop music fadeout 2.0
# 効果音を停止
stop sound
# ボイスを停止
stop voice
チャンネルの仕組み
Ren'Py の音声は チャンネル で管理される。各チャンネルは独立して再生・停止・音量調整ができる。
デフォルトチャンネル
| チャンネル | ミキサー | ループ | 用途 |
|---|---|---|---|
music | music | あり | BGM |
sound | sfx | なし | 効果音 |
voice | voice | なし | ボイス(次のインタラクションで自動停止) |
audio | sfx | なし | 複数音の同時再生(queue/stop 不可) |
music チャンネルに新しい曲を流すと、前の曲は自動的に停止する。同時に2曲流したい場合はカスタムチャンネルを作る。
audio チャンネルは1つのチャンネルで複数の音声を同時に再生できる特殊なチャンネルだ。play audio を呼ぶたびに前の音を止めずに新しい音が追加される。ただし queue audio や stop audio は使えない。同時再生+停止制御が必要なら、カスタムチャンネルを使おう。
カスタムチャンネルを作る
環境音(雨音、風の音)を BGM と独立して制御したい場合、カスタムチャンネルを登録する。
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 で次の曲を予約する
# 現在の曲が終わったら次の曲を再生
play music "audio/intro.ogg" noloop
queue music "audio/main_theme.ogg"
queue は現在再生中の曲が終了したタイミングで次の曲を開始する。イントロ → メインテーマの切り替えに使える。
フェードとループポイント
フェードイン・フェードアウト
# 現在の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回だけ再生し、以降はループ部分だけを繰り返す。
# 6.333秒地点からループ(それ以前はイントロとして1回だけ再生)
play music "<loop 6.333>audio/main_theme.ogg"
# 特定の区間だけを再生
play music "<from 5.0 to 30.0>audio/long_track.ogg"
音量の動的制御
# チャンネル全体の音量を変更(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 キーワードは個別のファイルの相対音量を設定する。
音声ファイルを整理する
ファイルが増えてくると、パスを直接書くのが面倒になる。define で audio 名前空間にエイリアスを作ると管理しやすい。
audio名前空間
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 文で直接使える。ファイルパスを毎回書く必要がなくなり、タイポも防げる。
フォルダ構成の例
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 sound と play audio は何が違う?
play sound は sound チャンネルを使い、1度に1音、queue と stop に対応している。play audio は特殊な audio チャンネルで複数の音を同時再生できるが、queue audio や stop audio は使えない。制御が必要なら play sound、重ねて鳴らすだけなら play audio を選ぶ。
すべての音声ファイルに define audio を書く必要がある?
いいえ。game/audio/(サブフォルダ含む)に置いた対応拡張子のファイルは audio名前空間に自動登録される。例えば game/audio/bgm/battle.ogg は play 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 — コミュニティ
関連記事: