Pipe Organ Stop Combination Generator

Pipe Organ Stop Combination Generator

Select options to generate stop combination

${description}

    ${stops.map(stop => `
  • ${stop.name} ${stop.pitch} (${stop.family})
  • `).join('')}

Note: Adjust stops based on specific organ voicing and acoustics.

`; resultDiv.style.backgroundColor = colorGradient[0]; resultDiv.style.color = colorGradient[2]; } async function downloadPDF() { const { jsPDF } = window.jspdf; const doc = new jsPDF(); const pageWidth = doc.internal.pageSize.getWidth(); const pageHeight = doc.internal.pageSize.getHeight(); doc.setFontSize(16); doc.setTextColor(colorGradient[2]); doc.text('Pipe Organ Stop Combination Generator', pageWidth / 2, 20, { align: 'center' }); doc.setFontSize(12); doc.setTextColor(0, 0, 0); doc.text(`Musical Context: ${inputs.musicalContext.options[inputs.musicalContext.selectedIndex].text}`, 20, 40); doc.text(`Organ Size: ${inputs.organSize.options[inputs.organSize.selectedIndex].text}`, 20, 50); doc.text(`Desired Volume: ${inputs.volume.options[inputs.volume.selectedIndex].text}`, 20, 60); doc.text(`Color Scheme: ${inputs.colorScheme.value}`, 20, 70); doc.text(`Recommended Stops:`, 20, 80); // Extract stops from resultDiv const stopItems = resultDiv.querySelectorAll('.stop-list li'); let y = 90; stopItems.forEach(item => { doc.text(item.textContent, 20, y); y += 10; }); doc.setFillColor(colorGradient[1]); doc.rect(0, pageHeight - 10, pageWidth, 10, 'F'); doc.save('Pipe_Organ_Stop_Combination_Results.pdf'); } function updateVisuals() { colorGradient = getColorGradient(inputs.colorScheme.value); generateStopCombination(); } Object.values(inputs).forEach(input => { input.addEventListener('input', updateVisuals); }); // Initial generation generateStopCombination();
Scroll to Top