carta1 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -2
- package/bin/cli.js +17 -180
- package/bin/options.js +41 -0
- package/codec/boundary/inspect.js +96 -0
- package/codec/boundary/pcm.js +86 -0
- package/codec/boundary/stream.js +48 -54
- package/codec/boundary/wme.js +189 -0
- package/dist/carta1-worker.min.js +1 -1
- package/dist/carta1-worker.min.js.map +1 -1
- package/dist/carta1.min.js +1 -1
- package/dist/carta1.min.js.map +1 -1
- package/dist/carta1.wme +0 -0
- package/dist/wme/index.js +2 -0
- package/dist/wme/index.js.map +1 -0
- package/docs/native.md +107 -0
- package/docs/porffor.md +23 -0
- package/package.json +16 -7
package/dist/carta1.wme
ADDED
|
Binary file
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var r,e,t=2048,n=212,o=24,a=new Uint8Array([0,8,0,0]),i=(new Int32Array([8,8,8,8,4,4,4,4,8,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,9,9,9,9,10,10,10,10,12,12,12,12,12,12,12,12,20,20,20,20,20,20,20,20]),new Int32Array([20,28,32,36,40,44,48,52]),new Int32Array([20,36,52]),new Int32Array([0,8,16,24,32,36,40,44,48,56,64,72,80,86,92,98,104,110,116,122,128,134,140,146,152,159,166,173,180,189,198,207,216,226,236,246,256,268,280,292,304,316,328,340,352,372,392,412,432,452,472,492]),new Int32Array([0,32,64,96,8,40,72,104,12,44,76,108,20,52,84,116,26,58,90,122,128,160,192,224,134,166,198,230,141,173,205,237,150,182,214,246,256,288,320,352,384,416,448,480,268,300,332,364,396,428,460,492]),function(){for(var r=new Float64Array(32),e=0;e<32;e++)r[e]=Math.sin((e+.5)*Math.PI/64)}(),new Float32Array([-1461907e-11,-9205479e-11,-56157569e-12,.00030117269,.0002422519,-.00085293897,-.0005205574,.0020340169,.00078333891,-.0042153862,-.00075614988,.0078402944,-61169922e-12,-.01344162,.0024626821,.021736089,-.007801671,-.034090221,.01880949,.054326009,-.043596379,-.099384367,.13207909,.46424159])),u=function(){for(var r=new Float32Array(48),e=0;e<24;e++)r[e]=2*i[e],r[47-e]=2*i[e];return r}(),c=function(){for(var r=new Float32Array(24),e=0;e<24;e++)r[e]=u[2*e];return r}(),f=function(){for(var r=new Float32Array(24),e=0;e<24;e++)r[e]=u[2*e+1];return r}(),s=(function(){for(var r=new Uint8Array(48),e=0;e<24;e++)r[e]=47-2*e,r[24+e]=46-2*e}(),(r=new Float32Array(48)).set(c),r.set(f,24),new Float32Array([1,1,1,-1]),new Float32Array([1.8477590084075928,.7653668522834778,1.8477590084075928,.7653668522834778]),new Float32Array([.7071067690849304,.2071067839860916,1.2071068286895752]),new Float32Array([1.990369439125061,1.913880705833435,1.7638425827026367,1.5460208654403687,1.2687865495681763,.9427934885025024,.5805693864822388,.1960342824459076]),new Float32Array([1.9615705013275146,1.662939190864563,1.111140489578247,.39018064737319946]),new Float32Array([1.9975908994674683,1.9783530235290527,1.9400625228881836,1.8830881118774414,1.807978630065918,1.7154572010040283,1.606415033340454,1.4819022417068481,1.3431179523468018,1.1913986206054688,1.0282055139541626,.8551101684570312,.6737797260284424,.48596036434173584,.2934609651565552,.09813535213470459]),function(){for(var r=new Uint8Array(48),e=0;e<2;e++)for(var t=e*o,n=0;n<o;n++)r[t+n]=23-n}(),(e=new Uint8Array(48)).fill(1,0,o),function(){var r=new Float64Array(48);r.set(f),r.set(c,o)}(),new Float64Array([.5,.5,.5,-.5]),new Int32Array([0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])),l=(function(){for(var r=new Float64Array(64),e=0;e<64;e++)r[e]=Math.pow(2,e/3-21)}(),function(){for(var r=s[15],e=new Float64Array(r+1),t=0;t<=r;t++)e[t]=Math.pow(2,-t);return e}());(function(){for(var r=new Int32Array(15),e=0;e<15;e++)r[e]=s[e+1]-s[e]|0})(),function(){var r=new Float64Array(15);r[0]=2-l[s[1]];for(var e=1;e<15;e++){var t=0|s[e],n=0|s[e+1];r[e]=l[t]-l[n]}}();function p(r){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(r){return typeof r}:function(r){return r&&"function"==typeof Symbol&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},p(r)}function y(r,e){for(var t=0;t<e.length;t++){var n=e[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(r,w(n.key),n)}}function w(r){var e=function(r,e){if("object"!=p(r)||!r)return r;var t=r[Symbol.toPrimitive];if(void 0!==t){var n=t.call(r,e||"default");if("object"!=p(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(r)}(r,"string");return"symbol"==p(e)?e:e+""}var b=new TextEncoder,h=new TextDecoder;var v=function(){return r=function r(){!function(r,e){if(!(r instanceof e))throw new TypeError("Cannot call a class as a function")}(this,r)},n=[{key:"createHeader",value:function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:266,u=new Uint8Array(t),c=new DataView(u.buffer);return u.set(a,0),b.encodeInto(r,u.subarray(4,259)),c.setUint32(260,e,!0),u[264]=n,c.setUint32(268,i>>>0,!0),c.setUint32(272,o>>>0,!0),u}},{key:"parseHeader",value:function(r){if(r.length!==t)throw new Error("Header must be ".concat(t," bytes"));for(var e=0;e<a.length;e++)if(r[e]!==a[e])throw new Error("Invalid AEA file");var n=new DataView(r.buffer,r.byteOffset,r.byteLength),o=r.indexOf(0,4),i=-1===o?256:o-4;return{title:h.decode(r.subarray(4,4+i)),frameCount:n.getUint32(260,!0),channelCount:r[264],primingSampleCount:n.getUint32(268,!0),sampleCount:n.getUint32(272,!0)}}}],(e=null)&&y(r.prototype,e),n&&y(r,n),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,e,n}();function m(r){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(r){return typeof r}:function(r){return r&&"function"==typeof Symbol&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},m(r)}function d(){/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */var r,e,t="function"==typeof Symbol?Symbol:{},n=t.iterator||"@@iterator",o=t.toStringTag||"@@toStringTag";function a(t,n,o,a){var c=n&&n.prototype instanceof u?n:u,f=Object.create(c.prototype);return g(f,"_invoke",function(t,n,o){var a,u,c,f=0,s=o||[],l=!1,p={p:0,n:0,v:r,a:y,f:y.bind(r,4),d:function(e,t){return a=e,u=0,c=r,p.n=t,i}};function y(t,n){for(u=t,c=n,e=0;!l&&f&&!o&&e<s.length;e++){var o,a=s[e],y=p.p,w=a[2];t>3?(o=w===n)&&(c=a[(u=a[4])?5:(u=3,3)],a[4]=a[5]=r):a[0]<=y&&((o=t<2&&y<a[1])?(u=0,p.v=n,p.n=a[1]):y<w&&(o=t<3||a[0]>n||n>w)&&(a[4]=t,a[5]=n,p.n=w,u=0))}if(o||t>1)return i;throw l=!0,n}return function(o,s,w){if(f>1)throw TypeError("Generator is already running");for(l&&1===s&&y(s,w),u=s,c=w;(e=u<2?r:c)||!l;){a||(u?u<3?(u>1&&(p.n=-1),y(u,c)):p.n=c:p.v=c);try{if(f=2,a){if(u||(o="next"),e=a[o]){if(!(e=e.call(a,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=a.return)&&e.call(a),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);a=r}else if((e=(l=p.n<0)?c:t.call(n,p))!==i)break}catch(e){a=r,u=1,c=e}finally{f=1}}return{value:e,done:l}}}(t,o,a),!0),f}var i={};function u(){}function c(){}function f(){}e=Object.getPrototypeOf;var s=[][n]?e(e([][n]())):(g(e={},n,function(){return this}),e),l=f.prototype=u.prototype=Object.create(s);function p(r){return Object.setPrototypeOf?Object.setPrototypeOf(r,f):(r.__proto__=f,g(r,o,"GeneratorFunction")),r.prototype=Object.create(l),r}return c.prototype=f,g(l,"constructor",f),g(f,"constructor",c),c.displayName="GeneratorFunction",g(f,o,"GeneratorFunction"),g(l),g(l,o,"Generator"),g(l,n,function(){return this}),g(l,"toString",function(){return"[object Generator]"}),(d=function(){return{w:a,m:p}})()}function g(r,e,t,n){var o=Object.defineProperty;try{o({},"",{})}catch(r){o=0}g=function(r,e,t,n){function a(e,t){g(r,e,function(r){return this._invoke(e,t,r)})}e?o?o(r,e,{value:t,enumerable:!n,configurable:!n,writable:!n}):r[e]=t:(a("next",0),a("throw",1),a("return",2))},g(r,e,t,n)}function k(r,e,t,n,o,a,i){try{var u=r[a](i),c=u.value}catch(r){return void t(r)}u.done?e(c):Promise.resolve(c).then(n,o)}function A(r){return function(){var e=this,t=arguments;return new Promise(function(n,o){var a=r.apply(e,t);function i(r){k(a,n,o,i,u,"next",r)}function u(r){k(a,n,o,i,u,"throw",r)}i(void 0)})}}function j(r,e){for(var t=0;t<e.length;t++){var n=e[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(r,E(n.key),n)}}function E(r){var e=function(r,e){if("object"!=m(r)||!r)return r;var t=r[Symbol.toPrimitive];if(void 0!==t){var n=t.call(r,e||"default");if("object"!=m(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(r)}(r,"string");return"symbol"==m(e)?e:e+""}var S,F,U,P={SPS:{bitrate:292,channels:2},SPM:{bitrate:146,channels:1}},O=function(){return r=function r(e){!function(r,e){if(!(r instanceof e))throw new TypeError("Cannot call a class as a function")}(this,r),this.api=e,this.ffmpeg=e.getBuiltinEncoder("ffmpeg"),this.workerURL=null,this.worker=null,this.rejectJob=null,this.busy=!1},e=[{key:"init",value:(f=A(d().m(function r(){var e;return d().w(function(r){for(;;)switch(r.p=r.n){case 0:if(!this.workerURL){r.n=1;break}return r.a(2);case 1:return r.p=1,r.n=2,this.ffmpeg.init();case 2:this.workerURL=URL.createObjectURL(new Blob([this.api.getOwnFile("worker.js")],{type:"text/javascript"})),r.n=5;break;case 3:return r.p=3,e=r.v,r.n=4,this.ffmpeg.deinit();case 4:throw e;case 5:return r.a(2)}},r,this,[[1,3]])})),function(){return f.apply(this,arguments)})},{key:"deinit",value:(c=A(d().m(function r(){var e,t;return d().w(function(r){for(;;)switch(r.n){case 0:return null===(e=this.rejectJob)||void 0===e||e.call(this,new Error("Encoder was stopped")),null===(t=this.worker)||void 0===t||t.terminate(),this.worker=null,this.workerURL&&URL.revokeObjectURL(this.workerURL),this.workerURL=null,r.n=1,this.ffmpeg.deinit();case 1:return r.a(2)}},r,this)})),function(){return c.apply(this,arguments)})},{key:"getSupportFor",value:function(r){return Object.hasOwn(P,r)?{state:"perfect",gapless:!1,bitrates:[P[r].bitrate]}:{state:"unsupported",gapless:!1}}},{key:"getUserFriendyStageName",value:function(r){return"carta"===r?"Encoding ATRAC1...":"ffmpeg"===r?"Preparing audio...":this.ffmpeg.getUserFriendyStageName(r)}},{key:"transcode",value:(u=A(d().m(function r(e,t,n,o){var a,i,u;return d().w(function(r){for(;;)switch(r.p=r.n){case 0:if(this.workerURL){r.n=1;break}throw new Error("Encoder is not initialized");case 1:if(!this.busy){r.n=2;break}throw new Error("Encoder is already processing a track");case 2:if(a=n.format,i=a.codec,u=a.bitrate,Object.hasOwn(P,i)&&u===P[i].bitrate){r.n=3;break}throw new RangeError("Unsupported carta1 recording format (experimental SPS/SPM host extension required)");case 3:return this.busy=!0,r.p=4,r.n=5,this.encodeAtrac(e,t,n,o);case 5:return r.a(2,r.v);case 6:return r.p=6,this.busy=!1,r.f(6);case 7:return r.a(2)}},r,this,[[4,,6,7]])})),function(r,e,t,n){return u.apply(this,arguments)})},{key:"encodeAtrac",value:(i=A(d().m(function r(e,o,a,i){var u,c,f,s,l,p,y,w,b,h,m,g,k,A,j,E,S,F,U,O;return d().w(function(r){for(;;)switch(r.p=r.n){case 0:return u=P[a.format.codec].channels,c=o.split(".").pop(),f="carta1-input.".concat(/^[a-z0-9]+$/i.test(c)?c:"audio"),s="carta1-pcm.f32",l=this.ffmpeg.ffmpegProcess,r.p=1,null==i||i({stage:"ffmpeg",progress:0,total:1}),r.n=2,l.write(f,e);case 2:return p=this.ffmpeg.createFfmpegParams(a,"f32le","-ac ".concat(u," -c:a pcm_f32le")),r.n=3,l.transcode(f,s,p);case 3:return r.n=4,l.read(s);case 4:if(y=r.v,w=y.data,b=4*u,0!==w.byteLength&&w.byteLength%b===0){r.n=5;break}throw new RangeError("Expected nonempty channel-aligned float32 PCM");case 5:for(h=new DataView(w.buffer,w.byteOffset,w.byteLength),m=w.byteLength/b,g=Array.from({length:u},function(){return new Float32Array(m)}),k=0;k<m;k++)for(A=0;A<u;A++)g[A][k]=h.getFloat32(k*b+4*A,!0);return null==i||i({stage:"ffmpeg",progress:1,total:1}),null==i||i({stage:"carta",progress:0,total:1}),r.n=6,this.encodeInWorker(g);case 6:if(!((j=r.v).byteLength<=t)){r.n=7;break}throw new Error("Worker returned an incompatible ATRAC1 AEA file");case 7:if(E=v.parseHeader(j.subarray(0,t)),S=j.byteLength-t,E.channelCount===u&&S%(n*u)===0&&E.frameCount*n===S){r.n=8;break}throw new Error("Worker returned an incompatible ATRAC1 AEA file");case 8:return null==i||i({stage:"carta",progress:1,total:1}),r.a(2,j.slice(t));case 9:r.p=9,F=0,U=[f,s];case 10:if(!(F<U.length)){r.n=15;break}return O=U[F],r.p=11,r.n=12,l.remove(O);case 12:r.n=14;break;case 13:r.p=13,r.v;case 14:F++,r.n=10;break;case 15:return r.f(9);case 16:return r.a(2)}},r,this,[[11,13],[1,,9,16]])})),function(r,e,t,n){return i.apply(this,arguments)})},{key:"encodeInWorker",value:(a=A(d().m(function r(e){var t,n,o,a,i=this;return d().w(function(r){for(;;)switch(r.p=r.n){case 0:return t=new Worker(this.workerURL),this.worker=t,r.p=1,r.n=2,new Promise(function(r,n){i.rejectJob=n,t.onmessage=function(e){var t=e.data;1===t.jobId&&(t.error?n(new Error(t.error)):r(t.result))},t.onerror=function(r){return n(new Error(r.message||"Codec worker failed"))},t.onmessageerror=function(){return n(new Error("Invalid codec worker response"))},t.postMessage({jobId:1,type:"encode",pcmData:e,options:{}},e.map(function(r){return r.buffer}))});case 2:return n=r.v,o=Uint8Array,r.n=3,n.aeaBlob.arrayBuffer();case 3:return a=r.v,r.a(2,new o(a));case 4:return r.p=4,this.rejectJob=null,t.terminate(),this.worker=null,r.f(4);case 5:return r.a(2)}},r,this,[[1,,4,5]])})),function(r){return a.apply(this,arguments)})}],e&&j(r.prototype,e),o&&j(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,e,o,a,i,u,c,f}();S=O,U=[],(F=E(F="customConstructionParameters"))in S?Object.defineProperty(S,F,{value:U,enumerable:!0,configurable:!0,writable:!0}):S[F]=U;export{O as default};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://carta1/./codec/core/constants.js","webpack://carta1/./codec/core/tables.js","webpack://carta1/./codec/boundary/container.js","webpack://carta1/./codec/boundary/wme.js"],"sourcesContent":["/**\n * Carta1 scalar format constants.\n */\n\nexport const SAMPLE_RATE = 44100\nexport const SAMPLES_PER_FRAME = 512\nexport const FRAME_RATE = SAMPLE_RATE / SAMPLES_PER_FRAME\n\nexport const AEA_HEADER_SIZE = 2048\nexport const AEA_TITLE_OFFSET = 4\nexport const AEA_TITLE_SIZE = 256\nexport const AEA_FRAME_COUNT_OFFSET = 260\nexport const AEA_CHANNEL_COUNT_OFFSET = 264\nexport const AEA_PRIMING_SAMPLE_COUNT_OFFSET = 268\nexport const AEA_SOURCE_SAMPLE_COUNT_OFFSET = 272\n\nexport const STREAM_PRIMING_SAMPLES = 266\nexport const STREAM_FLUSH_TAIL_FRAMES = 1\n\nexport const SOUND_UNIT_SIZE = 212\nexport const FRAME_BITS = SOUND_UNIT_SIZE * 8\nexport const FRAME_OVERHEAD_BITS = 40\nexport const BITRATE_PER_CHANNEL = SOUND_UNIT_SIZE * FRAME_RATE * 8\n\nexport const NUM_BFUS = 52\nexport const MAX_BFU_SIZE = 20\nexport const BITS_PER_BFU_METADATA = 10\nexport const BFU_AMOUNTS_COUNT = 8\n\nexport const MDCT_SIZE_SHORT = 64\nexport const MDCT_SIZE_MID = 256\nexport const MDCT_SIZE_LONG = 512\nexport const MDCT_SHORT_BLOCK_SIZE = 32\nexport const MDCT_OVERLAP_SIZE = 32\nexport const MDCT_TAIL_WINDOW_SIZE = 16\n\nexport const QMF_BANDS = 2\nexport const QMF_TAPS = 48\nexport const QMF_ANALYSIS_START_SAMPLE = 0\nexport const QMF_ANALYSIS_STEP_SAMPLES = QMF_BANDS\nexport const QMF_ANALYSIS_WINDOW_SAMPLES = QMF_TAPS\nexport const QMF_ANALYSIS_MODULATION_SCALE = 1\nexport const QMF_ANALYSIS_TERMS = 24\nexport const QMF_ANALYSIS_DELAY_SAMPLES = QMF_TAPS - QMF_BANDS\nexport const QMF_SYNTHESIS_DELAY_ROWS = 24\nexport const QMF_SYNTHESIS_TERMS = 24\nexport const QMF_SYNTHESIS_DELAY_SAMPLES = QMF_BANDS * QMF_SYNTHESIS_DELAY_ROWS\nexport const QMF_HIGH_BAND_DELAY = 39\n\nexport const FFT_SIZE_LOW = 128\nexport const FFT_SIZE_MID = 128\nexport const FFT_SIZE_HIGH = 256\n\nexport const WAV_HEADER_SIZE = 44\nexport const WAV_BYTES_PER_SAMPLE = 2\nexport const WAV_BITS_PER_SAMPLE = 16\nexport const WAV_PCM_MAX_POSITIVE = 0x7fff\nexport const WAV_PCM_MAX_NEGATIVE = 0x8000\nexport const WAV_DATA_OFFSET = 36\n\nexport const FRAME_HEADER_BITS = 16\nexport const FRAME_WORD_LENGTH_BITS = 4\nexport const FRAME_SCALE_FACTOR_BITS = 6\n\nexport const QUANTIZATION_SIGN_BIT_SHIFT = 1\nexport const MAX_WORD_LENGTH_INDEX = 15\n","/**\n * Stable ATRAC1 geometry, signal, allocation, and quantization tables.\n */\n\nimport {\n MAX_WORD_LENGTH_INDEX,\n QMF_ANALYSIS_TERMS,\n QMF_BANDS,\n QMF_SYNTHESIS_DELAY_ROWS,\n QMF_SYNTHESIS_TERMS,\n QMF_TAPS,\n} from './constants.js'\n\nexport const AEA_MAGIC = new Uint8Array([0x00, 0x08, 0x00, 0x00])\n\nexport const SPECS_PER_BFU = new Int32Array([\n 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,\n 7, 7, 9, 9, 9, 9, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 20, 20, 20,\n 20, 20, 20, 20, 20,\n])\n\nexport const BFU_AMOUNTS = new Int32Array([20, 28, 32, 36, 40, 44, 48, 52])\nexport const BFU_BAND_BOUNDARIES = new Int32Array([20, 36, 52])\n\nexport const BFU_START_LONG = new Int32Array([\n 0, 8, 16, 24, 32, 36, 40, 44, 48, 56, 64, 72, 80, 86, 92, 98, 104, 110, 116,\n 122, 128, 134, 140, 146, 152, 159, 166, 173, 180, 189, 198, 207, 216, 226,\n 236, 246, 256, 268, 280, 292, 304, 316, 328, 340, 352, 372, 392, 412, 432,\n 452, 472, 492,\n])\n\nexport const BFU_START_SHORT = new Int32Array([\n 0, 32, 64, 96, 8, 40, 72, 104, 12, 44, 76, 108, 20, 52, 84, 116, 26, 58, 90,\n 122, 128, 160, 192, 224, 134, 166, 198, 230, 141, 173, 205, 237, 150, 182,\n 214, 246, 256, 288, 320, 352, 384, 416, 448, 480, 268, 300, 332, 364, 396,\n 428, 460, 492,\n])\n\nexport const WINDOW_SHORT = (() => {\n const table = new Float64Array(32)\n for (let i = 0; i < 32; i++) {\n table[i] = Math.sin(((i + 0.5) * Math.PI) / 64)\n }\n return table\n})()\n\nexport const QMF_COEFFS = new Float32Array([\n -0.00001461907, -0.00009205479, -0.000056157569, 0.00030117269, 0.0002422519,\n -0.00085293897, -0.0005205574, 0.0020340169, 0.00078333891, -0.0042153862,\n -0.00075614988, 0.0078402944, -0.000061169922, -0.01344162, 0.0024626821,\n 0.021736089, -0.007801671, -0.034090221, 0.01880949, 0.054326009,\n -0.043596379, -0.099384367, 0.13207909, 0.46424159,\n])\n\nexport const QMF_WINDOW = (() => {\n const window = new Float32Array(QMF_TAPS)\n for (let i = 0; i < 24; i++) {\n window[i] = QMF_COEFFS[i] * 2.0\n window[47 - i] = QMF_COEFFS[i] * 2.0\n }\n return window\n})()\n\nexport const QMF_EVEN = (() => {\n const even = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n even[i] = QMF_WINDOW[i * 2]\n }\n return even\n})()\n\nexport const QMF_ODD = (() => {\n const odd = new Float32Array(24)\n for (let i = 0; i < 24; i++) {\n odd[i] = QMF_WINDOW[i * 2 + 1]\n }\n return odd\n})()\n\n/** Sample positions read by each component of the configurable QMF analysis. */\nexport const QMF_ANALYSIS_SAMPLE_OFFSETS = (() => {\n const offsets = new Uint8Array(QMF_BANDS * QMF_ANALYSIS_TERMS)\n for (let term = 0; term < QMF_ANALYSIS_TERMS; term++) {\n offsets[term] = QMF_TAPS - 1 - term * QMF_BANDS\n offsets[QMF_ANALYSIS_TERMS + term] = QMF_TAPS - QMF_BANDS - term * QMF_BANDS\n }\n return offsets\n})()\n\n/** Prototype-filter coefficients in component-major QMF analysis order. */\nexport const QMF_ANALYSIS_FILTER_COEFFICIENTS = (() => {\n const coefficients = new Float32Array(QMF_BANDS * QMF_ANALYSIS_TERMS)\n coefficients.set(QMF_EVEN)\n coefficients.set(QMF_ODD, QMF_ANALYSIS_TERMS)\n return coefficients\n})()\n\n/** Dense modulation applied after Carta1 QMF analysis filtering. */\nexport const QMF_ANALYSIS_MODULATION_COEFFICIENTS = new Float32Array([\n 1, 1, 1, -1,\n])\n\n/* eslint-disable no-loss-of-precision -- Float32Array applies the intended float32 rounding. */\n\n/** Reference factors used by the optimized sixteen-band modulation path. */\nexport const QMF_ANALYSIS_PI_OVER_8_BUTTERFLY_SCALES = new Float32Array([\n 1.8477590084075928, 0.7653668522834778, 1.8477590084075928,\n 0.7653668522834778,\n])\n\n/** Reference half-angle factors used by sixteen-band modulation. */\nexport const QMF_ANALYSIS_HALF_BUTTERFLY_SCALES = new Float32Array([\n 0.7071067690849304, 0.2071067839860916, 1.2071068286895752,\n])\n\n/** Reference odd pi/32 cosines used by sixteen-band modulation. */\nexport const QMF_ANALYSIS_ODD_PI_OVER_32_COSINES = new Float32Array([\n 1.990369439125061, 1.913880705833435, 1.7638425827026367, 1.5460208654403687,\n 1.2687865495681763, 0.9427934885025024, 0.5805693864822388,\n 0.1960342824459076,\n])\n\n/** Reference odd pi/16 cosines used by sixteen-band modulation. */\nexport const QMF_ANALYSIS_ODD_PI_OVER_16_COSINES = new Float32Array([\n 1.9615705013275146, 1.662939190864563, 1.111140489578247, 0.39018064737319946,\n])\n\n/** Reference odd pi/64 cosines used by sixteen-band modulation. */\nexport const QMF_ANALYSIS_ODD_PI_OVER_64_COSINES = new Float32Array([\n 1.9975908994674683, 1.9783530235290527, 1.9400625228881836,\n 1.8830881118774414, 1.807978630065918, 1.7154572010040283, 1.606415033340454,\n 1.4819022417068481, 1.3431179523468018, 1.1913986206054688,\n 1.0282055139541626, 0.8551101684570312, 0.6737797260284424,\n 0.48596036434173584, 0.2934609651565552, 0.09813535213470459,\n])\n\n/* eslint-enable no-loss-of-precision */\n\n/** Delay-row offsets read by each sample of configurable QMF synthesis. */\nexport const QMF_SYNTHESIS_DELAY_ROW_OFFSETS = (() => {\n const offsets = new Uint8Array(QMF_BANDS * QMF_SYNTHESIS_TERMS)\n for (let sample = 0; sample < QMF_BANDS; sample++) {\n const sampleOffset = sample * QMF_SYNTHESIS_TERMS\n for (let term = 0; term < QMF_SYNTHESIS_TERMS; term++) {\n offsets[sampleOffset + term] = QMF_SYNTHESIS_DELAY_ROWS - 1 - term\n }\n }\n return offsets\n})()\n\n/** Delay components read by each sample of configurable QMF synthesis. */\nexport const QMF_SYNTHESIS_DELAY_COMPONENTS = (() => {\n const components = new Uint8Array(QMF_BANDS * QMF_SYNTHESIS_TERMS)\n components.fill(1, 0, QMF_SYNTHESIS_TERMS)\n return components\n})()\n\n/** Prototype-filter coefficients in output-sample-major QMF synthesis order. */\nexport const QMF_SYNTHESIS_FILTER_COEFFICIENTS = (() => {\n const coefficients = new Float64Array(QMF_BANDS * QMF_SYNTHESIS_TERMS)\n coefficients.set(QMF_ODD)\n coefficients.set(QMF_EVEN, QMF_SYNTHESIS_TERMS)\n return coefficients\n})()\n\n/** Dense modulation applied before Carta1 QMF synthesis filtering. */\nexport const QMF_SYNTHESIS_MODULATION_COEFFICIENTS = new Float64Array([\n 0.5, 0.5, 0.5, -0.5,\n])\n\nexport const MDCT_BAND_CONFIGS = [\n { size: 128, windowStart: 48 },\n { size: 128, windowStart: 48 },\n { size: 256, windowStart: 112 },\n]\n\nexport const WORD_LENGTH_BITS = new Int32Array([\n 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n])\n\nexport const SCALE_FACTORS = (() => {\n const table = new Float64Array(64)\n for (let i = 0; i < 64; i++) {\n table[i] = Math.pow(2.0, i / 3.0 - 21)\n }\n return table\n})()\n\nexport const INV_POWER_OF_TWO = (() => {\n const maxBits = WORD_LENGTH_BITS[MAX_WORD_LENGTH_INDEX]\n const table = new Float64Array(maxBits + 1)\n for (let bits = 0; bits <= maxBits; bits++) {\n table[bits] = Math.pow(2, -bits)\n }\n return table\n})()\n\nexport const WORD_LENGTH_DELTA_BITS = (() => {\n const table = new Int32Array(MAX_WORD_LENGTH_INDEX)\n for (let i = 0; i < MAX_WORD_LENGTH_INDEX; i++) {\n table[i] = (WORD_LENGTH_BITS[i + 1] - WORD_LENGTH_BITS[i]) | 0\n }\n return table\n})()\n\nexport const DISTORTION_DELTA_FACTORS = (() => {\n const table = new Float64Array(MAX_WORD_LENGTH_INDEX)\n table[0] = 2.0 - INV_POWER_OF_TWO[WORD_LENGTH_BITS[1]]\n for (let i = 1; i < MAX_WORD_LENGTH_INDEX; i++) {\n const bits1 = WORD_LENGTH_BITS[i] | 0\n const bits2 = WORD_LENGTH_BITS[i + 1] | 0\n table[i] = INV_POWER_OF_TWO[bits1] - INV_POWER_OF_TWO[bits2]\n }\n return table\n})()\n","/**\n * Carta1 AEA container boundary.\n */\n\nimport {\n AEA_CHANNEL_COUNT_OFFSET,\n AEA_FRAME_COUNT_OFFSET,\n AEA_HEADER_SIZE,\n AEA_PRIMING_SAMPLE_COUNT_OFFSET,\n AEA_SOURCE_SAMPLE_COUNT_OFFSET,\n AEA_TITLE_OFFSET,\n AEA_TITLE_SIZE,\n STREAM_PRIMING_SAMPLES,\n} from '../core/constants.js'\nimport { AEA_MAGIC } from '../core/tables.js'\n\nconst UTF8_ENCODER = new TextEncoder()\nconst UTF8_DECODER = new TextDecoder()\n\n/**\n * Validate a title for the fixed-width AEA title field.\n *\n * @param {string} title\n * @returns {{valid: boolean, error?: string}}\n */\nexport function validateAeaTitle(title) {\n const byteLength = UTF8_ENCODER.encode(title).length\n const maxByteLength = AEA_TITLE_SIZE - 1\n\n if (byteLength > maxByteLength) {\n return {\n valid: false,\n error: `Title is too long (${byteLength} UTF-8 bytes). Maximum allowed: ${maxByteLength} bytes`,\n }\n }\n\n return { valid: true }\n}\n\n/**\n * AEA file-format handler.\n */\nexport class AeaFile {\n /**\n * Create an AEA header.\n *\n * @param {string} [title='']\n * @param {number} [frameCount=0]\n * @param {number} [channelCount=1]\n * @param {number} [sampleCount=0]\n * @param {number} [primingSampleCount=STREAM_PRIMING_SAMPLES]\n * @returns {Uint8Array}\n */\n static createHeader(\n title = '',\n frameCount = 0,\n channelCount = 1,\n sampleCount = 0,\n primingSampleCount = STREAM_PRIMING_SAMPLES\n ) {\n const header = new Uint8Array(AEA_HEADER_SIZE)\n const view = new DataView(header.buffer)\n header.set(AEA_MAGIC, 0)\n\n UTF8_ENCODER.encodeInto(\n title,\n header.subarray(AEA_TITLE_OFFSET, AEA_TITLE_OFFSET + AEA_TITLE_SIZE - 1)\n )\n view.setUint32(AEA_FRAME_COUNT_OFFSET, frameCount, true)\n header[AEA_CHANNEL_COUNT_OFFSET] = channelCount\n view.setUint32(\n AEA_PRIMING_SAMPLE_COUNT_OFFSET,\n primingSampleCount >>> 0,\n true\n )\n view.setUint32(AEA_SOURCE_SAMPLE_COUNT_OFFSET, sampleCount >>> 0, true)\n return header\n }\n\n /**\n * Parse an AEA header.\n *\n * @param {Uint8Array} header\n * @returns {object} Container metadata.\n * @throws {Error} If the header is invalid\n */\n static parseHeader(header) {\n if (header.length !== AEA_HEADER_SIZE) {\n throw new Error(`Header must be ${AEA_HEADER_SIZE} bytes`)\n }\n\n for (let i = 0; i < AEA_MAGIC.length; i++) {\n if (header[i] !== AEA_MAGIC[i]) {\n throw new Error('Invalid AEA file')\n }\n }\n\n const view = new DataView(\n header.buffer,\n header.byteOffset,\n header.byteLength\n )\n const titleEnd = header.indexOf(0, AEA_TITLE_OFFSET)\n const titleLength =\n titleEnd === -1 ? AEA_TITLE_SIZE : titleEnd - AEA_TITLE_OFFSET\n const title = UTF8_DECODER.decode(\n header.subarray(AEA_TITLE_OFFSET, AEA_TITLE_OFFSET + titleLength)\n )\n\n return {\n title,\n frameCount: view.getUint32(AEA_FRAME_COUNT_OFFSET, true),\n channelCount: header[AEA_CHANNEL_COUNT_OFFSET],\n primingSampleCount: view.getUint32(AEA_PRIMING_SAMPLE_COUNT_OFFSET, true),\n sampleCount: view.getUint32(AEA_SOURCE_SAMPLE_COUNT_OFFSET, true),\n }\n }\n}\n","/** Experimental ATRAC1 host extension; see README's WME contract.\n * API v1's current codec union does not include SPS/SPM. No PCM fallback.\n */\nimport { AeaFile } from './container.js'\nimport { AEA_HEADER_SIZE, SOUND_UNIT_SIZE } from '../core/constants.js'\n\nconst PROFILES = {\n SPS: { bitrate: 292, channels: 2 },\n SPM: { bitrate: 146, channels: 1 },\n}\n\nexport default class CartaWmeEncoder {\n static customConstructionParameters = []\n\n constructor(api) {\n this.api = api\n this.ffmpeg = api.getBuiltinEncoder('ffmpeg')\n this.workerURL = null\n this.worker = null\n this.rejectJob = null\n this.busy = false\n }\n\n async init() {\n if (this.workerURL) return\n try {\n await this.ffmpeg.init()\n this.workerURL = URL.createObjectURL(\n new Blob([this.api.getOwnFile('worker.js')], {\n type: 'text/javascript',\n })\n )\n } catch (error) {\n await this.ffmpeg.deinit()\n throw error\n }\n }\n\n async deinit() {\n this.rejectJob?.(new Error('Encoder was stopped'))\n this.worker?.terminate()\n this.worker = null\n if (this.workerURL) URL.revokeObjectURL(this.workerURL)\n this.workerURL = null\n await this.ffmpeg.deinit()\n }\n\n getSupportFor(codec) {\n if (Object.hasOwn(PROFILES, codec)) {\n return {\n state: 'perfect',\n gapless: false,\n bitrates: [PROFILES[codec].bitrate],\n }\n }\n return { state: 'unsupported', gapless: false }\n }\n\n getUserFriendyStageName(stage) {\n if (stage === 'carta') return 'Encoding ATRAC1...'\n if (stage === 'ffmpeg') return 'Preparing audio...'\n return this.ffmpeg.getUserFriendyStageName(stage)\n }\n\n async transcode(source, sourceFileName, exportParams, progress) {\n if (!this.workerURL) throw new Error('Encoder is not initialized')\n if (this.busy) throw new Error('Encoder is already processing a track')\n const { codec, bitrate } = exportParams.format\n if (\n !Object.hasOwn(PROFILES, codec) ||\n bitrate !== PROFILES[codec].bitrate\n ) {\n throw new RangeError(\n 'Unsupported carta1 recording format (experimental SPS/SPM host extension required)'\n )\n }\n this.busy = true\n try {\n return await this.encodeAtrac(\n source,\n sourceFileName,\n exportParams,\n progress\n )\n } finally {\n this.busy = false\n }\n }\n\n async encodeAtrac(source, sourceFileName, exportParams, progress) {\n const { channels } = PROFILES[exportParams.format.codec]\n const extension = sourceFileName.split('.').pop()\n const inputName = `carta1-input.${/^[a-z0-9]+$/i.test(extension) ? extension : 'audio'}`\n const outputName = 'carta1-pcm.f32'\n const process = this.ffmpeg.ffmpegProcess\n try {\n progress?.({ stage: 'ffmpeg', progress: 0, total: 1 })\n await process.write(inputName, source)\n // Preserve host resampling/ReplayGain, overriding its default stereo for SPM.\n const command = this.ffmpeg.createFfmpegParams(\n exportParams,\n 'f32le',\n `-ac ${channels} -c:a pcm_f32le`\n )\n await process.transcode(inputName, outputName, command)\n const { data } = await process.read(outputName)\n const stride = channels * 4\n if (data.byteLength === 0 || data.byteLength % stride !== 0) {\n throw new RangeError('Expected nonempty channel-aligned float32 PCM')\n }\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength)\n const samples = data.byteLength / stride\n const pcmData = Array.from(\n { length: channels },\n () => new Float32Array(samples)\n )\n for (let sample = 0; sample < samples; sample++) {\n for (let channel = 0; channel < channels; channel++) {\n pcmData[channel][sample] = view.getFloat32(\n sample * stride + channel * 4,\n true\n )\n }\n }\n progress?.({ stage: 'ffmpeg', progress: 1, total: 1 })\n progress?.({ stage: 'carta', progress: 0, total: 1 })\n const aea = await this.encodeInWorker(pcmData)\n if (aea.byteLength <= AEA_HEADER_SIZE) {\n throw new Error('Worker returned an incompatible ATRAC1 AEA file')\n }\n const info = AeaFile.parseHeader(aea.subarray(0, AEA_HEADER_SIZE))\n const payloadLength = aea.byteLength - AEA_HEADER_SIZE\n if (\n info.channelCount !== channels ||\n payloadLength % (SOUND_UNIT_SIZE * channels) !== 0 ||\n info.frameCount * SOUND_UNIT_SIZE !== payloadLength\n ) {\n throw new Error('Worker returned an incompatible ATRAC1 AEA file')\n }\n progress?.({ stage: 'carta', progress: 1, total: 1 })\n // Proposed host contract: raw 212-byte sound units, no AEA header.\n // Stereo units alternate L/R. Keep canonical priming and drain units.\n return aea.slice(AEA_HEADER_SIZE)\n } finally {\n // FFmpeg 0.6 tracks pending FS jobs by action, not job ID. Parallel\n // removals overwrite the resolver and leave one promise pending forever.\n for (const filename of [inputName, outputName]) {\n try {\n await process.remove(filename)\n } catch {\n // A failed conversion may not have created both temporary files.\n }\n }\n }\n }\n\n async encodeInWorker(pcmData) {\n const worker = new Worker(this.workerURL)\n this.worker = worker\n try {\n const result = await new Promise((resolve, reject) => {\n this.rejectJob = reject\n worker.onmessage = ({ data }) => {\n if (data.jobId !== 1) return\n if (data.error) reject(new Error(data.error))\n else resolve(data.result)\n }\n worker.onerror = (event) =>\n reject(new Error(event.message || 'Codec worker failed'))\n worker.onmessageerror = () =>\n reject(new Error('Invalid codec worker response'))\n worker.postMessage(\n {\n jobId: 1,\n type: 'encode',\n pcmData,\n options: {},\n },\n pcmData.map((channel) => channel.buffer)\n )\n })\n return new Uint8Array(await result.aeaBlob.arrayBuffer())\n } finally {\n this.rejectJob = null\n worker.terminate()\n this.worker = null\n }\n }\n}\n"],"names":["coefficients","components","AEA_HEADER_SIZE","SOUND_UNIT_SIZE","QMF_SYNTHESIS_TERMS","AEA_MAGIC","Uint8Array","QMF_COEFFS","Int32Array","table","Float64Array","i","Math","sin","PI","Float32Array","QMF_WINDOW","window","QMF_EVEN","even","QMF_ODD","odd","WORD_LENGTH_BITS","offsets","QMF_BANDS","term","QMF_TAPS","set","sample","sampleOffset","QMF_SYNTHESIS_DELAY_ROWS","fill","INV_POWER_OF_TWO","pow","maxBits","bits","bits1","bits2","UTF8_ENCODER","TextEncoder","UTF8_DECODER","TextDecoder","AeaFile","_classCallCheck","this","key","value","title","arguments","length","undefined","frameCount","channelCount","sampleCount","primingSampleCount","header","view","DataView","buffer","encodeInto","subarray","AEA_TITLE_OFFSET","setUint32","Error","concat","byteOffset","byteLength","titleEnd","indexOf","titleLength","decode","getUint32","e","t","r","Symbol","n","iterator","o","toStringTag","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","l","TypeError","call","done","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","apply","_next","_throw","_defineProperties","_toPropertyKey","_typeof","toPrimitive","String","Number","_toPrimitive","PROFILES","SPS","bitrate","channels","SPM","CartaWmeEncoder","api","ffmpeg","getBuiltinEncoder","workerURL","worker","rejectJob","busy","_init","_callee","_t","_context","init","URL","createObjectURL","Blob","getOwnFile","type","deinit","_deinit","_callee2","_this$rejectJob","_this$worker","_context2","terminate","revokeObjectURL","codec","hasOwn","state","gapless","bitrates","stage","getUserFriendyStageName","_transcode","_callee3","source","sourceFileName","exportParams","progress","_exportParams$format","_context3","format","RangeError","encodeAtrac","_x","_x2","_x3","_x4","_encodeAtrac","_callee4","extension","inputName","outputName","process","command","_yield$process$read","data","stride","samples","pcmData","channel","aea","info","payloadLength","_i","_arr","filename","_context4","split","pop","test","ffmpegProcess","total","write","createFfmpegParams","transcode","read","Array","from","getFloat32","encodeInWorker","parseHeader","slice","remove","_x5","_x6","_x7","_x8","_encodeInWorker","_callee5","result","_t3","_t4","_this","_context5","Worker","reject","onmessage","_ref","jobId","error","onerror","event","message","onmessageerror","postMessage","options","map","aeaBlob","arrayBuffer","_x9"],"sourceRoot":""}
|
package/docs/native.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Native Carta1 CLI
|
|
2
|
+
|
|
3
|
+
Carta1's native CLI compiles the JavaScript codec to machine code with Porffor.
|
|
4
|
+
The executable uses the OS C runtime and does not require Node.js. JavaScript
|
|
5
|
+
packages and browser bundles continue to ship separately.
|
|
6
|
+
|
|
7
|
+
## Download and run
|
|
8
|
+
|
|
9
|
+
GitHub Releases include `carta1-VERSION-OS-ARCH.tar.gz` and a matching `.sha256`
|
|
10
|
+
file. Targets are `linux-x64`, `linux-arm64`, `darwin-x64`, and `darwin-arm64`.
|
|
11
|
+
Linux builds target Ubuntu 24.04/glibc; macOS ARM64 builds target macOS 14 and
|
|
12
|
+
Intel builds target macOS 15. Native Windows and musl builds are not included.
|
|
13
|
+
|
|
14
|
+
Extract the archive and run its `carta1` executable:
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
./carta1 --encode input.wav output.aea
|
|
18
|
+
./carta1 --decode input.aea output.wav
|
|
19
|
+
./carta1 --json input.aea structure.json
|
|
20
|
+
./carta1 --help
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The native CLI accepts the Node CLI's encode/decode/JSON operations and its
|
|
24
|
+
quiet, force, UTF-8 title, allocation bias, and fixed block mode options.
|
|
25
|
+
WAV input is mono/stereo signed little-endian 16/24/32-bit integer PCM.
|
|
26
|
+
Decoding writes PCM16 WAV. Input is normally 44.1 kHz; other rates trigger a
|
|
27
|
+
warning and are not resampled. JSON inspection escapes non-ASCII characters
|
|
28
|
+
as Unicode escapes, preserving the same parsed data as Node.
|
|
29
|
+
|
|
30
|
+
The native adapter processes complete files in memory and prints a completion
|
|
31
|
+
line instead of an interactive progress bar. The Node CLI remains available
|
|
32
|
+
for stream-based input processing. Existing output files require `--force`.
|
|
33
|
+
The archive contains the executable, build metadata, this guide, Carta1's ISC
|
|
34
|
+
license, and the Porffor runtime's MIT license.
|
|
35
|
+
|
|
36
|
+
## Build and verify
|
|
37
|
+
|
|
38
|
+
From the repository checkout, with Node.js and a system C compiler installed:
|
|
39
|
+
|
|
40
|
+
```sh
|
|
41
|
+
npm ci
|
|
42
|
+
node build/install-porffor.js /tmp/carta1-toolchain
|
|
43
|
+
export PORFFOR=/tmp/carta1-toolchain/porf
|
|
44
|
+
npm run build:native
|
|
45
|
+
npm run probe:porffor
|
|
46
|
+
npm run test:native
|
|
47
|
+
npm run package:native
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The installer pins Porffor alpha 19 (`0c135ce`) and verifies the downloaded
|
|
51
|
+
archive against a checked-in SHA-256. It does not change shell configuration.
|
|
52
|
+
`PORFFOR` can instead select an already installed copy of that exact version.
|
|
53
|
+
`CC` may select a C compiler executable without arguments.
|
|
54
|
+
|
|
55
|
+
`build:native` writes `dist/native/carta1` and `build-info.json`. Its optional
|
|
56
|
+
argument selects another binary output path. Compilation uses a temporary
|
|
57
|
+
source tree and hardcodes the package version, so the executable needs no
|
|
58
|
+
adjacent JavaScript files or `package.json`. C compilation always uses
|
|
59
|
+
`-fno-fast-math -ffp-contract=off`: default floating-point contraction changed
|
|
60
|
+
decoded sample bits in the initial experiment. Generated native files are
|
|
61
|
+
excluded from the npm package.
|
|
62
|
+
|
|
63
|
+
`probe:porffor` checks exact encoded bytes and float32 reconstruction bits for
|
|
64
|
+
288 channel frames, public package startup with the native host, and native
|
|
65
|
+
CLI help. `test:native` runs 58 WAV/AEA cases against the actual Node CLI,
|
|
66
|
+
including independent stereo state, 16/24/32-bit input, partial/empty files,
|
|
67
|
+
block modes and bias, UTF-8 titles and paths, JSON data, overwrite behavior,
|
|
68
|
+
invalid input, and a 20-second stereo case that exercises garbage collection.
|
|
69
|
+
Encoded AEA and decoded WAV files must match byte for byte.
|
|
70
|
+
|
|
71
|
+
To include external corpus files and retain hash evidence:
|
|
72
|
+
|
|
73
|
+
```sh
|
|
74
|
+
CARTA1_NATIVE_CORPUS=/absolute/castanets.wav:/absolute/music.wav \
|
|
75
|
+
CARTA1_KEEP_NATIVE_EVIDENCE=1 npm run test:native
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Use the root harness with a native CLI adapter and `--jobs 1` for final ODG
|
|
79
|
+
comparisons. Native release jobs also run the frame and file parity gates on
|
|
80
|
+
each target machine before uploading archives.
|
|
81
|
+
|
|
82
|
+
## Host implementation
|
|
83
|
+
|
|
84
|
+
`native/host.js` supplies argument decoding, bounded binary reads, exclusive
|
|
85
|
+
output creation, the UTF-8 operations needed by AEA titles, and the byte Blob
|
|
86
|
+
operations used by the existing PCM facade. Its small C bridge relies on the
|
|
87
|
+
pinned Porffor runtime's ArrayBuffer layout. The native CLI imports
|
|
88
|
+
`codec/index.js` and reuses the existing container, serialization, timeline,
|
|
89
|
+
and PCM conversions. WAV sample conversion and JSON inspection are shared
|
|
90
|
+
with the Node CLI; the codec algorithm is unchanged.
|
|
91
|
+
|
|
92
|
+
Complete-file helpers use synchronous frame operations on the same stateful
|
|
93
|
+
stream classes used by async callers. This avoids a Porffor alpha 19
|
|
94
|
+
async-generator queue crash on longer audio without disabling garbage
|
|
95
|
+
collection or duplicating priming, tail flushing, or source-length trimming.
|
|
96
|
+
Their public Promise-returning API is unchanged. The host's UTF-8 and Blob
|
|
97
|
+
classes implement the surface needed by Carta1, rather than a general browser
|
|
98
|
+
or Node compatibility layer.
|
|
99
|
+
|
|
100
|
+
## GitHub release gate
|
|
101
|
+
|
|
102
|
+
The reusable Native binaries workflow builds and tests all four targets on
|
|
103
|
+
native GitHub runners. It runs in CI and is required by the tag-triggered
|
|
104
|
+
publishing workflow. A failed native parity check prevents publishing.
|
|
105
|
+
Successful jobs package versioned archives, build metadata, licenses, and
|
|
106
|
+
SHA-256 checksums; the publishing job attaches them alongside browser/WME
|
|
107
|
+
assets. The existing version-bump workflow still controls versioning and tags.
|
package/docs/porffor.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Porffor investigation
|
|
2
|
+
|
|
3
|
+
Carta1 can compile to machine code with Porffor alpha 19. The initial
|
|
4
|
+
unadapted CLI failed at Node filesystem imports, and the public package failed
|
|
5
|
+
at startup without TextEncoder. A native host now supplies the required
|
|
6
|
+
operations; see [native builds, verification and release assets](native.md).
|
|
7
|
+
|
|
8
|
+
The original frame-only test on macOS ARM64 used Carta1 1.5.0, Node 24.11.1,
|
|
9
|
+
Apple Clang 16.0.0, and Porffor `alpha 19 (0c135ce 2026-10-21)`
|
|
10
|
+
([compiler source](https://github.com/CanadaHonk/porffor/tree/0c135ce2f36fdd3467d5a58daa92283810705a51)).
|
|
11
|
+
All 288 channel frames encoded identically under default C flags, but 8,708
|
|
12
|
+
decoded float32 samples differed, with maximum absolute error about `1.19e-7`.
|
|
13
|
+
Disabling C floating-point contraction restored exact sample-bit parity.
|
|
14
|
+
The matched frame output SHA-256 was
|
|
15
|
+
`413f72d3f2e1c7735f831e7c637b49d7757b3f76b6ff8df16fb8ee36a572a57d`.
|
|
16
|
+
|
|
17
|
+
The repeatable `npm run probe:porffor` command now includes native host
|
|
18
|
+
initialization and CLI help, and succeeds when those checks and strict frame
|
|
19
|
+
parity pass. It keeps its binaries, complete output records, build logs and
|
|
20
|
+
`report.json` in the printed temporary directory. It does not download a
|
|
21
|
+
compiler or produce release assets. `npm run test:native` supplies the actual
|
|
22
|
+
WAV/AEA release gate, including long-file coverage for the compiler runtime's
|
|
23
|
+
async-generator limitation.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "carta1",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "An ATRAC1 audio codec implementation in JavaScript",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "codec/index.js",
|
|
@@ -10,7 +10,11 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"bin/",
|
|
12
12
|
"codec/",
|
|
13
|
-
"dist
|
|
13
|
+
"dist/*.js",
|
|
14
|
+
"dist/*.map",
|
|
15
|
+
"dist/*.wme",
|
|
16
|
+
"dist/wme/",
|
|
17
|
+
"docs/",
|
|
14
18
|
"LICENSE",
|
|
15
19
|
"README.md"
|
|
16
20
|
],
|
|
@@ -18,12 +22,17 @@
|
|
|
18
22
|
"start": "node bin/cli.js",
|
|
19
23
|
"test": "vitest run",
|
|
20
24
|
"test:watch": "vitest",
|
|
25
|
+
"probe:porffor": "node build/porffor.js",
|
|
26
|
+
"build:native": "node build/native.js",
|
|
27
|
+
"test:native": "node --test tests/native-cli.integration.mjs",
|
|
28
|
+
"package:native": "node build/package-native.js",
|
|
21
29
|
"prepare": "husky",
|
|
22
|
-
"lint": "eslint bin/ codec/ tests/",
|
|
30
|
+
"lint": "eslint bin/ build/ codec/ native/ tests/",
|
|
23
31
|
"format": "prettier --write .",
|
|
24
|
-
"build": "webpack --config webpack.config.js",
|
|
25
|
-
"check": "npm run lint && npm test && npm run build",
|
|
26
|
-
"prepublishOnly": "npm run check"
|
|
32
|
+
"build": "webpack --config webpack.config.js && node build/wme.js",
|
|
33
|
+
"check": "npm run lint && npm test && npm run build && npm run test:wme",
|
|
34
|
+
"prepublishOnly": "npm run check",
|
|
35
|
+
"test:wme": "node --test tests/wme-build.integration.mjs"
|
|
27
36
|
},
|
|
28
37
|
"dependencies": {
|
|
29
38
|
"cli-progress": "^3.12.0",
|
|
@@ -69,7 +78,7 @@
|
|
|
69
78
|
"webpack-cli": "^6.0.1"
|
|
70
79
|
},
|
|
71
80
|
"lint-staged": {
|
|
72
|
-
"(bin|codec|tests)/**/*.js": [
|
|
81
|
+
"(bin|build|codec|tests)/**/*.js": [
|
|
73
82
|
"prettier --write",
|
|
74
83
|
"eslint --fix"
|
|
75
84
|
]
|