<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>O Ses Türkiye Simülatörü</title>
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background-color: #111;
            color: white;
            text-align: center;
            margin: 0;
            padding: 20px;
            overflow-x: hidden;
        }

        h1 {
            color: #e50914;
            text-transform: uppercase;
            letter-spacing: 2px;
            text-shadow: 0 0 10px rgba(229, 9, 20, 0.5);
        }

        .jury-container {
            display: flex;
            justify-content: center;
            gap: 20px;
            margin-top: 50px;
            flex-wrap: wrap;
            perspective: 1000px;
        }

        .chair {
            width: 120px;
            height: 160px;
            background-color: #333;
            border: 5px solid #555;
            border-radius: 10px;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            font-weight: bold;
            font-size: 1.2rem;
            transition: all 0.8s cubic-bezier(0.25, 0.8, 0.25, 1);
            box-shadow: 0 10px 20px rgba(0,0,0,0.5);
            position: relative;
        }

        .chair::after {
            content: "O SES";
            position: absolute;
            bottom: 10px;
            font-size: 0.8rem;
            color: #888;
        }

        /* Jüri döndüğünde uygulanacak sınıf */
        .chair.turned {
            background-color: #e50914;
            border-color: #ff3333;
            transform: rotateY(180deg);
            box-shadow: 0 0 30px rgba(229, 9, 20, 0.8);
        }

        .chair.turned .name, 
        .chair.selected .name {
            transform: rotateY(180deg);
        }
        
        .chair.turned::after {
            content: "SANA DÖNDÜ";
            color: white;
            transform: rotateY(180deg);
        }

        /* Jüri seçilebilir olduğunda */
        .chair.choosable {
            cursor: pointer;
            animation: pulse 1.5s infinite;
        }

        .chair.choosable:hover {
            transform: rotateY(180deg) scale(1.05);
            border-color: #fff;
        }

        /* Kullanıcı jüriyi seçtiğinde */
        .chair.selected {
            background-color: #28a745;
            border-color: #1e7e34;
            transform: rotateY(180deg) scale(1.1);
            box-shadow: 0 0 40px rgba(40, 167, 69, 0.9);
            z-index: 10;
        }

        .chair.selected::after {
            content: "TAKIMINDASIN";
            color: white;
            transform: rotateY(180deg);
            font-size: 0.7rem;
        }

        /* Seçilmeyen jüriler kararır */
        .chair.not-selected {
            opacity: 0.4;
            transform: rotateY(180deg) scale(0.9);
        }

        @keyframes pulse {
            0% { box-shadow: 0 0 20px rgba(229, 9, 20, 0.6); }
            50% { box-shadow: 0 0 40px rgba(229, 9, 20, 1); }
            100% { box-shadow: 0 0 20px rgba(229, 9, 20, 0.6); }
        }

        .stage {
            margin-top: 60px;
            padding: 30px;
            background: radial-gradient(circle, #2a2a2a 0%, #111 70%);
            border-radius: 50%;
            display: inline-block;
            box-shadow: 0 0 50px rgba(255, 255, 255, 0.1);
        }

        button {
            background-color: #e50914;
            color: white;
            border: none;
            padding: 15px 30px;
            font-size: 1.2rem;
            border-radius: 50px;
            cursor: pointer;
            font-weight: bold;
            transition: 0.3s;
            margin: 10px;
            box-shadow: 0 5px 15px rgba(229, 9, 20, 0.4);
        }

        button:hover {
            background-color: #ff1a1a;
            transform: scale(1.05);
        }

        button:disabled {
            background-color: #555;
            cursor: not-allowed;
            transform: none;
            box-shadow: none;
        }

        canvas {
            display: block;
            margin: 20px auto;
            background-color: #000;
            border-radius: 10px;
            border: 2px solid #333;
        }

        #feedback {
            margin-top: 30px;
            font-size: 1.3rem;
            min-height: 60px;
            line-height: 1.5;
            color: #ddd;
        }
    </style>
