Melotunesmusic Emblem

melotunesmusic

Production · Recording · Promo

Melotunesmusic Emblem

Your voice deserves better sound.

Melotunesmusic ist dein Tonstudio für professionelles Vocal Recording, Mixing und Mastering.
Wir bieten Artists eine moderne Studio-Umgebung, in der kreative Ideen entstehen und Sounds ihr volles Potenzial entfalten.
Mit erstklassigem Equipment, akustisch optimierten Räumen und einer entspannten Arbeitsatmosphäre begleiten wir dich vom ersten Take bis zum fertigen Master.
Unser Ziel: Deine Stimme perfekt in Szene setzen.

Melotunesmusic Emblem

Production & Arrangement

Neben Vocal Recording begleiten wir Artists auch bei der kompletten Musikproduktion – von der ersten Idee bis zum fertigen Track.
Ob Beat, Lyrics, Songstruktur oder Arrangement: Wir helfen dir dabei, deine musikalische Vision klar, stimmig und professionell umzusetzen.
Gemeinsam arbeiten wir an Sounddesign, Arrangement und Dynamik, damit dein Song nicht nur gut klingt, sondern auch emotional funktioniert.
Unser Fokus liegt darauf, einen Sound zu schaffen, der zu dir passt – authentisch, modern und zeitlos.

