Band Rehearsal Plan Sheet

Rehearsal Agenda & Focus Plan

Band: | Date: | Total Time:

Time Allocation

Total Music Time: min

Add Song / Focus Slot


Setlist is empty. Add songs above.

'; return; } const table = document.createElement('table'); table.style.cssText = 'width:100%; border-collapse:collapse; font-size:13px;'; brpsSetlist.forEach(item => { const tr = document.createElement('tr'); tr.style.borderBottom = '1px dashed #444'; tr.innerHTML = ` ${item.song} (${item.time} min) Focus: ${item.focus} `; display.appendChild(tr); }); } // --- Agenda Generation --- function timeStringToMinutes(timeStr) { const [h, m] = timeStr.split(':').map(Number); return h * 60 + m; } function minutesToTimeString(totalMinutes) { const hours = Math.floor(totalMinutes / 60) % 24; const minutes = totalMinutes % 60; const date = new Date(); date.setHours(hours, minutes, 0, 0); return date.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit', hour12: true }); } window.brpsGeneratePlan = function() { const startStr = document.getElementById('brps-in-start').value; const endStr = document.getElementById('brps-in-end').value; const breakTime = parseInt(document.getElementById('brps-in-break').value) || 0; const bandName = document.getElementById('brps-cfg-band').value || 'The Band'; const date = document.getElementById('brps-cfg-date').value || 'YYYY-MM-DD'; const startMinutes = timeStringToMinutes(startStr); const endMinutes = timeStringToMinutes(endStr); const totalDurationMinutes = endMinutes > startMinutes ? endMinutes - startMinutes : (endMinutes + 1440) - startMinutes; const musicTime = brpsSetlist.reduce((sum, song) => sum + song.time, 0); const breakAndSetupTime = breakTime; const totalRehearsalSlots = musicTime + breakAndSetupTime; const freeTime = totalDurationMinutes - totalRehearsalSlots; document.getElementById('brps-out-band').innerText = bandName; document.getElementById('brps-out-date').innerText = date; document.getElementById('brps-out-total-duration').innerText = `${totalDurationMinutes} minutes`; document.getElementById('brps-out-music-time').innerText = musicTime; // --- Build Agenda --- let agendaHtml = ''; let currentTime = startMinutes; let currentItemCount = 1; const addSegment = (title, duration, content) => { if (duration <= 0) return; const startTime = minutesToTimeString(currentTime); const endTime = minutesToTimeString(currentTime + duration); currentTime += duration; agendaHtml += `
${currentItemCount++}. ${title}

[${startTime} - ${endTime}] - ${duration} min

${content}

`; }; // 1. Warmup / Setup addSegment("Warm-up & Setup", 15, "Check levels, instrument tuning, and confirm practice goals."); // 2. Setlist let setlistTableHtml = ` `; brpsSetlist.forEach(song => { const startTime = minutesToTimeString(currentTime); currentTime += song.time; const endTime = minutesToTimeString(currentTime); setlistTableHtml += ` `; }); setlistTableHtml += `
TimeSong / PieceKey Focus
${startTime} - ${endTime} ${song.song} ${song.focus}
`; addSegment("Focus Practice Set", musicTime, setlistTableHtml); // 3. Break addSegment("Scheduled Break", breakTime, "Stretch, hydrate, quick discussion on technical issues."); // 4. Wrap-up / Free Time if (freeTime > 0) { addSegment("Free Time / Discussion / Pack Up", freeTime, "Use remaining time for creative jamming or final feedback."); } else if (freeTime < 0) { agendaHtml += `

WARNING: Agenda is ${Math.abs(freeTime)} minutes over the scheduled end time.

`; } document.getElementById('brps-agenda-content').innerHTML = agendaHtml; // Update Chart wccdUpdateChart(musicTime, breakAndSetupTime, freeTime); }; // --- Chart Logic --- window.brpsInitChart = function() { const ctx = document.getElementById('brps-chart').getContext('2d'); brpsChart = new Chart(ctx, { type: 'doughnut', data: { labels: ['Music Focus', 'Scheduled Break', 'Free Time'], datasets: [{ data: [50, 10, 30], backgroundColor: ['#ff4d4d', '#495057', '#94a3b8'], borderWidth: 1 }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: 'bottom', labels: { boxWidth: 10, padding: 10 } } } } }); }; window.wccdUpdateChart = function(musicTime, breakTime, freeTime) { if(brpsChart) { // Ensure freeTime is never negative for chart data const actualFreeTime = Math.max(0, freeTime); brpsChart.data.datasets[0].data = [musicTime, breakTime, actualFreeTime]; brpsChart.update(); } }; window.brpsResetData = function(silent = false) { if(silent || confirm("Clear all data and reset to default?")) { brpsSetlist = [ { id: 1, song: "The City Lights", focus: "Bridge transition (Tempo changes)", time: 15 }, { id: 2, song: "Silent Echo", focus: "Vocal harmonies in the chorus", time: 10 } ]; document.getElementById('brps-cfg-band').value = 'The Chrononauts'; document.getElementById('brps-cfg-date').valueAsDate = new Date(); document.getElementById('brps-in-start').value = "19:00"; document.getElementById('brps-in-end').value = "21:00"; document.getElementById('brps-in-break').value = 10; brpsRenderSetlistDisplay(); brpsGeneratePlan(); if (!silent) alert("Plan reset to template."); } }; // --- PDF Export --- window.brpsDownloadPDF = function() { const element = document.getElementById('brps-export-area'); const opt = { margin: 0.75, filename: 'Rehearsal_Plan_Sheet.pdf', image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2 }, jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' } }; html2pdf().set(opt).from(element).save(); }; })();
Scroll to Top