フォルダ内の音楽ファイルの連続再生について
Siv3Dはじめました 2017/12/13(Wed) 17:09
Siv3Dの入門者です.
https://qiita.com/Reputeless/items/112dbac6bafe837ea3c7
https://github.com/Siv3D/Reference-JP/wiki/%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0
上記二つのチュートリアルをもとに,フォルダをダイアログで選択し,フォルダ内のmp3を連続で再生するプレイヤーを作成したいと考えています.
フォルダ内のファイルへのパスは
const auto folder = Dialog::GetFolder()
Array<FilePath> contents = FileSystem::DirectoryContents(folder.value());
で取得出来たのですが,その音楽ファイルをロードする方法が分かりません.
サンプル内では,
m_sound = Dialog::OpenSound();
でダイアログから直接音楽ファイルをロードしていましたが,取得したパスから音楽ファイルをロードする方法はありますでしょうか?
Sound m_sound(contents[0]);
という形であればロードできるのですが,
Sound m_sound;
のように,既に宣言されたm_soundに音楽ファイルを改めてロードしたいのです.
m_sound(contents[0]);
で出来るのかと思いやってみましたが,エラーが出てしまいました.
煩雑な質問で申し訳ありませんが,よろしくお願いします.
-----追記(2017/12/14)-----
現状,メインループ前に以下のような形で楽曲をロードしています.
---------------------------------------------------------------------------------------
const auto folder = Dialog::GetFolder();
Array<FilePath> contents = FileSystem::DirectoryContents(folder.value());
Sound sound0(contents[0]);
Sound sound1(contents[1]);
Sound sound2(contents[2]);
Sound sound3(contents[3]);
Sound m_sound[4];
m_sound[0] = sound0;
m_sound[1] = sound1;
m_sound[2] = sound2;
m_sound[3] = sound3;
----------------------------------------------------------------------------------------
メインループ内でm_sound[i]を操作しながら再生/一時停止などをしている状態です.
あまりにも愚直な形なので,なんとか綺麗にしたいです.
上手い方法はありませんでしょうか?
よろしくお願いします.
Reputeless 2017/12/15(Fri) 23:26
sound = Sound(path); で代入できます。
複数楽曲のループ再生はこのような感じでどうでしょう。
Array<Sound> sounds;
sounds.push_back(Sound(L"0.mp3"));
sounds.push_back(Sound(L"1.mp3"));
sounds.push_back(Sound(L"2.mp3"));
sounds.push_back(Sound(L"3.mp3"));
const size_t num_sounds = sounds.size();
size_t index = 0;
sounds[index].play();
while (System::Update())
{
if (!sounds[index].isPlaying())
{
++index %= num_sounds;
sounds[index].play();
}
}
Siv3Dはじめました 2017/12/17(Sun) 15:12