The SoundManager class is designed to manage background music (BGM) and sound effects (SE) in a Pyxel game. This class assumes loading JSON files created using the PyxelTracker music creation software. The repository for PyxelTracker can be found here.
https://github.com/shiromofufactory/pyxel-tracker
- Load BGM and SE from JSON files.
- Play and stop BGM and SE.
- Manage sound channels and sound bank allocation.
- Support for looping BGMs.
- Handle SE interruptions and resume BGMs afterwards.
Ensure you have the following installed:
- Python 3.x
- Pyxel
- JSON files created using PyxelTracker
To install Pyxel, run:
pip install pyxel
First, import the necessary modules and create an instance of the SoundManager
class:
import pyxel
from sound_manager import SoundManager
sound_manager = SoundManager()
Load BGM and SE from JSON files. The files should be located in the ./sounds/
directory.
sound_manager.load_bgm('path_to_bgm_file', 'bgm_name')
sound_manager.load_se('path_to_se_file', 'se_name')
Play a BGM with optional looping (default is True
):
sound_manager.play_bgm('bgm_name', loop=True)
Play an SE:
sound_manager.play_se('se_name')
Stop all sounds:
sound_manager.stop()
Set the channel for SE playback (default is 2
):
sound_manager.set_seChannel(1)
Here is a complete example of using the SoundManager
class in a Pyxel game:
import pyxel
from sound_manager import SoundManager
class App:
def __init__(self):
pyxel.init(160, 120, caption="Sound Manager Example")
self.sound_manager = SoundManager()
self.sound_manager.load_bgm('example_bgm', 'bgm1')
self.sound_manager.load_se('example_se', 'se1')
self.sound_manager.play_bgm('bgm1')
pyxel.run(self.update, self.draw)
def update(self):
if pyxel.btnp(pyxel.KEY_SPACE):
self.sound_manager.play_se('se1')
def draw(self):
pyxel.cls(0)
pyxel.text(50, 60, "Press SPACE to play SE", pyxel.frame_count % 16)
App()
Set the channel for SE playback.
ch
: The channel number to set for SE playback.
Load a BGM from a JSON file.
path
: The path to the BGM JSON file (relative to./sounds/
).name
: The name to associate with the loaded BGM.
Load an SE from a JSON file and allocate it to a sound bank.
path
: The path to the SE JSON file (relative to./sounds/
).name
: The name to associate with the loaded SE.
Play a BGM.
name
: The name of the BGM to play.loop
: Whether to loop the BGM (default isTrue
).
Play an SE.
name
: The name of the SE to play.
Stop all sounds.
Resume the BGM after an SE has finished playing. This method is called internally.
Get the current playback position. This method is called internally.
Check if a sound with the specified name exists in the given dictionary. This method is called internally.
name
: The name of the sound to check.sound_dict
: The dictionary to check in (eitherself.bgms
orself.ses
).
- Raises
FileNotFoundError
if the specified JSON file is not found. - Raises
OverflowError
if the sound bank is full and cannot load more SEs. - Raises
KeyError
if trying to play a sound that has not been loaded. - Raises
RuntimeError
if all channels are stopped unexpectedly.
This project is licensed under the MIT License. See the LICENSE file for more details.
SoundManagerクラスは、Pyxelゲームでの背景音楽(BGM)と効果音(SE)を管理するためのものです。このクラスは、PyxelTracker音楽制作ソフトを用いて作成されたJSONファイルを読み込むことを前提としています。PyxelTrackerのリポジトリはこちらにあります。
https://github.com/shiromofufactory/pyxel-tracker
- JSONファイルからBGMとSEを読み込む
- BGMとSEの再生と停止
- サウンドチャンネルとサウンドバンクの管理
- ループ再生のサポート
- SE割り込み後にBGMを再開
以下の環境が必要です:
- Python 3.x
- Pyxel
- PyxelTrackerで作成されたJSONファイル
Pyxelをインストールするには、以下のコマンドを実行してください:
pip install pyxel
まず、必要なモジュールをインポートし、SoundManager
クラスのインスタンスを作成します:
import pyxel
from sound_manager import SoundManager
sound_manager = SoundManager()
JSONファイルからBGMとSEを読み込みます。ファイルは./sounds/
ディレクトリに配置します。
sound_manager.load_bgm('path_to_bgm_file', 'bgm_name')
sound_manager.load_se('path_to_se_file', 'se_name')
BGMを再生します(ループ再生はデフォルトでTrue
):
sound_manager.play_bgm('bgm_name', loop=True)
SEを再生します:
sound_manager.play_se('se_name')
全てのサウンドを停止します:
sound_manager.stop()
SE再生用のチャンネルを設定します(デフォルトは2
):
sound_manager.set_seChannel(1)
以下は、PyxelゲームでSoundManager
クラスを使用する完全な例です:
import pyxel
from sound_manager import SoundManager
class App:
def __init__(self):
pyxel.init(160, 120, caption="Sound Manager Example")
self.sound_manager = SoundManager()
self.sound_manager.load_bgm('example_bgm', 'bgm1')
self.sound_manager.load_se('example_se', 'se1')
self.sound_manager.play_bgm('bgm1')
pyxel.run(self.update, self.draw)
def update(self):
if pyxel.btnp(pyxel.KEY_SPACE):
self.sound_manager.play_se('se1')
def draw(self):
pyxel.cls(0)
pyxel.text(50, 60, "Press SPACE to play SE", pyxel.frame_count % 16)
App()
SE再生用のチャンネルを設定します。
ch
: SE再生用のチャンネル番号
JSONファイルからBGMを読み込みます。
path
: BGM JSONファイルのパス(./sounds/
からの相対パス)name
: 読み込んだBGMに対応する名前
JSONファイルからSEを読み込み、サウンドバンクに割り当てます。
path
: SE JSONファイルのパス(./sounds/
からの相対パス)name
: 読み込んだSEに対応する名前
BGMを再生します。
name
: 再生するBGMの名前loop
: BGMをループ再生するかどうか(デフォルトはTrue
)
SEを再生します。
name
: 再生するSEの名前
全てのサウンドを停止します。
SE再生後にBGMを再開します。このメソッドは内部で呼び出されます。
現在の再生位置を取得します。このメソッドは内部で呼び出されます。
指定された名前のサウンドが指定された辞書に存在するかをチェックします。このメソッドは内部で呼び出されます。
name
: チェックするサウンドの名前sound_dict
: チェック対象の辞書(self.bgms
またはself.ses
)
- 指定されたJSONファイルが見つからない場合、
FileNotFoundError
を発生させます。 - サウンドバンクがいっぱいでSEを読み込めない場合、
OverflowError
を発生させます。 - 読み込まれていないサウンドを再生しようとした場合、
KeyError
を発生させます。 - 全てのチャンネルが予期せず停止した場合、
RuntimeError
を発生させます。
このプロジェクトはMITライセンスの下でライセンスされています。詳細はLICENSEファイルを参照してください。