// === Debug helpers (safe) ===
const log = (...a)=>console.log('[SV]', ...a);
const warn = (...a)=>console.warn('[SV]', ...a);
import AudioMotionAnalyzer from 'https://cdn.skypack.dev/-/audiomotion-analyzer@v4.5.4-UnISvush0sMQ1COoSTMA/dist=es2019,mode=imports,min/optimized/audiomotion-analyzer.js';
const audioEl = document.getElementById('audio');
const container = document.getElementById('container');
const playlist = document.getElementById('playlist');
// Üst ince bar kontrolleri
const settingsBar = document.getElementById('settingsBar');
const openBtn = document.getElementById('openSettings');
const closeBtn = document.getElementById('closeSettings');
const fsBtn = document.getElementById('fullscreen');
const gradientSelect = document.getElementById('gradientSelect');
const modeSelect = document.getElementById('modeSelect');
const scaleSelect = document.getElementById('scaleSelect');
// YENİ kontrol referansları
const fftSizeSelect = document.getElementById('fftSizeSelect');
const minFreqSelect = document.getElementById('minFreqSelect');
const maxFreqSelect = document.getElementById('maxFreqSelect');
const barSpaceSelect = document.getElementById('barSpaceSelect');
const mirrorSelect = document.getElementById('mirrorSelect');
const smoothingRange = document.getElementById('smoothingRange');
const smoothValSpan = document.getElementById('smoothVal');
let currentIndex = -1;
const loopStates = new WeakMap();
let hls = null;
let shakaPlayer = null;
// Auto-resume AudioContext on user interaction
try {
const resume = ()=>{ if (audioCtx && audioCtx.state !== 'running') audioCtx.resume().then(()=>log('AudioContext resumed')); };
['click','touchstart','keydown'].forEach(ev => document.addEventListener(ev, resume, { passive:true }));
audioEl.addEventListener('play', resume);
} catch(e){}
// Aç/Kapat (TOGGLE)
function openSettingsBar() { settingsBar.classList.add('open'); settingsBar.setAttribute('aria-hidden','false'); }
function closeSettingsBar() { settingsBar.classList.remove('open'); settingsBar.setAttribute('aria-hidden','true'); }
function toggleSettingsBar(){ settingsBar.classList.contains('open') ? closeSettingsBar() : openSettingsBar(); }
openBtn.addEventListener('click', toggleSettingsBar);
closeBtn.addEventListener('click', closeSettingsBar);
document.addEventListener('keydown', (e)=>{ if(e.key==='Escape') closeSettingsBar(); });
// Fullscreen
fsBtn.addEventListener('click', () => {
if (!document.fullscreenElement) container.requestFullscreen().catch(()=>{});
else document.exitFullscreen().catch(()=>{});
});
// Kaynak türleri
const isM3U8 = s => /\.m3u8(\?|$)/i.test(s);
const isAAC = s => /\.aac(\?|$)/i.test(s);
const isM4A = s => /\.m4a(\?|$)/i.test(s);
const isMP3 = s => /\.mp3(\?|$)/i.test(s);
const isOGG = s => /\.ogg(\?|$)/i.test(s);
const isWAV = s => /\.wav(\?|$)/i.test(s);
const isFLAC = s => /\.flac(\?|$)/i.test(s);
const isWEBM = s => /\.webm(\?|$)/i.test(s);
function guessMime(src){
if (isAAC(src)) return 'audio/aac';
if (isM4A(src)) return 'audio/mp4';
if (isMP3(src)) return 'audio/mpeg';
if (isOGG(src)) return 'audio/ogg';
if (isWAV(src)) return 'audio/wav';
if (isFLAC(src)) return 'audio/flac';
if (isWEBM(src)) return 'audio/webm';
return '';
}
function cleanupPlayers(){
if (hls) { try { hls.destroy(); } catch {} hls = null; }
if (shakaPlayer) { try { shakaPlayer.destroy(); } catch {} shakaPlayer = null; }
}
function setTypedSource(src, mime){
audioEl.pause();
cleanupPlayers();
audioEl.removeAttribute('src');
while (audioEl.firstChild) audioEl.removeChild(audioEl.firstChild);
const source = document.createElement('source');
source.src = src;
if (mime) source.type = mime;
audioEl.appendChild(source);
audioEl.load();
audioEl.play().catch(()=>{});
}
// Analyzer (başlangıç varsayılanları - sonra UI / kayıt ile override edilecek)
// Web Audio pipeline (single instance)
const audioCtx = new (window.AudioContext||window.webkitAudioContext)();
const srcNode = audioCtx.createMediaElementSource(audioEl);
srcNode.connect(audioCtx.destination);
const audioMotion = new AudioMotionAnalyzer(container, { source: srcNode,
mode: 6,
barSpace: .1,
showLeds: false,
mirror: 0,
reflexRatio: 0,
height: container.clientHeight,
fftSize: 8192,
minFreq: 20,
maxFreq: 16000,
smoothing: 0.5
});
/* ---------- 19 Gradient kaydı ---------- */
const gradients = {
'Apple ][': ['#001100','#005500','#00AA00','#55FF55','#AAFFAA'],
'Aurora': ['#00284d','#005f73','#0a9396','#94d2bd','#e9d8a6','#ee9b00','#ca6702'],
'Borealis': ['#0b0e2e','#1b3a4b','#1f7a8c','#88d498','#c3f0ca'],
'Candy': ['#ff006e','#fb5607','#ffbe0b','#ff006e'],
'Classic': ['#0f0','#ff0','#f80','#f00'],
'Cool': ['#001f3f','#0074D9','#7FDBFF','#39CCCC'],
'Dusk': ['#2e026d','#6a00f4','#b5179e','#ff006e','#ffbe0b'],
'Miami': ['#00d2d3','#54a0ff','#5f27cd','#ff6b6b','#feca57'],
'Orient': ['#2C3E50','#FD746C','#FF9068'],
'Outrun': ['#200122','#6f0000','#C33764','#1D2671','#12c2e9'],
'Pacific Dream':['#34e89e','#0f3443','#2c5364','#0b8793'],
'Prism': ['#ff0000','#ffa500','#ffff00','#00ff00','#00ffff','#0000ff','#8b00ff'],
'Prism (legacy)':['#ff0000','#ffff00','#00ff00','#00ffff','#0000ff'],
'Rainbow': ['#ffffff','#ffffff','#ffffff','#ffffff','#ffffff','#ffffff','#ffffff'],
'Rainbow (legacy)':['#ff0000','#ffff00','#00ff00','#0000ff','#ff00ff'],
'Shahabi': ['#e96443','#904e95','#1f1c2c'],
'Summer': ['#f6d365','#fda085','#fbc2eb','#a6c0fe'],
'Sunset': ['#0b486b','#f56217','#f7485e','#ff8c00'],
'Tie Dye': ['#ff595e','#ffca3a','#8ac926','#1982c4','#6a4c93']
};
for (const [name, stops] of Object.entries(gradients)) {
audioMotion.registerGradient(name, { colorStops: stops });
}
// ====== Ayarları uygula & persist ======
const LS_KEY = 'amSettingsV1';
const switchesWrap = settingsBar; // tüm switch inputları bar içinde
function applyOptions(opts) {
try { audioMotion.setOptions(opts); }
catch(e){ console.warn('setOptions error:', e); }
}
function readSwitches() {
const switches = {};
switchesWrap.querySelectorAll('input[type="checkbox"][data-key]').forEach(cb=>{
switches[cb.dataset.key] = cb.checked;
});
return switches;
}
function saveSettings() {
const data = {
gradient: gradientSelect.value,
mode: parseInt(modeSelect.value,10),
scale: scaleSelect.value,
// yeni numeric/select değerleri
fftSize: parseInt(fftSizeSelect.value,10),
minFreq: parseFloat(minFreqSelect.value),
maxFreq: parseFloat(maxFreqSelect.value),
barSpace: parseFloat(barSpaceSelect.value),
mirror: parseInt(mirrorSelect.value,10),
smoothing: parseFloat(smoothingRange.value),
switches: readSwitches()
};
localStorage.setItem(LS_KEY, JSON.stringify(data));
}
function loadSettings() {
try {
const raw = localStorage.getItem(LS_KEY);
if (!raw) return null;
return JSON.parse(raw);
} catch { return null; }
}
// İlk yükleme
(function initUI(){
const saved = loadSettings();
// Gradient
const defaultGradient = (saved && saved.gradient) || 'Tie Dye';
if ([...gradientSelect.options].some(o=>o.value===defaultGradient)) {
gradientSelect.value = defaultGradient;
}
audioMotion.gradient = gradientSelect.value;
// Mode
if (saved && Number.isFinite(saved.mode)) {
modeSelect.value = String(saved.mode);
applyOptions({ mode: saved.mode });
} else {
applyOptions({ mode: parseInt(modeSelect.value,10) });
}
// Scale
scaleSelect.value = (saved && saved.scale) || 'log';
applyOptions({ frequencyScale: scaleSelect.value });
// ==== Yeni numeric/select alanları ====
// fftSize
if (saved && saved.fftSize) fftSizeSelect.value = String(saved.fftSize);
applyOptions({ fftSize: parseInt(fftSizeSelect.value,10) });
// min/max freq (geçersiz birleşim seçildiyse kibarca düzelt)
if (saved && saved.minFreq) minFreqSelect.value = String(saved.minFreq);
if (saved && saved.maxFreq) maxFreqSelect.value = String(saved.maxFreq);
let minF = parseFloat(minFreqSelect.value), maxF = parseFloat(maxFreqSelect.value);
if (minF >= maxF) { minF = 20; maxF = 16000; minFreqSelect.value = '20'; maxFreqSelect.value = '16000'; }
applyOptions({ minFreq: minF, maxFreq: maxF });
// barSpace
if (saved && typeof saved.barSpace==='number') barSpaceSelect.value = String(saved.barSpace);
applyOptions({ barSpace: parseFloat(barSpaceSelect.value) });
// mirror (0/1)
if (saved && typeof saved.mirror!=='undefined') mirrorSelect.value = String(saved.mirror);
applyOptions({ mirror: parseInt(mirrorSelect.value,10) });
// smoothing
const sm = (saved && typeof saved.smoothing==='number') ? saved.smoothing : 0.5;
smoothingRange.value = String(sm);
smoothValSpan.textContent = Number(sm).toFixed(2);
applyOptions({ smoothing: parseFloat(smoothingRange.value) });
// Switches (kaldırılanlar DOM’da yok; varsa kayıtları yine okunur)
const defaults = {
// eski anahtarlar
showPeaks:true, showScaleX:false, showScaleY:false,
linearAmplitude:false, lumiBars:false, showLeds:false,
outlineBars:false, radial:false, roundBars:false,
ansiBands:false, showFPS:false, alphaBars:false,
// yeni anahtarlar
overlay:false, splitGradient:false, trueLeds:false,
fadePeaks:true, peakLine:false, ledBars:true
};
const sw = Object.assign({}, defaults, (saved && saved.switches) || {});
switchesWrap.querySelectorAll('input[type="checkbox"][data-key]').forEach(cb=>{
cb.checked = !!sw[cb.dataset.key];
});
applyOptions(sw);
// Events
gradientSelect.addEventListener('change', ()=>{ audioMotion.gradient = gradientSelect.value; saveSettings(); });
modeSelect.addEventListener('change', ()=>{ applyOptions({ mode: parseInt(modeSelect.value,10) }); saveSettings(); });
scaleSelect.addEventListener('change', ()=>{ applyOptions({ frequencyScale: scaleSelect.value }); saveSettings(); });
fftSizeSelect.addEventListener('change', ()=>{ applyOptions({ fftSize: parseInt(fftSizeSelect.value,10) }); saveSettings(); });
minFreqSelect.addEventListener('change', ()=>{
const minFreq = parseFloat(minFreqSelect.value);
let maxFreq = parseFloat(maxFreqSelect.value);
if (minFreq >= maxFreq) {
// min >= max ise, mantıklı bir üst değer seç
const options = [...maxFreqSelect.options].map(o=>parseFloat(o.value)).filter(v=>v>minFreq);
if (options.length) { maxFreq = options[0]; maxFreqSelect.value = String(maxFreq); }
}
applyOptions({ minFreq, maxFreq });
saveSettings();
});
maxFreqSelect.addEventListener('change', ()=>{
let minFreq = parseFloat(minFreqSelect.value);
const maxFreq = parseFloat(maxFreqSelect.value);
if (minFreq >= maxFreq) {
// max <= min ise, mantıklı bir alt değer seç
const options = [...minFreqSelect.options].map(o=>parseFloat(o.value)).filter(v=>v{ applyOptions({ barSpace: parseFloat(barSpaceSelect.value) }); saveSettings(); });
mirrorSelect.addEventListener('change', ()=>{ applyOptions({ mirror: parseInt(mirrorSelect.value,10) }); saveSettings(); });
smoothingRange.addEventListener('input', ()=>{
smoothValSpan.textContent = Number(smoothingRange.value).toFixed(2);
applyOptions({ smoothing: parseFloat(smoothingRange.value) });
saveSettings();
});
switchesWrap.addEventListener('change', (e)=>{
if (e.target.matches('input[type="checkbox"][data-key]')) {
const key = e.target.dataset.key;
const val = e.target.checked;
applyOptions({ [key]: val });
saveSettings();
}
});
})();
// ------- player kaynak yükleme -------
async function loadSource(src) {
log('loadSource', src);
try { if (audioCtx && audioCtx.state !== 'running') audioCtx.resume(); } catch(e) {}
// .m3u8 ise: HLS.js -> (gerekirse) native HLS -> (gerekirse) Shaka
if (isM3U8(src)) {
cleanupPlayers();
audioEl.pause();
audioEl.removeAttribute('src');
while (audioEl.firstChild) audioEl.removeChild(audioEl.firstChild);
audioEl.load();
// 1) HLS.js
if (window.Hls && Hls.isSupported()) {
log('HLS.js supported, initializing');
try {
hls = new Hls({
enableWorker: true,
lowLatencyMode: true
});
hls.loadSource(src);
hls.attachMedia(audioEl);
hls.on(Hls.Events.MANIFEST_PARSED, () => audioEl.play().catch(() => {}));
// Fatal error olursa Shaka'ya düş
hls.on(Hls.Events.ERROR, (_e, data) => {
if (data && data.fatal) {
try { hls.destroy(); } catch {}
hls = null;
tryShaka(src);
}
});
return;
} catch(e){
try { hls && hls.destroy(); } catch {}
hls = null;
// HLS.js başarısız oldu → Shaka dene
await tryShaka(src);
return;
}
}
// 2) Safari/native HLS
if (audioEl.canPlayType('application/vnd.apple.mpegurl')) {
log('Using native HLS playback');
const source = document.createElement('source');
source.src = src;
source.type = 'application/vnd.apple.mpegurl';
audioEl.appendChild(source);
audioEl.load();
audioEl.play().catch(() => {});
return;
}
// 3) Shaka
await tryShaka(src);
return;
}
// Diğer bilinen ses tipleri
const mime = guessMime(src);
log('Direct type', mime||''); setTypedSource(src, mime);
}
async function tryShaka(src) {
log('Trying Shaka', src);
try {
if (!(window.shaka && shaka.Player && shaka.Player.isBrowserSupported())) {
console.warn('Shaka desteklenmiyor ya da yüklenemedi.');
return;
}
cleanupPlayers();
shakaPlayer = new shaka.Player(audioEl);
await shakaPlayer.load(src);
await audioEl.play().catch(()=>{});
console.log('Shaka Player ile oynatılıyor:', src);
} catch (err) {
console.warn('Shaka yüklenemedi:', err);
}
}
function playFromPlaylist(trackEl) {
if (!trackEl) return;
const btn = trackEl.querySelector('.play');
if (!btn) return;
const src = btn.dataset.src;
const isUserUpload = btn.dataset.user === '1' || btn.hasAttribute('data-user');
if (isUserUpload) {
audioEl.classList.add('no-ui');
audioEl.addEventListener('contextmenu', preventContext, { passive: false });
audioEl.addEventListener('ratechange', fixRate, { passive: true });
} else {
audioEl.classList.remove('no-ui');
audioEl.removeEventListener('contextmenu', preventContext);
audioEl.removeEventListener('ratechange', fixRate);
}
loadSource(src);
highlightActive(btn);
currentIndex = [...playlist.querySelectorAll('.track')].indexOf(trackEl);
}
function preventContext(e){
e.preventDefault();
return false;
}
function fixRate(){
if (audioEl && audioEl.playbackRate !== 1) {
try { audioEl.playbackRate = 1; } catch(e){}
}
}
function highlightActive(activeBtn) {
playlist.querySelectorAll('.play').forEach(b => {
b.classList.toggle('active', b === activeBtn);
});
}
playlist.addEventListener('click', e => {
if (e.target.closest('.play')) {
playFromPlaylist(e.target.closest('.track'));
}
if (e.target.closest('.remove')) {
const trackEl = e.target.closest('.track');
if (trackEl) {
if (trackEl.querySelector('.play').classList.contains('active')) {
audioEl.pause();
currentIndex = -1;
}
trackEl.remove();
}
}
if (e.target.closest('.loop')) {
const btn = e.target.closest('.loop');
const trackEl = e.target.closest('.track');
const state = !loopStates.get(trackEl);
loopStates.set(trackEl, state);
btn.classList.toggle('active', state);
}
});
document.getElementById('upload').addEventListener('change', e => {
const files = e.target.files;
if (!files.length) return;
let firstTrackEl = null;
for (const fileBlob of files) {
const url = URL.createObjectURL(fileBlob);
const name = fileBlob.name;
const trackEl = document.createElement('div');
trackEl.className = 'track';
trackEl.draggable = true;
trackEl.innerHTML = `
`;
playlist.insertBefore(trackEl, playlist.firstChild);
if (!firstTrackEl) firstTrackEl = trackEl;
}
if (firstTrackEl) playFromPlaylist(firstTrackEl);
});
audioEl.addEventListener('ended', () => {
const tracks = playlist.querySelectorAll('.track');
if (currentIndex >= 0) {
const currentTrack = tracks[currentIndex];
if (loopStates.get(currentTrack)) {
playFromPlaylist(currentTrack);
return;
}
if (currentIndex + 1 < tracks.length) {
playFromPlaylist(tracks[currentIndex + 1]);
} else if (tracks.length) {
playFromPlaylist(tracks[0]);
}
}
});
// Başlangıç şarkısını playlist içinden güvenli şekilde seç (IIFE)
(function(){
try {
const startIndex = (typeof window.startSongIndex === 'number') ? window.startSongIndex : 0; // 22. şarkı
const tracks = playlist.querySelectorAll('.track');
if (tracks && tracks[startIndex]) {
playFromPlaylist(tracks[startIndex]);
}
} catch(e) {
console.warn('startFromPlaylist error', e);
}
})();
let draggedEl = null;
playlist.addEventListener('dragstart', e => {
const tr = e.target.closest('.track');
if (!tr) return;
draggedEl = tr;
tr.classList.add('dragging');
e.dataTransfer.effectAllowed = 'move';
});
playlist.addEventListener('dragover', e => {
e.preventDefault();
const target = e.target.closest('.track');
if (target && target !== draggedEl) {
const rect = target.getBoundingClientRect();
const next = (e.clientY - rect.top) / rect.height > 0.5;
playlist.insertBefore(draggedEl, next ? target.nextSibling : target);
}
});
playlist.addEventListener('dragend', () => {
if (draggedEl) draggedEl.classList.remove('dragging');
draggedEl = null;
});
// Canvas çift tık ile tam ekran
container.addEventListener('dblclick', () => {
if (document.fullscreenElement) document.exitFullscreen();
else container.requestFullscreen();
});
audioEl.addEventListener('error', () => {
const e = audioEl.error;
console.warn('Audio error', e && e.code);
});
// --- test stream input ---
document.getElementById('testStream').addEventListener('click', () => {
const url = document.getElementById('customStream').value.trim();
if (!url) return;
let label = url;
try {
const u = new URL(url);
label = u.hostname;
const pathName = u.pathname.split('/').pop();
if (pathName) label = pathName;
} catch {
const parts = url.split('/');
if (parts.length) label = parts.pop();
}
const trackEl = document.createElement('div');
trackEl.className = 'track';
trackEl.draggable = true;
trackEl.innerHTML = `
`;
playlist.insertBefore(trackEl, playlist.firstChild);
playFromPlaylist(trackEl);
document.getElementById('customStream').value = '';
});
// Reset Defaults button handler (affects ALL controls)
const resetBtn = document.getElementById('resetDefaults');
if (resetBtn) {
resetBtn.addEventListener('click', ()=>{
const defaultsMain = {
gradient: 'Classic',
mode: 6,
frequencyScale: 'log',
fftSize: 8192,
minFreq: 20,
maxFreq: 16000,
barSpace: 0.10,
mirror: 0,
smoothing: 0.40
};
const desiredSwitches = {
showPeaks: true,
fadePeaks: true,
ledBars: true
// others default to false
};
try {
// Build options object including all switches present in DOM
const switchesObj = {};
document.querySelectorAll('#settingsBar input[type="checkbox"][data-key]').forEach(cb=>{
const k = cb.dataset.key;
const val = !!desiredSwitches[k];
cb.checked = val;
switchesObj[k] = val;
});
const opts = Object.assign({}, defaultsMain, switchesObj);
// Apply options at once
try { audioMotion.setOptions(opts); } catch(e){ console.warn('setOptions error on reset:', e); }
// Sync selects/ranges UI
if (typeof gradientSelect !== 'undefined' && gradientSelect) gradientSelect.value = defaultsMain.gradient;
if (typeof modeSelect !== 'undefined' && modeSelect) modeSelect.value = String(defaultsMain.mode);
if (typeof scaleSelect !== 'undefined' && scaleSelect) scaleSelect.value = defaultsMain.frequencyScale;
if (typeof fftSizeSelect !== 'undefined' && fftSizeSelect) fftSizeSelect.value = String(defaultsMain.fftSize);
if (typeof minFreqSelect !== 'undefined' && minFreqSelect) minFreqSelect.value = String(defaultsMain.minFreq);
if (typeof maxFreqSelect !== 'undefined' && maxFreqSelect) maxFreqSelect.value = String(defaultsMain.maxFreq);
if (typeof barSpaceSelect !== 'undefined' && barSpaceSelect) barSpaceSelect.value = String(defaultsMain.barSpace);
if (typeof mirrorSelect !== 'undefined' && mirrorSelect) mirrorSelect.value = String(defaultsMain.mirror);
if (typeof smoothingRange !== 'undefined' && smoothingRange) smoothingRange.value = defaultsMain.smoothing;
if (typeof smoothValSpan !== 'undefined' && smoothValSpan) smoothValSpan.textContent = defaultsMain.smoothing.toFixed(2);
// Persist
try { if (typeof saveSettings === 'function') saveSettings(); } catch(e){}
if (window.__svDebug && window.__svDebug.log) __svDebug.log('Defaults restored');
} catch(e){ console.warn('Reset defaults error', e); }
});
}
NEW MUSIC LISTS : Listen to online radio with the latest hit music. The New Era of Online Radio: Discovering the Latest Hit Music Anytime, Anywhere Music has always been one of the strongest forms of human connection. From vinyl records to cassette tapes, from CDs to digital downloads, every generation has experienced music through the technology of its time. Today, however, the way people listen to music has transformed completely. Online radio has become one of the most popular and dynamic ways to enjoy the latest hit songs, discover new artists, and stay connected with global music trends in real time. best music radio channels.
Unlike traditional FM stations that are limited by geographic coverage and fixed playlists, internet radio offers unlimited access to music from every corner of the world. Whether someone enjoys energetic pop songs, electronic dance music, emotional ballads, hip-hop beats, or relaxing chill-out tracks, online radio platforms provide nonstop streaming tailored to every mood and lifestyle. The rise of high-speed internet and mobile technology has made music more accessible than ever before, turning smartphones, tablets, laptops, and even smart TVs into personal radio devices available twenty-four hours a day.
One of the biggest reasons people prefer online radio today is the excitement of discovering fresh hit music instantly. Traditional radio stations often repeat the same songs throughout the day, but internet radio stations can update their playlists continuously. As soon as a new song begins trending internationally, listeners can hear it online within minutes. This creates a living musical environment where trends evolve rapidly and listeners always feel connected to the newest sounds shaping modern culture.
Another important advantage of online radio is variety. In the past, listeners were limited to a small number of local stations. Today, a person in one country can easily listen to music stations from another continent with a single click. This global accessibility has expanded musical taste worldwide. A listener in Europe can enjoy Latin American rhythms, Korean pop, African beats, or American hip-hop without restrictions. Online radio has effectively removed borders from the music experience, allowing cultures to interact through sound.
The social aspect of online radio is also changing the way people interact with music. Many internet radio stations now include live chats, song requests, listener communities, and social media integration. People no longer listen passively. They participate, communicate, and influence playlists in real time. This interactive environment creates a stronger emotional connection between listeners and stations. Music becomes more than entertainment; it becomes a shared digital experience.
Modern online radio stations also understand the importance of personalization. Advanced algorithms and listener analytics help stations recommend songs based on individual preferences. Instead of hearing random music, listeners can enjoy carefully selected tracks that match their musical interests. This personalized experience keeps audiences engaged for longer periods and increases the emotional impact of music consumption.
Another major factor behind the popularity of internet radio is convenience. In previous decades, people needed physical devices or specific frequencies to access radio stations. Now, anyone with an internet connection can listen instantly through websites or mobile applications. Whether driving, studying, exercising, working, or relaxing at home, online radio can accompany daily life seamlessly. Many people even use internet radio as background motivation during long work sessions because music helps improve concentration and mood.
Online radio also plays a significant role in promoting independent artists. Traditional radio industries often focus mainly on major record labels and mainstream performers. Internet radio, however, gives smaller musicians an opportunity to reach global audiences without massive financial backing. Independent singers, producers, and DJs can now share their music with listeners worldwide, creating a more diverse and creative music ecosystem. This freedom encourages experimentation and allows unique musical styles to gain recognition.
The technological evolution of streaming quality has further improved the online radio experience. High-definition audio streaming now provides crystal-clear sound that rivals professional music platforms. Fast internet speeds reduce buffering problems, while cloud technology ensures stable global broadcasting. Some stations even offer adaptive sound quality depending on internet speed, ensuring uninterrupted listening experiences across different devices and locations.
Another fascinating development is the rise of themed online radio stations. Instead of general playlists, many stations focus on specific genres, moods, decades, or activities. Some channels specialize in nonstop dance hits, while others focus on relaxing evening music or nostalgic classics from previous generations. There are stations dedicated entirely to workout motivation, gaming soundtracks, jazz evenings, or electronic festivals. This specialization allows listeners to find exactly the atmosphere they want without endlessly searching through random playlists.
The influence of online radio extends beyond entertainment. Music strongly affects emotions, productivity, and mental well-being. Listening to uplifting songs during stressful moments can improve mood and reduce anxiety. Energetic music can increase motivation during exercise, while calm instrumental tracks help with focus and relaxation. Online radio provides instant emotional support through music, making it an important part of modern digital lifestyles.
In addition to music itself, online radio presenters and DJs continue to play a valuable role. Human-curated radio still offers something unique compared to automated playlists. Skilled presenters introduce songs with personality, share stories about artists, discuss trends, and create emotional energy that algorithms alone cannot replicate. This human connection helps listeners feel engaged and connected to a real community rather than simply consuming digital content passively.
Advertising and monetization models in internet radio have also evolved significantly. Many stations offer free access supported by ads, while premium subscriptions provide ad-free listening experiences. This flexibility allows users to choose the experience that best fits their needs and budgets. At the same time, musicians and stations can generate revenue through sponsorships, digital campaigns, and audience support systems.
The future of online radio appears even more innovative. Artificial intelligence, voice assistants, and smart devices are already transforming music consumption habits. Users can now request stations using simple voice commands through smart speakers or connected home systems. AI-powered music recommendations are becoming increasingly accurate, learning listener behavior and predicting preferred songs with remarkable precision. Virtual reality concerts and interactive music environments may become standard parts of future online radio experiences.
Despite the dominance of streaming platforms and on-demand music libraries, online radio maintains a special charm. Unlike manually selecting every song, radio introduces unpredictability and discovery. Listeners often encounter tracks they would never search for themselves. This element of surprise keeps the experience exciting and emotionally engaging. Online radio combines the convenience of modern technology with the timeless excitement of musical exploration.
Young generations especially embrace internet radio because it fits naturally into digital lifestyles. Social media trends, viral songs, and global music culture spread rapidly through online platforms. Radio stations that quickly adapt to these trends attract large audiences searching for the newest hit music before it becomes mainstream everywhere else. Speed, accessibility, and constant freshness define the modern online radio experience.
The emotional power of music remains timeless regardless of technology. perfect Songs continue to inspire memories, relationships, dreams, and creativity. Online radio simply provides a faster, broader, and more interactive way to access those emotions. Whether someone wants to dance to the latest pop anthem, relax with smooth melodies, or explore unknown artists from another country, internet radio delivers endless possibilities instantly.
Ultimately, online radio represents far more than digital music streaming. It reflects how technology can connect people emotionally across cultures, languages, and distances through shared musical experiences. The world has become smaller through sound. A single song can travel globally within seconds, influencing millions of listeners simultaneously. In this constantly connected digital era, online radio continues to redefine how humanity discovers, shares, and experiences music every day
As technology advances further, online radio will likely become even more intelligent, immersive, and personalized. Yet the core idea will remain the same: bringing people together through the universal language of music. The latest hit songs may change every week, but the excitement of discovering new music will always remain one of the most powerful experiences in human culture.
International Music Radio – Listen to the Best Hits from Around the World 24/7
International Music Radio – Best Hits 24/7
Listen to International Music Online
Global Music Radio – Live 24/7
International Hits Radio Station
World Music Radio Live
Best International Music Radio
Non-Stop International Hits
Live International Music Stream
Worldwide Hits Radio Online
International Pop & Hit Music Radio
Welcome to International Music Radio, your ultimate destination for the best foreign music streaming online. Whether you enjoy today's chart-topping hits, timeless classics, pop, rock, dance, electronic, R&B, or indie tracks, our station brings together the most popular international songs in one place. Enjoy non-stop music 24 hours a day, 7 days a week, with a carefully curated playlist designed for music lovers around the globe.
Our online radio station is dedicated to delivering a premium listening experience. We broadcast a wide variety of international music from leading artists and emerging talents, ensuring that every listener discovers something new and exciting. From the latest global hits to unforgettable favorites, our playlist is constantly updated to keep the music fresh and engaging.
Listening to foreign music online has never been easier. With our live radio stream, you can enjoy high-quality audio from anywhere in the world. Whether you're at home, at work, traveling, studying, or relaxing, our radio station provides the perfect soundtrack for every moment. No complicated setup is required—simply press play and start enjoying the world's best music instantly.
International Music Radio is more than just a streaming service. It is a community of music enthusiasts who appreciate diverse sounds and cultures. Music has the power to connect people across countries and languages, and our station celebrates that connection by featuring songs from some of the biggest international music markets. Discover trending artists, popular releases, and global music sensations all in one place.
Our station focuses on providing uninterrupted entertainment with minimal interruptions. We understand that listeners want continuous music, and our goal is to create a smooth and enjoyable listening experience. Whether you are searching for background music while working or energetic tracks to boost your mood, our diverse playlist has something for everyone.
If you are looking for an online radio station that plays international hits, foreign pop music, global chart songs, dance anthems, and the latest music trends, you've come to the right place. Thousands of listeners choose International Music Radio because of its reliable stream quality, wide music selection, and commitment to delivering great entertainment around the clock
Join listeners from around the world and experience the excitement of international music. Explore new genres, discover talented artists, and enjoy the biggest songs from every corner of the globe. Stay connected to the world through music and make International Music Radio your favorite destination for online music streaming. new list albums.
Listen live now and enjoy the best international music radio experience available online. Your favorite global hits are just one click away.
// === Debug helpers (safe) ===
const log = (...a)=>console.log('[SV]', ...a);
const warn = (...a)=>console.warn('[SV]', ...a);
import AudioMotionAnalyzer from 'https://cdn.skypack.dev/-/audiomotion-analyzer@v4.5.4-UnISvush0sMQ1COoSTMA/dist=es2019,mode=imports,min/optimized/audiomotion-analyzer.js';
const audioEl = document.getElementById('audio');
const container = document.getElementById('container');
const playlist = document.getElementById('playlist');
// Üst ince bar kontrolleri
const settingsBar = document.getElementById('settingsBar');
const openBtn = document.getElementById('openSettings');
const closeBtn = document.getElementById('closeSettings');
const fsBtn = document.getElementById('fullscreen');
const gradientSelect = document.getElementById('gradientSelect');
const modeSelect = document.getElementById('modeSelect');
const scaleSelect = document.getElementById('scaleSelect');
// YENİ kontrol referansları
const fftSizeSelect = document.getElementById('fftSizeSelect');
const minFreqSelect = document.getElementById('minFreqSelect');
const maxFreqSelect = document.getElementById('maxFreqSelect');
const barSpaceSelect = document.getElementById('barSpaceSelect');
const mirrorSelect = document.getElementById('mirrorSelect');
const smoothingRange = document.getElementById('smoothingRange');
const smoothValSpan = document.getElementById('smoothVal');
let currentIndex = -1;
const loopStates = new WeakMap();
let hls = null;
let shakaPlayer = null;
// Auto-resume AudioContext on user interaction
try {
const resume = ()=>{ if (audioCtx && audioCtx.state !== 'running') audioCtx.resume().then(()=>log('AudioContext resumed')); };
['click','touchstart','keydown'].forEach(ev => document.addEventListener(ev, resume, { passive:true }));
audioEl.addEventListener('play', resume);
} catch(e){}
// Aç/Kapat (TOGGLE)
function openSettingsBar() { settingsBar.classList.add('open'); settingsBar.setAttribute('aria-hidden','false'); }
function closeSettingsBar() { settingsBar.classList.remove('open'); settingsBar.setAttribute('aria-hidden','true'); }
function toggleSettingsBar(){ settingsBar.classList.contains('open') ? closeSettingsBar() : openSettingsBar(); }
openBtn.addEventListener('click', toggleSettingsBar);
closeBtn.addEventListener('click', closeSettingsBar);
document.addEventListener('keydown', (e)=>{ if(e.key==='Escape') closeSettingsBar(); });
// Fullscreen
fsBtn.addEventListener('click', () => {
if (!document.fullscreenElement) container.requestFullscreen().catch(()=>{});
else document.exitFullscreen().catch(()=>{});
});
// Kaynak türleri
const isM3U8 = s => /\.m3u8(\?|$)/i.test(s);
const isAAC = s => /\.aac(\?|$)/i.test(s);
const isM4A = s => /\.m4a(\?|$)/i.test(s);
const isMP3 = s => /\.mp3(\?|$)/i.test(s);
const isOGG = s => /\.ogg(\?|$)/i.test(s);
const isWAV = s => /\.wav(\?|$)/i.test(s);
const isFLAC = s => /\.flac(\?|$)/i.test(s);
const isWEBM = s => /\.webm(\?|$)/i.test(s);
function guessMime(src){
if (isAAC(src)) return 'audio/aac';
if (isM4A(src)) return 'audio/mp4';
if (isMP3(src)) return 'audio/mpeg';
if (isOGG(src)) return 'audio/ogg';
if (isWAV(src)) return 'audio/wav';
if (isFLAC(src)) return 'audio/flac';
if (isWEBM(src)) return 'audio/webm';
return '';
}
function cleanupPlayers(){
if (hls) { try { hls.destroy(); } catch {} hls = null; }
if (shakaPlayer) { try { shakaPlayer.destroy(); } catch {} shakaPlayer = null; }
}
function setTypedSource(src, mime){
audioEl.pause();
cleanupPlayers();
audioEl.removeAttribute('src');
while (audioEl.firstChild) audioEl.removeChild(audioEl.firstChild);
const source = document.createElement('source');
source.src = src;
if (mime) source.type = mime;
audioEl.appendChild(source);
audioEl.load();
audioEl.play().catch(()=>{});
}
// Analyzer (başlangıç varsayılanları - sonra UI / kayıt ile override edilecek)
// Web Audio pipeline (single instance)
const audioCtx = new (window.AudioContext||window.webkitAudioContext)();
const srcNode = audioCtx.createMediaElementSource(audioEl);
srcNode.connect(audioCtx.destination);
const audioMotion = new AudioMotionAnalyzer(container, { source: srcNode,
mode: 6,
barSpace: .1,
showLeds: false,
mirror: 0,
reflexRatio: 0,
height: container.clientHeight,
fftSize: 8192,
minFreq: 20,
maxFreq: 16000,
smoothing: 0.5
});
/* ---------- 19 Gradient kaydı ---------- */
const gradients = {
'Apple ][': ['#001100','#005500','#00AA00','#55FF55','#AAFFAA'],
'Aurora': ['#00284d','#005f73','#0a9396','#94d2bd','#e9d8a6','#ee9b00','#ca6702'],
'Borealis': ['#0b0e2e','#1b3a4b','#1f7a8c','#88d498','#c3f0ca'],
'Candy': ['#ff006e','#fb5607','#ffbe0b','#ff006e'],
'Classic': ['#0f0','#ff0','#f80','#f00'],
'Cool': ['#001f3f','#0074D9','#7FDBFF','#39CCCC'],
'Dusk': ['#2e026d','#6a00f4','#b5179e','#ff006e','#ffbe0b'],
'Miami': ['#00d2d3','#54a0ff','#5f27cd','#ff6b6b','#feca57'],
'Orient': ['#2C3E50','#FD746C','#FF9068'],
'Outrun': ['#200122','#6f0000','#C33764','#1D2671','#12c2e9'],
'Pacific Dream':['#34e89e','#0f3443','#2c5364','#0b8793'],
'Prism': ['#ff0000','#ffa500','#ffff00','#00ff00','#00ffff','#0000ff','#8b00ff'],
'Prism (legacy)':['#ff0000','#ffff00','#00ff00','#00ffff','#0000ff'],
'Rainbow': ['#ffffff','#ffffff','#ffffff','#ffffff','#ffffff','#ffffff','#ffffff'],
'Rainbow (legacy)':['#ff0000','#ffff00','#00ff00','#0000ff','#ff00ff'],
'Shahabi': ['#e96443','#904e95','#1f1c2c'],
'Summer': ['#f6d365','#fda085','#fbc2eb','#a6c0fe'],
'Sunset': ['#0b486b','#f56217','#f7485e','#ff8c00'],
'Tie Dye': ['#ff595e','#ffca3a','#8ac926','#1982c4','#6a4c93']
};
for (const [name, stops] of Object.entries(gradients)) {
audioMotion.registerGradient(name, { colorStops: stops });
}
// ====== Ayarları uygula & persist ======
const LS_KEY = 'amSettingsV1';
const switchesWrap = settingsBar; // tüm switch inputları bar içinde
function applyOptions(opts) {
try { audioMotion.setOptions(opts); }
catch(e){ console.warn('setOptions error:', e); }
}
function readSwitches() {
const switches = {};
switchesWrap.querySelectorAll('input[type="checkbox"][data-key]').forEach(cb=>{
switches[cb.dataset.key] = cb.checked;
});
return switches;
}
function saveSettings() {
const data = {
gradient: gradientSelect.value,
mode: parseInt(modeSelect.value,10),
scale: scaleSelect.value,
// yeni numeric/select değerleri
fftSize: parseInt(fftSizeSelect.value,10),
minFreq: parseFloat(minFreqSelect.value),
maxFreq: parseFloat(maxFreqSelect.value),
barSpace: parseFloat(barSpaceSelect.value),
mirror: parseInt(mirrorSelect.value,10),
smoothing: parseFloat(smoothingRange.value),
switches: readSwitches()
};
localStorage.setItem(LS_KEY, JSON.stringify(data));
}
function loadSettings() {
try {
const raw = localStorage.getItem(LS_KEY);
if (!raw) return null;
return JSON.parse(raw);
} catch { return null; }
}
// İlk yükleme
(function initUI(){
const saved = loadSettings();
// Gradient
const defaultGradient = (saved && saved.gradient) || 'Tie Dye';
if ([...gradientSelect.options].some(o=>o.value===defaultGradient)) {
gradientSelect.value = defaultGradient;
}
audioMotion.gradient = gradientSelect.value;
// Mode
if (saved && Number.isFinite(saved.mode)) {
modeSelect.value = String(saved.mode);
applyOptions({ mode: saved.mode });
} else {
applyOptions({ mode: parseInt(modeSelect.value,10) });
}
// Scale
scaleSelect.value = (saved && saved.scale) || 'log';
applyOptions({ frequencyScale: scaleSelect.value });
// ==== Yeni numeric/select alanları ====
// fftSize
if (saved && saved.fftSize) fftSizeSelect.value = String(saved.fftSize);
applyOptions({ fftSize: parseInt(fftSizeSelect.value,10) });
// min/max freq (geçersiz birleşim seçildiyse kibarca düzelt)
if (saved && saved.minFreq) minFreqSelect.value = String(saved.minFreq);
if (saved && saved.maxFreq) maxFreqSelect.value = String(saved.maxFreq);
let minF = parseFloat(minFreqSelect.value), maxF = parseFloat(maxFreqSelect.value);
if (minF >= maxF) { minF = 20; maxF = 16000; minFreqSelect.value = '20'; maxFreqSelect.value = '16000'; }
applyOptions({ minFreq: minF, maxFreq: maxF });
// barSpace
if (saved && typeof saved.barSpace==='number') barSpaceSelect.value = String(saved.barSpace);
applyOptions({ barSpace: parseFloat(barSpaceSelect.value) });
// mirror (0/1)
if (saved && typeof saved.mirror!=='undefined') mirrorSelect.value = String(saved.mirror);
applyOptions({ mirror: parseInt(mirrorSelect.value,10) });
// smoothing
const sm = (saved && typeof saved.smoothing==='number') ? saved.smoothing : 0.5;
smoothingRange.value = String(sm);
smoothValSpan.textContent = Number(sm).toFixed(2);
applyOptions({ smoothing: parseFloat(smoothingRange.value) });
// Switches (kaldırılanlar DOM’da yok; varsa kayıtları yine okunur)
const defaults = {
// eski anahtarlar
showPeaks:true, showScaleX:false, showScaleY:false,
linearAmplitude:false, lumiBars:false, showLeds:false,
outlineBars:false, radial:false, roundBars:false,
ansiBands:false, showFPS:false, alphaBars:false,
// yeni anahtarlar
overlay:false, splitGradient:false, trueLeds:false,
fadePeaks:true, peakLine:false, ledBars:true
};
const sw = Object.assign({}, defaults, (saved && saved.switches) || {});
switchesWrap.querySelectorAll('input[type="checkbox"][data-key]').forEach(cb=>{
cb.checked = !!sw[cb.dataset.key];
});
applyOptions(sw);
// Events
gradientSelect.addEventListener('change', ()=>{ audioMotion.gradient = gradientSelect.value; saveSettings(); });
modeSelect.addEventListener('change', ()=>{ applyOptions({ mode: parseInt(modeSelect.value,10) }); saveSettings(); });
scaleSelect.addEventListener('change', ()=>{ applyOptions({ frequencyScale: scaleSelect.value }); saveSettings(); });
fftSizeSelect.addEventListener('change', ()=>{ applyOptions({ fftSize: parseInt(fftSizeSelect.value,10) }); saveSettings(); });
minFreqSelect.addEventListener('change', ()=>{
const minFreq = parseFloat(minFreqSelect.value);
let maxFreq = parseFloat(maxFreqSelect.value);
if (minFreq >= maxFreq) {
// min >= max ise, mantıklı bir üst değer seç
const options = [...maxFreqSelect.options].map(o=>parseFloat(o.value)).filter(v=>v>minFreq);
if (options.length) { maxFreq = options[0]; maxFreqSelect.value = String(maxFreq); }
}
applyOptions({ minFreq, maxFreq });
saveSettings();
});
maxFreqSelect.addEventListener('change', ()=>{
let minFreq = parseFloat(minFreqSelect.value);
const maxFreq = parseFloat(maxFreqSelect.value);
if (minFreq >= maxFreq) {
// max <= min ise, mantıklı bir alt değer seç
const options = [...minFreqSelect.options].map(o=>parseFloat(o.value)).filter(v=>v{ applyOptions({ barSpace: parseFloat(barSpaceSelect.value) }); saveSettings(); });
mirrorSelect.addEventListener('change', ()=>{ applyOptions({ mirror: parseInt(mirrorSelect.value,10) }); saveSettings(); });
smoothingRange.addEventListener('input', ()=>{
smoothValSpan.textContent = Number(smoothingRange.value).toFixed(2);
applyOptions({ smoothing: parseFloat(smoothingRange.value) });
saveSettings();
});
switchesWrap.addEventListener('change', (e)=>{
if (e.target.matches('input[type="checkbox"][data-key]')) {
const key = e.target.dataset.key;
const val = e.target.checked;
applyOptions({ [key]: val });
saveSettings();
}
});
})();
// ------- player kaynak yükleme -------
async function loadSource(src) {
log('loadSource', src);
try { if (audioCtx && audioCtx.state !== 'running') audioCtx.resume(); } catch(e) {}
// .m3u8 ise: HLS.js -> (gerekirse) native HLS -> (gerekirse) Shaka
if (isM3U8(src)) {
cleanupPlayers();
audioEl.pause();
audioEl.removeAttribute('src');
while (audioEl.firstChild) audioEl.removeChild(audioEl.firstChild);
audioEl.load();
// 1) HLS.js
if (window.Hls && Hls.isSupported()) {
log('HLS.js supported, initializing');
try {
hls = new Hls({
enableWorker: true,
lowLatencyMode: true
});
hls.loadSource(src);
hls.attachMedia(audioEl);
hls.on(Hls.Events.MANIFEST_PARSED, () => audioEl.play().catch(() => {}));
// Fatal error olursa Shaka'ya düş
hls.on(Hls.Events.ERROR, (_e, data) => {
if (data && data.fatal) {
try { hls.destroy(); } catch {}
hls = null;
tryShaka(src);
}
});
return;
} catch(e){
try { hls && hls.destroy(); } catch {}
hls = null;
// HLS.js başarısız oldu → Shaka dene
await tryShaka(src);
return;
}
}
// 2) Safari/native HLS
if (audioEl.canPlayType('application/vnd.apple.mpegurl')) {
log('Using native HLS playback');
const source = document.createElement('source');
source.src = src;
source.type = 'application/vnd.apple.mpegurl';
audioEl.appendChild(source);
audioEl.load();
audioEl.play().catch(() => {});
return;
}
// 3) Shaka
await tryShaka(src);
return;
}
// Diğer bilinen ses tipleri
const mime = guessMime(src);
log('Direct type', mime||''); setTypedSource(src, mime);
}
async function tryShaka(src) {
log('Trying Shaka', src);
try {
if (!(window.shaka && shaka.Player && shaka.Player.isBrowserSupported())) {
console.warn('Shaka desteklenmiyor ya da yüklenemedi.');
return;
}
cleanupPlayers();
shakaPlayer = new shaka.Player(audioEl);
await shakaPlayer.load(src);
await audioEl.play().catch(()=>{});
console.log('Shaka Player ile oynatılıyor:', src);
} catch (err) {
console.warn('Shaka yüklenemedi:', err);
}
}
function playFromPlaylist(trackEl) {
if (!trackEl) return;
const btn = trackEl.querySelector('.play');
if (!btn) return;
const src = btn.dataset.src;
const isUserUpload = btn.dataset.user === '1' || btn.hasAttribute('data-user');
if (isUserUpload) {
audioEl.classList.add('no-ui');
audioEl.addEventListener('contextmenu', preventContext, { passive: false });
audioEl.addEventListener('ratechange', fixRate, { passive: true });
} else {
audioEl.classList.remove('no-ui');
audioEl.removeEventListener('contextmenu', preventContext);
audioEl.removeEventListener('ratechange', fixRate);
}
loadSource(src);
highlightActive(btn);
currentIndex = [...playlist.querySelectorAll('.track')].indexOf(trackEl);
}
function preventContext(e){
e.preventDefault();
return false;
}
function fixRate(){
if (audioEl && audioEl.playbackRate !== 1) {
try { audioEl.playbackRate = 1; } catch(e){}
}
}
function highlightActive(activeBtn) {
playlist.querySelectorAll('.play').forEach(b => {
b.classList.toggle('active', b === activeBtn);
});
}
playlist.addEventListener('click', e => {
if (e.target.closest('.play')) {
playFromPlaylist(e.target.closest('.track'));
}
if (e.target.closest('.remove')) {
const trackEl = e.target.closest('.track');
if (trackEl) {
if (trackEl.querySelector('.play').classList.contains('active')) {
audioEl.pause();
currentIndex = -1;
}
trackEl.remove();
}
}
if (e.target.closest('.loop')) {
const btn = e.target.closest('.loop');
const trackEl = e.target.closest('.track');
const state = !loopStates.get(trackEl);
loopStates.set(trackEl, state);
btn.classList.toggle('active', state);
}
});
document.getElementById('upload').addEventListener('change', e => {
const files = e.target.files;
if (!files.length) return;
let firstTrackEl = null;
for (const fileBlob of files) {
const url = URL.createObjectURL(fileBlob);
const name = fileBlob.name;
const trackEl = document.createElement('div');
trackEl.className = 'track';
trackEl.draggable = true;
trackEl.innerHTML = `
`;
playlist.insertBefore(trackEl, playlist.firstChild);
if (!firstTrackEl) firstTrackEl = trackEl;
}
if (firstTrackEl) playFromPlaylist(firstTrackEl);
});
audioEl.addEventListener('ended', () => {
const tracks = playlist.querySelectorAll('.track');
if (currentIndex >= 0) {
const currentTrack = tracks[currentIndex];
if (loopStates.get(currentTrack)) {
playFromPlaylist(currentTrack);
return;
}
if (currentIndex + 1 < tracks.length) {
playFromPlaylist(tracks[currentIndex + 1]);
} else if (tracks.length) {
playFromPlaylist(tracks[0]);
}
}
});
// Başlangıç şarkısını playlist içinden güvenli şekilde seç (IIFE)
(function(){
try {
const startIndex = (typeof window.startSongIndex === 'number') ? window.startSongIndex : 21; // 22. şarkı
const tracks = playlist.querySelectorAll('.track');
if (tracks && tracks[startIndex]) {
playFromPlaylist(tracks[startIndex]);
}
} catch(e) {
console.warn('startFromPlaylist error', e);
}
})();
let draggedEl = null;
playlist.addEventListener('dragstart', e => {
const tr = e.target.closest('.track');
if (!tr) return;
draggedEl = tr;
tr.classList.add('dragging');
e.dataTransfer.effectAllowed = 'move';
});
playlist.addEventListener('dragover', e => {
e.preventDefault();
const target = e.target.closest('.track');
if (target && target !== draggedEl) {
const rect = target.getBoundingClientRect();
const next = (e.clientY - rect.top) / rect.height > 0.5;
playlist.insertBefore(draggedEl, next ? target.nextSibling : target);
}
});
playlist.addEventListener('dragend', () => {
if (draggedEl) draggedEl.classList.remove('dragging');
draggedEl = null;
});
// Canvas çift tık ile tam ekran
container.addEventListener('dblclick', () => {
if (document.fullscreenElement) document.exitFullscreen();
else container.requestFullscreen();
});
audioEl.addEventListener('error', () => {
const e = audioEl.error;
console.warn('Audio error', e && e.code);
});
// --- test stream input ---
document.getElementById('testStream').addEventListener('click', () => {
const url = document.getElementById('customStream').value.trim();
if (!url) return;
let label = url;
try {
const u = new URL(url);
label = u.hostname;
const pathName = u.pathname.split('/').pop();
if (pathName) label = pathName;
} catch {
const parts = url.split('/');
if (parts.length) label = parts.pop();
}
const trackEl = document.createElement('div');
trackEl.className = 'track';
trackEl.draggable = true;
trackEl.innerHTML = `
`;
playlist.insertBefore(trackEl, playlist.firstChild);
playFromPlaylist(trackEl);
document.getElementById('customStream').value = '';
});
// Reset Defaults button handler (affects ALL controls)
const resetBtn = document.getElementById('resetDefaults');
if (resetBtn) {
resetBtn.addEventListener('click', ()=>{
const defaultsMain = {
gradient: 'Classic',
mode: 6,
frequencyScale: 'log',
fftSize: 8192,
minFreq: 20,
maxFreq: 16000,
barSpace: 0.10,
mirror: 0,
smoothing: 0.40
};
const desiredSwitches = {
showPeaks: true,
fadePeaks: true,
ledBars: true
// others default to false
};
try {
// Build options object including all switches present in DOM
const switchesObj = {};
document.querySelectorAll('#settingsBar input[type="checkbox"][data-key]').forEach(cb=>{
const k = cb.dataset.key;
const val = !!desiredSwitches[k];
cb.checked = val;
switchesObj[k] = val;
});
const opts = Object.assign({}, defaultsMain, switchesObj);
// Apply options at once
try { audioMotion.setOptions(opts); } catch(e){ console.warn('setOptions error on reset:', e); }
// Sync selects/ranges UI
if (typeof gradientSelect !== 'undefined' && gradientSelect) gradientSelect.value = defaultsMain.gradient;
if (typeof modeSelect !== 'undefined' && modeSelect) modeSelect.value = String(defaultsMain.mode);
if (typeof scaleSelect !== 'undefined' && scaleSelect) scaleSelect.value = defaultsMain.frequencyScale;
if (typeof fftSizeSelect !== 'undefined' && fftSizeSelect) fftSizeSelect.value = String(defaultsMain.fftSize);
if (typeof minFreqSelect !== 'undefined' && minFreqSelect) minFreqSelect.value = String(defaultsMain.minFreq);
if (typeof maxFreqSelect !== 'undefined' && maxFreqSelect) maxFreqSelect.value = String(defaultsMain.maxFreq);
if (typeof barSpaceSelect !== 'undefined' && barSpaceSelect) barSpaceSelect.value = String(defaultsMain.barSpace);
if (typeof mirrorSelect !== 'undefined' && mirrorSelect) mirrorSelect.value = String(defaultsMain.mirror);
if (typeof smoothingRange !== 'undefined' && smoothingRange) smoothingRange.value = defaultsMain.smoothing;
if (typeof smoothValSpan !== 'undefined' && smoothValSpan) smoothValSpan.textContent = defaultsMain.smoothing.toFixed(2);
// Persist
try { if (typeof saveSettings === 'function') saveSettings(); } catch(e){}
if (window.__svDebug && window.__svDebug.log) __svDebug.log('Defaults restored');
} catch(e){ console.warn('Reset defaults error', e); }
});
}
Hit Music Nonstop Music Radio – Create Your Playlist & Listen Offline
Welcome to Hit Music Nonstop Music Radio, the ultimate online platform for techno, dance, EDM, and electronic music lovers. With our fully-featured music player, you can create your own playlist in just a few clicks and enjoy your favorite tracks anytime, even offline. No internet? No problem! Your playlist continues to play without interruption, so the beats never stop.
Our music player is designed for maximum flexibility and fun. You can drag and drop songs to reorder your playlist exactly how you like. Want to repeat a single track? Use the repeat button on the right to loop your favorite songs endlessly. If no repeat option is selected, the player automatically cycles through your playlist, restarting at the first track for a continuous non-stop music experience.
Whether you’re working out, partying, or relaxing, our nonstop music radio keeps the energy high. We feature live DJ sets, trending remixes, and exclusive mixes, bringing the festival atmosphere directly to your device. Techno, house, and dance fans will find their perfect playlist ready in seconds.
Our platform also offers offline listening, which means you can enjoy your favorite hits anywhere, without worrying about data or connectivity. Perfect for commuting, exercising, or traveling, you can always keep the music going.
Creating and managing your playlist is effortless. Simply select your favorite songs from your library, add them with a single click, and rearrange as you like. The intuitive drag-and-drop interface ensures you have full control over your playlist experience.
At Hit Music Nonstop Music Radio, we believe music is more than just sound—it’s an experience. Our high-quality audio player, interactive controls, and visually appealing interface make listening engaging and fun. Stay tuned to the latest hits, discover new DJ sets, and enjoy nonstop beats every day. new songs albums.
Join thousands of music enthusiasts around the world who already use our platform. Whether you love techno, dance, EDM, or electronic music, our player and playlists are designed to keep you moving, energized, and entertained. Start creating your playlist today and feel the nonstop rhythm wherever you are.
1. bursa In today’s music scene, electronic beats have gained massive popularity among young audiences and music enthusiasts. Especially techno and dance genres captivate listeners with their energetic rhythms and pulsating soundscapes. These genres are not only staples in clubs but also reach millions through radio channels worldwide.
2. Hit music radio channels focus on delivering the best of techno and dance music, catering to diverse age groups and cultures. These channels provide the latest tracks and popular DJ sets, making listening enjoyable whether you are at home, commuting, or working.
3. Techno music is characterized by strong electronic sounds and repetitive rhythms that keep listeners moving. Radio channels specializing in techno carefully curate playlists to maintain high energy, offering a journey through different moods and intensities with each track.
4. Dance music, on the other hand, appeals to a broader audience with its melodic and rhythmic elements. Hit music channels present dance tracks in mixed sets, encouraging listeners to move and bringing the festival or club vibe directly into their environment.
5. One of the key advantages of these radio channels is their constantly updated playlists. Each week, the most popular techno and dance tracks are broadcast, helping listeners stay on top of trends. Some channels also showcase new releases and independent DJs, promoting musical discovery. hit music radio channels techno dance.
6. Hit music radio channels don’t just play music—they also feature DJ interviews, live performances, and event announcements. This keeps the experience dynamic and interactive, turning the radio into more than just a listening platform.
7. With technological advancements, many of these channels have gone online. Now, it’s possible to access techno and dance music from anywhere in the world. Listeners can experience sets from international DJs, breaking down geographical barriers.
8. These radio channels are also a valuable platform for emerging talent. New tracks and remixes are introduced to a wide audience, keeping the electronic music scene fresh, innovative, and constantly evolving.
9. Listening to radio is more than just music—it’s an experience. Techno and dance channels energize listeners, providing motivation and entertainment. Whether exercising, driving, or getting ready for a party, these channels make the perfect companion.
10. In conclusion, hit music radio channels are essential for techno and dance music lovers. Through updated playlists, live DJ sets, and interactive content, they offer listeners a continuous flow of energy and a vibrant musical journey, keeping the spirit of electronic music alive at all times.
House, Techno, Trance, Dubstep, Drum and Bass, Progressive House, Electro, Deep House, Future House, Hardstyle, Trap, Acid House, Tech House, Minimal Techno, Electro House, Big Room, Bass House, Psytrance, Glitch Hop, Chillwave, Future Bass, Tropical House, Eurodance, Ambient, Industrial, Breakbeat, Liquid Drum and Bass, Synthwave, Psybient, Downtempo, Neurofunk, Hardcore, Moombahcore, Glitchwave, Electro Swing, Darkstep, Gabber, Tech Trance, UK Garage, Reggaeton, Progressive Trance, Hard Trance, IDM (Intelligent Dance Music), Bounce, Melodic Techno, Speed Garage, Lo-Fi Hip Hop, Synthpop, Vaporwave, Chillout, Jumpstyle, EDM, Slap House, Fidget House, Tribal House, Freestyle, French House, Balearic Beat, Acid Techno, Garage House, Dub, Skream, Trapstep, Dancehall, Cumbia, Funk, Rave, Electroclash, Breakcore, Jungle, Post-Dubstep, Speedcore, Goa Trance, Reggae, Minimal House, Deep Techno, Experimental, Electro-Funk, Futurepop, Vaporwave, Acid Breaks, NRG, Dance Punk, Italo Disco, Alternative Dance, Baltimore Club, Trancecore, Chillstep, Darkwave, Drumstep, Riddim, Moombahton, Progressive Electro, Electro Metal, Sonic EDM, Hard Bass, Eurotrance, Future Garage, Liquid Funk, Techno Pop, Big Beat, Dubtronic, Dubwave, Industrial Techno, Euro Pop, Synthwave, Synth Funk. Funk, Soul, Funkstep, Glitchcore, Acid Breakbeat, Hard EDM, Chilltrance, Ambient Dub, Psytech, Bounce House, Hard Rock EDM, Moombahtrap, Hard Bounce, Progressive Electro, UK Drill, Progressive Techno, Tech Trance, Vocal House, Electro Acid, Techy Progressive, Fidget Electro, Experimental Breakbeat, Indie Dance, Chicago House, Garage Punk, Breaks, Space Disco, Downtempo House, Dubstep Grime, Dream Trance, Deep Dubstep, Euro EDM, Boombap, Reggae Dubstep, Electro-Pop, Future House Bass, Niche House, Minimal Wave, Electro Dancehall, Future Groove, Chicago Acid, Neo-Trance, Pop Dubstep, Twerk, Glitchdub, Electro Rock, Speed Metal EDM, Trappy House, Hardtek, Witch House, EBM (Electronic Body Music), Bassline House, Trapcore, Post-Punk Electronica, Ambient Techno, Hardcore Techno, Dark Electro, Jazzy House, High-energy Trance, Minimalist Dubstep, Lo-Fi House, Progressive Breaks, Goa House, Metalstep, Nightwave, Nu Disco, Electro-Indie, Speed Trance, Power Noise, Synthwave Trap, Electro Pop Rock, Chillstep House, Deep Progressive, Chillcore, Electro Rave, Drum Bass Funk, Electro Fusion, Eurobeat, Trance House, Space Techno, Bounce Trance, Clubstep, Vapor Funk, Bounce Trance, Acid Jazz, Moombahton Reggae, Indie Electro, French Electro House, Bass House Trance, Experimental House, Techno Funk, Bounce Electro, Deep Disco, Progressive Psytrance, Vocal Dubstep, Chill Funk, Funk House, Electropunk, Urban EDM, Ravecore, Heavy Bass, IDM Breaks, Basswave, Electrowave, Dancehall EDM, Jazzstep, Electro Post-Disco, Funkstep House, Neo-Funk, Drum and Bass Jungle, Electrofunk, Post-Electronic, Bass Trance, Acid Funk, Dub Acid, Dancecore. Progressive Dubstep, Chill Progressive, Psybreaks, Future Funk, Hardwave, Minimal Electro, Acid Dub, Trance Hop, Industrial Breaks, Synthwave Trap, Vocal Trance, Happy Hardcore, Psygressive, Reggaeton EDM, Techno Bass, Melodic Dubstep, UK Hardcore, Ambient House, Tribal Techno, Electro Rap, Breakbeat Hardcore, Glitch Trap, Tech House Funk, Psytrance Progressive, Deep Electro, Electro Minimal, Hard Drumstep, Acid Tech, Hip Hop EDM, Deep Bass House, Techno Pop Rock, Trip Hop, Digital Hardcore, Ghetto House, Glitchcore Breaks, Minimalist Techno, Speed Garage House, Electro Jungle, Dancefloor Trance, Substep, Chill Trapsoul, Tech House Acid, EDM RnB, Hard Tech House, Electro Trapstep, Noise Pop, Liquid Dubstep, Hypnotic Techno, Clubstep Electro, Dreamwave, Funkcore, Trance Downtempo, Sludge Bass, Dark Tech House, Electro Punkwave, Hybrid Trap, Synthwave Metal, Future Rhythm, Jazzy Dubstep, Pop Electro Swing, Progressive Bass, Psy-House, Organic House, Space Bass, Afrobeat EDM, Progressive Breakcore, Drone Techno, Chill Rave, Funkstep Electro, Liquid Funk Bass, Groove Techno, Glitchwave Funk, Speed Dub, Trance Downtempo, New Wave Electro, Dubstep House, Acid Rock EDM, Techno Breaks, Dub Bass House, Post-Techno, Funk Electro Swing, Trapwave, Experimental Electro, Deep Trap, Electro-House Hip Hop, Disco Techno, Melodic Future Bass, Electro-Funk Soul, Chillwave Funk, Noise Dubstep, Rave Breaks, Trancewave, Hardcore Electro, Moombahcore Bass, Deep House Trap, Industrial Psytrance, Glitch Electro Pop, Funky Drumstep, Minimalist House, Cosmic EDM.
Radio Stations with Equalizers and Playlists
Radio stations that offer equalizer features allow listeners to fine-tune their audio experience, adjusting frequencies like bass, treble, and midrange to suit their personal preferences. This is especially beneficial for those who want more control over the sound quality, whether they’re enjoying music, talk shows, or live broadcasts. Many online radio platforms now incorporate playlists alongside equalizers, giving listeners the added benefit of selecting tracks or shows they want to hear while customizing the audio output to match the genre or mood. This integration of playlists with equalizer settings creates a more dynamic and interactive listening experience.
Adding a Playlist-based Equalizer Radio to Your Website
Integrating a playlist-based, equalizer-enabled radio player into your website provides a unique way to enhance user engagement. By embedding a radio player that offers both curated playlists and customizable audio settings, you offer visitors a more interactive and enjoyable experience. Listeners can easily navigate through different playlists, select their preferred tracks, and adjust the sound to suit their individual tastes. This feature not only boosts the appeal of your site but also encourages longer visits, as users can seamlessly enjoy music or radio shows that fit their preferences, all while having the freedom to modify the sound quality to their liking.
1. House
House music, originating from Chicago in the early 1980s, is a genre that has become one of the most influential and widely recognized forms of electronic dance music (EDM). Characterized by its repetitive 4/4 beat, soulful vocals, and funky basslines, House music continues to evolve, with subgenres like Deep House, Tech House, and Future House further diversifying its sound. It remains a dominant force on dance floors globally, often serving as the backbone of club culture and music festivals. Pioneers like Frankie Knuckles and modern stars like Calvin Harris and David Guetta have propelled House music into mainstream popularity.
2. Techno
Techno, born in Detroit in the late 1980s, is a genre defined by its synthetic sounds, pulsating basslines, and hypnotic rhythms. The genre focuses on repetitive, driving beats with minimalistic melodies, often using synthesizers and drum machines to create an atmospheric vibe. Techno has become a cornerstone of electronic music, with a massive following worldwide, especially in Europe, where cities like Berlin are famous for their underground techno scene. Artists like Carl Cox, Adam Beyer, and Nina Kraviz continue to shape the genre’s future.
3. Trance
Trance music emerged in the 1990s, gaining popularity in Europe and becoming a staple at large music festivals. It is known for its uplifting and euphoric melodies, driving basslines, and hypnotic progressions. Trance tracks typically build to an emotional peak, creating a sense of euphoria and unity among listeners. With its distinct breakdowns and anthemic build-ups, Trance has become synonymous with massive festival crowds and late-night clubbing. Artists like Armin van Buuren, Tiësto, and Above & Beyond are key figures in its global appeal.
4. Dubstep
Dubstep, originating from the UK in the early 2000s, is known for its heavy bass, syncopated rhythms, and aggressive sound design. It blends elements of garage, drum and bass, and dub reggae, creating a dark and intense atmosphere. The genre gained global fame in the 2010s, thanks to artists like Skrillex and Flux Pavilion, who introduced dubstep to mainstream audiences with its explosive drops and unique soundscapes. Despite its relatively recent rise to prominence, dubstep has left a lasting impact on the EDM scene and continues to influence various genres.
5. Future Bass
Future Bass is a genre that emerged in the mid-2010s, characterized by its colorful synths, chopped vocal samples, and deep, emotional basslines. It combines elements of Trap and Dubstep but is known for its more melodic and less aggressive tone. Artists like Flume, Illenium, and Marshmello have helped push Future Bass into the spotlight, blending electronic beats with heartfelt melodies to create a sound that resonates deeply with listeners. This genre has quickly become a favorite among young listeners and continues to define the sound of modern EDM.
6. Trap
Trap music, initially a subgenre of Southern Hip Hop, gained a new life when it fused with EDM in the early 2010s. It features hard-hitting 808 bass, rapid hi-hats, and often dark, menacing melodies. The genre has found a home in both hip hop and dance music scenes, attracting fans with its aggressive drops and heavy beats. Artists like RL Grime, Baauer, and Flosstradamus are central figures in the EDM Trap movement, known for their high-energy performances and anthemic tracks that shake dance floors worldwide.
7. Drum and Bass
Drum and Bass (DnB) is a fast-paced genre of electronic music characterized by its rapid breakbeats, deep basslines, and intricate rhythms. Emerging in the UK in the 1990s, DnB has become a major part of the global electronic music scene, with a dedicated following in both the underground and mainstream worlds. Artists like Pendulum, Andy C, and Noisia have pioneered the genre, constantly pushing its boundaries with both melodic and neurofunk subgenres. Drum and Bass remains a favorite in clubs and festivals due to its high-energy sound and complex drum patterns.
8. Electro House
Electro House is a genre of electronic dance music that gained major popularity in the 2000s. Known for its punchy, bass-heavy drops and catchy melodies, Electro House combines elements of progressive house and electro-funk. Its energetic sound has made it a festival favorite, and it is often played in big-room clubs and arenas. Big names like Deadmau5, Steve Aoki, and Zedd are some of the leading figures in Electro House, delivering high-octane tracks that keep dance floors alive all night long.
9. Hardstyle
Hardstyle is a genre of EDM that features fast tempos, distorted basslines, and hard-hitting kicks. It originated in the Netherlands and has since become incredibly popular in Europe and beyond. Known for its aggressive and energetic style, Hardstyle tracks typically feature uplifting melodies and intense build-ups followed by explosive drops. Hardstyle is a staple of festivals like Defqon.1 and Qlimax, where artists like Headhunterz and Brennan Heart deliver electrifying performances that keep crowds moving.
10. Tropical House
Tropical House, a subgenre of House music, became mainstream in the 2010s, known for its laid-back, beachy vibes, and uplifting melodies. It incorporates tropical instruments like steel drums, marimbas, and smooth synths, making it the perfect soundtrack for summer and vacation moods. Artists like Kygo, Thomas Jack, and Matoma brought Tropical House into the spotlight with catchy, feel-good anthems that continue to dominate charts and playlists. It’s a genre that evokes a sense of relaxation and carefree joy.
11. Lo-fi Hip Hop
Lo-fi Hip Hop is a genre that blends chill instrumental beats with a relaxed, sometimes nostalgic, atmosphere. Often characterized by ambient background noise, soft piano loops, and steady, mellow rhythms, Lo-fi Hip Hop is particularly popular among listeners who enjoy it as background music for studying or relaxation. Artists like Jinsang, Nujabes, and idealism have cultivated a loyal following through YouTube streams and online playlists, making Lo-fi Hip Hop a soundtrack to productivity and calm.
12. Electro Swing
Electro Swing merges the sounds of traditional swing, jazz, and big band music with modern electronic beats and basslines. This genre is defined by its upbeat and playful vibe, combining retro influences with a contemporary twist. Electro Swing has gained popularity in Europe and at music festivals due to its lively, danceable nature. Artists like Caravan Palace and Parov Stelar have become synonymous with the genre, bringing classic swing rhythms into the 21st century with electrifying soundscapes that make it a hit on the dance floor.
13. Hardcore
Hardcore is an intense subgenre of electronic music characterized by fast tempos, heavy basslines, and aggressive sound design. Often associated with rave culture, Hardcore’s pounding beats and high-energy drops make it a favorite in underground scenes, particularly in Europe. The genre features a variety of substyles, including Happy Hardcore and Gabber, each with its unique twist on the fast-paced, hard-hitting sound. Artists like Angerfist and Scott Brown continue to push Hardcore’s boundaries, keeping it relevant in today’s EDM landscape.
14. Psytrance
Psytrance, short for psychedelic trance, is a genre of electronic music known for its hypnotic rhythms, complex melodies, and trippy sound design. Originating in the 1990s, it has become a mainstay of the global electronic music scene, particularly in countries like Israel, India, and Brazil. With its psychedelic influences, Psytrance often creates an immersive experience for listeners, especially at music festivals and raves. Artists like Infected Mushroom and Astrix have shaped Psytrance's evolution, constantly exploring new sonic territories.
15. Indie Dance / Nu Disco
Indie Dance and Nu Disco are genres that merge elements of disco, funk, and indie rock with electronic music. song These genres focus on groovy basslines, funky rhythms, and catchy melodies, often incorporating retro sounds into modern production. Popular in both underground and mainstream scenes, Indie Dance and Nu Disco offer a blend of upbeat energy and smooth, danceable grooves. Artists like Daft Punk, Justice, and Breakbot have helped shape these genres, creating timeless anthems that keep the dance floors moving.