</head>
<body>

    <h1>O Ses Simülatörü</h1>
    <p>Mikrofon izni ver, sahnede şarkını söyle ve jürileri etkile!</p>

    <div class="jury-container">
        <div class="chair" id="jury1" data-name="Muro"><span class="name">Muro</span></div>
        <div class="chair" id="jury2" data-name="Hado"><span class="name">Hado</span></div>
        <div class="chair" id="jury3" data-name="Ebo"><span class="name">Ebo</span></div>
        <div class="chair" id="jury4" data-name="Beyo"><span class="name">Beyo</span></div>
    </div>

    <div class="stage">
        <canvas id="visualizer" width="300" height="100"></canvas>
        <button id="startBtn">🎤 Şarkıya Başla</button>
        <button id="stopBtn" disabled>⏹️ Performansı Bitir</button>
    </div>

    <div id="feedback">Sahnede yerini al ve şarkıya başla...</div>

    <script>
        let audioContext;
        let analyser;
        let microphone;
        let animationId;
        let isRecording = false;

        // Ses seviyesi ölçümü için değişkenler
        let totalVolume = 0;
        let volumeChecks = 0;

        const startBtn = document.getElementById('startBtn');
        const stopBtn = document.getElementById('stopBtn');
        const canvas = document.getElementById('visualizer');
        const ctx = canvas.getContext('2d');
        const feedback = document.getElementById('feedback');
        const chairs = document.querySelectorAll('.chair');

        // Mikrofonu başlat ve sesi görselleştir
        async function startPerformance() {
            try {
                const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
                audioContext = new (window.AudioContext || window.webkitAudioContext)();
                analyser = audioContext.createAnalyser();
                microphone = audioContext.createMediaStreamSource(stream);
                
                microphone.connect(analyser);
                analyser.fftSize = 256;
                const bufferLength = analyser.frequencyBinCount;
                const dataArray = new Uint8Array(bufferLength);

                isRecording = true;
                totalVolume = 0;
                volumeChecks = 0;

                startBtn.disabled = true;
                stopBtn.disabled = false;
                feedback.innerHTML = "Harika söylüyorsun! Ses dalgaların ekranda...<br><em>Ne kadar güçlü söylersen dönme ihtimalleri o kadar artar!</em>";
                
                // Jürileri ve tıklama olaylarını sıfırla
                chairs.forEach(chair => {
                    chair.className = 'chair'; // Sadece chair sınıfı kalsın
                    chair.onclick = null;
                });

                function draw() {
                    if (!isRecording) return;
                    animationId = requestAnimationFrame(draw);
                    analyser.getByteFrequencyData(dataArray);

                    ctx.fillStyle = '#000';
                    ctx.fillRect(0, 0, canvas.width, canvas.height);

                    const barWidth = (canvas.width / bufferLength) * 2.5;
                    let barHeight;
                    let x = 0;
                    let sumVolume = 0;

                    for (let i = 0; i < bufferLength; i++) {
                        barHeight = dataArray[i] / 2;
                        sumVolume += dataArray[i]; // Toplam sesi hesapla
                        
                        ctx.fillStyle = `rgb(${barHeight + 100}, 20, 20)`;
                        ctx.fillRect(x, canvas.height - barHeight, barWidth, barHeight);
                        x += barWidth + 1;
                    }

                    // Anlık sesin ortalamasını al ve performansa kaydet
                    let currentAvgVolume = sumVolume / bufferLength;
                    totalVolume += currentAvgVolume;
                    volumeChecks++;
                }
                draw();

            } catch (err) {
                alert("Mikrofonuna erişilemedi! Oyunu oynamak için mikrofon izni vermelisin.");
                console.error(err);
            }
        }

        // Performansı bitir ve jüri kararını hesapla
        function stopPerformance() {
            isRecording = false;
            cancelAnimationFrame(animationId);
            startBtn.disabled = false;
            stopBtn.disabled = true;
            
            if (audioContext) {
                audioContext.close();
            }
            
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            ctx.fillStyle = '#000';
            ctx.fillRect(0, 0, canvas.width, canvas.height);

            feedback.innerText = "Şarkı bitti... Jüriler düşünüyor...";
            
            setTimeout(evaluatePerformance, 1500);
        }

        function evaluatePerformance() {
            // Şarkı boyunca çıkan ortalama ses seviyesini hesapla
            let averageSessionVolume = volumeChecks > 0 ? (totalVolume / volumeChecks) : 0;
            
            // Eğer ortalama ses seviyesi 10'un altındaysa (sessizlik veya çok kısık ortam sesi)
            let didSing = averageSessionVolume > 10; 

            let turnedCount = 0;
            const turnedChairs = [];

            chairs.forEach((chair, index) => {
                let willTurn = false;

                if (didSing) {
                    // Şarkı söylendiyse ses yüksekliğine göre dönme şansı hesapla (%40 taban + sese göre bonus)
                    let turnChance = 0.4 + (averageSessionVolume / 150);
                    willTurn = Math.random() < turnChance; 
                } else {
                    // Şarkı söylenmediyse dönme şansı %0
                    willTurn = false;
                }

                if (willTurn) {
                    setTimeout(() => {
                        chair.classList.add('turned');
                        turnedChairs.push(chair);
                    }, index * 500);
                    turnedCount++;
                }
            });

            setTimeout(() => {
                if (turnedCount > 1) {
                    feedback.innerHTML = `<strong>TEBRİKLER! ${turnedCount} JÜRİ BİRDEN DÖNDÜ!</strong><br> Şimdi dönen jürilerin üzerine tıklayarak <strong>takımını seç</strong>!`;
                    enableJurySelection(turnedChairs);
                } else if (turnedCount === 1) {
                    feedback.innerHTML = `<strong>Tebrikler! ${turnedChairs[0].getAttribute('data-name')} sana döndü!</strong><br> Otomatik olarak onun takımına katıldın.`;
                    turnedChairs[0].classList.add('selected');
                    dimOtherChairs(turnedChairs[0]);
                } else {
                    if (!didSing) {
                        feedback.innerHTML = "<strong>Hiç ses gelmedi!</strong><br> Şarkı söylemediğin için jüriler dönmedi. Biraz daha yüksek sesle tekrar dene.";
                    } else {
                        feedback.innerHTML = "<strong>Maalesef kimse dönmedi...</strong><br> Sesin duyuldu ama jürileri ikna edemedin. Pes etme, tekrar dene!";
                    }
                }
            }, 2500);
        }

        // Dönen jürileri tıklanabilir yap
        function enableJurySelection(turnedChairs) {
            turnedChairs.forEach(chair => {
                chair.classList.add('choosable');
                
                chair.onclick = function() {
                    // Seçim yapıldıktan sonra tüm tıklama olaylarını kaldır
                    chairs.forEach(c => c.onclick = null);
                    
                    // Seçileni vurgula
                    this.classList.remove('choosable');
                    this.classList.add('selected');
                    
                    dimOtherChairs(this);

                    let juriName = this.getAttribute('data-name');
                    feedback.innerHTML = `<strong>Mükemmel Seçim!</strong><br> Artık <strong>${juriName}</strong>'nun takımındasın! Şampiyonluğa giden yol açıldı!`;
                };
            });
        }

        // Seçilmeyen jürileri soluklaştır
        function dimOtherChairs(selectedChair) {
            chairs.forEach(c => {
                if (c !== selectedChair) {
                    c.classList.remove('choosable');
                    if (c.classList.contains('turned')) {
                        c.classList.add('not-selected');
                    }
                }
            });
        }

        startBtn.addEventListener('click', startPerformance);
        stopBtn.addEventListener('click', stopPerformance);

    </script>
</body>
</html>







Selamlar şarkıya başla diyin mikrofonunuz ile kendiniz şarkınızı söyleyin jüri dönsün sizi seçsin geliştirmek size kalmış yapay zeka yapımıdır iyi forumlar