投稿者 祈り星  (社会人) 投稿日時 2023/9/21 18:11:40
お答えありがとうございます。
現在のターゲットフレームは.NET6です。PCにダウンロードしたのは.NET7になります。

> 漠然と『偶然』という言葉で片付けられても判断しにくいです。
書き込み内容の情報が不足していて申し訳ないです、以下のコードが私が弄ってループと音量調整に成功したコードです。


// 音楽再生〇〇〇
[System.Runtime.InteropServices.DllImport("winmm.dll")]
private static extern int mciSendString(String command,
StringBuilder buffer, int bufferSize, IntPtr hwndCallback);

private string aliasName = "BGM";


private void button1_Click(object sender, EventArgs e)
{
    ongaku();
}


private void ongaku()
{
    string fileName = "C:\\Users\\音楽.mp3";
    string cmd;

    cmd = "open \"" + fileName + "\" type mpegvideo alias " + aliasName;
    if (mciSendString(cmd, null, 0, IntPtr.Zero) != 0)
        return;

    cmd = "play " + aliasName + " repeat";
    mciSendString(cmd, null, 0, IntPtr.Zero);

    cmd = "setaudio " + aliasName + " volume to 300";
    mciSendString(cmd, null, 0, IntPtr.Zero);
}




>問題になっているのは設定と取得のいずれですか?
設定になります。

すみません、これも今更で情けない話ですが英語が読めず、C#以外の言語は分からずなので解説サイト等も正確ではない和訳と知識不足が合わさって理解が出来ませんでした。
今まで習ってきたC#とは書き方?表記?も一部、違っていてそういうのもあります。
魔界の仮面弁士さんが言ってくれたおかげで分かったのは mciSendString の第4引数は IntPtr になること。
mciSendString の戻り値が0であれば成功、それ以外は失敗、失敗時の数字によってどんなエラーなのか、ということです。

目的である音量の設定をするにはmciSendStringの第1引数に"setaudio my_sound volume to 100"を入れて my_sound を aliasName に変えて文字列連結でつなげる、くらいの理解はしました。
しかし、先ほど私が書いたここのサイトのサンプルに置き換えようとすると色々試しましたが、やはりうまくいきません。
すみませんがどこをどうすればいいのか、解説をどうかよろしくお願いします。
以下が今、うまくいっていないコードです。

private void Play()
{
    string cmd;

    //再生するファイル名
    string fileName = Random.Shared.Next(1, 9) switch
    {
        1 => "C2.wav",
        2 => "F2.wav",
        3 => "G2.wav",
        4 => "C3.wav",
        5 => "EF2.wav",
        6 => "AF2.wav",
        7 => "BF2.wav",
        _ => "EF3.wav"
    };
    fileName = Application.StartupPath + @"Sound\" + fileName;


    string aliasName = $"Alias{DateTime.Now.Ticks}{Random.Shared.Next(1, 90000000)}";
    mciSendString($"open \"{fileName}\" alias {aliasName}"null, 0, IntPtr.Zero);
    mciSendString($"play {aliasName}"null, 0, IntPtr.Zero);



    cmd = "setaudio " + aliasName + " volume to 200";
    mciSendString(cmd, null, 0, IntPtr.Zero);

    label4.Text = mciSendString(cmd, null, 0, IntPtr.Zero).ToString();
}