linked-rolls 0.52.0 → 0.53.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/lib/Emulation.js CHANGED
@@ -2,15 +2,16 @@ import { MIDIControlEvents } from "midifile-ts";
2
2
  import { idOf } from "./Assumption.js";
3
3
  import { isCommand, pairsAmong, placementsOf } from "./Symbol.js";
4
4
  import { add, mean, mm, seconds, subtract } from "./Quantity.js";
5
+ import { punchDiameterOf } from "./RollCopy.js";
5
6
  /** The punch diameter the edition's copies report, where any of them does. */
6
- const punchDiameterOf = (view) => {
7
+ const meanPunchDiameterOf = (view) => {
7
8
  const measured = view.edition.copies
8
- .map(copy => copy.measurements.punchDiameter?.value)
9
- .filter((value) => value !== undefined && value > 0);
9
+ .map(punchDiameterOf)
10
+ .filter(value => value !== undefined);
10
11
  return measured.length > 0 ? mean(measured) : undefined;
11
12
  };
12
13
  const propertiesOf = (view, version) => ({
13
- punchDiameter: punchDiameterOf(view),
14
+ punchDiameter: meanPunchDiameterOf(view),
14
15
  tempo: view.edition.tempoAdjustment,
15
16
  toOwnPaper: view.toOwnPaperOf(version)
16
17
  });
@@ -141,7 +142,7 @@ export class Emulation {
141
142
  * diameter, or a millimetre, where no copy agrees with a statement.
142
143
  */
143
144
  applyConstraints(view) {
144
- const gap = punchDiameterOf(view) ?? mm(1);
145
+ const gap = meanPunchDiameterOf(view) ?? mm(1);
145
146
  const offsets = (follower, reference) => offsetsBetween(view, follower, reference);
146
147
  displacementsOf(this.negotiatedEvents, offsets, gap).forEach((distance, event) => {
147
148
  event.horizontal.from = add(event.horizontal.from, distance);
@@ -0,0 +1,89 @@
1
+ import { ObjectAssumption } from "./Assumption.js";
2
+ import { ConditionState } from "./ConditionState.js";
3
+ import { Measure, Millimeters } from "./Quantity.js";
4
+ import { WithId } from "./utils.js";
5
+ /**
6
+ * The pitch in the engineering sense: the distance along the roll from
7
+ * one punch of a chain to the next, which is the slot one firing cut
8
+ * together with the bridge of paper left before the next. It is taken
9
+ * on held notes, whose chains repeat it, as the median over them. It
10
+ * runs along the roll, and is another thing than the hole separation,
11
+ * which is the distance across the roll from one track to the next.
12
+ * @see crm:E54 Dimension
13
+ */
14
+ export interface ChainPitch extends Measure<'mm'> {
15
+ /**
16
+ * The length along the roll of one slot of a chain.
17
+ * @see reo:slot
18
+ */
19
+ slot?: Millimeters;
20
+ /**
21
+ * The paper left standing between two slots of a chain. Slot and
22
+ * bridge are medians of their own and need not add up to the pitch.
23
+ * @see reo:bridge
24
+ */
25
+ bridge?: Millimeters;
26
+ /**
27
+ * How many pitches the median was taken over.
28
+ * @see reo:sampleSize
29
+ */
30
+ n?: number;
31
+ }
32
+ /**
33
+ * The step by which the perforator moved the paper on, read as the
34
+ * period the lengths of the slots keep: a slot is the punch together
35
+ * with a whole number of steps, so its lengths fall on a comb of this
36
+ * spacing.
37
+ * @see crm:E54 Dimension
38
+ */
39
+ export interface Advance extends Measure<'mm'> {
40
+ /**
41
+ * How closely the lengths keep the period, from 0 where they scatter
42
+ * to 1 where every one falls on the comb: the mean resultant length
43
+ * of the lengths folded onto it. A period found weakly is the result
44
+ * of a search all the same; the belief it is stated with says how far
45
+ * it is held to be the machine's step.
46
+ * @see reo:strength
47
+ */
48
+ strength?: number;
49
+ /**
50
+ * How many slot lengths were folded.
51
+ * @see reo:sampleSize
52
+ */
53
+ n?: number;
54
+ }
55
+ /**
56
+ * How the perforator was set when it punched the copy, as far as the
57
+ * perforations show it. No time is stated: how long a machine kept a
58
+ * setting is for a comparison across rolls to find out.
59
+ * @see crm:E3 Condition State
60
+ */
61
+ export interface PerforatorSetting extends ConditionState<'setting'> {
62
+ /**
63
+ * The diameter of the round punch. Taken across the roll, it is the
64
+ * one value of the setting that neither the scale along the roll nor
65
+ * the shrinkage of the paper enters.
66
+ * @see reo:punchDiameter
67
+ */
68
+ punchDiameter?: ObjectAssumption<Measure<'mm'>>;
69
+ /**
70
+ * @see reo:chainPitch
71
+ */
72
+ chainPitch?: ObjectAssumption<ChainPitch>;
73
+ /**
74
+ * @see reo:advance
75
+ */
76
+ advance?: ObjectAssumption<Advance>;
77
+ }
78
+ /**
79
+ * The machine that punched the copy. It stands for this production
80
+ * alone. Whether it is the one another copy was punched on is left to a
81
+ * statement of identity made about it elsewhere, which its id allows.
82
+ * @see crm:E22 Human-Made Object
83
+ */
84
+ export interface Perforator extends WithId {
85
+ /**
86
+ * @see crm:P44 has condition
87
+ */
88
+ condition?: PerforatorSetting;
89
+ }
@@ -0,0 +1 @@
1
+ export {};
package/lib/RollCopy.d.ts CHANGED
@@ -8,6 +8,7 @@ import { WithId, WithType } from "./utils.js";
8
8
  import { Agent, Concept } from "./Agent.js";
9
9
  import { FeatureSource } from "./FeatureSource.js";
10
10
  import { Measure, Millimeters, Quantity, Track } from "./Quantity.js";
11
+ import { Perforator } from "./Perforator.js";
11
12
  /**
12
13
  * This condition state is used to describe the roll's
13
14
  * paper shrinkage or stretching. It might be calculated
@@ -114,6 +115,12 @@ export interface ProductionEvent {
114
115
  * @see reo:paperSpeed
115
116
  */
116
117
  speed?: ObjectAssumption<PaperSpeed>;
118
+ /**
119
+ * The perforator the copy was punched on, with the setting its
120
+ * perforations show.
121
+ * @see crm:P16 used specific object
122
+ */
123
+ perforator?: Perforator;
117
124
  /**
118
125
  * The features the copy came from its punching with: the note and
119
126
  * expression perforations, and now and then a mark the perforator
@@ -204,8 +211,10 @@ export interface RollCopy extends WithType<'RollCopy'>, WithId {
204
211
  ops: Array<'shifted' | 'stretched' | 'shortened'>;
205
212
  /**
206
213
  * Physical measurements of this roll copy, including
207
- * dimensions, punch diameter, hole separation, margins,
208
- * shift corrections, and information about the measuring software.
214
+ * dimensions, hole separation, margins, shift corrections,
215
+ * and information about the measuring software. What the
216
+ * perforations tell about the machine that cut them is stated
217
+ * with the production.
209
218
  * @see crm:P39i was measured by
210
219
  */
211
220
  measurements: Partial<{
@@ -231,13 +240,11 @@ export interface RollCopy extends WithType<'RollCopy'>, WithId {
231
240
  unit: 'mm';
232
241
  };
233
242
  /**
234
- * The average diameter of punched holes.
235
- * @see reo:punchDiameter
236
- */
237
- punchDiameter: Measure<'mm'>;
238
- /**
239
- * The distance between adjacent tracker bar holes, in the
240
- * unit the scan was measured in.
243
+ * The distance across the roll from the centre of one track to
244
+ * the next, the track pitch or Teilung, in the unit the scan was
245
+ * measured in. It is fixed by the tracker bar the roll was cut
246
+ * for, and is another thing than the chain pitch, which runs
247
+ * along the roll.
241
248
  * @see reo:holeSeparation
242
249
  */
243
250
  holeSeparation: Measure<'px'> | Measure<'mm'>;
@@ -400,6 +407,8 @@ export declare const isPaperStretch: (condition: RollConditionAssignment) => boo
400
407
  * before the systems were told apart; `reservationsAbout` says so.
401
408
  */
402
409
  export declare const barOf: (copy: Pick<RollCopy, 'production'>) => TrackerBar;
410
+ /** The diameter of the punch the copy was cut with, where the edition holds it true or likely. */
411
+ export declare const punchDiameterOf: (copy: Pick<RollCopy, 'production'>) => Millimeters | undefined;
403
412
  /**
404
413
  * Reads the features of a copy as the tracker bar would read them.
405
414
  * Holes on a position the bar does not read carry no symbol and are
package/lib/RollCopy.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { v4 } from "uuid";
2
2
  import { welteT100 } from "./systems/welteT100/bar.js";
3
3
  import { trackerBarOf } from "./systems/index.js";
4
- import { assignReference } from "./Assumption.js";
4
+ import { assignReference, certaintyOf, isAsserted } from "./Assumption.js";
5
5
  import { px, track } from "./Quantity.js";
6
6
  export const rollConditions = [
7
7
  'general',
@@ -47,6 +47,11 @@ export const isPaperStretch = (condition) => condition.conditionType === 'paper-
47
47
  * before the systems were told apart; `reservationsAbout` says so.
48
48
  */
49
49
  export const barOf = (copy) => trackerBarOf(copy.production?.system) ?? welteT100;
50
+ /** The diameter of the punch the copy was cut with, where the edition holds it true or likely. */
51
+ export const punchDiameterOf = (copy) => {
52
+ const diameter = copy.production?.perforator?.condition?.punchDiameter;
53
+ return diameter && isAsserted(certaintyOf(diameter)) ? diameter.value : undefined;
54
+ };
50
55
  /**
51
56
  * Reads the features of a copy as the tracker bar would read them.
52
57
  * Holes on a position the bar does not read carry no symbol and are
@@ -1,5 +1,5 @@
1
1
  import { derivedKeys } from "./asJsonLd.js";
2
- import { migrate } from "./migrate.js";
2
+ import { migrate, plainCopyId } from "./migrate.js";
3
3
  import { isDateString } from "./utils.js";
4
4
  export const importDate = (str) => {
5
5
  const [y, m, d] = str.split('-').map(s => parseInt(s, 10));
@@ -49,7 +49,7 @@ const withPlainCopyIds = (json) => ({
49
49
  ...json,
50
50
  copies: (json.copies ?? []).map((copy) => ({
51
51
  ...copy,
52
- '@id': typeof copy['@id'] === 'string' ? copy['@id'].replace(/^copy\//, '') : copy['@id']
52
+ '@id': typeof copy['@id'] === 'string' ? plainCopyId(copy['@id']) : copy['@id']
53
53
  }))
54
54
  });
55
55
  export const importJsonLd = (json) => {
package/lib/index.d.ts CHANGED
@@ -16,6 +16,7 @@ export * from './systems/welteT98/bar.js';
16
16
  export * from './systems/index.js';
17
17
  export * from './ReproducingSystem.js';
18
18
  export * from './FeatureSource.js';
19
+ export * from './Perforator.js';
19
20
  export * from './RollCopy.js';
20
21
  export * from './procedures.js';
21
22
  export * from './vocabulary.js';
package/lib/index.js CHANGED
@@ -16,6 +16,7 @@ export * from './systems/welteT98/bar.js';
16
16
  export * from './systems/index.js';
17
17
  export * from './ReproducingSystem.js';
18
18
  export * from './FeatureSource.js';
19
+ export * from './Perforator.js';
19
20
  export * from './RollCopy.js';
20
21
  export * from './procedures.js';
21
22
  export * from './vocabulary.js';
package/lib/migrate.d.ts CHANGED
@@ -11,5 +11,7 @@
11
11
  * had renamed before.
12
12
  */
13
13
  type Json = any;
14
+ /** A copy's id without the `copy/` that documents of earlier releases put before it. */
15
+ export declare const plainCopyId: (id: string) => string;
14
16
  export declare const migrate: (edition: Json) => Json;
15
17
  export {};
package/lib/migrate.js CHANGED
@@ -117,6 +117,39 @@ const withScale = (node) => {
117
117
  const factor = (node.conditions ?? []).find(isPaperStretch)?.factor;
118
118
  return factor === undefined ? node : { ...node, measurements: { ...node.measurements, scale: factor } };
119
119
  };
120
+ /** A copy's id without the `copy/` that documents of earlier releases put before it. */
121
+ export const plainCopyId = (id) => id.replace(/^copy\//, '');
122
+ /**
123
+ * The punch diameter was a measurement of the copy before it was stated
124
+ * as the setting of the perforator that cut it. A diameter of -1 stood
125
+ * for one nobody had measured and is left out. The perforator is named
126
+ * after the copy, so that a file migrated twice names it the same way.
127
+ */
128
+ const withPerforator = (node) => {
129
+ const diameter = node.measurements?.punchDiameter;
130
+ if (diameter === undefined)
131
+ return node;
132
+ const { punchDiameter: _moved, ...measurements } = node.measurements;
133
+ if (!(diameter?.value > 0))
134
+ return { ...node, measurements };
135
+ const perforator = node.production?.perforator ?? { '@id': `perforator_${plainCopyId(node['@id'])}` };
136
+ return {
137
+ ...node,
138
+ measurements,
139
+ production: {
140
+ ...node.production,
141
+ perforator: {
142
+ ...perforator,
143
+ condition: {
144
+ '@type': 'ConditionState',
145
+ conditionType: 'setting',
146
+ ...perforator.condition,
147
+ punchDiameter: diameter
148
+ }
149
+ }
150
+ }
151
+ };
152
+ };
120
153
  /** A derivation written as a single one, before a version could name several. */
121
154
  const isSingleDerivation = (basedOn) => basedOn !== null && typeof basedOn === 'object' && !Array.isArray(basedOn);
122
155
  const withDerivationList = (node) => isSingleDerivation(node.basedOn) ? { ...node, basedOn: [node.basedOn] } : node;
@@ -233,7 +266,7 @@ const withTimeSpanDates = (node) => {
233
266
  return { ...rest, within };
234
267
  };
235
268
  const migrateNode = (node) => [withRenamedKeys, withTypology, withoutVersionType, withoutVersionSiglum, withLowerCaseTerms, withSplitMethod, withReferences, withKeeper, withoutEmptyKeeper,
236
- withProductionNodes, withScale, withDerivationList, withReadingKind, withTimeSpanDates, withoutFeatureKind,
269
+ withPerforator, withProductionNodes, withScale, withDerivationList, withReadingKind, withTimeSpanDates, withoutFeatureKind,
237
270
  withBorneFeaturesNamed, withFeaturesInActs]
238
271
  .reduce((result, step) => step(result), node);
239
272
  /** The items each walked, or the very same list where the walk changed none. */
@@ -157,7 +157,20 @@ export function readFromStanfordAton(atonString, { trackShift, system = welteT10
157
157
  id: v4(),
158
158
  ops: [],
159
159
  conditions: [],
160
- production: { system: systemOf(system), produced: features },
160
+ production: {
161
+ system: systemOf(system),
162
+ ...(punchDiameter !== undefined && {
163
+ perforator: {
164
+ id: `perforator_${v4()}`,
165
+ condition: {
166
+ type: 'ConditionState',
167
+ conditionType: 'setting',
168
+ punchDiameter: { value: punchDiameter, unit: 'mm' }
169
+ }
170
+ }
171
+ }),
172
+ produced: features
173
+ },
161
174
  modifications: [],
162
175
  ...((scan ?? stanford) && { scan: scan ?? stanford?.scan }),
163
176
  measurements: {
@@ -166,9 +179,6 @@ export function readFromStanfordAton(atonString, { trackShift, system = welteT10
166
179
  height: inMillimeters(readPx(json.ROLLINFO.IMAGE_LENGTH), dpi),
167
180
  unit: 'mm'
168
181
  },
169
- ...(punchDiameter !== undefined && {
170
- punchDiameter: { value: punchDiameter, unit: 'mm' }
171
- }),
172
182
  holeSeparation: {
173
183
  value: separation,
174
184
  unit: 'px'
package/lib/schema.json CHANGED
@@ -1854,6 +1854,56 @@
1854
1854
  ],
1855
1855
  "description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain."
1856
1856
  },
1857
+ "ObjectAssumption<Advance>": {
1858
+ "description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain.",
1859
+ "properties": {
1860
+ "@annotation": {
1861
+ "description": "An optional annotation expressing a belief about this assumption. Uses the JSON-LD-star `@annotation` mechanism to attach epistemic metadata (certainty and reasons) to any triple.",
1862
+ "properties": {
1863
+ "belief": {
1864
+ "$ref": "#/definitions/Belief",
1865
+ "description": "The belief held about the annotated statement.",
1866
+ "ontology": "crminf:J4i is subject of"
1867
+ },
1868
+ "@id": {
1869
+ "description": "A unique identifier for this object.",
1870
+ "type": "string"
1871
+ }
1872
+ },
1873
+ "required": [
1874
+ "belief",
1875
+ "@id"
1876
+ ],
1877
+ "type": "object"
1878
+ },
1879
+ "n": {
1880
+ "description": "How many slot lengths were folded.",
1881
+ "type": "number",
1882
+ "ontology": "reo:sampleSize"
1883
+ },
1884
+ "strength": {
1885
+ "description": "How closely the lengths keep the period, from 0 where they scatter to 1 where every one falls on the comb: the mean resultant length of the lengths folded onto it. A period found weakly is the result of a search all the same; the belief it is stated with says how far it is held to be the machine's step.",
1886
+ "type": "number",
1887
+ "ontology": "reo:strength"
1888
+ },
1889
+ "unit": {
1890
+ "const": "mm",
1891
+ "description": "The unit of measurement.",
1892
+ "type": "string",
1893
+ "ontology": "crm:P91 has unit"
1894
+ },
1895
+ "value": {
1896
+ "$ref": "#/definitions/Quantity%3C%22mm%22%3E",
1897
+ "description": "The measured value.",
1898
+ "ontology": "crm:P90 has value"
1899
+ }
1900
+ },
1901
+ "required": [
1902
+ "unit",
1903
+ "value"
1904
+ ],
1905
+ "type": "object"
1906
+ },
1857
1907
  "ObjectAssumption<Agent>": {
1858
1908
  "description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain.",
1859
1909
  "properties": {
@@ -1908,6 +1958,61 @@
1908
1958
  ],
1909
1959
  "type": "object"
1910
1960
  },
1961
+ "ObjectAssumption<ChainPitch>": {
1962
+ "description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain.",
1963
+ "properties": {
1964
+ "@annotation": {
1965
+ "description": "An optional annotation expressing a belief about this assumption. Uses the JSON-LD-star `@annotation` mechanism to attach epistemic metadata (certainty and reasons) to any triple.",
1966
+ "properties": {
1967
+ "belief": {
1968
+ "$ref": "#/definitions/Belief",
1969
+ "description": "The belief held about the annotated statement.",
1970
+ "ontology": "crminf:J4i is subject of"
1971
+ },
1972
+ "@id": {
1973
+ "description": "A unique identifier for this object.",
1974
+ "type": "string"
1975
+ }
1976
+ },
1977
+ "required": [
1978
+ "belief",
1979
+ "@id"
1980
+ ],
1981
+ "type": "object"
1982
+ },
1983
+ "bridge": {
1984
+ "$ref": "#/definitions/Millimeters",
1985
+ "description": "The paper left standing between two slots of a chain. Slot and bridge are medians of their own and need not add up to the pitch.",
1986
+ "ontology": "reo:bridge"
1987
+ },
1988
+ "n": {
1989
+ "description": "How many pitches the median was taken over.",
1990
+ "type": "number",
1991
+ "ontology": "reo:sampleSize"
1992
+ },
1993
+ "slot": {
1994
+ "$ref": "#/definitions/Millimeters",
1995
+ "description": "The length along the roll of one slot of a chain.",
1996
+ "ontology": "reo:slot"
1997
+ },
1998
+ "unit": {
1999
+ "const": "mm",
2000
+ "description": "The unit of measurement.",
2001
+ "type": "string",
2002
+ "ontology": "crm:P91 has unit"
2003
+ },
2004
+ "value": {
2005
+ "$ref": "#/definitions/Quantity%3C%22mm%22%3E",
2006
+ "description": "The measured value.",
2007
+ "ontology": "crm:P90 has value"
2008
+ }
2009
+ },
2010
+ "required": [
2011
+ "unit",
2012
+ "value"
2013
+ ],
2014
+ "type": "object"
2015
+ },
1911
2016
  "ObjectAssumption<CollationTolerance>": {
1912
2017
  "description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain.",
1913
2018
  "properties": {
@@ -2238,6 +2343,46 @@
2238
2343
  ],
2239
2344
  "type": "object"
2240
2345
  },
2346
+ "ObjectAssumption<Measure<\"mm\">>": {
2347
+ "description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain.",
2348
+ "properties": {
2349
+ "@annotation": {
2350
+ "description": "An optional annotation expressing a belief about this assumption. Uses the JSON-LD-star `@annotation` mechanism to attach epistemic metadata (certainty and reasons) to any triple.",
2351
+ "properties": {
2352
+ "belief": {
2353
+ "$ref": "#/definitions/Belief",
2354
+ "description": "The belief held about the annotated statement.",
2355
+ "ontology": "crminf:J4i is subject of"
2356
+ },
2357
+ "@id": {
2358
+ "description": "A unique identifier for this object.",
2359
+ "type": "string"
2360
+ }
2361
+ },
2362
+ "required": [
2363
+ "belief",
2364
+ "@id"
2365
+ ],
2366
+ "type": "object"
2367
+ },
2368
+ "unit": {
2369
+ "const": "mm",
2370
+ "description": "The unit of measurement.",
2371
+ "type": "string",
2372
+ "ontology": "crm:P91 has unit"
2373
+ },
2374
+ "value": {
2375
+ "$ref": "#/definitions/Quantity%3C%22mm%22%3E",
2376
+ "description": "The measured value.",
2377
+ "ontology": "crm:P90 has value"
2378
+ }
2379
+ },
2380
+ "required": [
2381
+ "unit",
2382
+ "value"
2383
+ ],
2384
+ "type": "object"
2385
+ },
2241
2386
  "ObjectAssumption<PaperSpeed>": {
2242
2387
  "anyOf": [
2243
2388
  {
@@ -2514,6 +2659,65 @@
2514
2659
  ],
2515
2660
  "type": "object"
2516
2661
  },
2662
+ "Perforator": {
2663
+ "description": "The machine that punched the copy. It stands for this production alone. Whether it is the one another copy was punched on is left to a statement of identity made about it elsewhere, which its id allows.",
2664
+ "properties": {
2665
+ "condition": {
2666
+ "$ref": "#/definitions/PerforatorSetting",
2667
+ "ontology": "crm:P44 has condition"
2668
+ },
2669
+ "@id": {
2670
+ "description": "A unique identifier for this object.",
2671
+ "type": "string"
2672
+ }
2673
+ },
2674
+ "required": [
2675
+ "@id"
2676
+ ],
2677
+ "type": "object",
2678
+ "ontology": "crm:E22 Human-Made Object"
2679
+ },
2680
+ "PerforatorSetting": {
2681
+ "description": "How the perforator was set when it punched the copy, as far as the perforations show it. No time is stated: how long a machine kept a setting is for a comparison across rolls to find out.",
2682
+ "properties": {
2683
+ "advance": {
2684
+ "$ref": "#/definitions/ObjectAssumption%3CAdvance%3E",
2685
+ "ontology": "reo:advance"
2686
+ },
2687
+ "chainPitch": {
2688
+ "$ref": "#/definitions/ObjectAssumption%3CChainPitch%3E",
2689
+ "ontology": "reo:chainPitch"
2690
+ },
2691
+ "conditionType": {
2692
+ "const": "setting",
2693
+ "description": "The kind of condition, from the list the roll or the kind of feature allows.",
2694
+ "type": "string",
2695
+ "ontology": "crm:P2 has type"
2696
+ },
2697
+ "description": {
2698
+ "description": "A free-text description of the condition, providing details beyond the type classification.",
2699
+ "type": "string",
2700
+ "ontology": "crm:P3 has note"
2701
+ },
2702
+ "punchDiameter": {
2703
+ "$ref": "#/definitions/ObjectAssumption%3CMeasure%3C%22mm%22%3E%3E",
2704
+ "description": "The diameter of the round punch. Taken across the roll, it is the one value of the setting that neither the scale along the roll nor the shrinkage of the paper enters.",
2705
+ "ontology": "reo:punchDiameter"
2706
+ },
2707
+ "@type": {
2708
+ "const": "ConditionState",
2709
+ "description": "The type discriminator for this object.",
2710
+ "type": "string",
2711
+ "ontology": "rdf:type"
2712
+ }
2713
+ },
2714
+ "required": [
2715
+ "conditionType",
2716
+ "@type"
2717
+ ],
2718
+ "type": "object",
2719
+ "ontology": "crm:E3 Condition State"
2720
+ },
2517
2721
  "Person": {
2518
2722
  "$ref": "#/definitions/Agent",
2519
2723
  "description": "An agent that is a person."
@@ -2567,6 +2771,11 @@
2567
2771
  "description": "The paper the roll copy was cut on.",
2568
2772
  "ontology": "crm:P126 employed"
2569
2773
  },
2774
+ "perforator": {
2775
+ "$ref": "#/definitions/Perforator",
2776
+ "description": "The perforator the copy was punched on, with the setting its perforations show.",
2777
+ "ontology": "crm:P16 used specific object"
2778
+ },
2570
2779
  "produced": {
2571
2780
  "description": "The features the copy came from its punching with: the note and expression perforations, and now and then a mark the perforator left. A reading of a scan finds every hole on the paper at once and states it here, and a feature an editor reads as the work of a later hand belongs in the act that made it, whichever kind of feature it is.",
2572
2781
  "items": {
@@ -2742,7 +2951,7 @@
2742
2951
  "ontology": "crm:P50 has current keeper"
2743
2952
  },
2744
2953
  "measurements": {
2745
- "description": "Physical measurements of this roll copy, including dimensions, punch diameter, hole separation, margins, shift corrections, and information about the measuring software.",
2954
+ "description": "Physical measurements of this roll copy, including dimensions, hole separation, margins, shift corrections, and information about the measuring software. What the perforations tell about the machine that cut them is stated with the production.",
2746
2955
  "properties": {
2747
2956
  "dimensions": {
2748
2957
  "description": "The physical dimensions of the roll.",
@@ -2781,7 +2990,7 @@
2781
2990
  "$ref": "#/definitions/Measure%3C%22mm%22%3E"
2782
2991
  }
2783
2992
  ],
2784
- "description": "The distance between adjacent tracker bar holes, in the unit the scan was measured in.",
2993
+ "description": "The distance across the roll from the centre of one track to the next, the track pitch or Teilung, in the unit the scan was measured in. It is fixed by the tracker bar the roll was cut for, and is another thing than the chain pitch, which runs along the roll.",
2785
2994
  "ontology": "reo:holeSeparation"
2786
2995
  },
2787
2996
  "margins": {
@@ -2823,11 +3032,6 @@
2823
3032
  "type": "object",
2824
3033
  "ontology": "crmdig:L23 used software or firmware"
2825
3034
  },
2826
- "punchDiameter": {
2827
- "$ref": "#/definitions/Measure%3C%22mm%22%3E",
2828
- "description": "The average diameter of punched holes.",
2829
- "ontology": "reo:punchDiameter"
2830
- },
2831
3035
  "readerExtension": {
2832
3036
  "description": "What a pneumatic reader added to this copy's holes, where it was taken off again. Such a reader reports how long a valve stayed open, which exceeds the perforation that opened it, so its holes are overlong by a constant while its onsets agree. Nothing for a copy read by other means, whose holes are the punched slots themselves. Not exported to RDF.",
2833
3037
  "properties": {
@@ -157,7 +157,6 @@
157
157
  "dimensions": "reo:dimensions",
158
158
  "width": "reo:width",
159
159
  "height": "reo:height",
160
- "punchDiameter": "reo:punchDiameter",
161
160
  "holeSeparation": "reo:holeSeparation",
162
161
  "scanResolution": "reo:scanResolution",
163
162
  "value": "crm:P90_has_value",
@@ -177,6 +176,19 @@
177
176
  "speed": {
178
177
  "@id": "reo:paperSpeed",
179
178
  "@context": { "value": "crm:P90_has_value" }
179
+ },
180
+ "perforator": {
181
+ "@id": "crm:P16_used_specific_object",
182
+ "@context": {
183
+ "punchDiameter": "reo:punchDiameter",
184
+ "chainPitch": "reo:chainPitch",
185
+ "advance": "reo:advance",
186
+ "slot": "reo:slot",
187
+ "bridge": "reo:bridge",
188
+ "n": "reo:sampleSize",
189
+ "strength": "reo:strength",
190
+ "value": "crm:P90_has_value"
191
+ }
180
192
  }
181
193
  }
182
194
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "linked-rolls",
3
- "version": "0.52.0",
3
+ "version": "0.53.0",
4
4
  "description": "Digital editions of piano rolls: import, collation, editorial assumptions, JSON-LD export, and emulation through a reproducing system",
5
5
  "license": "MIT",
6
6
  "repository": {