サウンド
サウンドを再生するには、Loadメソッドを用いてサウンドファイルを読み込みSoundインスタンスを作成します。次にEngine.Sound.Playメソッドを用いてSoundインスタンスを再生します。
このとき返される ID や、ID を用いて再生中のサウンドを操作する機能について解説します。
Sound
Soundはサウンドファイルを読み込んで生成される音源の情報を表すデータです。 サウンドファイルを読み込んでSoundインスタンスを生成するにはLoadメソッドを使います。
この時、事前に音のデータを解凍するかどうかを指定できます。 OGG等のフォーマットでは、音のデータが圧縮された状態で格納されているため、音を再生前にデータを解凍しなければなりません。 読み込み時に音のデータを解凍しなかった場合、再生しながらリアルタイムに解凍することになります。
Important
音のデータをを事前に解凍するか、再生中にリアルタイムに解凍するかによって、消費するメモリやCPUへの負荷が異なります。 事前に解凍する場合、読み込み時間は長くなりメモリも消費しますが再生時のCPUへの負荷は小さくなります。 一方、再生中にリアルタイムに解凍する場合は、読み込み時間もメモリも小さくなりますが、再生時に若干CPUの処理を必要とします。 基本的に、音が長い BGMは圧縮したまま 、音が短くたくさん鳴らす 効果音は事前に解凍 して読み込みます。
サウンドはループさせることが可能です。サウンドをループさせるにはIsLoopingModeをtrue
にします。
ループする範囲はLoopStartingPointやLoopEndPointを設定することでを設定でき、
ループする範囲を設定していない場合、音を最後まで再生したら最初に戻ってループします。
LoopStartingPointやLoopEndPointを設定すると、先頭から音を再生し、
LoopEndPointに到達したらLoopStartingPointの位置に戻ることを繰り返します。
SoundMixer
音の再生・停止・その他操作を行う機能を提供します。音を再生する際に使用します。
音を再生するにはPlayメソッドを使用します。このメソッドを実行すると、再生される音に対応するIDが返されます。 SoundMixerクラスの各メソッドに、このIDを渡すことで再生されている音に対して操作をすることができます。
SoundMixerクラスで行える操作は次の通りです。
- 音の停止・一時停止・再開
- 音量の変更・フェードイン/アウト
- 再生速度・パン位置・再生位置の取得・変更
- スペクトル情報の取得
Tip
Altseedでは、再生されている音に対する操作をIDを通して行っています。これは、音のデータそのものとは別に、音の再生情報に関するデータを管理するためです。
音のデータが再生情報を含んでいる場合、同じ音を二重に再生することができません。
Tip
BGMなどを除き、再生中に停止などの操作を行うことは稀です。そのため再生の度に、再生情報を含むインスタンスを生成することは無駄が大きいため、都度IDを用いて操作する仕組みになっています。
スペクトル情報の取得
SoundMixerクラスにはメディアアートのための機能として、スペクトルアナライザが実装されています。GetSpectrumDataメソッドを使用することで、再生中の音声のスペクトル情報を取得し、それを使って独自のサウンドビジュアライザを作ることができます。
Tip
音は波としての性質を持ちます。スペクトルアナライザでは、その波のデータに対して、どの周波数の成分の波形がどれくらいの量含まれているかを解析します。解析する手法としてフーリエ変換が用いられています。
サンプル
効果音の再生
using System;
using Altseed2;
namespace Sample
{
class SoundSE
{
static void Main(string[] args)
{
// Altseed2 を初期化します。
Engine.Initialize("Sound_SE", 640, 480);
// 音ファイルを読み込みます。
// 効果音の場合は第2引数を true に設定して事前にファイルを解凍することが推奨されている。
var se = Sound.Load(@"TestData\Sound\se1.wav", true);
// 音を再生します。
var id = Engine.Sound.Play(se);
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseedを更新します。
Engine.Update();
// 音の再生が終了しているか調べる。
if (!Engine.Sound.GetIsPlaying(id))
{
break;
}
}
// Altseed の終了処理をします。
Engine.Terminate();
}
}
}
BGMの再生
using System;
using Altseed2;
namespace Sample
{
class SoundBGM
{
static void Main(string[] args)
{
// Altseed2 を初期化します。
Engine.Initialize("Sound_BGM", 640, 480);
// 音ファイルを読み込みます。
// 効果音の場合は第2引数を true に設定して再生しながら解凍することが推奨されている。
var bgm = Sound.Load(@"TestData\Sound\bgm1.ogg", false);
// 音を再生します。
var id = Engine.Sound.Play(bgm);
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseedを更新します。
Engine.Update();
// 音の再生が終了しているか調べる。
if (!Engine.Sound.GetIsPlaying(id))
{
break;
}
}
// Altseed の終了処理をします。
Engine.Terminate();
}
}
}
BGMのループ再生
using System;
using Altseed2;
namespace Sample
{
class SoundLoop
{
static void Main(string[] args)
{
// Altseed2 を初期化します。
Engine.Initialize("Sound_Loop", 640, 480);
// 音ファイルを読み込みます。
// 効果音の場合は第2引数を true に設定して再生しながら解凍することが推奨されている。
var bgm = Sound.Load(@"TestData\Sound\bgm1.ogg", false);
// 音のループモードを有効にします。
bgm.IsLoopingMode = true;
// ループの始端を1秒に、終端を2.5秒にします。
bgm.LoopStartingPoint = 1.0f;
bgm.LoopEndPoint = 2.5f;
// 音を再生します。
var id = Engine.Sound.Play(bgm);
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseedを更新します。
Engine.Update();
// 音の再生が終了しているか調べる。
if (!Engine.Sound.GetIsPlaying(id))
{
break;
}
}
// Altseed の終了処理をします。
Engine.Terminate();
}
}
}
スペクトル情報の取得
using System;
using Altseed2;
namespace Sample
{
class SoundSpectrum
{
static void Main(string[] args)
{
// Altseed2 を初期化します。
Engine.Initialize("Sound_BGM", 640, 480);
// 音ファイルを読み込みます。
// 効果音の場合は第2引数を true に設定して再生しながら解凍することが推奨されている。
var bgm = Sound.Load(@"TestData\Sound\bgm1.ogg", false);
// 音を再生します。
var id = Engine.Sound.Play(bgm);
// スペクトルバーのインスタンスを1024個作成します。
var spectrumBars = new PolygonNode[1024];
for (int i = 0; i < 1024; ++i)
{
// ※ 640 / 1024 = 0.625
var spectrumBar = new PolygonNode();
spectrumBar.Position = new Vector2F(i * 0.625f, 1.0f);
Span<Vector2F> vertexes = stackalloc Vector2F[4] {
new Vector2F(0.0f, 480.0f),
new Vector2F(0.0f, 480.0f),
new Vector2F(0.625f, 480.0f),
new Vector2F(0.625f, 480.0f),
};
spectrumBar.SetVertexes(vertexes, new Color(255, 255, 255));
spectrumBars[i] = spectrumBar;
Engine.AddNode(spectrumBar);
}
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseedを更新します。
Engine.Update();
// 再生されている音のスペクトル情報を取得します。
// データの長さは2のn乗でなくてはなりません。
var spectrum = Engine.Sound.GetSpectrum(id, 1024, FFTWindow.Rectangular);
// 取得したスペクトル情報をスペクトルバーに反映させます。
for (int i = 0; i < 1024; ++i)
{
Span<Vector2F> vertexes = stackalloc Vector2F[]
{
new Vector2F(0.0f, 480.0f),
new Vector2F(0.0f, 480.0f - spectrum[i]),
new Vector2F(0.625f, 480.0f - spectrum[i]),
new Vector2F(0.625f, 480.0f),
};
spectrumBars[i].SetVertexes(vertexes, new Color(255, 255, 255));
}
// 音の再生が終了しているか調べる。
if (!Engine.Sound.GetIsPlaying(id))
{
break;
}
}
// Altseed の終了処理をします。
Engine.Terminate();
}
}
}