diff options
Diffstat (limited to 'libs')
34 files changed, 576 insertions, 406 deletions
diff --git a/libs/music/player b/libs/music/player index ae89d67..6676d0b 100644 --- a/libs/music/player +++ b/libs/music/player @@ -92,7 +92,7 @@ New experimental online player with visualization. 2015.11.7 1.0.0 The online player was added. --> -<body onload="init();"> +<body> <div id="overlay"><span style="text-align:center;" id="overlaytext" class="TText">LOADING...</span></div> <div id="helpoverlay" class="TText"> <pre class="TText" style="padding:2em;overflow:auto scroll;white-space:pre-wrap;"> @@ -115,7 +115,7 @@ If the format shows an exclamation mark after it, it could be unsupported by you To view the description of the currently selected album, click on the currently selected album in the sidebar. To view the description of the currently playing track, click on the link after "Now Playing: " in the bottom. Not all tracks have description texts. -Some tracks offer "multi-mixes". They are only provided in the ogg format. You need to enable experimental features in your browser for them to work. For chromium-based browsers, turn on "enable-experimental-web-platform-features". For firefox-based browsers, turn on "media.track.enabled" (however firefox doesn't seem to support multitrack ogg files yet). Once the support is correctly enabled, you'll see "Press C to switch tracks" over the seek bar for these tracks. +Some tracks offer "multi-mixes". They are only provided in the ogg format. You need to enable experimental features in your browser for them to work. For chromium-based browsers, turn on "enable-experimental-web-platform-features". For firefox-based browsers, turn on "media.track.enabled" (however firefox doesn't seem to support multitrack ogg files yet). Once the support is correctly enabled, you'll see "[Switch Tracks (C)]" over the seek bar for these tracks. All tracks on this site are available for download. You can simply right click the links in the playlist and save the link. Alternatively you can go to the "Downloads" link in the sidebar, where you can find all tracks in all formats, a few unlisted tracks, and some MIDI exports. Unless otherwise stated, all finished tracks here can be used under a permissive CC-BY 4.0 license. Please contact the owner of the site if you want to use the MIDI exports. </pre><a href="javascript:NSUI.hideHelp()" style="right:2em;bottom:1em;position:absolute;">close</a> @@ -129,7 +129,8 @@ All tracks on this site are available for download. You can simply right click t <li><ul id="plists"></ul></li> <li><a href="//filestorage.chrisoft.org/music/" target="_blank">Downloads</a></li> <li><a href="javascript:NSUI.showHelp()">Help</a></li> - <li><a>TSOP 2.7.1</a></li> + <li><a href="https://cgit.chrisoft.org/web.git/tree/libs/music">TSOP 2.7.1</a></li> + <li><a href="javascript:togglepanel()" id="paneltoggle"></a></li> </ul> </div> <div id="content"> @@ -141,10 +142,10 @@ All tracks on this site are available for download. You can simply right click t <div id="ctrlcontainer" class="footer TText widgetbg"> <div class="switches" style="text-align:right;padding-top:0.25em 0 0.25em 0;"> <div style="text-align:center;width:100%;" id="nowplaying"></div> - <span id="mt" style="display:none;">Press C to switch tracks</span> - <a id="formatsw" href="#">[PCM wave 64 kbps]</a> - <a id="am3u8" href="#">[m3u8 Playlist]</a> - <a id="plistsw" href="javascript:void(0);">[Hide Playlist]</a> + <a id="mt" style="display:none;" href="javascript:NSAudio.switchAudioTrack();">[Switch Tracks (C)]</a> + <a id="formatsw" href="javascript:void(0);">[PCM wave 64 kbps]</a> + <a id="am3u8" href="javascript:void(0);">[m3u8 Playlist]</a> + <a id="plistsw" href="javascript:NSUI.togglePlist();">[Hide Playlist]</a> </div> <div class="centered-audio"> <audio id="audio" preload="auto" tabindex="0" type="audio/ogg" autoplay="autoplay" style="display:none;" crossorigin="anonymous"></audio> diff --git a/libs/music/player.d/cgi-bin/m3u8.cgi b/libs/music/player.d/cgi-bin/m3u8.cgi index 506ce0e..3e463ca 100755 --- a/libs/music/player.d/cgi-bin/m3u8.cgi +++ b/libs/music/player.d/cgi-bin/m3u8.cgi @@ -18,9 +18,10 @@ print('Content-type: audio/mpegurl',end='\r\n') print(end='\r\n') f.readline() try: - fmt=d['type'][0] if d['type'][0] in ['ogg','flac','opus','m4a'] else 'ogg' + fmt=d['type'][0] if d['type'][0] in ['vorbis','flac','opus','m4a'] else 'vorbis' except KeyError: - fmt='ogg' + fmt='vorbis' +ext='ogg' if fmt == 'vorbis' else fmt for line in f: - print(f'https://filestorage.chrisoft.org/music/{fmt}/{urllib.parse.quote(line.strip())}.{fmt}') + print(f'https://filestorage.chrisoft.org/music/{fmt}/{urllib.parse.quote(line.strip())}.{ext}') f.close() diff --git a/libs/music/player.d/cgi-bin/pcm.cgi b/libs/music/player.d/cgi-bin/pcm.cgi index 34539ad..460b1db 100755 --- a/libs/music/player.d/cgi-bin/pcm.cgi +++ b/libs/music/player.d/cgi-bin/pcm.cgi @@ -4,7 +4,7 @@ from urllib.parse import quote,unquote def getfilelist(d): fmt='ogg' if 'fmt' not in d else d['fmt'] - AUDIO_BASE='//filestorage.chrisoft.org/music/ogg/' + AUDIO_BASE='//filestorage.chrisoft.org/music/vorbis/' ro={'status':200,'message':'OK'} if 'folder' not in d or d['folder']=='': diff --git a/libs/music/player.d/main_static.js b/libs/music/player.d/main_static.js index 7070e1d..eec68e0 100644 --- a/libs/music/player.d/main_static.js +++ b/libs/music/player.d/main_static.js @@ -1,4 +1,4 @@ -//Chris Xiong 2015-2021 +//Chris Xiong 2015-2025 //License: Expat //WARNING: This file contains profanity (thrown as exceptions). @@ -21,23 +21,51 @@ const sh={ class Ink { - constructor(_vx,_vy,_c) + constructor(_vx,_vy,_c,_d) { this.x=NSUI.canvas.width/2;this.y=NSUI.canvas.height/2; this.vx=_vx;this.vy=_vy; + this.d = _d ? 1 - _d : 0.995; this.color=_c>6?6:_c;this.active=true; } update() { const canvas=NSUI.canvas; - this.x+=this.vx;this.y+=this.vy; - this.vx*=0.995;this.vy*=0.995; - if(this.x<-10||this.x>canvas.width+10||this.y<-10||this.y>canvas.height+10) + this.x += this.vx; this.y += this.vy; + if (this.vx > 5 && this.vy > 5) { + this.vx *= this.d; this.vy *= this.d; + } + if(this.x<-30||this.x>canvas.width+30||this.y<-30||this.y>canvas.height+30 || Number.isNaN(this.x) || Number.isNaN(this.y)) this.active=false; } draw(cctx) { - cctx.drawImage(NSInk.inkimg[this.color],this.x+5*window.devicePixelRatio,this.y+5*window.devicePixelRatio); + cctx.drawImage(NSInk.inkimg[this.color], this.x - 5 * window.devicePixelRatio, this.y - 5 * window.devicePixelRatio); + } +} + +class TrendTracker +{ + constructor(_window_size, _default_value) + { + this.window_size = _window_size; + this.data = new Array(_window_size).fill(_default_value); + this.meanx = (this.window_size - 1) / 2; + } + push(v) + { + this.data.shift(); + this.data.push(v); + this.update_slope(); + } + update_slope() + { + const meanx = this.meanx; + const meany = this.data.reduce((s, v) => s + v / this.window_size, 0); + this.slope = this.data.reduce((s, v, i) => s + (i - meanx) * (v - meany), 0) / + this.data.reduce((s, _, i) => s + (i - meanx) * (i - meanx), 0); + this.intercept = meany - this.slope * meanx; + this.meanv = meany; } } @@ -47,7 +75,7 @@ NSPlayer={ current:null, shuffle:0, repeat:0, - served_formats:{'ogg':{'mime':'audio/ogg; codecs=vorbis','disp':'ogg 224 kbps'},'flac':{'mime':'audio/flac','disp':'flac'},'opus':{'mime':'audio/ogg; codecs=opus','disp':'opus 96 kbps'},'m4a':{'mime':'audio/aac','disp':'aac 192kbps'}}, + served_formats:{'vorbis':{'mime':'audio/ogg; codecs=vorbis','disp':'ogg 224 kbps','ext':'ogg'},'flac':{'mime':'audio/flac','disp':'flac'},'opus':{'mime':'audio/ogg; codecs=opus','disp':'opus 96 kbps'},'aac':{'mime':'audio/aac','disp':'aac 192kbps','ext':'m4a'}}, get_preferred_or_default_format:function() { if (sh.getcookie('preferredformat') in this.served_formats) @@ -91,7 +119,8 @@ NSPlayer={ navigator.mediaSession.metadata=new MediaMetadata({title:this.tracks[id].title,album:this.plistname}); NSUI.set_highlighted(this.plistname,this.tracks[id].title); const fmt=NSPlayer.get_preferred_or_default_format(); - NSUI.audio.src=`//filestorage.chrisoft.org/music/${fmt}/${this.tracks[id].title}.${fmt}`; + const ext=(NSPlayer.served_formats[fmt].ext !== undefined) ? NSPlayer.served_formats[fmt].ext : fmt; + NSUI.audio.src=`//filestorage.chrisoft.org/music/${fmt}/${this.tracks[id].title}.${ext}`; NSUI.audio.load(); return NSUI.audio.play(); }, @@ -183,6 +212,15 @@ NSUI={ this.swformat=sh.elem('formatsw'); if(!(sh.getcookie('preferredformat') in NSPlayer.served_formats)) sh.setcookie('preferredformat',''); + NSUI.resize_canvas(); + try { + const ro = new ResizeObserver(() => { + NSUI.resize_canvas(); + }); + ro.observe(sh.elem("content")); + } catch(e) { + console.error(e); + } const fmt=NSPlayer.get_preferred_or_default_format(); const cantplay=(NSUI.audio.canPlayType(NSPlayer.served_formats[fmt].mime)=='')?' !':''; this.swformat.innerHTML=`[${NSPlayer.served_formats[fmt].disp}${cantplay}]`; @@ -215,7 +253,6 @@ NSUI={ if(NSUI.selectedplist) NSUI.switch_playlist(NSUI.selectedplist); }; - sh.elem('plistsw').onclick=NSUI.togglePlist; sh.elem('tsliderbase').onclick= sh.elem('tsliderbase').onmousemove=function(e) { @@ -268,16 +305,17 @@ NSUI={ return false; } if(e.key=='c') - if(NSUI.audio.audioTracks.length==2) - { - const t=NSUI.audio.currentTime; - NSUI.audio.audioTracks[0].enabled^=1; - NSUI.audio.audioTracks[1].enabled^=1; - NSUI.audio.currentTime=t; - } + return NSAudio.switchAudioTrack(); return true; }; }, + resize_canvas: function() + { + sh.elem("cvsdiv").style.width = `calc(100% - 1em - ${window.getComputedStyle(sh.elem("content")).marginLeft})`; + NSUI.canvas.width = NSUI.canvas.clientWidth * window.devicePixelRatio; + NSUI.canvas.height = NSUI.canvas.clientHeight * window.devicePixelRatio; + NSInk.inkPrepare(); + }, load_playlists:async function() { const moi=this; @@ -343,7 +381,8 @@ NSUI={ const a=sh.newelem('a'); a.innerHTML=list[i].title; const fmt=NSPlayer.get_preferred_or_default_format(); - a.href=`//filestorage.chrisoft.org/music/${fmt}/${list[i].title}.${fmt}`; + const ext=(NSPlayer.served_formats[fmt].ext !== undefined) ? NSPlayer.served_formats[fmt].ext : fmt; + a.href=`//filestorage.chrisoft.org/music/${fmt}/${list[i].title}.${ext}`; a.ord=i; a.onclick=function(e){e.preventDefault();NSUI.switch_track.bind(NSUI,this.ord)();}; l.appendChild(a); @@ -479,17 +518,27 @@ NSAudio={ }, connect:function() { - if(this.srcnode===null) + if(this.srcnode===null) this.srcnode=this.audioctx.createMediaElementSource(NSUI.audio); this.srcnode.connect(this.anlznode); this.anlznode.connect(this.audioctx.destination); - if(this.audioctx.state!="running")throw "resume required"; + if(this.audioctx.state!="running")throw "resume required"; }, + switchAudioTrack:function() + { + const a = NSUI.audio; + if (a.audioTracks.length != 2) return false; + const t = a.currentTime; + const e = a.audioTracks[0].enabled; + [a.audioTracks[0].enabled, a.audioTracks[1].enabled] = [!e, e]; + a.currentTime = t; + return true; + } }; NSVisualization={ nbinsp:10, - nbins:Math.pow(2,10), + nbins:Math.pow(2, 10), spectgrmw:1200, spectrw:0.7, spectrm:0.08125, @@ -497,18 +546,20 @@ NSVisualization={ cctx:null, spectgrmp:0, _61spbins:29, - _61spfintv:Math.pow(1024,1./29), - _61spbinw:9, - _61spaccel:.617274873, - _61spdamp:Math.pow(.617274873,6.17274873), + _61spbinw:5, + _61spaccel:.3617274873, + _61spdamp:0.1617174873, _61spvelcap:2*6.17274873, - _61spgvel:.025, - _61spelas:.617274873, - _61spf:6.17274873*6.17274873, - _61spelasth:.017274873, + _61spgvel:.06617274873, + _61spelas:.2617274873, + _61spf:61.7274873, + _61spelasth:.1617274873, _61spcaps:new Float32Array(29), _61spcapsv:new Float32Array(29), - _61spft:new Date(), + _61spft:performance.now(), + frms:0, + lastfpsupd:null, + fps:0, init:function() { window.requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame; @@ -541,6 +592,33 @@ NSVisualization={ } } }, + distr_log_bins:function(data, nbins, shift) + { + let ret = new Float32Array(nbins); + let binfreq = 0; + const cctx = NSVisualization.cctx; + //cctx.fillStyle=window.getComputedStyle(document.body).getPropertyValue("--principal-fg"); + const cw = NSUI.canvas.width; + for (let i = 0; i < nbins; ++i) + { + const lbin = Math.floor(binfreq); + binfreq = Math.pow(2, (i + shift) * NSVisualization.nbinsp / (nbins - 1 + shift)) - 1; + const rbin = Math.max(Math.floor(binfreq), lbin + 1); + //cctx.fillText(lbin, i / nbins * cw + 8, 60); + //cctx.fillText(rbin, i / nbins * cw + 8, 90); + const clamp0 = (x) => Math.max(0, x); + ret[i] = Math.pow(data. + slice(lbin, rbin + 1). + reduce( + (s, c) => s + + clamp0((c - NSAudio.anlznode.minDecibels) / + (NSAudio.anlznode.maxDecibels - NSAudio.anlznode.minDecibels)) / + (rbin - lbin + 1) + , 0), 2);//iS tHiS dBv^2? + //cctx.fillText(ret[i].toFixed(2), i / nbins * cw + 8, 120); + } + return ret; + }, update_61_spectrum:function() { const cctx=this.cctx,canvas=NSUI.canvas; @@ -548,29 +626,12 @@ NSVisualization={ try{ let freqdomv=new Float32Array(NSAudio.anlznode.frequencyBinCount); NSAudio.anlznode.getFloatFrequencyData(freqdomv); - let binl=Math.pow(2,(this._61spbinw-1)*this.nbinsp/(this._61spbins-1+this._61spbinw))-1; - let _61spfdomv=new Float32Array(this._61spbins); - const ft=new Date()-this._61spft; - this._61spft=new Date(); + let _61spfdomv = NSVisualization.distr_log_bins(freqdomv, this._61spbins, this._61spbinw); + const ft=performance.now() - this._61spft; + this._61spft=performance.now(); const rft=ft/1000*24; for(let i=0;i<this._61spbins;++i) { - let binr=Math.pow(2,(i+this._61spbinw)*this.nbinsp/(this._61spbins-1+this._61spbinw))-1; - if(Math.floor(binr)<=Math.floor(binl))binr=binl+1; - let binli=Math.floor(binl); - let binri=Math.floor(binr); - const clamp=(x)=>Math.max(0,Math.min(1,x)); - _61spfdomv[i]=Math.pow(freqdomv. - slice(binli,binri+1). - reduce( - (s,c)=>s+ - clamp( - (c-NSAudio.anlznode.minDecibels) - /(NSAudio.anlznode.maxDecibels-NSAudio.anlznode.minDecibels) - )/(binri-binli+1) - ,0),2);//iS tHiS dBv^2? - binl=binr; - if(ft>1000) { this._61spcaps[i]=0; @@ -578,24 +639,38 @@ NSVisualization={ continue; } let vel=this._61spgvel*this._61spcapsv[i]; - if(this._61spcaps[i]-vel*rft<=_61spfdomv[i]) + //cctx.fillStyle = this._61spcapsv[i] > 0 ? "#f00" : "#0f0"; + //cctx.fillText(Math.abs(this._61spcapsv[i]).toFixed(1), i / this._61spbins * canvas.width + 8, 120); + if (Number.isNaN(this._61spcaps[i]) || !Number.isFinite(this._61spcaps[i])) { + this._61spcaps[i] = _61spfdomv[i]; + this._61spcapsv[i] = 0; + } + if (this._61spcaps[i] - (vel < 0.5 ? vel * rft : 0) <= _61spfdomv[i]) { - let elf=0; - if(vel>this._61spgvel*this._61spvelcap) + if (!(this._61spcaps[i] < 1e-2 && this._61spcapsv[i] < 1e-2 && _61spfdomv[i] < 1e-2)) + { + let elf=0; + if(vel>this._61spgvel*this._61spvelcap) + { + vel=this._61spgvel*this._61spvelcap;//cap this so that Newton could rest in peace. + this._61spcapsv[i]=this._61spvelcap; + } + if(vel>rft*this._61spelasth) + elf=this._61spcapsv[i]*this._61spelas; + this._61spcapsv[i]=(this._61spcaps[i]-vel*rft-_61spfdomv[i])*this._61spf-elf; + this._61spcaps[i]=_61spfdomv[i]; + } else { - vel=this._61spgvel*this._61spvelcap;//cap this so that Newton could rest in peace. - this._61spcapsv[i]=this._61spvelcap; + this._61spcaps[i] = _61spfdomv[i]; + this._61spcapsv[i] = 0; } - if(vel>rft*this._61spelasth) - elf=this._61spcapsv[i]*this._61spelas; - this._61spcapsv[i]=(this._61spcaps[i]-vel*rft-_61spfdomv[i])*this._61spf-elf; - this._61spcaps[i]=_61spfdomv[i]; } else { this._61spcapsv[i]+=rft*(this._61spaccel-this._61spdamp*Math.sign(this._61spcapsv[i])*Math.pow(this._61spcapsv[i],2)); vel=this._61spgvel*this._61spcapsv[i]; - this._61spcaps[i]-=Math.min(rft*vel,this._61spcaps[i]); + this._61spcaps[i] -= Math.min(rft * vel,this._61spcaps[i]); + this._61spcaps[i] = Math.max(this._61spcaps[i], _61spfdomv[i]); } cctx.fillStyle=`rgba(70,130,180,${0.36+0.64*_61spfdomv[i]})`; @@ -653,6 +728,16 @@ NSVisualization={ }, updateVisualization:function() { + const self=NSVisualization; + const cctx=self.cctx; + ++self.frms; + if(Date.now()-self.lastfpsupd>500) + { + if(self.lastfpsupd) + self.fps=1000*self.frms/(Date.now()-self.lastfpsupd),self.frms=0; + self.lastfpsupd=Date.now(); + } + const ts=Date.now(); switch(NSUI.vissel.value) { case 'spectrum': @@ -670,7 +755,13 @@ NSVisualization={ case 'inkfountain': NSInk.update(); break; + default: + return; } + cctx.fillStyle=window.getComputedStyle(document.body).getPropertyValue("--principal-fg"); + cctx.font="2em 'CMU Typewriter Text w', 'CMU Typewriter Text', 'TeX Gyre Cursor', 'FreeMono', 'Courier New', Courier, monospace"; + const fpst=`FPS: ${self.fps.toFixed(1)}, update time ${Date.now()-ts} ms`; + cctx.fillText(fpst,0,24); if(NSUI.vissel.value!='none') requestAnimationFrame(NSVisualization.updateVisualization); } @@ -683,9 +774,13 @@ NSInk={ inkimg:[], ifcaps:[], nbinsif:128, + debug_render:false, + erms_tracker:new TrendTracker(8, 0), + freq_tracker:[], + max_droplets:1536, inkPrepare:function() { - for(let i=0;i<7;++i) + for(let i = 0; i < 7; ++i) { this.inkimg[i]=document.createElement('canvas'); this.inkimg[i].width=this.inkimg[i].height=10*window.devicePixelRatio; @@ -698,63 +793,146 @@ NSInk={ cctx.beginPath(); cctx.arc(5*window.devicePixelRatio,5*window.devicePixelRatio,5*window.devicePixelRatio,0,2*Math.PI); cctx.fill(); + this.freq_tracker[i] = new TrendTracker(8, 0); } for(let i=0;i<NSVisualization.nbins;++i)this.ifcaps[i]=0; this.nbinsif=NSVisualization.nbins/8; }, createInk:function(_vx,_vy,_c1,_c2) { - let f=false; for(let i=0;i<this.inks.length;++i) { if(!this.inks[i].active) - {this.inks[i]=new Ink(_vx,_vy,_c1,_c2);f=true;break;} + {this.inks[i]=new Ink(_vx,_vy,_c1,_c2);return;} } - if(!f&&this.inks.length<512)this.inks.push(new Ink(_vx,_vy,_c1,_c2)); + if (this.inks.length < NSInk.max_droplets) this.inks.push(new Ink(_vx, _vy, _c1, _c2)); }, - frms:0,lastfpsupd:null,fps:0, update:function() { const canvas=NSUI.canvas; - const cctx=canvas.getContext('2d'),ts=Date.now(); + const cctx=canvas.getContext('2d'); cctx.clearRect(0,0,canvas.width,canvas.height); - ++this.frms;if(Date.now()-this.lastfpsupd>500) - { - if(this.lastfpsupd) - this.fps=1000*this.frms/(Date.now()-this.lastfpsupd),this.frms=0; - this.lastfpsupd=Date.now(); - } + if (!NSAudio || !NSAudio.anlznode) return; + const origblend = cctx.globalCompositeOperation; + cctx.globalCompositeOperation = "screen"; try{ - let freqarr=new Uint8Array(NSAudio.anlznode.frequencyBinCount); - NSAudio.anlznode.getByteFrequencyData(freqarr); - for(let i=0;i<this.nbinsif;++i) + let amplarr = new Float32Array(NSAudio.anlznode.frequencyBinCount); + let freqarr = new Float32Array(NSAudio.anlznode.frequencyBinCount); + NSAudio.anlznode.getFloatTimeDomainData(amplarr); + NSAudio.anlznode.getFloatFrequencyData(freqarr); + + const rms = 10 * Math.log10(amplarr.reduce((s, a) => s += a * a / NSAudio.anlznode.frequencyBinCount, 0)); + const erms = Math.pow(Math.pow(10, rms / 10), .5); + this.erms_tracker.push(erms); + + const evals = NSVisualization.distr_log_bins(freqarr, 8, 2); + evals[6] += evals[7]; + + const clamped_lerp = function(v, imin, imax, omin, omax) { + if (v <= imin) return omin; + if (v >= imax) return omax; + const f = (v - imin) / (imax - imin); + return f * (omax - omin) + omin; + }; + + let base_emission_modifier = 1; + if (this.erms_tracker.slope < -0.015) + base_emission_modifier = clamped_lerp(this.erms_tracker.slope, -0.03, -0.015, 0.3, 1); + else if (this.erms_tracker.slope > 0.01) + base_emission_modifier = clamped_lerp(this.erms_tracker.slope, 0.01, 0.1, 1, 5); + const base_emission_factor = Math.max(1, Math.pow(erms * 8, 2)); + const base_velocity_factor = clamped_lerp(erms, 0.05, 0.4, 12, 80); + const base_veldamp_factor = clamped_lerp(erms, 0.1, 0.4, 0.005, 0.001); + + const freq_emission_factors = []; + const freq_emission_modifiers = []; + const freq_velocity_shift = []; + const freq_velocity_variances = []; + const actual_emission = []; + for(let i = 0; i < 7; ++i) { - let r=0; - for(let j=0;j<8;++j)r+=freqarr[i*8+j]; - r/=8.; - if(r-this.ifcaps[i]>7) + this.freq_tracker[i].push(evals[i]); + let r = evals[i] * 255; + + freq_emission_modifiers[i] = 1; + if (this.freq_tracker[i].slope < -0.01) + freq_emission_modifiers[i] = Math.pow(clamped_lerp(this.freq_tracker[i].slope, -0.03, -0.01, 0, 1), 2); + else if (this.freq_tracker[i].slope > 0.005) + freq_emission_modifiers[i] = clamped_lerp(this.freq_tracker[i].slope, 0.005, 0.05, 1, 5); + freq_emission_factors[i] = Math.pow(evals[i] * (i > 1 ? (i > 4 ? 20 : 10) : 7), 2) / 10; + freq_velocity_shift[i] = Math.pow(clamped_lerp(this.freq_tracker[i].slope, 0.005, 0.03, 4, 8), 1.5); + freq_velocity_variances[i] = Math.min(base_velocity_factor * 0.5, Math.pow(evals[i] * 10, 0.5)); + + actual_emission[i] = 0; + const sustained1 = Math.abs(this.freq_tracker[i].slope) < 0.00125 && (evals[i] * (i > 4 ? 2 : 1)) > 0.5; + const sustained2 = Math.abs(this.freq_tracker[i].slope) < 0.00075 && (evals[i] * (i > 4 ? 2 : 1)) > 0.3; + let emit = false; + emit |= (r - this.ifcaps[i] > 5); + emit |= (sustained1 || sustained2); + if (sustained1) freq_emission_factors[i] /= 5; + if (sustained2) freq_emission_factors[i] /= 10; + if (emit) { - let color=Math.floor(i*8.0/this.nbinsif),rad=Math.random()*Math.PI*2; - let ndrops=(128-i)/128.*3+1;ndrops*=(r/128.);ndrops=Math.floor(ndrops);if(ndrops<1)ndrops=1; - for(let k=0;k<ndrops;++k) + actual_emission[i] = base_emission_factor * base_emission_modifier * freq_emission_factors[i] * freq_emission_modifiers[i]; + const emission = actual_emission[i] < 0.075 ? 0 : Math.min(Math.max(Math.floor(actual_emission[i]), 1), 24); + for(let k = 0; k < emission; ++k) { - this.createInk(((r-this.ifcaps[i]-7)/32*24+12)*Math.cos(rad),((r-this.ifcaps[i]-7)/32*24+12)*Math.sin(rad),color); - rad=Math.random()*Math.PI*2; + const rad = Math.random() * Math.PI * 2; + const vel = (base_velocity_factor + freq_velocity_shift[i]) * 0.25 + (Math.random() * 2 - 1) * freq_velocity_variances[i]; + this.createInk(vel * Math.cos(rad), vel * Math.sin(rad), i, base_veldamp_factor); } } - if(r>this.ifcaps[i])this.ifcaps[i]=r;else this.ifcaps[i]-=2; + if (r > this.ifcaps[i]) this.ifcaps[i] = r; else this.ifcaps[i] -= 3; + } + for (let i = 0; i < 7; ++i) + { + const multi = [1, 1, 1.1, 1.25, 1.65, 2.5, 2.15]; + const v = Math.pow(Math.min(evals[i] * multi[i], 1), 2); + const r = 10 + 110 * v; + cctx.fillStyle = `${NSInk.ic2[i].slice(0, -4)}${0.3 + 0.5 * v})`; + cctx.beginPath(); + cctx.ellipse(NSUI.canvas.width / 2, NSUI.canvas.height / 2, r, r, 0, 0, 2 * Math.PI); + cctx.fill(); + } + if (this.debug_render) { + const debug_render_bars = function(data, n, max, bipolar, style) { + const cw = NSUI.canvas.width; + const ch = NSUI.canvas.height; + for (let i = 0; i < n; ++i) { + cctx.fillStyle = Array.isArray(style) ? style[i] : style; + const h = Math.min(Math.max(-data[i] / max, -1), 1); + cctx.fillRect(i * (cw / n), bipolar ? ch / 2 : ch, cw / n * 0.96, h * ch * 0.6); + } + } + debug_render_bars(evals, 7, 1, false, NSInk.ic1); + const fsl = []; + for (let i = 0; i < 7; ++i) fsl.push(this.freq_tracker[i].slope); + debug_render_bars(fsl, 7, 0.1, true, NSInk.ic2); + cctx.fillStyle = "rgba(70,130,180)"; + cctx.fillRect(0, 0, erms * NSUI.canvas.width, 10); + cctx.fillRect(NSUI.canvas.width / 2, 10, 10 * this.erms_tracker.slope * NSUI.canvas.width / 2, 10); + cctx.fillStyle=window.getComputedStyle(document.body).getPropertyValue("--principal-fg"); + cctx.font="2em 'CMU Typewriter Text w', 'CMU Typewriter Text', 'TeX Gyre Cursor', 'FreeMono', 'Courier New', Courier, monospace"; + cctx.fillText(`${erms.toFixed(4).padStart(7)} ${this.erms_tracker.slope.toFixed(6).padStart(9)}`,0,90); + cctx.fillText(`${base_emission_factor.toFixed(3).padStart(6)} ${base_emission_modifier.toFixed(3).padStart(6)}`,0,120); + for (let i = 0; i < 7; ++i) { + cctx.fillStyle = NSInk.ic1[i]; + cctx.fillText(evals[i].toFixed(2), i / 7 * NSUI.canvas.width + 8, 180); + cctx.fillText(this.freq_tracker[i].slope.toFixed(4).padStart(7), i / 7 * NSUI.canvas.width + 8, 210); + cctx.fillText(actual_emission[i].toFixed(4).padStart(7), i / 7 * NSUI.canvas.width + 8, 240); + } } }catch(e){ cctx.clearRect(0,0,canvas.width,canvas.height); + console.error(e); } - const tu=Date.now(); let aa=0; for(let i=0;i<this.inks.length;++i) - if(this.inks[i].active){this.inks[i].update();this.inks[i].draw(cctx);++aa;} - cctx.fillStyle='#000'; - cctx.font="1em 'CMU Typewriter Text w', 'CMU Typewriter Text', 'TeX Gyre Cursor', 'FreeMono', 'Courier New', Courier, monospace"; - cctx.fillText('Active droplets '+aa+', '+this.fps.toFixed(2)+' FPS',0,10); - cctx.fillText('Update time '+(tu-ts)+'ms, render time '+(Date.now()-tu)+'ms',0,24); + if(this.inks[i].active){this.inks[i].draw(cctx);this.inks[i].update();++aa;} + cctx.globalCompositeOperation = origblend; + cctx.fillStyle=window.getComputedStyle(document.body).getPropertyValue("--principal-fg"); + cctx.font="2em 'CMU Typewriter Text w', 'CMU Typewriter Text', 'TeX Gyre Cursor', 'FreeMono', 'Courier New', Courier, monospace"; + cctx.fillText(`Active droplets ${aa}`,0,52); } }; @@ -830,3 +1008,4 @@ function init() NSUI.vissel.value=sh.getcookie('playervisualization'); requestAnimationFrame(NSVisualization.updateVisualization); } +document.addEventListener("DOMContentLoaded", init); diff --git a/libs/music/player.d/playlists/0 b/libs/music/player.d/playlists/0 deleted file mode 100644 index 89427c1..0000000 --- a/libs/music/player.d/playlists/0 +++ /dev/null @@ -1,64 +0,0 @@ -Arranged -21medley-samidare-concerto -Alice Miniature -An Ordeal From God_remix -Bad Apple!! -BadAppleOrchestral -Beatrix - Barn Aid Project -Complete Darkness -Heian Hartmann's Butterfly -Maple Dream... -NecroFantasia 2 in 1 -Palkorum -Peaceful Romancer -Reincarnation -Romantic Children -Samidare-stage4+boss_arrange -Silk Road Alice_remix -Strawberry Crisis!! -Tabula rasa~空白少女 -The Grimore of Alice -The Last Judgement -The Last Judgement_samidare_remix -The Legend of KAGE -U.N.Hartmann_samidare -Voyager Issac's Butterfly -Witching Dream -かわいい悪魔~Innocence -アリスマエステラ -サブマリン幻視幻覚 -トロヤ群の密林_jungle -ハルトマンの妖怪少女_cdversion -ラクトガール~少女密室_cdversion_remix -ラポルトコメンスメント~Yggdrasil_remix -上海紅茶館~Chinese Tea_cdver_remix -不思議の国のアリス -今宵は飄逸なエゴイスト~Egoistic Flowers_retromix -反逆の烽火~Revolutionary War_remix -嘲りの輪舞曲~Sneer of Woods_remix -六十年目の東方裁判~Fate of Sixty Years_cdversion_remix -启程by61 -夢想時空 -夢消失~Lost Dream -妖精たちの輪舞曲_remix -妖魔夜行~Mystic Flier -少女綺想曲~Capriccio -幽夢~Inanimate Dream -御伽の国の鬼が島_remix -恋色マジック -悔恨の洞穴~Regret and Confession_remix -旅途_新乱搞 -星の器~Casket of Star -東方妖恋談 -東方怪奇談 -永遠の巫女 -無何有の郷~Deep Mountain_remix_2 -真紅の少女~Crimson Dead!! -眠れる恐怖~Sleeping Terror -神話幻想~Infinite Being -禁じざるをえない遊戯 -禁断の魔法~Forbidden Magic -薄命なる少女~Sentence of Death_remix -薄命なる少女~Sentence of Death_stylemedley -裏切りの少女~Judas Kiss -霊戦~Perdition Crisis diff --git a/libs/music/player.d/playlists/1 b/libs/music/player.d/playlists/1 deleted file mode 100644 index 0ccb610..0000000 --- a/libs/music/player.d/playlists/1 +++ /dev/null @@ -1,7 +0,0 @@ -Original -45canonrev -CanonTechno -Maritima Sylva -noname03_preview -Spoolka -The Ware Rosette diff --git a/libs/music/player.d/playlists/10 b/libs/music/player.d/playlists/10 deleted file mode 100644 index b8a5646..0000000 --- a/libs/music/player.d/playlists/10 +++ /dev/null @@ -1,22 +0,0 @@ -Remix - th08 -永夜抄~Eastern Night._remix -幻視の夜~Ghostly Eyes_remix -蠢々秋月~Mooned Insect_remix -夜雀の歌声~Night Bird_remix -もう歌しか聞こえない_remix -懐かしき東方の血~Old World_remix -プレインエイジア_remix -永夜の報い~Imperishable Night._remix -少女綺想曲~Dream Battle_remix -恋色マスタースパーク_remix -シンデレラケージ~Kagome-Kagome_remix -狂気の瞳~Invisible Full Moon_remix -ヴォヤージュ1969_remix -千年幻想郷~History of the Moon_remix -竹取飛翔~Lunatic Princess_remix -ヴォヤージュ1970_remix -エクステンドアッシュ~蓬莱人_remix -月まで届け、不死の煙_remix -月見草_remix -Eternal Dream~幽玄の槭樹_remix -東方妖怪小町_remix diff --git a/libs/music/player.d/playlists/11 b/libs/music/player.d/playlists/11 deleted file mode 100644 index 5b74b40..0000000 --- a/libs/music/player.d/playlists/11 +++ /dev/null @@ -1,18 +0,0 @@ -Remix - th10 (.5) -人恋し神様~Romantic Fall_remix -稲田姫様に叱られるから_remix -厄神様の通り道~Dark Road_remix -運命のダークサイド_remix -神々が恋した幻想郷_remix -芥川龍之介の河童~Candid Friend_remix -フォールオブフォール~秋めく滝_remix -妖怪の山~Mysterious Mountain_remix -少女が見た日本の原風景_remix -信仰は儚き人間の為に_remix -御柱の墓場~Grave of Being_remix -神さびた古戦場~Suwa Foughten Field_remix -明日ハレの日、ケの昨日_remix -ネイティブフェイス_remix -黒い海に紅く~Legendary Fish_remix -有頂天変~Wonderful Heaven_remix -幼心地の有頂天_remix diff --git a/libs/music/player.d/playlists/12 b/libs/music/player.d/playlists/12 deleted file mode 100644 index fd24aaa..0000000 --- a/libs/music/player.d/playlists/12 +++ /dev/null @@ -1,13 +0,0 @@ -Remix - th11 -渡る者の途絶えた橋_remix -緑眼のジェラシー_remix -旧地獄街道を行く_remix -華のさかづき大江山_remix -ハートフェルトファンシー_remix -少女さとり~3rd eye._samidare_remix -廃獄ララバイ_remix -死体旅行~Be of good cheer!_remix -業火マントル_remix -霊知の太陽信仰~Nuclear Fusion_remix -ラストリモート_remix -ハルトマンの妖怪少女_remix diff --git a/libs/music/player.d/playlists/13 b/libs/music/player.d/playlists/13 deleted file mode 100644 index 3e7ff4c..0000000 --- a/libs/music/player.d/playlists/13 +++ /dev/null @@ -1,10 +0,0 @@ -Remix - th12 -春の湊に_remix -小さな小さな賢将_remix -万年置き傘にご注意を_remix -キャプテン・ムラサ_remix -虎柄の毘沙門天_remix -法界の火_remix -感情の摩天楼~Cosmic Mind_remix -夜空のユーフォーロマンス_remix -平安のエイリアン_remix diff --git a/libs/music/player.d/playlists/2 b/libs/music/player.d/playlists/2 deleted file mode 100644 index d9b9219..0000000 --- a/libs/music/player.d/playlists/2 +++ /dev/null @@ -1,16 +0,0 @@ -Saigen - th06 -ほおずきみたいに紅い魂 -妖魔夜行 -ルーネイトエルフ -おてんば恋娘 -上海紅茶館 ~ Chinese Tea -明治十七年の上海アリス -ヴワル魔法図書館 -ラクトガール ~ 少女密室 -メイドと血の懐中時計 -月時計 ~ ルナ·ダイアル -ツェペシュの幼き末裔 -亡き王女の為のセプテット -魔法少女達の百年祭 -U.N.オーエンは彼女なのか? -紅楼 ~ Eastern Dream.. diff --git a/libs/music/player.d/playlists/3 b/libs/music/player.d/playlists/3 deleted file mode 100644 index 7cc147f..0000000 --- a/libs/music/player.d/playlists/3 +++ /dev/null @@ -1,20 +0,0 @@ -Saigen - th07 -妖々夢 ~ Snow or Cherry Petal -無何有の郷 ~ Deep Mountain -クリスタライズシルバー -遠野幻想物語 -ティアオイエツォン(withered leaf) -ブクレシュティの人形師 -人形裁判 ~ 人の形弄びし少女 -天空の花の都 -幽霊楽団 ~ Phantom Ensemble -東方妖々夢 ~ Ancient Temple -広有射怪鳥事 ~ Till When? -アルティメットトゥルース -幽雅に咲かせ、墨染の桜 ~ Border of Life -ボーダーオブライフ -妖々跋扈 -少女幻葬 ~ Necro-Fantasy -妖々跋扈 ~ Who done it! -ネクロファンタジア -さくらさくら ~ Japanize Dream... diff --git a/libs/music/player.d/playlists/4 b/libs/music/player.d/playlists/4 deleted file mode 100644 index cf843ba..0000000 --- a/libs/music/player.d/playlists/4 +++ /dev/null @@ -1,20 +0,0 @@ -Saigen - th08 -幻視の夜~Ghostly Eyes
-蠢々秋月 ~ Mooned Insect
-夜雀の歌声~Night Bird
-もう歌しか聞こえない
-懐かしき東方の血~Old World
-プレインエイジア
-永夜の報い ~ Imperishable Night
-少女綺想曲~Dream Battle
-恋色マスタースパーク
-シンデレラケージ ~ Kagome-Kagome
-狂気の瞳 ~ Invisible Full Moon
-ヴォヤージュ1969
-千年幻想郷 ~ History of the Moon
-竹取飛翔 ~ Lunatic Princess
-ヴォヤージュ1970
-エクステンドアッシュ ~ 蓬莱人
-月まで届け、不死の煙
-Eternal Dream ~ 幽玄の槭樹
-東方妖怪小町 diff --git a/libs/music/player.d/playlists/5 b/libs/music/player.d/playlists/5 deleted file mode 100644 index a7d504a..0000000 --- a/libs/music/player.d/playlists/5 +++ /dev/null @@ -1,13 +0,0 @@ -Saigen - th10 -人恋し神様 ~ Romantic Fall -稲田姫様に叱られるから -厄神樣の通り道~Dark Road -運命のダークサイド -神々が恋した幻想郷 -芥川龍之介の河童 ~ Candid Friend -妖怪の山 ~ Mysterious Mountain -信仰は儚き人間の為に -御柱の墓場~Grave of Being -神さびた古戦場 ~ Suwa Foughten Field -明日ハレの日、ケの昨日 -ネイティブフェイス diff --git a/libs/music/player.d/playlists/6 b/libs/music/player.d/playlists/6 deleted file mode 100644 index 9818493..0000000 --- a/libs/music/player.d/playlists/6 +++ /dev/null @@ -1,10 +0,0 @@ -Saigen - th11 -旧地獄街道を行く -華のさかづき大江山
-ハートフェルトファンシー
-少女さとり ~ 3rd eye.
-廃獄ララバイ
-業火マントル
-霊知の太陽信仰~Nuclear Fusion
-ラストリモート
-ハルトマンの妖怪少女
diff --git a/libs/music/player.d/playlists/7 b/libs/music/player.d/playlists/7 deleted file mode 100644 index 01cdd4d..0000000 --- a/libs/music/player.d/playlists/7 +++ /dev/null @@ -1,31 +0,0 @@ -Saigen - misc -Demystify Feast -春色小径~Colorful Path -オリエンタルダークフライト -フラワリングナイト -おてんば恋娘の冒険 -六十年目の東方裁判 ~ Fate of Sixty Years -東の国の眠らない夜 -風神少女 -黒い海に紅く~Legendary Fish -有頂天変 ~ Wonderful Heaven -幼心地の有頂天 -春の湊に_samidare -小さな小さな賢将 -万年置き傘にご注意を -キャプテン・ムラサ -虎柄の毘沙門天 -感情の摩天楼 ~ Cosmic Mind -平安のエイリアン -可愛い大戦争のリフレーン -妖精大戦争 ~ Fairy Wars -ゴーストリード -古きユアンシェン -佐渡の二ッ岩 -華狭間のバトルフィールド -ラストオカルティズム~現し世の秘術師 -永遠の三日天下 -永遠の春夢 -星条旗のピエロ -ピュアヒューリーズ~心の在処 -パンデモニックプラネット diff --git a/libs/music/player.d/playlists/8 b/libs/music/player.d/playlists/8 deleted file mode 100644 index 76d8c95..0000000 --- a/libs/music/player.d/playlists/8 +++ /dev/null @@ -1,18 +0,0 @@ -Remix - th06 -赤より紅い夢_remix -ほおずきみたいに紅い魂_remix -妖魔夜行_remix -ルーネイトエルフ_remix -おてんば恋娘_remix -上海紅茶館~Chinese Tea_remix -明治十七年の上海アリス_remix -ヴワル魔法図書館_remix -ラクトガール~少女密室_remix -メイドと血の懐中時計_remix -月時計~ルナ・ダイアル_remix -ツェペシュの幼き末裔_remix -亡き王女の為のセプテット_remix -魔法少女達の百年祭_remix -U.N.オーエンは彼女なのか?_remix -紅より儚い永遠_remix -紅楼~Eastern Dream..._remix diff --git a/libs/music/player.d/playlists/9 b/libs/music/player.d/playlists/9 deleted file mode 100644 index 3e68fdb..0000000 --- a/libs/music/player.d/playlists/9 +++ /dev/null @@ -1,23 +0,0 @@ -Remix - th07 -妖々夢~Snow or Cherry Petal_remix -無何有の郷~Deep Mountain_remix -クリスタライズシルバー_remix -遠野幻想物語_remix -ティアオイエツォン(withered leaf)_remix -ブクレシュティの人形師_remix -人形裁判~人の形弄びし少女_remix -天空の花の都_remix -幽霊楽団~Phantom Ensemble_remix -東方妖々夢~Ancient Temple_remix -広有射怪鳥事~Till When?_remix -アルティメットトゥルース_remix -幽雅に咲かせ、墨染の桜~Border of Life_remix -ボーダーオブライフ_remix -妖々跋扈_remix -少女幻葬~Necro-Fantasy_remix -妖々跋扈~Who done it!_remix -ネクロファンタジア_remix -春風の夢_remix -さくらさくら~Japanize Dream..._remix -妖々跋扈~Speed Fox!_remix -過去の花~Fairy of Flower_remix diff --git a/libs/music/player.d/playlists/Arranged.playlist b/libs/music/player.d/playlists/Arranged.playlist index c227083..fae7f88 120000..100644 --- a/libs/music/player.d/playlists/Arranged.playlist +++ b/libs/music/player.d/playlists/Arranged.playlist @@ -1 +1,64 @@ -0
\ No newline at end of file +Arranged +21medley-samidare-concerto +Alice Miniature +An Ordeal From God_remix +Bad Apple!! +BadAppleOrchestral +Beatrix - Barn Aid Project +Complete Darkness +Heian Hartmann's Butterfly +Maple Dream... +Minua Sobole ~ Okambuchi Folk Song - SA Mix +NecroFantasia 2 in 1 +Palkorum +Peaceful Romancer +Reincarnation +Romantic Children +Samidare-stage4+boss_arrange +Strawberry Crisis!! +Tabula rasa~空白少女 +The Grimore of Alice +The Last Judgement +The Last Judgement_samidare_remix +The Legend of KAGE +U.N.Hartmann_samidare +Voyager Issac's Butterfly +Witching Dream +かわいい悪魔~Innocence +アリスマエステラ +サブマリン幻視幻覚 +トロヤ群の密林_jungle +ハルトマンの妖怪少女_cdversion +ラクトガール~少女密室_cdversion_remix +ラポルトコメンスメント~Yggdrasil_remix +上海紅茶館~Chinese Tea_cdver_remix +不思議の国のアリス +今宵は飄逸なエゴイスト~Egoistic Flowers_retromix +反逆の烽火~Revolutionary War_remix +嘲りの輪舞曲~Sneer of Woods_remix +六十年目の東方裁判~Fate of Sixty Years_cdversion_remix +启程by61 +夢想時空 +夢消失~Lost Dream +妖精たちの輪舞曲_remix +妖魔夜行~Mystic Flier +少女綺想曲~Capriccio +幽夢~Inanimate Dream +御伽の国の鬼が島_remix +恋色マジック +悔恨の洞穴~Regret and Confession_remix +旅途_新乱搞 +星の器~Casket of Star +東方妖恋談 +東方怪奇談 +永遠の巫女 +無何有の郷~Deep Mountain_remix_2 +真紅の少女~Crimson Dead!! +眠れる恐怖~Sleeping Terror +神話幻想~Infinite Being +禁じざるをえない遊戯 +禁断の魔法~Forbidden Magic +薄命なる少女~Sentence of Death_remix +薄命なる少女~Sentence of Death_stylemedley +裏切りの少女~Judas Kiss +霊戦~Perdition Crisis diff --git a/libs/music/player.d/playlists/Converted-Modules.playlist b/libs/music/player.d/playlists/Converted-Modules.playlist index b925524..32e2b96 100644 --- a/libs/music/player.d/playlists/Converted-Modules.playlist +++ b/libs/music/player.d/playlists/Converted-Modules.playlist @@ -1,17 +1,22 @@ Converted-Modules +Beek - Blue Slide - MIDI Edition +Beek + Mick Rippon - Sexy Satellite - MIDI Edition Carl Larsson - Seasons' Passing - MIDI Edition Carl Larsson - The Steadfast - MIDI Edition Carl Larsson - Trickster - MIDI Edition Carl Larsson - Wake - MIDI Edition Carl Larsson - Waylands - MIDI Edition Chris Jarvis - Northern Sky - MIDI Edition +Chris Jarvis - Pale Dreams - MIDI Edition Dan Nyman - Winds Of Compositions - MIDI Edition David Lenaerts - Under the Autumn Tree - MIDI Remix DipA - A Bard's Tale... - MIDI Edition DipA - A Bard's Tale... - SD Edition DreaMSectioN - One Last Hope - MIDI Edition HyoChan - Farewell, My Friend +Jeroen Tel + Thomas Mogensen - Rubicon Title Theme - SD Edition Mads Orbesen Troest - Tick Tack Toe - MIDI Edition +Mick Rippon - Pleading - MIDI Edition minomus - Quicksilver - MIDI Edition Noby - Teh Windows Medley - XV Edition Reed - Clamberdown - MIDI Edition @@ -19,6 +24,8 @@ Sphenx - Far Space Dance - MIDI Edition Sphenx - Flutana Variata - MIDI Edition Sphenx - The Awakening of Evil - MIDI Edition Sphenx - The Last Morning - MIDI Edition +Thomas Mogensen - Get the Fuck out of My Life - SD Edition +Thomas Mogensen - I Won't Tell - SD Edition Traven - Pocket - SD Edition Traven - Pocket - XV Edition Warder - Carra's Lament - MIDI Edition diff --git a/libs/music/player.d/playlists/Original.playlist b/libs/music/player.d/playlists/Original.playlist index 56a6051..0ccb610 120000..100644 --- a/libs/music/player.d/playlists/Original.playlist +++ b/libs/music/player.d/playlists/Original.playlist @@ -1 +1,7 @@ -1
\ No newline at end of file +Original +45canonrev +CanonTechno +Maritima Sylva +noname03_preview +Spoolka +The Ware Rosette diff --git a/libs/music/player.d/playlists/Remix - th06.playlist b/libs/music/player.d/playlists/Remix - th06.playlist index 301160a..76d8c95 120000..100644 --- a/libs/music/player.d/playlists/Remix - th06.playlist +++ b/libs/music/player.d/playlists/Remix - th06.playlist @@ -1 +1,18 @@ -8
\ No newline at end of file +Remix - th06 +赤より紅い夢_remix +ほおずきみたいに紅い魂_remix +妖魔夜行_remix +ルーネイトエルフ_remix +おてんば恋娘_remix +上海紅茶館~Chinese Tea_remix +明治十七年の上海アリス_remix +ヴワル魔法図書館_remix +ラクトガール~少女密室_remix +メイドと血の懐中時計_remix +月時計~ルナ・ダイアル_remix +ツェペシュの幼き末裔_remix +亡き王女の為のセプテット_remix +魔法少女達の百年祭_remix +U.N.オーエンは彼女なのか?_remix +紅より儚い永遠_remix +紅楼~Eastern Dream..._remix diff --git a/libs/music/player.d/playlists/Remix - th07.playlist b/libs/music/player.d/playlists/Remix - th07.playlist index f11c82a..3e68fdb 120000..100644 --- a/libs/music/player.d/playlists/Remix - th07.playlist +++ b/libs/music/player.d/playlists/Remix - th07.playlist @@ -1 +1,23 @@ -9
\ No newline at end of file +Remix - th07 +妖々夢~Snow or Cherry Petal_remix +無何有の郷~Deep Mountain_remix +クリスタライズシルバー_remix +遠野幻想物語_remix +ティアオイエツォン(withered leaf)_remix +ブクレシュティの人形師_remix +人形裁判~人の形弄びし少女_remix +天空の花の都_remix +幽霊楽団~Phantom Ensemble_remix +東方妖々夢~Ancient Temple_remix +広有射怪鳥事~Till When?_remix +アルティメットトゥルース_remix +幽雅に咲かせ、墨染の桜~Border of Life_remix +ボーダーオブライフ_remix +妖々跋扈_remix +少女幻葬~Necro-Fantasy_remix +妖々跋扈~Who done it!_remix +ネクロファンタジア_remix +春風の夢_remix +さくらさくら~Japanize Dream..._remix +妖々跋扈~Speed Fox!_remix +過去の花~Fairy of Flower_remix diff --git a/libs/music/player.d/playlists/Remix - th08.playlist b/libs/music/player.d/playlists/Remix - th08.playlist index 9a03714..b8a5646 120000..100644 --- a/libs/music/player.d/playlists/Remix - th08.playlist +++ b/libs/music/player.d/playlists/Remix - th08.playlist @@ -1 +1,22 @@ -10
\ No newline at end of file +Remix - th08 +永夜抄~Eastern Night._remix +幻視の夜~Ghostly Eyes_remix +蠢々秋月~Mooned Insect_remix +夜雀の歌声~Night Bird_remix +もう歌しか聞こえない_remix +懐かしき東方の血~Old World_remix +プレインエイジア_remix +永夜の報い~Imperishable Night._remix +少女綺想曲~Dream Battle_remix +恋色マスタースパーク_remix +シンデレラケージ~Kagome-Kagome_remix +狂気の瞳~Invisible Full Moon_remix +ヴォヤージュ1969_remix +千年幻想郷~History of the Moon_remix +竹取飛翔~Lunatic Princess_remix +ヴォヤージュ1970_remix +エクステンドアッシュ~蓬莱人_remix +月まで届け、不死の煙_remix +月見草_remix +Eternal Dream~幽玄の槭樹_remix +東方妖怪小町_remix diff --git a/libs/music/player.d/playlists/Remix - th10 (.5).playlist b/libs/music/player.d/playlists/Remix - th10 (.5).playlist index 9d60796..5b74b40 120000..100644 --- a/libs/music/player.d/playlists/Remix - th10 (.5).playlist +++ b/libs/music/player.d/playlists/Remix - th10 (.5).playlist @@ -1 +1,18 @@ -11
\ No newline at end of file +Remix - th10 (.5) +人恋し神様~Romantic Fall_remix +稲田姫様に叱られるから_remix +厄神様の通り道~Dark Road_remix +運命のダークサイド_remix +神々が恋した幻想郷_remix +芥川龍之介の河童~Candid Friend_remix +フォールオブフォール~秋めく滝_remix +妖怪の山~Mysterious Mountain_remix +少女が見た日本の原風景_remix +信仰は儚き人間の為に_remix +御柱の墓場~Grave of Being_remix +神さびた古戦場~Suwa Foughten Field_remix +明日ハレの日、ケの昨日_remix +ネイティブフェイス_remix +黒い海に紅く~Legendary Fish_remix +有頂天変~Wonderful Heaven_remix +幼心地の有頂天_remix diff --git a/libs/music/player.d/playlists/Remix - th11.playlist b/libs/music/player.d/playlists/Remix - th11.playlist index 3cacc0b..fd24aaa 120000..100644 --- a/libs/music/player.d/playlists/Remix - th11.playlist +++ b/libs/music/player.d/playlists/Remix - th11.playlist @@ -1 +1,13 @@ -12
\ No newline at end of file +Remix - th11 +渡る者の途絶えた橋_remix +緑眼のジェラシー_remix +旧地獄街道を行く_remix +華のさかづき大江山_remix +ハートフェルトファンシー_remix +少女さとり~3rd eye._samidare_remix +廃獄ララバイ_remix +死体旅行~Be of good cheer!_remix +業火マントル_remix +霊知の太陽信仰~Nuclear Fusion_remix +ラストリモート_remix +ハルトマンの妖怪少女_remix diff --git a/libs/music/player.d/playlists/Remix - th12.playlist b/libs/music/player.d/playlists/Remix - th12.playlist index ca7bf83..3e7ff4c 120000..100644 --- a/libs/music/player.d/playlists/Remix - th12.playlist +++ b/libs/music/player.d/playlists/Remix - th12.playlist @@ -1 +1,10 @@ -13
\ No newline at end of file +Remix - th12 +春の湊に_remix +小さな小さな賢将_remix +万年置き傘にご注意を_remix +キャプテン・ムラサ_remix +虎柄の毘沙門天_remix +法界の火_remix +感情の摩天楼~Cosmic Mind_remix +夜空のユーフォーロマンス_remix +平安のエイリアン_remix diff --git a/libs/music/player.d/playlists/Saigen - misc.playlist b/libs/music/player.d/playlists/Saigen - misc.playlist index c793025..01cdd4d 120000..100644 --- a/libs/music/player.d/playlists/Saigen - misc.playlist +++ b/libs/music/player.d/playlists/Saigen - misc.playlist @@ -1 +1,31 @@ -7
\ No newline at end of file +Saigen - misc +Demystify Feast +春色小径~Colorful Path +オリエンタルダークフライト +フラワリングナイト +おてんば恋娘の冒険 +六十年目の東方裁判 ~ Fate of Sixty Years +東の国の眠らない夜 +風神少女 +黒い海に紅く~Legendary Fish +有頂天変 ~ Wonderful Heaven +幼心地の有頂天 +春の湊に_samidare +小さな小さな賢将 +万年置き傘にご注意を +キャプテン・ムラサ +虎柄の毘沙門天 +感情の摩天楼 ~ Cosmic Mind +平安のエイリアン +可愛い大戦争のリフレーン +妖精大戦争 ~ Fairy Wars +ゴーストリード +古きユアンシェン +佐渡の二ッ岩 +華狭間のバトルフィールド +ラストオカルティズム~現し世の秘術師 +永遠の三日天下 +永遠の春夢 +星条旗のピエロ +ピュアヒューリーズ~心の在処 +パンデモニックプラネット diff --git a/libs/music/player.d/playlists/Saigen - th06.playlist b/libs/music/player.d/playlists/Saigen - th06.playlist index d8263ee..d9b9219 120000..100644 --- a/libs/music/player.d/playlists/Saigen - th06.playlist +++ b/libs/music/player.d/playlists/Saigen - th06.playlist @@ -1 +1,16 @@ -2
\ No newline at end of file +Saigen - th06 +ほおずきみたいに紅い魂 +妖魔夜行 +ルーネイトエルフ +おてんば恋娘 +上海紅茶館 ~ Chinese Tea +明治十七年の上海アリス +ヴワル魔法図書館 +ラクトガール ~ 少女密室 +メイドと血の懐中時計 +月時計 ~ ルナ·ダイアル +ツェペシュの幼き末裔 +亡き王女の為のセプテット +魔法少女達の百年祭 +U.N.オーエンは彼女なのか? +紅楼 ~ Eastern Dream.. diff --git a/libs/music/player.d/playlists/Saigen - th07.playlist b/libs/music/player.d/playlists/Saigen - th07.playlist index e440e5c..7cc147f 120000..100644 --- a/libs/music/player.d/playlists/Saigen - th07.playlist +++ b/libs/music/player.d/playlists/Saigen - th07.playlist @@ -1 +1,20 @@ -3
\ No newline at end of file +Saigen - th07 +妖々夢 ~ Snow or Cherry Petal +無何有の郷 ~ Deep Mountain +クリスタライズシルバー +遠野幻想物語 +ティアオイエツォン(withered leaf) +ブクレシュティの人形師 +人形裁判 ~ 人の形弄びし少女 +天空の花の都 +幽霊楽団 ~ Phantom Ensemble +東方妖々夢 ~ Ancient Temple +広有射怪鳥事 ~ Till When? +アルティメットトゥルース +幽雅に咲かせ、墨染の桜 ~ Border of Life +ボーダーオブライフ +妖々跋扈 +少女幻葬 ~ Necro-Fantasy +妖々跋扈 ~ Who done it! +ネクロファンタジア +さくらさくら ~ Japanize Dream... diff --git a/libs/music/player.d/playlists/Saigen - th08.playlist b/libs/music/player.d/playlists/Saigen - th08.playlist index bf0d87a..cf843ba 120000..100644 --- a/libs/music/player.d/playlists/Saigen - th08.playlist +++ b/libs/music/player.d/playlists/Saigen - th08.playlist @@ -1 +1,20 @@ -4
\ No newline at end of file +Saigen - th08 +幻視の夜~Ghostly Eyes
+蠢々秋月 ~ Mooned Insect
+夜雀の歌声~Night Bird
+もう歌しか聞こえない
+懐かしき東方の血~Old World
+プレインエイジア
+永夜の報い ~ Imperishable Night
+少女綺想曲~Dream Battle
+恋色マスタースパーク
+シンデレラケージ ~ Kagome-Kagome
+狂気の瞳 ~ Invisible Full Moon
+ヴォヤージュ1969
+千年幻想郷 ~ History of the Moon
+竹取飛翔 ~ Lunatic Princess
+ヴォヤージュ1970
+エクステンドアッシュ ~ 蓬莱人
+月まで届け、不死の煙
+Eternal Dream ~ 幽玄の槭樹
+東方妖怪小町 diff --git a/libs/music/player.d/playlists/Saigen - th10.playlist b/libs/music/player.d/playlists/Saigen - th10.playlist index 7813681..a7d504a 120000..100644 --- a/libs/music/player.d/playlists/Saigen - th10.playlist +++ b/libs/music/player.d/playlists/Saigen - th10.playlist @@ -1 +1,13 @@ -5
\ No newline at end of file +Saigen - th10 +人恋し神様 ~ Romantic Fall +稲田姫様に叱られるから +厄神樣の通り道~Dark Road +運命のダークサイド +神々が恋した幻想郷 +芥川龍之介の河童 ~ Candid Friend +妖怪の山 ~ Mysterious Mountain +信仰は儚き人間の為に +御柱の墓場~Grave of Being +神さびた古戦場 ~ Suwa Foughten Field +明日ハレの日、ケの昨日 +ネイティブフェイス diff --git a/libs/music/player.d/playlists/Saigen - th11.playlist b/libs/music/player.d/playlists/Saigen - th11.playlist index 62f9457..9818493 120000..100644 --- a/libs/music/player.d/playlists/Saigen - th11.playlist +++ b/libs/music/player.d/playlists/Saigen - th11.playlist @@ -1 +1,10 @@ -6
\ No newline at end of file +Saigen - th11 +旧地獄街道を行く +華のさかづき大江山
+ハートフェルトファンシー
+少女さとり ~ 3rd eye.
+廃獄ララバイ
+業火マントル
+霊知の太陽信仰~Nuclear Fusion
+ラストリモート
+ハルトマンの妖怪少女
diff --git a/libs/music/player.d/styles.css b/libs/music/player.d/styles.css index 7985f25..5e6819a 100644 --- a/libs/music/player.d/styles.css +++ b/libs/music/player.d/styles.css @@ -62,15 +62,11 @@ canvas#cvs{width:100%;height:100%;} a.listitem{padding-left:160px !important;margin-left:-160px;} div#cvsdiv{ position: absolute; - width: calc(100% - 16.5em); + width: calc(100% - 17em); height: calc(100% - 9.6em); - top: 0; + top: 0.3em; z-index: -1; } -@media (max-width:768px) -{ - div#cvsdiv{width:calc(100% - 1.5em);} -} ul#plists { list-style-type:none; |