ビジュアルノベルの没入感を決めるのは、テキストでも画像でもなく音だ。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 チャンネルは 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/ とそのサブフォルダ内のファイルを自動検出する。
まとめ
この記事で解説したこと:
- フォーマット選択: 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)
- r/RenPy — コミュニティ