Archive the father as well as the mother; how many represses a mother carries
Decided (October 2026): the plant keeps the father and the mother of every side. production-timeline.md (repress section) records the decision and the rule of thumb with sources: about 10 stamper sets per mother before it degrades (Third Man Pressing FAQ, a Nashville plater via WPLN), fewer in quality-minded sources (5 VinyLab, 6 to 8 Stereo Review 1962); a father grows about 5 to 10 mothers. So a mother covers roughly ten represses (10,000 to 20,000 records a side) and a worn one is replaced from the archived father without a new cut. galvanics.md: 4 archived parts per title, ~1,200 to 2,400 a year; new open question to all galvanics candidates (sets per mother, mothers per father, storage). artist-platform.md repress paragraph. Demos: make-a-record and artist-order say father and mother are archived; factory console archives the father on represses too, counts stamper sets per mother (shown in the genealogy and the customer's metal card), and the metal archive counts fathers and mothers.
This commit is contained in:
1 parent
1cceedc8a4
commit
475623e9f2
6 files changed
+57
-22
No files matched your search
@@ -529,10 +529,12 @@ const H={
|
||||
intake(o){const lim=LIM[o.size][o.rpm];o.files={lim,len:SIDES.map(()=>lim*U(0.62,0.96)),sr:pick([44.1,48,96]),bits:24,peak:-U(0.3,1.4),fmt:pick(["WAV","FLAC","AIFF"])};},
|
||||
cut(o,t){o.lac=SIDES.map(s=>({id:"L-"+code(++S.seq.p),side:s,w:U(48,62),dep:U(26,31),scribe:o.catno+" "+s,stylus:"Stylus "+RI(11,19)}));log(t,"metal",`${o.id}: lacquers ${o.lac.map(l=>l.id).join(", ")} on Lathe 1`,"Cutting room",o.id);},
|
||||
plate(o,t){
|
||||
if(o.repress){o.fa=null;o.mo=SIDES.map(s=>({id:"M-"+code(o.n*31+s.charCodeAt(0)),side:s,thick:U(246,256),listen:"pass",made:t-U(90,400)*DAY,arch:true}));}
|
||||
if(o.repress){o.fa=SIDES.map(s=>({id:"F-"+code(o.n*29+s.charCodeAt(0)),side:s,arch:true}));o.mo=SIDES.map(s=>({id:"M-"+code(o.n*31+s.charCodeAt(0)),side:s,thick:U(246,256),listen:"pass",made:t-U(90,400)*DAY,arch:true}));}
|
||||
else{o.fa=SIDES.map(s=>({id:"F-"+code(++S.seq.p),side:s,thick:U(246,256)}));o.mo=SIDES.map(s=>({id:"M-"+code(++S.seq.p),side:s,thick:U(246,256),listen:"pass",made:t+1.2*DAY}));}
|
||||
o.cell="PDPU 1, cell "+RI(1,2);
|
||||
o.sets=[];const n=Math.max(1,Math.ceil(o.qty*1.08/1000));for(let k=1;k<=n;k++)o.sets.push(mkSet(o,k));
|
||||
/* stamper sets grown from this mother so far: about 10 is the industry rule of thumb before a new mother is grown from the archived father */
|
||||
o.moUse=(o.repress?RI(1,6):0)+n;
|
||||
},
|
||||
prep(o,t){for(const s of o.sets)measure(s);log(t,"metal",`${o.id}: ${o.sets.length*2} stampers punched, back-finished, measured`,"Stamper prep",o.id);},
|
||||
tp(o){o.tp={n:10,you:5,sides:SIDES.map(s=>({side:s,score:U(97.8,99.5),clicks:RI(0,1),noise:-U(61,66)}))};},
|
||||
@@ -640,7 +642,7 @@ function cycle(p,now){
|
||||
if(o.good>=o.qty){finishRun(p,now);return;}
|
||||
if(set.plays>=set.life){
|
||||
set.state="retired";set.retired=now;o.setIdx++;
|
||||
if(!o.sets[o.setIdx]){const ns=mkSet(o,o.sets.length+1);measure(ns);o.sets.push(ns);log(now,"metal",`${o.id}: extra stamper set ${ns.n} grown from the archived mothers`,"Galvanics",o.id);}
|
||||
if(!o.sets[o.setIdx]){const ns=mkSet(o,o.sets.length+1);measure(ns);o.sets.push(ns);o.moUse=(o.moUse||0)+1;log(now,"metal",`${o.id}: extra stamper set ${ns.n} grown from the archived mothers`,"Galvanics",o.id);}
|
||||
mount(p,o,now);p.st="change";p.why="Stamper change to set "+(o.setIdx+1);p.until=now+20*MIN;p.next=p.until;p.since=0;
|
||||
log(now,"press",`${p.id}: stamper set ${set.n} retired after ${fI(set.plays)} plays`,p.op||"Operator",o.id);return;
|
||||
}
|
||||
@@ -915,7 +917,7 @@ function orderBlocks(o){
|
||||
const spec=`<dl class="kv"><dt>Format</dt><dd>${esc(fmtL(o))}</dd><dt>Copies</dt><dd>${fI(o.qty)}</dd><dt>Run-out</dt><dd class="mono">${esc(o.catno)} A / ${esc(o.catno)} B</dd><dt>Labels</dt><dd>Printed${o.labelLot?", lot "+o.labelLot+", print-inspected, oven pre-dried":""}</dd><dt>Packing</dt><dd>Inner sleeve, printed jacket${o.shrink?", shrink wrap":""}</dd><dt>Ordered</dt><dd>${fDT(o.created)}</dd>${o.repress?"<dt>Repress</dt><dd>From the archived mothers, no new cut</dd>":""}</dl>`;
|
||||
const gates=[1,2,3].filter(g=>!o.repress&&(g!==2||o.mastering)).map(g=>{const a=o.gates[g];const waiting=st.gate===g;return `<dt>Gate ${g}</dt><dd>${a?`<span class="ok">✓</span> ${GATE_T[g]}, ${fDT(a.t)}, ${esc(a.by)}`:waiting?`<span class="warn">waiting ${dur(S.t-o.ss)}</span> for the ${GATE_T[g]}`:`<span class="faint">${GATE_T[g]}</span>`}</dd>`;}).join("");
|
||||
let metal="";
|
||||
if(o.lac||o.mo){metal=`<div class="gen">${o.lac?`<span>${o.lac[0].id}</span><em>→</em>`:""}${o.fa?`<span>${o.fa[0].id}</span><em>→</em>`:""}${o.mo?`<span>${o.mo[0].id}${o.mo[0].arch?" (archive)":""}</span><em>→</em>`:""}<span>${o.sets.length} stamper set${o.sets.length>1?"s":""}</span></div><p class="note" style="margin:0 0 8px">Side A shown; side B has its own chain. ${o.lac?`Lacquers under the microscope: groove ${Math.round(o.lac[0].w)} µm wide, ${Math.round(o.lac[0].dep)} µm deep; scribed <span class="mono">${esc(o.lac[0].scribe)}</span>, fiducial applied.`:"Repress: grown from the archived mothers."} ${o.mo?"Mothers listened to: pass.":""}</p>${stamperTable(o)}`;}
|
||||
if(o.lac||o.mo){metal=`<div class="gen">${o.lac?`<span>${o.lac[0].id}</span><em>→</em>`:""}${o.fa?`<span>${o.fa[0].id} (archive)</span><em>→</em>`:""}${o.mo?`<span>${o.mo[0].id} (archive, ${o.moUse||1} of about 10 sets)</span><em>→</em>`:""}<span>${o.sets.length} stamper set${o.sets.length>1?"s":""}</span></div><p class="note" style="margin:0 0 8px">Side A shown; side B has its own chain. ${o.lac?`Lacquers under the microscope: groove ${Math.round(o.lac[0].w)} µm wide, ${Math.round(o.lac[0].dep)} µm deep; scribed <span class="mono">${esc(o.lac[0].scribe)}</span>, fiducial applied.`:"Repress: grown from the archived mothers."} ${o.mo?"Mothers listened to: pass.":""}</p>${stamperTable(o)}`;}
|
||||
const lots=o.lots.map(id=>S.lots.find(L=>L.id===id)).filter(Boolean);
|
||||
const comp=lots.length?lots.map(L=>`<p style="margin:0 0 6px"><b class="mono">${L.id}</b> ${esc(MAT[L.mat])}, ${esc(SUP[L.sup])}${L.mat==="black"?". Mixed 80 % virgin / 20 % in-house regrind at the extruder":""}.</p><div class="tw"><table class="t">${lotRow(L).map(([k,v,l,ok])=>`<tr><td>${k}</td><td class="num">${v}</td><td class="num faint">${l}</td><td>${lim(ok)}</td></tr>`).join("")}</table></div>`).join(""):'<p class="mute" style="margin:0">Assigned when the press run starts.</p>';
|
||||
const A=o.ta;
|
||||
@@ -986,12 +988,12 @@ PAGES.metal={
|
||||
blocks(){
|
||||
const plating=S.orders.filter(o=>o.si===SI.plate||o.si===SI.prep||o.si===SI.cut).sort((a,b)=>a.si-b.si||a.ss-b.ss);
|
||||
const rec=S.orders.filter(o=>o.si>SI.prep&&o.sets.length&&o.sets[0].st[0].res).sort((a,b)=>(b.hist.find(h=>h.id==="prep")||{a:0}).a-(a.hist.find(h=>h.id==="prep")||{a:0}).a).slice(0,3);
|
||||
const mothers=S.orders.reduce((a,o)=>a+(o.mo&&!o.repress?o.mo.length:0),0);
|
||||
const mothers=S.orders.reduce((a,o)=>a+(o.mo&&!o.repress?o.mo.length+(o.fa?o.fa.length:0):0),0);
|
||||
return {
|
||||
mB:plating.length?plating.map(o=>`<div class="si"><div class="r1"><span><a href="#order=${o.id}">${o.id}</a> ${esc(o.title)}</span>${chip(o)}</div><small>${esc(subStep(o))}${o.cell&&o.si===SI.plate?" · "+o.cell:""}</small>${bar(prog(o),"metal")}</div>`).join(""):'<p class="mute">Nothing in progress.</p>',
|
||||
mM:S.presses.map(p=>`<div class="si"><div class="r1"><span class="mono"><a href="#press=${p.id}">${p.id}</a> ${p.set?p.set.st.map(s=>s.id).join(" / "):""}</span><span class="mono mute">${p.set?fI(p.set.plays)+" / "+fI(p.set.life):PST[p.st]}</span></div>${bar(p.set?p.set.plays/p.set.life:0,p.set&&p.set.plays/p.set.life>0.9?"warn":"metal")}</div>`).join(""),
|
||||
mR:rec.length?rec.map(o=>`<p style="margin:10px 0 4px"><a href="#order=${o.id}">${o.id}</a> ${esc(o.title)} <span class="mute">${o.repress?"repress from the archive":""}</span></p>${stamperTable(o)}`).join(""):'<p class="mute">No stampers measured yet.</p>',
|
||||
mA:`<div class="stats3"><div><b>${fI(mothers)}</b><span>mothers archived, orders on file</span></div><div><b>${fI(cnt(o=>o.repress))}</b><span>represses in the pipeline</span></div><div><b>${fI(S.orders.reduce((a,o)=>a+o.sets.filter(s=>s.state==="rack").length,0))}</b><span>stamper sets in the rack</span></div></div><p class="note">A repress skips cutting and the father: new stampers grow from the archived mother, which is the cost and lead-time advantage of plating in-house.</p>`
|
||||
mA:`<div class="stats3"><div><b>${fI(mothers)}</b><span>fathers and mothers archived, orders on file</span></div><div><b>${fI(cnt(o=>o.repress))}</b><span>represses in the pipeline</span></div><div><b>${fI(S.orders.reduce((a,o)=>a+o.sets.filter(s=>s.state==="rack").length,0))}</b><span>stamper sets in the rack</span></div></div><p class="note">A repress skips cutting and the father: new stampers grow from the archived mother, about 10 sets per mother by the industry rule of thumb. A worn mother is replaced by growing a new one from the archived father, still without a new cut. That is the cost and lead-time advantage of plating in-house.</p>`
|
||||
};
|
||||
}
|
||||
};
|
||||
@@ -1145,7 +1147,7 @@ function cStatus(o){
|
||||
return `<div class="hl press">${head}</div><div class="big">${fI(o.good)}<span> of ${fI(o.qty)} pressed</span></div>${bar(o.good/o.qty,"acc")}<p>${esc(sub)}</p><p>Estimated delivery <b style="color:var(--ink)">${fDW(e.t)}</b></p>`;
|
||||
}
|
||||
if(STAGES[o.si].gate)return `<div class="hl gate">Waiting for you</div><div class="big" style="font-size:34px">Approve the ${GATE_T[STAGES[o.si].gate]}</div><p>Nothing goes ahead without your approval. Waiting since ${fDW(o.ss)}.</p>`;
|
||||
if(st==="done")return `<div class="hl done">Delivered</div><div class="big" style="font-size:34px">${fDW(o.ss)}</div><p>${fI(o.good)} copies, every one inspected. Your mothers stay in our archive, so a repress skips cutting and plating the father.</p>`;
|
||||
if(st==="done")return `<div class="hl done">Delivered</div><div class="big" style="font-size:34px">${fDW(o.ss)}</div><p>${fI(o.good)} copies, every one inspected. Your fathers and mothers stay in our archive: a repress grows new stampers from the mother (about ten sets per mother), and a worn mother is replaced from the father, so there is no new cut.</p>`;
|
||||
if(st==="queue")return `<div class="hl prog">Pressing slot booked</div><div class="big" style="font-size:34px">Starts about ${fDT(e.start)}</div><p>Planned on press ${e.press}${pById(e.press).kind==="duplex"?", a Newbilt Duplex":", the Newbilt Classic"}.</p><p>Your stampers are measured and in the rack. Estimated delivery <b style="color:var(--ink)">${fDW(e.t)}</b>.</p>`;
|
||||
if(st==="ship"||st==="fin")return `<div class="hl done">${st==="ship"?"On the way":"Packing"}</div><div class="big" style="font-size:34px">Arrives about ${fDW(e.t)}</div><p>${st==="ship"?`${o.ship.carrier}, ${o.ship.boxes} cartons, tracking ${o.ship.trk} (simulated).`:`Every copy is scanned into its jacket: the run-out code against the jacket barcode.`}</p>`;
|
||||
const f=prog(o)||0;
|
||||
@@ -1164,8 +1166,8 @@ function cQual(o){
|
||||
if(o.files&&(done("intake")||o.si>0))out.push(card("Your files","checked",`${o.files.fmt}, ${o.files.bits}-bit / ${o.files.sr} kHz, checksums verified at both ends.`,`<table class="t">${o.files.len.map((m,i)=>`<tr><td>Side ${SIDES[i]}</td><td class="num">${Math.floor(Math.round(m*60)/60)}:${pad(Math.round(m*60)%60)}</td><td class="num faint">at most ${o.files.lim} min</td><td>${lim(true)}</td></tr>`).join("")}<tr><td>True peak</td><td class="num">${f1(o.files.peak)} dBTP</td><td></td><td>${lim(true)}</td></tr></table>`));
|
||||
if(o.lac&&done("cut"))out.push(card("Your lacquers","inspected",`Cut on Lathe 1 and checked under the microscope. Your run-out text is scribed by hand next to the run-out groove.`,`<table class="t"><tr><th>Lacquer</th><th class="num">Groove width</th><th class="num">Depth</th><th>Run-out</th></tr>${o.lac.map(l=>`<tr><td class="mono">${l.id}</td><td class="num">${Math.round(l.w)} µm</td><td class="num">${Math.round(l.dep)} µm</td><td class="mono">${esc(l.scribe)}</td></tr>`).join("")}</table>`));
|
||||
if(o.mo&&(done("plate")||o.si===SI.plate)){const inb=o.si===SI.plate;
|
||||
out.push(card("Your metal parts",done("prep")?"measured":"",inb?`In the bath now: ${esc(subStep(o).toLowerCase())}. `+(o.repress?"":"From your lacquer we grow a father, from the father a mother, and from the mother the stampers."):`From your lacquer${o.repress?" (first pressing)":""} we grew a father, a mother and ${o.sets.length*2} stampers. The mother stays in our archive for represses.`,
|
||||
`<div class="gen">${o.lac?`<span>${o.lac[0].id}</span><em>→</em>`:""}${o.fa?`<span>${o.fa[0].id}</span><em>→</em>`:""}<span>${o.mo[0].id}</span><em>→</em><span>${o.sets[0].st[0].id}${o.sets.length>1?" +"+(o.sets.length-1):""}</span></div>${inb?bar(prog(o),"metal"):""}${done("prep")?stamperTable(o):""}`,done("prep")));}
|
||||
out.push(card("Your metal parts",done("prep")?"measured":"",inb?`In the bath now: ${esc(subStep(o).toLowerCase())}. `+(o.repress?"":"From your lacquer we grow a father, from the father a mother, and from the mother the stampers."):`From your lacquer${o.repress?" (first pressing)":""} we grew a father, a mother and ${o.sets.length*2} stampers. The father and mother stay in our archive for represses.`,
|
||||
`<div class="gen">${o.lac?`<span>${o.lac[0].id}</span><em>→</em>`:""}${o.fa?`<span>${o.fa[0].id}</span><em>→</em>`:""}<span>${o.mo[0].id}</span><em>→</em><span>${o.sets[0].st[0].id}${o.sets.length>1?" +"+(o.sets.length-1):""}</span></div><p class="note" style="margin:0 0 8px">Your mother has given ${o.moUse||1} of about 10 stamper sets; after that a fresh mother is grown from your archived father.</p>${inb?bar(prog(o),"metal"):""}${done("prep")?stamperTable(o):""}`,done("prep")));}
|
||||
if(o.tp&&done("tp"))out.push(card("Test pressings","checked",`${o.tp.n} pressed, ${o.tp.you} sent to you. Optical inspection passed on both sides; audio compared with your master:`,`<table class="t">${o.tp.sides.map(s=>`<tr><td>Side ${s.side}</td><td class="num">${f1(s.score)} % match</td><td class="num">${s.clicks} clicks</td><td class="num">${Math.round(s.noise)} dB</td></tr>`).join("")}</table>${o.gates[3]?`<p class="note">You approved it ${fDW(o.gates[3].t)}.</p>`:""}`));
|
||||
const lots=o.lots.map(id=>S.lots.find(L=>L.id===id)).filter(Boolean);
|
||||
for(const L of lots)out.push(card("Your vinyl compound","lab released",`Lot <span class="mono">${L.id}</span>, ${esc(MAT[L.mat].toLowerCase())}. Tested in our lab before release, then released by a test pressing.`,`<table class="t">${lotRow(L).map(([k,v,l,ok])=>`<tr><td>${k}</td><td class="num">${v}</td><td class="num faint">${l}</td><td>${lim(ok)}</td></tr>`).join("")}</table>`));
|
||||
|
||||
Reference in new issue
Block a user