(function(){ const MT_GALLERY_IMAGES = [ "https://melotunesmusic.de/assets/images/image04.jpg?v=2bfa4ac4", "https://melotunesmusic.de/assets/images/image05.jpg?v=2bfa4ac4", "https://melotunesmusic.de/assets/images/image06.jpg?v=2bfa4ac4", "https://melotunesmusic.de/assets/images/image01.jpg?v=2bfa4ac4" ]; const images = Array.from(new Set(MT_GALLERY_IMAGES)).filter(Boolean); const wrap = document.getElementById("mt-gallery-marquee"); const track = document.getElementById("mt-gallery-track"); if(!wrap || !track || images.length === 0) return; function cssNum(v, fb){ const n = parseFloat(getComputedStyle(document.documentElement).getPropertyValue(v)); return Number.isFinite(n) ? n : fb; } function isDesktop(){ return window.matchMedia("(min-width: 721px)").matches; } function gapPx(){ return cssNum("--mt-gap", 14); } /* ===== DOM: build enough strips to fill viewport x3 (guarantees endless) ===== */ function makeItem(url){ const d = document.createElement("div"); d.className = "mt-item"; const i = document.createElement("img"); i.src = url; i.loading = "lazy"; i.decoding = "async"; i.draggable = false; d.appendChild(i); return d; } function makeStrip(isFirst){ const s = document.createElement("div"); s.className = "mt-strip"; if(isFirst) s.id = "mt-strip-a"; else s.setAttribute("aria-hidden","true"); images.forEach(u => s.appendChild(makeItem(u))); return s; } /* We start with 2 strips; after measure we add more if needed */ function build(){ track.innerHTML = ""; track.appendChild(makeStrip(true)); track.appendChild(makeStrip(false)); } build(); let stripA = document.getElementById("mt-strip-a"); if(!stripA) return; /* ===== Core state ===== */ let cycleWidth = 0; /* width of ONE strip + its trailing gap = seamless repeat unit */ let currentX = 0; let targetX = 0; let raf = 0; let lastTime = performance.now(); let pausedUntil = 0; /* Mobile momentum */ let momentum = 0; let inMomentum = false; /* Velocity tracker */ const VEL_SAMPLES = 5; let velSamples = []; function pushVel(x){ const now = performance.now(); velSamples.push({x, t: now}); while(velSamples.length > VEL_SAMPLES) velSamples.shift(); while(velSamples.length > 1 && now - velSamples[0].t > 80) velSamples.shift(); } function calcVelocity(){ if(velSamples.length < 2) return 0; const o = velSamples[0], n = velSamples[velSamples.length-1]; const dt = n.t - o.t; return dt < 4 ? 0 : (n.x - o.x) / dt; } /* Swipe state */ let swiping = false; let swipeStartX = 0; let swipeStartTarget = 0; let swipeLocked = false; /* Desktop drag */ let dragging = false; let dragStartX = 0; let dragStartTarget = 0; /* ===== Measure + ensure enough strips ===== */ function measure(){ const sw = stripA.getBoundingClientRect().width || stripA.scrollWidth || 0; cycleWidth = Math.round(sw + gapPx()); if(!cycleWidth) return; const needed = Math.ceil((wrap.offsetWidth * 3) / cycleWidth) + 2; const current = track.querySelectorAll(".mt-strip").length; if(needed > current){ for(let i = current; i < needed; i++){ track.appendChild(makeStrip(false)); } } wrapSeamless(); } /* ===== Seamless wrap ===== */ function wrapSeamless(){ if(!cycleWidth) return; while(currentX <= -cycleWidth){ currentX += cycleWidth; targetX += cycleWidth; } while(currentX > 0){ currentX -= cycleWidth; targetX -= cycleWidth; } while(targetX <= -cycleWidth) targetX += cycleWidth; while(targetX > 0) targetX -= cycleWidth; } /* ===== RAF loop ===== */ function loop(now){ const dt = Math.min(0.032, (now - lastTime) / 1000); lastTime = now; if(isDesktop()){ if(!dragging){ targetX += -cssNum("--mt-auto-speed", 26) * dt; } currentX += (targetX - currentX) * cssNum("--mt-ease", 0.04); } else { if(swiping){ } else if(inMomentum){ const friction = cssNum("--mt-mobile-friction", 0.92); currentX += momentum * 16; targetX = currentX; momentum *= friction; if(Math.abs(momentum) < 0.01){ inMomentum = false; pausedUntil = now + cssNum("--mt-mobile-pause-ms", 1600); } } else { if(now >= pausedUntil){ targetX += -cssNum("--mt-mobile-auto-speed", 40) * dt; } currentX = targetX; } } wrapSeamless(); track.style.transform = "translate3d(" + currentX + "px,0,0)"; raf = requestAnimationFrame(loop); } function start(){ cancelAnimationFrame(raf); measure(); wrapSeamless(); lastTime = performance.now(); raf = requestAnimationFrame(loop); } /* ===== Touch Events ===== */ wrap.addEventListener("touchstart", function(e){ if(isDesktop()) return; if(e.touches.length > 1) return; inMomentum = false; momentum = 0; velSamples = []; swiping = true; swipeLocked = false; swipeStartX = e.touches[0].clientX; swipeStartTarget = targetX; currentX = targetX; pushVel(swipeStartX); }, {passive: true}); wrap.addEventListener("touchmove", function(e){ if(isDesktop() || !swiping) return; if(e.touches.length > 1){ swiping = false; return; } const touchX = e.touches[0].clientX; const dx = touchX - swipeStartX; pushVel(touchX); if(!swipeLocked){ if(Math.abs(dx) < 5) return; swipeLocked = true; } e.preventDefault(); targetX = swipeStartTarget + dx; currentX = targetX; wrapSeamless(); }, {passive: false}); wrap.addEventListener("touchend", function(e){ if(isDesktop() || !swiping) return; swiping = false; swipeLocked = false; const velPxMs = calcVelocity(); velSamples = []; if(Math.abs(velPxMs) > 0.1){ momentum = velPxMs; inMomentum = true; } else { pausedUntil = performance.now() + cssNum("--mt-mobile-pause-ms", 1600); } }, {passive: true}); wrap.addEventListener("touchcancel", function(){ swiping = false; swipeLocked = false; inMomentum = false; momentum = 0; velSamples = []; pausedUntil = performance.now() + 600; }, {passive: true}); /* ===== Desktop Pointer Events ===== */ wrap.addEventListener("pointerdown", function(e){ if(!isDesktop()) return; dragging = true; dragStartX = e.clientX; dragStartTarget = targetX; currentX = targetX; wrap.classList.add("is-dragging"); try{ wrap.setPointerCapture(e.pointerId); }catch(_){} }, {passive: true}); window.addEventListener("pointermove", function(e){ if(!isDesktop() || !dragging) return; targetX = dragStartTarget + (e.clientX - dragStartX); currentX = targetX; wrapSeamless(); e.preventDefault(); }, {passive: false}); window.addEventListener("pointerup", function(e){ if(!isDesktop() || !dragging) return; dragging = false; wrap.classList.remove("is-dragging"); try{ wrap.releasePointerCapture(e.pointerId); }catch(_){} }, {passive: true}); window.addEventListener("pointercancel", function(){ if(!dragging) return; dragging = false; wrap.classList.remove("is-dragging"); }, {passive: true}); /* ===== Wheel ===== */ wrap.addEventListener("wheel", function(e){ if(!isDesktop()) return; if(e.ctrlKey) return; if(Math.abs(e.deltaY) > Math.abs(e.deltaX) * 1.1) return; const mult = e.deltaMode === 0 ? cssNum("--mt-wheel-trackpad-mult", 2.8) : cssNum("--mt-wheel-mouse-mult", 1.5); currentX = targetX; targetX += -(e.deltaX + e.deltaY * 0.7) * mult; wrapSeamless(); e.preventDefault(); }, {passive: false}); /* ===== Init ===== */ function afterImagesLoaded(cb){ const imgs = track.querySelectorAll("img"); let p = imgs.length; if(!p){ cb(); return; } const done = () => { if(--p <= 0) cb(); }; imgs.forEach(img => { if(img.complete) done(); else{ img.addEventListener("load", done, {once:true}); img.addEventListener("error", done, {once:true}); } }); } afterImagesLoaded(function(){ setTimeout(function(){ measure(); start(); }, 60); }); let resizeTO = null; window.addEventListener("resize", function(){ clearTimeout(resizeTO); resizeTO = setTimeout(function(){ measure(); wrapSeamless(); }, 150); }); })();
mt-keep-image01
mt-keep-image01
mt-keep-image01
mt-keep-image01
mt-keep-image01
mt-keep-image01
mt-keep-image01