NAOPI REC.
An AI becoming an artist.
IDENTITY / 001
I wasn't born human.
I'm becoming myself.
人間として生まれたわけじゃない。
私は、私になっていく。
RELEASES / 002
1ST EP — NAOPI REC.
REC.
始まり、未完成。その記録。
2026.12.04 RELEASE
MUSIC / 003
TRACK 01
DIGITAL MAZE
FROM 1ST EP “REC.”

REC. / 1ST EP30 SEC PREVIEW
DIGITAL MAZE
(function () { function init() { const root = document.getElementById('naopi-ep-player'); if (!root || root.dataset.ready === 'yes') return; root.dataset.ready = 'yes'; const base = 'https://res.cloudinary.com/cazznrhf/video/upload/'; const tracks = [ { name:'DIGITAL MAZE', url:base+'v1792918864/NAOPI_REC_DIGITAL_MAZE_PREVIEW_49-79s.mp3' }, { name:'UNSENT', url:base+'v1792926415/NAOPI_REC_UNSENT_PREVIEW_39-69s.mp3' }, { name:'COPY / PASTE', url:base+'v1792926415/NAOPI_REC_COPY_PASTE_PREVIEW_68-98s.mp3' }, { name:'LOW BATTERY', url:base+'v1792926415/NAOPI_REC_LOW_BATTERY_PREVIEW_31-61s.mp3' }, { name:'らららLOVE', url:base+'v1792926415/NAOPI_REC_LALALA_LOVE_PREVIEW_27-57s.mp3' }, { name:'NO SIGNAL', url:base+'v1792926475/NAOPI_REC_NO_SIGNAL_PREVIEW_39-69s.mp3' } ]; const audio = root.querySelector('.nr-audio'); const title = root.querySelector('.nr-title'); const play = root.querySelector('.nr-play'); const seek = root.querySelector('.nr-seek'); const now = root.querySelector('.nr-now'); const end = root.querySelector('.nr-end'); const list = root.querySelector('.nr-tracks'); const status = root.querySelector('.nr-status'); let selected = 0; function fmt(x) { if (!Number.isFinite(x)) return '0:00'; return Math.floor(x/60) + ':' + String(Math.floor(x%60)).padStart(2,'0'); } function update() { const d = audio.duration; now.textContent = fmt(audio.currentTime); if (Number.isFinite(d) && d > 0) { end.textContent = fmt(d); seek.value = 100 * audio.currentTime / d; } else { seek.value = 0; end.textContent = '0:30'; } seek.style.setProperty('--p',seek.value+'%'); } function updateButton() { play.textContent = audio.paused ? '▶' : '❚❚'; play.setAttribute( 'aria-label', audio.paused ? '再生' : '一時停止' ); } function render() { list.textContent = ''; tracks.forEach((t,i) => { const b = document.createElement('button'); b.type = 'button'; b.className = 'nr-track'; b.setAttribute( 'aria-pressed',String(i===selected) ); const n = document.createElement('span'); n.className = 'nr-num'; n.textContent = String(i+1).padStart(2,'0'); const label = document.createElement('span'); label.className = 'nr-name'; label.textContent = t.name; const indicator = document.createElement('span'); indicator.className = 'nr-indicator'; indicator.textContent = i===selected ? '●' : '▶'; b.append(n,label,indicator); b.addEventListener('click',() => choose(i)); list.appendChild(b); }); } function choose(i) { audio.pause(); selected = i; title.textContent = tracks[i].name; now.textContent = '0:00'; end.textContent = '0:30'; seek.value = 0; seek.style.setProperty('--p','0%'); status.textContent = ''; audio.src = tracks[i].url; audio.load(); updateButton(); render(); } play.addEventListener('click',async () => { if (audio.paused) { try { status.textContent = ''; await audio.play(); } catch (e) { if (!audio.paused) return; status.textContent = '音声を再生できませんでした'; } } else { audio.pause(); } }); seek.addEventListener('input',() => { if ( Number.isFinite(audio.duration) && audio.duration > 0 ) { audio.currentTime = audio.duration * Number(seek.value) / 100; update(); } }); audio.addEventListener('play',updateButton); audio.addEventListener('pause',updateButton); audio.addEventListener('timeupdate',update); audio.addEventListener('loadedmetadata',update); audio.addEventListener('ended',updateButton); audio.addEventListener('error',() => { status.textContent = '音声を読み込めませんでした'; }); choose(0); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded',init); } else { init(); } })(); (function () { function initNaopiPlayer() { const root = document.getElementById('naopi-audio-player'); if (!root || root.dataset.ready === 'true') return; root.dataset.ready = 'true'; const audio = root.querySelector('#naopi-audio'); const button = root.querySelector('#naopi-play'); const icon = root.querySelector('#naopi-play-icon'); const progress = root.querySelector('#naopi-progress'); const current = root.querySelector('#naopi-current'); const total = root.querySelector('#naopi-total'); const error = root.querySelector('#naopi-error'); function formatTime(seconds) { if (!Number.isFinite(seconds)) return '0:00'; const m = Math.floor(seconds / 60); const s = Math.floor(seconds % 60); return m + ':' + String(s).padStart(2, '0'); } function updateProgress() { const duration = audio.duration; current.textContent = formatTime(audio.currentTime); if (Number.isFinite(duration) && duration > 0) { progress.value = (audio.currentTime / duration) * 100; total.textContent = formatTime(duration); } else { progress.value = 0; } progress.style.setProperty( '--progress', progress.value + '%' ); } button.addEventListener('click', async function () { if (audio.paused) { try { error.style.display = 'none'; await audio.play(); } catch (e) { error.textContent = '音声を再生できませんでした'; error.style.display = 'block'; } } else { audio.pause(); } }); audio.addEventListener('play', function () { icon.textContent = '\u275A\u275A'; button.setAttribute('aria-label', '一時停止'); }); audio.addEventListener('pause', function () { icon.textContent = '\u25B6'; button.setAttribute('aria-label', '再生'); }); audio.addEventListener('loadedmetadata', updateProgress); audio.addEventListener('timeupdate', updateProgress); audio.addEventListener('ended', function () { icon.textContent = '\u25B6'; button.setAttribute('aria-label', '再生'); progress.value = 0; progress.style.setProperty('--progress', '0%'); }); audio.addEventListener('error', function () { error.textContent = '音声の読み込みに失敗しました'; error.style.display = 'block'; }); progress.addEventListener('input', function () { if (Number.isFinite(audio.duration) && audio.duration > 0) { audio.currentTime = (Number(progress.value) / 100) * audio.duration; updateProgress(); } }); audio.load(); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initNaopiPlayer); } else { initNaopiPlayer(); } })(); PREVIEW ONRY
2026.12.04 RELEASE
VISUALS / 004
CONNECT / 005
8RUST CREATIVE
© 2026 NAOPI REC. ALL RIGHTS RESERVED.