Files
motif/play.html
T
b1rdmania b0c1b49d2a Remove volume controls and play at 100%.
Eliminates volume sliders on main and share pages and hard-sets preview + Motif playback volume to 1.0 across the app.
2025-12-26 20:25:38 +00:00

380 lines
11 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
<title>Check out this Gameboy tune — MOTIF</title>
<meta name="description" content="Someone shared a song with you. Press play to hear it reimagined as classic game-console music — then generate your own." />
<!-- OpenGraph / Social Media Preview -->
<meta property="og:title" content="Check out this Gameboy tune" />
<meta property="og:description" content="Someone shared a song with you. Press play to hear it reimagined as classic game-console music — then generate your own." />
<meta property="og:image" content="https://motif-self.vercel.app/chiptune_blog_piece_1000x.webp" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://motif-self.vercel.app/play" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Check out this Gameboy tune" />
<meta name="twitter:description" content="Someone shared a song with you. Press play to hear it reimagined as classic game-console music — then generate your own." />
<meta name="twitter:image" content="https://motif-self.vercel.app/chiptune_blog_piece_1000x.webp" />
<style>
:root {
--color-bg: #0a0a0a;
--color-surface: #141414;
--color-surface-elevated: #1a1a1a;
--color-border: #2a2a2a;
--color-text: #e8e8e8;
--color-text-dim: #999;
--color-accent-primary: #00ff88;
--color-accent-secondary: #ffaa44;
--spacing-unit: 8px;
--radius: 8px;
--shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.5);
--shadow-md: 0 4px 16px rgba(0, 0, 0, 0.6);
--shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.7);
--glow-primary: 0 0 20px rgba(0, 255, 136, 0.3);
--glow-secondary: 0 0 20px rgba(255, 170, 68, 0.3);
}
* {
box-sizing: border-box;
}
body {
margin: 0;
padding: calc(var(--spacing-unit) * 3);
background:
radial-gradient(1000px 600px at 50% -150px, rgba(0, 255, 136, 0.12), transparent 60%),
radial-gradient(800px 600px at 110% 20%, rgba(255, 170, 68, 0.08), transparent 55%),
var(--color-bg);
color: var(--color-text);
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
.container {
max-width: 960px;
margin: 0 auto;
}
h1.page-title {
color: var(--color-accent-primary);
text-align: center;
margin: 0 0 calc(var(--spacing-unit) * 3) 0;
font-size: 2em;
font-weight: 700;
letter-spacing: 0.05em;
text-shadow: var(--glow-primary);
}
.tagline {
text-align: center;
margin: 0 0 calc(var(--spacing-unit) * 3) 0;
color: var(--color-text-dim);
}
.section {
margin-top: calc(var(--spacing-unit) * 5);
}
.section-header {
margin: 0 0 calc(var(--spacing-unit) * 2) 0;
}
.section-title {
margin: 0;
font-size: 13px;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--color-text);
}
.section-subtitle {
margin: calc(var(--spacing-unit) / 2) 0 0 0;
font-size: 13px;
color: var(--color-text-dim);
}
.divider {
height: 1px;
margin: 0 0 calc(var(--spacing-unit) * 3) 0;
background: linear-gradient(90deg, transparent, var(--color-border), transparent);
}
/* Share page: no status box */
button {
background: var(--color-surface);
color: var(--color-text);
border: 1px solid var(--color-border);
padding: calc(var(--spacing-unit) * 1.5) calc(var(--spacing-unit) * 3);
border-radius: var(--radius);
cursor: pointer;
font-family: inherit;
font-size: 14px;
font-weight: 500;
transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: var(--shadow-sm);
}
button:hover:not(:disabled) {
background: var(--color-surface-elevated);
transform: translateY(-1px);
border-color: #444;
box-shadow: var(--shadow-md);
}
button:active:not(:disabled) {
transform: translateY(0);
box-shadow: var(--shadow-sm);
}
button:disabled {
opacity: 0.4;
cursor: not-allowed;
}
button.primary {
background: var(--color-accent-primary);
color: #000;
border-color: rgba(0, 255, 136, 0.55);
font-weight: 700;
}
button.primary:hover:not(:disabled) {
box-shadow: var(--glow-primary), var(--shadow-md);
}
.motif-stage {
background: var(--color-surface-elevated);
padding: calc(var(--spacing-unit) * 3);
border-radius: var(--radius);
border: 1px solid rgba(255, 255, 255, 0.08);
box-shadow: var(--shadow-lg);
}
.motif-grid {
display: flex;
flex-direction: column;
gap: 16px;
}
.motif-header {
margin-bottom: 6px;
}
.motif-title {
margin: 0;
color: var(--color-accent-secondary);
text-shadow: 0 0 18px rgba(255, 170, 68, 0.15);
font-size: 16px;
font-weight: 700;
}
.motif-kicker {
font-size: 0.85em;
color: #b6b6b6;
margin: 6px 0 0 0;
max-width: 70ch;
}
.motif-controls {
display: flex;
gap: 12px;
align-items: center;
flex-wrap: wrap;
}
.motif-controls button.primary {
flex: 1;
min-width: 180px;
padding: 12px 16px;
}
.volume-control {
margin-top: 0;
display: flex;
align-items: center;
gap: 10px;
flex: 1;
min-width: 200px;
}
.volume-control label {
font-size: 0.85em;
color: #aaa;
min-width: 55px;
}
input[type="range"] {
flex: 1;
margin: 0;
}
/* Share page: single CTA only */
/* Progress (matches main page style) */
.progress-container {
margin-top: 8px;
padding-top: 16px;
border-top: 1px solid rgba(255, 255, 255, 0.08);
display: none;
}
.progress-time {
display: flex;
justify-content: space-between;
margin-bottom: 8px;
font-size: 0.85em;
color: rgba(255,255,255,0.22);
transition: color 120ms ease;
}
.progress-time.active {
color: rgba(255,255,255,0.55);
}
.progress-bar-wrapper {
position: relative;
height: 44px;
display: flex;
align-items: center;
padding: calc(var(--spacing-unit) * 2) 0;
}
.progress-bar {
width: 100%;
height: 6px;
-webkit-appearance: none;
appearance: none;
background: transparent;
border-radius: 3px;
outline: none;
cursor: pointer;
position: relative;
z-index: 2;
}
.progress-bar::-webkit-slider-runnable-track {
height: 6px;
background: rgba(255, 255, 255, 0.1);
border-radius: 3px;
}
.progress-bar::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--color-accent-primary);
cursor: pointer;
box-shadow: 0 0 10px rgba(0, 255, 136, 0.28), var(--shadow-sm);
margin-top: -7px;
transition: transform 100ms ease;
}
.progress-bar:active::-webkit-slider-thumb {
transform: scale(1.15);
}
.progress-bar::-moz-range-track {
height: 6px;
background: rgba(255, 255, 255, 0.1);
border-radius: 3px;
}
.progress-bar::-moz-range-thumb {
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--color-accent-primary);
cursor: pointer;
border: none;
box-shadow: 0 0 10px rgba(0, 255, 136, 0.28), var(--shadow-sm);
}
.progress-fill {
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
height: 6px;
background: linear-gradient(90deg, rgba(0,255,136,0.95), rgba(0,255,136,0.45));
border-radius: 3px;
pointer-events: none;
z-index: 1;
width: 0%;
transition: width 0.1s linear;
}
.meta-block {
margin-top: 8px;
font-size: 13px;
color: rgba(255,255,255,0.58);
line-height: 1.45;
max-width: 72ch;
}
/* No volume control on share page */
</style>
</head>
<body>
<div class="container">
<div class="motif-stage">
<div class="motif-grid" style="gap: 14px;">
<!-- 1. Source Song Title -->
<h1 id="songTitle" style="margin:0; font-size: 28px; line-height: 1.15; font-weight: 800; color: var(--color-text); letter-spacing: 0.01em;">
Loading…
</h1>
<div id="songArtist" style="display:none; margin-top: -4px; font-size: 14px; color: rgba(255,255,255,0.62);"></div>
<!-- 2. Transformation Description -->
<p id="transformLine" style="margin:0; color: rgba(255,255,255,0.72); font-size: 14px;">
Reimagined as classic game-console music
</p>
<!-- 3. Single Play/Pause Control -->
<div style="display:flex; justify-content:center; margin-top: 16px; margin-bottom: 16px;">
<button id="playToggleBtn" class="primary" disabled style="min-width: 240px; padding: 14px 18px; font-size: 15px;">
Play
</button>
</div>
<!-- 4. Progress Bar -->
<div class="progress-container" id="playProgressContainer" style="display:block; margin-top: 0; padding-top: 12px;">
<div class="progress-time" id="playTimeRow">
<span id="playCurrentTime">0:00</span>
<span id="playDuration"></span>
</div>
<div class="progress-bar-wrapper" style="padding: 10px 0;">
<input id="playProgressBar" class="progress-bar" type="range" min="0" max="100" value="0" step="0.1" />
<div id="playProgressFill" class="progress-fill"></div>
</div>
</div>
<!-- 5/6. Metadata (quiet block) -->
<div class="meta-block" id="metaBlock">
Procedural playback from MIDI structure.<br />
Rendered using Motifs Wario game-console engine.
</div>
<!-- 7. Primary CTA (single) -->
<div style="margin-top: 18px;">
<a id="generateOwn" href="/" style="display:inline-block; color: rgba(0,255,136,0.92); text-decoration:none; font-weight: 650;">
Generate your own →
</a>
</div>
</div>
</div>
</div>
<script type="module" src="/src/play.ts"></script>
</body>
</html>