Files
NumberSwipe_New/wechat-campaign-200-r2/music-assets.mjs
T

8 lines
1.1 KiB
JavaScript

import fs from 'node:fs';import path from 'node:path';
// Original sparse pentatonic loops. Each damped note wraps its tail across the seam.
export function buildMusic(root){fs.mkdirSync(path.join(root,'music'),{recursive:true});const rate=22050,seconds=16,n=rate*seconds;
for(const [name,notes]of Object.entries({select:[60,67,72,64,69,67,64,62],play:[48,55,60,55,57,52,55,50]})){
const samples=new Float64Array(n);for(let k=0;k<notes.length;k++){const f=440*2**((notes[k]-69)/12),offset=k*2;for(let j=0;j<rate*4;j++){const t=j/rate,env=(1-Math.exp(-t/.025))*Math.exp(-t/.65)*Math.min(1,(4-t)/.15);samples[(offset*rate+j)%n]+=(Math.sin(2*Math.PI*f*t)+.12*Math.sin(4*Math.PI*f*t))*env*.24;}}
const b=Buffer.alloc(44+n*2);b.write('RIFF');b.writeUInt32LE(b.length-8,4);b.write('WAVEfmt ',8);b.writeUInt32LE(16,16);b.writeUInt16LE(1,20);b.writeUInt16LE(1,22);b.writeUInt32LE(rate,24);b.writeUInt32LE(rate*2,28);b.writeUInt16LE(2,32);b.writeUInt16LE(16,34);b.write('data',36);b.writeUInt32LE(n*2,40);for(let i=0;i<n;i++)b.writeInt16LE(Math.round(samples[i]*32767),44+i*2);fs.writeFileSync(path.join(root,'music',name+'.wav'),b);
}}