The Marimba Studio

PLAY|LEARN|CREATE

The Most Advanced Virtual Marimba Ever

🔕 Check your silent mode! Make sure your phone is not on silent or muted — you won't hear the marimba otherwise.

Rotate to landscape to play

The marimba needs landscape mode to fit on your screen

The Marimba Studio logo

The Marimba Studio v9.8.2.4

Mobile Version
Play | Music Book | Create
0%
Initializing studio...

The Marimba Studio v9.8.2.4

No sound? Turn off silent mode
0 RP
G2
A
B
C
D
E
F
F#
G3
A
Volume
Metronome Speed
Play Mode
REC 00:00
120 BPM
70% 120 BPM 8 notes/sec
🎼
No saved recordings yet
Start recording to create your first masterpiece!

⚙️ Settings

🔊 Volume 70%
⏱️ Metronome 120 BPM
🎵 Rumble
👆 Play Mode
Rumble Points 0 RP
🎓 Marimba Lessons With Prof Rumble
(function mobileInstallPrompt() { 'use strict'; const PROMPT_DELAY_MS = 60000; const DISMISSED_KEY = 'ms_mobile_install_prompt_dismissed_until'; const INSTALLED_KEY = 'ms_mobile_install_prompt_installed'; const OPENED_FROM_APP = window.matchMedia?.('(display-mode: standalone)')?.matches || window.navigator.standalone === true; const el = (id) => document.getElementById(id); let deferredInstallPrompt = null; let promptTimer = null; let detectedInstallProfile = null; const safariIosSteps = { browserLabel: 'iPhone Safari', note: 'Safari is the most reliable way to add the studio to an iPhone home screen.', steps: [ ['Open this page in Safari.', 'On iPhone, Apple shows the home-screen install option from Safari.'], ['Tap the Share button.', 'It is usually at the bottom of Safari. If your address bar is at the top, it may appear near the top instead.'], ['Choose "Add to Home Screen".', 'Scroll the share sheet if you do not see it straight away, then tap Add. The Marimba Studio icon will appear on your home screen.'] ] }; const androidChromeSteps = { browserLabel: 'Android Chrome', note: 'Chrome usually offers the cleanest Android install flow.', steps: [ ['Tap the three-dot menu.', 'It is usually in the top-right corner of Chrome.'], ['Choose "Install app" or "Add to Home screen".', 'The wording changes between Android versions, but it will be in the browser menu.'], ['Confirm Add or Install.', 'After confirming, launch The Marimba Studio from your home screen for the most app-like experience.'] ] }; const browserMatchers = [ ['iOS Chrome', /CriOS/i, 'iosRedirect'], ['iOS Edge', /EdgiOS/i, 'iosRedirect'], ['iOS Firefox', /FxiOS/i, 'iosRedirect'], ['iOS Opera', /OPiOS/i, 'iosRedirect'], ['iOS DuckDuckGo', /DuckDuckGo/i, 'iosRedirect'], ['iOS Brave', /Brave/i, 'iosRedirect'], ['Samsung Internet', /SamsungBrowser/i, 'samsung'], ['Android Edge', /EdgA/i, 'androidMenu'], ['Android Firefox', /Firefox/i, 'firefoxAndroid'], ['Android Opera', /OPR|Opera/i, 'androidMenu'], ['Android Brave', /Brave/i, 'androidMenu'], ['Android Vivaldi', /Vivaldi/i, 'androidMenu'], ['Android DuckDuckGo', /DuckDuckGo/i, 'androidMenu'], ['Android Yandex', /YaBrowser/i, 'androidMenu'], ['Android UC Browser', /UCBrowser/i, 'androidMenu'], ['Android Kiwi Browser', /Kiwi/i, 'androidMenu'], ['Android Mi Browser', /MiuiBrowser/i, 'androidMenu'], ['Android Huawei Browser', /HuaweiBrowser/i, 'androidMenu'], ['Android QQ Browser', /MQQBrowser/i, 'androidMenu'], ['Android Puffin', /Puffin/i, 'androidMenu'], ['Android Chrome', /Chrome|CriOS/i, 'androidChrome'], ['Android Browser', /Android/i, 'androidMenu'], ['iPhone Safari', /Safari/i, 'iosSafari'] ]; function isMobilePage() { return /mobileindex\.html/i.test(window.location.pathname) || document.getElementById('bottom-nav')?.classList.contains('bottom-nav-redesigned'); } function isSuppressed() { if (OPENED_FROM_APP) return true; if (localStorage.getItem(INSTALLED_KEY) === '1') return true; const dismissedUntil = Number(localStorage.getItem(DISMISSED_KEY) || 0); return dismissedUntil > Date.now(); } function escapeHtml(value) { return String(value).replace(/[&<>"']/g, (char) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[char])); } function getBrowserProfile() { const ua = navigator.userAgent || ''; const isIOS = /iPad|iPhone|iPod/i.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1); const isAndroid = /Android/i.test(ua); const matched = browserMatchers.find(([label, pattern]) => { if (label.startsWith('iOS') || label.includes('iPhone')) return isIOS && pattern.test(ua); if (label.startsWith('Android') || label === 'Samsung Internet') return isAndroid && pattern.test(ua); return pattern.test(ua); }); const label = matched?.[0] || (isIOS ? 'iPhone browser' : isAndroid ? 'Android browser' : 'Mobile browser'); const recipe = matched?.[2] || (isIOS ? 'iosRedirect' : isAndroid ? 'androidMenu' : 'generic'); if (recipe === 'iosSafari') { return { ...safariIosSteps, browserLabel: label, tab: 'ios' }; } if (recipe === 'iosRedirect') { return { browserLabel: label, note: `${label} on iPhone may not show Apple's home-screen option. Safari is the reliable route.`, steps: [ ['Open this page in Safari.', 'Copy the page link, open Safari, then paste it there.'], ['Tap the Share button in Safari.', 'It is usually at the bottom of Safari, or near the address bar if your layout is different.'], ['Choose "Add to Home Screen".', 'Tap Add, then launch The Marimba Studio from the new home-screen icon.'] ], tab: 'detected' }; } if (recipe === 'firefoxAndroid') { return { browserLabel: label, note: 'Firefox usually places the home-screen option inside its menu.', steps: [ ['Tap the three-dot menu.', 'Open the Firefox menu from the address bar area.'], ['Choose "Install" or "Add to Home screen".', 'If you do not see Install, look for Add to Home screen further down the menu.'], ['Confirm the shortcut.', 'After confirming, open The Marimba Studio from your home screen.'] ], tab: 'detected' }; } if (recipe === 'samsung') { return { browserLabel: label, note: 'Samsung Internet usually adds sites through its menu.', steps: [ ['Tap the menu button.', 'It may appear as three lines or three dots depending on your toolbar layout.'], ['Choose "Add page to" or "Add to Home screen".', 'Select Home screen if Samsung Internet asks where to add it.'], ['Confirm Add.', 'The Marimba Studio icon will appear on your home screen.'] ], tab: 'detected' }; } if (recipe === 'androidChrome') { return { ...androidChromeSteps, browserLabel: label, tab: 'android' }; } if (recipe === 'androidMenu') { return { browserLabel: label, note: `${label} normally uses the browser menu for home-screen install options.`, steps: [ ['Open the browser menu.', 'Look for the three-dot, three-line, or browser menu button.'], ['Choose "Install app" or "Add to Home screen".', 'Some browsers call it Add page to, Add shortcut, or Install.'], ['Confirm Add or Install.', 'Then open The Marimba Studio from your home screen for the cleaner app-style view.'] ], tab: 'detected' }; } return { browserLabel: label, note: 'Your browser is not one of the common install flows, so use the standard mobile browser menu route.', steps: [ ['Open the browser menu.', 'Look for a share, menu, or tools button.'], ['Find an install or home-screen option.', 'The wording may be "Install app", "Add to Home Screen", "Add shortcut", or similar.'], ['Confirm the action.', 'If your browser does not offer it, open the page in Safari on iPhone or Chrome on Android.'] ], tab: 'detected' }; } function renderSteps(sectionId, profile) { const section = el(sectionId); if (!section) return; const note = profile.note ? `

${escapeHtml(profile.note)}

` : ''; section.innerHTML = note + profile.steps.map((step, index) => `
${index + 1}

${escapeHtml(step[0])}

${escapeHtml(step[1])}

`).join(''); } function setupInstallInstructions() { detectedInstallProfile = getBrowserProfile(); const browserLabel = el('mobile-install-detected-browser'); if (browserLabel) { browserLabel.innerHTML = `Detected browser: ${escapeHtml(detectedInstallProfile.browserLabel)}`; } renderSteps('mobile-install-detected', detectedInstallProfile); renderSteps('mobile-install-ios', safariIosSteps); renderSteps('mobile-install-android', androidChromeSteps); setInstallTab('detected'); } function showNudge() { if (!isMobilePage() || isSuppressed()) return; if (document.body.classList.contains('song-menu-active') || document.body.classList.contains('drum-machine-active')) { schedulePrompt(15000); return; } const nudge = el('mobile-install-nudge'); if (!nudge) return; nudge.classList.add('show'); nudge.setAttribute('aria-hidden', 'false'); } function hideNudge() { const nudge = el('mobile-install-nudge'); nudge?.classList.remove('show'); nudge?.setAttribute('aria-hidden', 'true'); } function openPanel() { hideNudge(); setupInstallInstructions(); const overlay = el('mobile-install-overlay'); if (!overlay) return; overlay.classList.add('show'); overlay.setAttribute('aria-hidden', 'false'); } function closePanel() { const overlay = el('mobile-install-overlay'); overlay?.classList.remove('show'); overlay?.setAttribute('aria-hidden', 'true'); } function remindLater(days = 3) { localStorage.setItem(DISMISSED_KEY, String(Date.now() + days * 24 * 60 * 60 * 1000)); hideNudge(); closePanel(); } function markInstalled() { localStorage.setItem(INSTALLED_KEY, '1'); hideNudge(); closePanel(); } function schedulePrompt(delay = PROMPT_DELAY_MS) { if (promptTimer) clearTimeout(promptTimer); promptTimer = setTimeout(() => { promptTimer = null; showNudge(); }, delay); } function setInstallTab(tabName) { document.querySelectorAll('[data-install-tab]').forEach((button) => { const active = button.dataset.installTab === tabName; button.classList.toggle('active', active); button.setAttribute('aria-selected', active ? 'true' : 'false'); }); document.querySelectorAll('[data-install-section]').forEach((section) => { section.classList.toggle('active', section.dataset.installSection === tabName); }); } window.addEventListener('beforeinstallprompt', (event) => { event.preventDefault(); deferredInstallPrompt = event; }); document.addEventListener('DOMContentLoaded', () => { if (!isMobilePage() || isSuppressed()) return; setupInstallInstructions(); el('mobile-install-open')?.addEventListener('click', (event) => { event.stopPropagation(); openPanel(); }); el('mobile-install-nudge')?.addEventListener('click', openPanel); el('mobile-install-dismiss')?.addEventListener('click', (event) => { event.stopPropagation(); remindLater(3); }); el('mobile-install-close')?.addEventListener('click', () => remindLater(1)); el('mobile-install-later')?.addEventListener('click', () => remindLater(3)); el('mobile-install-done')?.addEventListener('click', markInstalled); el('mobile-install-overlay')?.addEventListener('click', (event) => { if (event.target === event.currentTarget) remindLater(1); }); document.querySelectorAll('[data-install-tab]').forEach((button) => { button.addEventListener('click', () => setInstallTab(button.dataset.installTab)); }); el('mobile-install-native')?.addEventListener('click', async () => { if (!deferredInstallPrompt) { setInstallTab(detectedInstallProfile?.tab || (/Android/i.test(navigator.userAgent) ? 'android' : 'ios')); return; } try { deferredInstallPrompt.prompt(); const choice = await deferredInstallPrompt.userChoice; if (choice?.outcome === 'accepted') markInstalled(); } catch (_) { setInstallTab(detectedInstallProfile?.tab || (/Android/i.test(navigator.userAgent) ? 'android' : 'ios')); } finally { deferredInstallPrompt = null; } }); schedulePrompt(); }); })();