// Fungsi untuk memutar suara azan (menggunakan oscillator sederhana, mirip nada panjang) function playAzanSound() // Hentikan audio sebelumnya jika ada if (currentAudio) currentAudio.pause(); currentAudio = null; // Menggunakan AudioContext (web audio) untuk suara azan sederhana try window.webkitAudioContext; const audioCtx = new AudioContextClass(); currentAudio = audioCtx; let startTime = audioCtx.currentTime; // nada azan sederhana: rangkaian frekuensi dan durasi (simulasi panggilan) const notes = [ freq: 440, dur: 0.8 , // A freq: 494, dur: 0.8 , // B freq: 523, dur: 1.0 , // C freq: 587, dur: 0.9 , // D freq: 523, dur: 0.8 , freq: 440, dur: 1.2 , freq: 659, dur: 1.0 , // E freq: 587, dur: 1.2 , freq: 523, dur: 1.5 ]; let timeCursor = startTime; for (let note of notes) const osc = audioCtx.createOscillator(); const gain = audioCtx.createGain(); osc.connect(gain); gain.connect(audioCtx.destination); osc.frequency.value = note.freq; gain.gain.value = 0.35; osc.start(timeCursor); gain.gain.exponentialRampToValueAtTime(0.0001, timeCursor + note.dur); osc.stop(timeCursor + note.dur); timeCursor += note.dur; // tambah nafas panjang const finalOsc = audioCtx.createOscillator(); const finalGain = audioCtx.createGain(); finalOsc.connect(finalGain); finalGain.connect(audioCtx.destination); finalOsc.frequency.value = 440; finalGain.gain.value = 0.3; finalOsc.start(timeCursor); finalGain.gain.exponentialRampToValueAtTime(0.0001, timeCursor + 2.2); finalOsc.stop(timeCursor + 2.2); // resume jika suspended if (audioCtx.state === 'suspended') audioCtx.resume(); // status selesai cleanup setTimeout(() => if (currentAudio === audioCtx) currentAudio = null; , (timeCursor + 2.5) * 1000); catch(e) console.warn("AudioContext error:", e); azanMsgSpan.innerText = "⚠️ Browser tidak support audio, azan visual tetap aktif.";
.city-name font-size: 1.2rem; background: #d4af37; color: #1e2f2c; padding: 4px 14px; border-radius: 40px; font-weight: bold; aplikasi jam digital masjid gratis
// Data jadwal sholat let prayerSchedule = Imsak: "04:30", Subuh: "04:45", Dzuhur: "12:00", Ashar: "15:20", Maghrib: "18:00", Isya: "19:15" ; // fallback sementara // Fungsi untuk memutar suara azan (menggunakan oscillator
// Update data dari API (Aladhan) berdasarkan kota (default Jakarta, bisa diganti dengan geolocation optional) async function fetchPrayerTimes(city = "Jakarta", country = "ID") try const today = new Date(); const dateStr = `$today.getDate()-$today.getMonth()+1-$today.getFullYear()`; // menggunakan API Aladhan const url = `https://api.aladhan.com/v1/timingsByCity/$dateStr?city=$encodeURIComponent(city)&country=$encodeURIComponent(country)&method=2`; const response = await fetch(url); const data = await response.json(); if (data.code === 200 && data.data && data.data.timings) const timings = data.data.timings; prayerSchedule = timings.Subuh, Dzuhur: timings.Dhuhr, Ashar: timings.Asr, Maghrib: timings.Maghrib, Isya: timings.Isha ; // juga dapatkan hijriah if (data.data.date && data.data.date.hijri) const hijri = data.data.date.hijri; hijriElement.innerText = `$hijri.day $hijri.month.en $hijri.year H`; else hijriElement.innerText = "📅 Hijriah tersedia"; document.getElementById('lokasiMasjid').innerHTML = `🕌 Masjid $city`; // setelah update schedule, render ulang renderPrayerTimes(new Date()); return true; else throw new Error("Gagal ambil jadwal"); catch (err) console.warn("Gagal mengambil dari API, menggunakan jadwal offline & estimasi", err); // fallback offline: generate jadwal berdasarkan metode sederhana + waktu lokal (simulasi) useOfflineSchedule(); return false; currentAudio = null
.prayer-name font-size: 1.1rem; font-weight: bold; color: #ffd966; letter-spacing: 1px;
Pro Filmmaker Apps helps you get the job done a little better or a little faster. We provide a curated database of hundreds of mobile, tablet, watch, and desktop apps. We only include apps made for and used by film, television, and digital media professionals.
No Film School"[T]he Best Curated Filmmaking Apps. ... A great resource for filmmaking apps. ... Pro Filmmaker Apps is just doing us a solid by creating a database."