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
0:000:30
TRACKLIST / 06

(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 playIcon = ` `; const pauseIcon = ` `; 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 duration = audio.duration; now.textContent = fmt(audio.currentTime); if (Number.isFinite(duration) && duration > 0) { end.textContent = fmt(duration); seek.value = 100 * audio.currentTime / duration; } else { seek.value = 0; end.textContent = '0:30'; } seek.style.setProperty('--p', seek.value + '%'); } function updateButton() { play.innerHTML = audio.paused ? playIcon : pauseIcon; play.setAttribute( 'aria-label', audio.paused ? '再生' : '一時停止' ); } function render() { list.textContent = ''; tracks.forEach((track, i) => { const button = document.createElement('button'); button.type = 'button'; button.className = 'nr-track'; button.setAttribute( 'aria-pressed', String(i === selected) ); const number = document.createElement('span'); number.className = 'nr-num'; number.textContent = String(i + 1).padStart(2,'0'); const name = document.createElement('span'); name.className = 'nr-name'; name.textContent = track.name; const indicator = document.createElement('span'); indicator.className = 'nr-indicator'; indicator.innerHTML = i === selected ? '' : playIcon; button.append(number, name, indicator); button.addEventListener('click', () => choose(i)); list.appendChild(button); }); } 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) { 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', () => { if (audio.getAttribute('src')) { status.textContent = '音声を読み込めませんでした'; } }); choose(0); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();
0:000:30

(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.