// --- 設定エリア --- const musicFolderPath = "music/"; // --- ゲーム状態管理 --- let initialTrackList = []; // 曲ファイル名のリスト let answerData = {}; // 曲名と歌手名のデータ let shuffledTrackList = []; let currentTrackIndex = 0; let currentTimeout; // --- DOM要素取得 --- const audioPlayer = document.getElementById('audio-player'); const quizView = document.getElementById('quiz-view'); const answerView = document.getElementById('answer-view'); const playButtons = document.querySelectorAll('.play-button'); const checkAnswerButton = document.getElementById('checkAnswerButton'); const nextTrackButton = document.getElementById('nextTrackButton'); const currentQuestionEl = document.getElementById('current-question'); const messageAreaEl = document.getElementById('current-track-name'); const answerSongEl = document.getElementById('answer-song'); const answerArtistEl = document.getElementById('answer-artist'); /** * 1. list.js 内の csvData 文字列を解析してデータを準備する */ function loadDataAndStart() { try { // list.js で定義した csvData を改行ごとに分ける const rows = csvData.trim().split(/\r?\n/); // 1行目(ヘッダー)を飛ばして2行目から処理 for (let i = 1; i < rows.length; i++) { const row = rows[i].split(","); if (row.length < 3) continue; const num = row[0].trim(); // 曲番号 (例: 01) const song = row[1].trim(); // 曲名 const artist = row[2].trim(); // 歌手名 const fileName = num + ".mp3"; initialTrackList.push(fileName); answerData[fileName] = { song: song, artist: artist }; } // 解析が終わったらゲームを開始 initializeGame(); } catch (error) { console.error("解析エラー:", error); alert("データの読み込みに失敗しました。list.jsの形式を確認してください。"); } } // --- ユーティリティ関数 --- function shuffleArray(array) { for (let i = array.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; } return array; } // --- イベントリスナー --- playButtons.forEach(button => { button.addEventListener('click', () => { const durationType = button.getAttribute('data-duration'); if (durationType === 'full') { playTrackSegment(Infinity); } else { playTrackSegment(parseInt(durationType)); } }); }); checkAnswerButton.addEventListener('click', showAnswerScreen); nextTrackButton.addEventListener('click', moveToNextTrack); audioPlayer.onended = () => { enableButtons(); checkAnswerButton.disabled = false; messageAreaEl.textContent = "曲の再生が終了しました。答え合わせへどうぞ。"; }; // --- メインロジック --- function initializeGame() { if (initialTrackList.length === 0) { alert("曲データが見つかりません。"); return; } shuffledTrackList = shuffleArray([...initialTrackList]); currentTrackIndex = 0; loadTrack(); } function loadTrack() { if (currentTrackIndex >= shuffledTrackList.length) { endGame(); return; } const currentTrackName = shuffledTrackList[currentTrackIndex]; audioPlayer.src = musicFolderPath + currentTrackName; audioPlayer.load(); clearTimeout(currentTimeout); audioPlayer.pause(); audioPlayer.currentTime = 0; quizView.classList.remove('hidden'); answerView.classList.add('hidden'); currentQuestionEl.textContent = currentTrackIndex + 1; messageAreaEl.textContent = "再生ボタンを押してイントロを聴いてみましょう"; checkAnswerButton.disabled = true; enableButtons(); } function playTrackSegment(duration) { if (currentTrackIndex >= shuffledTrackList.length) return; clearTimeout(currentTimeout); audioPlayer.pause(); audioPlayer.currentTime = 0; disableButtons(); checkAnswerButton.disabled = true; audioPlayer.play().then(() => { if (duration !== Infinity) { messageAreaEl.textContent = `現在、${duration}秒まで再生中です...`; currentTimeout = setTimeout(() => { audioPlayer.pause(); enableButtons(); checkAnswerButton.disabled = false; messageAreaEl.textContent = `再生を停止しました。${duration}秒まで聴きました。答え合わせへどうぞ。`; }, duration * 1000); } else { messageAreaEl.textContent = "最後まで再生中です... 曲が終わるまでお待ちください。"; } }).catch(error => { console.error("再生エラー:", error); alert(`音楽ファイルが見つかりません: music/${shuffledTrackList[currentTrackIndex]}`); enableButtons(); checkAnswerButton.disabled = false; }); } function showAnswerScreen() { clearTimeout(currentTimeout); audioPlayer.pause(); const currentTrackFile = shuffledTrackList[currentTrackIndex]; const answer = answerData[currentTrackFile]; if (answer) { answerSongEl.textContent = answer.song; answerArtistEl.textContent = answer.artist; } quizView.classList.add('hidden'); answerView.classList.remove('hidden'); } function moveToNextTrack() { currentTrackIndex++; if (currentTrackIndex < shuffledTrackList.length) { loadTrack(); } else { endGame(); } } function endGame() { clearTimeout(currentTimeout); audioPlayer.pause(); quizView.classList.add('hidden'); answerView.classList.remove('hidden'); answerSongEl.textContent = "全問終了"; answerArtistEl.textContent = "お疲れ様でした!"; nextTrackButton.textContent = "ゲーム終了"; nextTrackButton.disabled = true; } function enableButtons() { playButtons.forEach(btn => btn.disabled = false); } function disableButtons() { playButtons.forEach(btn => btn.disabled = true); } // 🚀 実行開始 loadDataAndStart();