Newer
Older
Intro-Q-2025-ver2 / public / music / music_player.html
@Takizawa Soetsu Takizawa Soetsu on 27 Jul 3 KB add 正誤判定
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>音楽プレイヤー</title>
</head>
<body>
  <h1>音楽プレイヤー</h1>
  <p id="nowPlaying">選択された曲: なし</p>

  <button id="initBtn">🎵 音楽再生を有効にする</button>

  <audio id="audioPlayer" controls></audio>

  <script>
    const audioPlayer = document.getElementById("audioPlayer");
    const nowPlaying = document.getElementById("nowPlaying");
    const initBtn = document.getElementById("initBtn");

    // ▼▼▼【追加】効果音再生用のプレイヤーと、音楽サーバーのホスト名 ▼▼▼
    const sePlayer = new Audio();
    // ★★★ 音楽サーバーのIPアドレス `192.168.1.11` はご自身の環境に合わせてください ★★★
    const musicServerHost = 'http://192.168.1.11:8890';
    // ★★★ WebSocketサーバー(大学PC)のIPアドレスはご自身の環境に合わせてください ★★★
    const wsServerHost = '172.17.54.120';

    let currentFileUrl = "";

    const silentMp3 = "data:audio/mp3;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAACcQCA//////////8AAA==";
    initBtn.addEventListener("click", () => {
      audioPlayer.src = silentMp3;
      audioPlayer.play().then(() => {
          console.log("Autoplayが許可されました");
          audioPlayer.pause(); audioPlayer.src = "";
          initBtn.disabled = true; initBtn.style.display = "none";
        }).catch(err => console.error("初期再生失敗", err));
    });

    const conn = new WebSocket(`ws://${wsServerHost}:8888`);

    conn.onmessage = ev => {
      let msg;
      try { msg = JSON.parse(ev.data); } catch { return; }

      switch (msg.type) {
        case "select":
          currentFileUrl = msg.url;
          audioPlayer.src = currentFileUrl;
          nowPlaying.textContent = `選択された曲: ${decodeURIComponent(currentFileUrl.split('/').pop())}`;
          console.log("曲読み込み:", currentFileUrl);
          break;

        case "play":
          if (!currentFileUrl) return;
          audioPlayer.play().catch(err => console.error("再生失敗:", err));
          break;

        case "pause":
          audioPlayer.pause();
          break;

        case "stop":
          audioPlayer.pause();
          audioPlayer.currentTime = 0;
          break;

        case "announce":
          if (msg.queue && msg.queue.length > 0) {
            if (!audioPlayer.paused) {
              audioPlayer.pause();
              console.log("挙手があったため再生を一時停止しました。");
            }
          }
          break;

        // ▼▼▼【追加】正解・不正解の処理 ▼▼▼
        case "correct":
          audioPlayer.pause();
          audioPlayer.currentTime = 0;
          sePlayer.src = `${musicServerHost}/SE/correct.mp3`;
          sePlayer.play();
          nowPlaying.innerHTML = `⭕ 正解!<br>答え: ${decodeURIComponent(msg.answer)}`;
          break;

        case "incorrect":
          audioPlayer.pause(); // 曲は一時停止
          sePlayer.src = `${musicServerHost}/SE/incorrect.mp3`;
          sePlayer.play();
          nowPlaying.textContent = `❌ 不正解...`;
          break;
      }
    };

    conn.onopen = () => console.log("WebSocket 接続成功!");
    conn.onerror = (e) => console.error("WebSocket エラー", e);
    conn.onclose = () => console.log("WebSocket 切断");
  </script>
</body>
</html>