linked-rolls 0.0.1
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 +18 -0
- package/lib/Collation.d.ts +4 -0
- package/lib/Collation.js +1 -0
- package/lib/Condition.d.ts +10 -0
- package/lib/Condition.js +1 -0
- package/lib/ConditionState.d.ts +9 -0
- package/lib/ConditionState.js +6 -0
- package/lib/Edit.d.ts +21 -0
- package/lib/Edit.js +112 -0
- package/lib/Edition.d.ts +54 -0
- package/lib/Edition.js +1 -0
- package/lib/EditorialAssumption.d.ts +67 -0
- package/lib/EditorialAssumption.js +26 -0
- package/lib/Emulation.d.ts +76 -0
- package/lib/Emulation.js +474 -0
- package/lib/Feature.d.ts +37 -0
- package/lib/Feature.js +3 -0
- package/lib/Measurement.d.ts +9 -0
- package/lib/Measurement.js +1 -0
- package/lib/PlaceTimeConversion.d.ts +65 -0
- package/lib/PlaceTimeConversion.js +175 -0
- package/lib/RollCopy.d.ts +85 -0
- package/lib/RollCopy.js +273 -0
- package/lib/RollEvent.d.ts +76 -0
- package/lib/RollEvent.js +3 -0
- package/lib/Stage.d.ts +37 -0
- package/lib/Stage.js +165 -0
- package/lib/Symbol.d.ts +62 -0
- package/lib/Symbol.js +29 -0
- package/lib/TrackerBar.d.ts +8 -0
- package/lib/TrackerBar.js +53 -0
- package/lib/Transcription.d.ts +7 -0
- package/lib/Transcription.js +9 -0
- package/lib/Version.d.ts +42 -0
- package/lib/Version.js +217 -0
- package/lib/WithId.d.ts +3 -0
- package/lib/WithId.js +1 -0
- package/lib/alignFeatures.d.ts +11 -0
- package/lib/alignFeatures.js +54 -0
- package/lib/alignRolls.d.ts +7 -0
- package/lib/alignRolls.js +49 -0
- package/lib/alignSymbols.d.ts +7 -0
- package/lib/alignSymbols.js +49 -0
- package/lib/asJsonLd.d.ts +3 -0
- package/lib/asJsonLd.js +67 -0
- package/lib/asMIDISpans.d.ts +23 -0
- package/lib/asMIDISpans.js +111 -0
- package/lib/aton/AtonParser.d.ts +48 -0
- package/lib/aton/AtonParser.js +245 -0
- package/lib/aton/AtonParser.test.d.ts +1 -0
- package/lib/aton/AtonParser.test.js +16 -0
- package/lib/build-schema.cjs +113 -0
- package/lib/context.d.ts +1 -0
- package/lib/context.js +1 -0
- package/lib/importJsonLd.d.ts +4 -0
- package/lib/importJsonLd.js +121 -0
- package/lib/index.d.ts +17 -0
- package/lib/index.js +17 -0
- package/lib/spec/context.json +192 -0
- package/package.json +27 -0
package/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# linked-rolls
|
|
2
|
+
|
|
3
|
+
linked-rolls is a lightweight Typescript library for creating, manipulating
|
|
4
|
+
and exporting digital editions of piano roll. In particular it allows to:
|
|
5
|
+
|
|
6
|
+
- import piano rolls from different formats (such
|
|
7
|
+
as SUPRA's roll analysis files, DSP, etc.)
|
|
8
|
+
- collate differing piano roll copies
|
|
9
|
+
- create an manipulate editorial assumptions
|
|
10
|
+
- export the edition as JSON-LD (based on the
|
|
11
|
+
linked-rolls ontology)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## Building
|
|
15
|
+
```
|
|
16
|
+
npm i
|
|
17
|
+
npm run build
|
|
18
|
+
```
|
package/lib/Collation.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { WithId } from "./WithId";
|
|
2
|
+
/**
|
|
3
|
+
* Describes the physical condition of a roll or
|
|
4
|
+
* of a feature on the roll (e.g. a damaged
|
|
5
|
+
* or unsuccessful perforation).
|
|
6
|
+
*/
|
|
7
|
+
export interface ConditionState<T extends string> extends WithId {
|
|
8
|
+
type: T;
|
|
9
|
+
description?: string;
|
|
10
|
+
}
|
package/lib/Condition.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/lib/Edit.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Person } from "./Edition";
|
|
2
|
+
import { EditorialAssumption, Motivation } from "./EditorialAssumption";
|
|
3
|
+
import { AnySymbol } from "./Symbol";
|
|
4
|
+
import { WithId } from "./WithId";
|
|
5
|
+
export declare const editMotivations: readonly ["short-dynamic-differentation", "additional-accent", "add-redundancy", "remove-redundancy", "replace-with-equivalent", "shift", "correct-error", "shorten", "prolong"];
|
|
6
|
+
export type EditMotivation = typeof editMotivations[number];
|
|
7
|
+
export type ActorAssignment = EditorialAssumption<'actorAssignment', Person>;
|
|
8
|
+
/**
|
|
9
|
+
* Actor should be used to indicate the person who
|
|
10
|
+
* (presumably) carried out the edit.
|
|
11
|
+
*/
|
|
12
|
+
export interface Edit extends WithId {
|
|
13
|
+
actor?: ActorAssignment;
|
|
14
|
+
motivation?: Motivation<EditMotivation>;
|
|
15
|
+
insert?: AnySymbol[];
|
|
16
|
+
delete?: AnySymbol[];
|
|
17
|
+
intentionOf?: AnySymbol[];
|
|
18
|
+
}
|
|
19
|
+
export declare const isEdit: (object: any) => object is Edit;
|
|
20
|
+
export declare const merge: (selection: Edit[]) => Edit;
|
|
21
|
+
export declare const split: (edit: Edit) => Edit[];
|
package/lib/Edit.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { v4 } from "uuid";
|
|
2
|
+
import { assign } from "./EditorialAssumption";
|
|
3
|
+
import { dimensionOf } from "./Symbol";
|
|
4
|
+
export const editMotivations = [
|
|
5
|
+
/**
|
|
6
|
+
* An additional accent that can only be encoded with
|
|
7
|
+
* sforzando on/off due to the short space left between
|
|
8
|
+
* the notes to be differentiated.
|
|
9
|
+
*/
|
|
10
|
+
'short-dynamic-differentation',
|
|
11
|
+
'additional-accent',
|
|
12
|
+
'add-redundancy',
|
|
13
|
+
'remove-redundancy',
|
|
14
|
+
'replace-with-equivalent',
|
|
15
|
+
'shift',
|
|
16
|
+
'correct-error',
|
|
17
|
+
'shorten',
|
|
18
|
+
'prolong',
|
|
19
|
+
];
|
|
20
|
+
export const isEdit = (object) => {
|
|
21
|
+
return 'insert' in object || 'delete' in object;
|
|
22
|
+
};
|
|
23
|
+
const arraysIdentical = (a, b) => {
|
|
24
|
+
let i = a.length;
|
|
25
|
+
if (i != b.length)
|
|
26
|
+
return false;
|
|
27
|
+
while (i--) {
|
|
28
|
+
if (Array.isArray(a[i]) && Array.isArray(b[i])) {
|
|
29
|
+
return arraysIdentical(a[i], b[i]);
|
|
30
|
+
}
|
|
31
|
+
if (a[i] !== b[i])
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
};
|
|
36
|
+
const guessMotivation = (edit) => {
|
|
37
|
+
const inserts = (edit.insert || []);
|
|
38
|
+
const deletes = (edit.delete || []);
|
|
39
|
+
const types = [
|
|
40
|
+
inserts.filter(e => e.type === 'expression').map(e => e.expressionType),
|
|
41
|
+
deletes.filter(e => e.type === 'expression').map(e => e.expressionType)
|
|
42
|
+
];
|
|
43
|
+
if (arraysIdentical(types, [['SlowCrescendoOn', 'SlowCrescendoOff'], []])) {
|
|
44
|
+
return 'additional-accent';
|
|
45
|
+
}
|
|
46
|
+
else if (arraysIdentical(types, [['ForzandoOn', 'ForzandoOff'], []])) {
|
|
47
|
+
// TODO: check if the inserts are very close
|
|
48
|
+
// and return 'short-dynamic-differentation'
|
|
49
|
+
return 'additional-accent';
|
|
50
|
+
}
|
|
51
|
+
else if (types.every(t => t.length > 1) && arraysIdentical(types[0], types[1])) {
|
|
52
|
+
return 'shift';
|
|
53
|
+
}
|
|
54
|
+
else if (types[0].length === 0 && types[1].length === 1) {
|
|
55
|
+
return 'remove-redundancy';
|
|
56
|
+
}
|
|
57
|
+
if (inserts.length === 1 && deletes.length === 1) {
|
|
58
|
+
const insertDim = dimensionOf(inserts[0]).horizontal;
|
|
59
|
+
const deleteDim = dimensionOf(deletes[0]).horizontal;
|
|
60
|
+
if (Math.abs(insertDim.from - deleteDim.from) < 5) {
|
|
61
|
+
const insertLength = Math.abs(insertDim.to - insertDim.from);
|
|
62
|
+
const deleteLength = Math.abs(deleteDim.to - deleteDim.from);
|
|
63
|
+
if (insertLength < deleteLength) {
|
|
64
|
+
return 'shorten';
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
return 'prolong';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return 'correct-error';
|
|
72
|
+
};
|
|
73
|
+
export const merge = (selection) => {
|
|
74
|
+
const result = selection[0];
|
|
75
|
+
selection
|
|
76
|
+
.slice(1)
|
|
77
|
+
.forEach(edit => {
|
|
78
|
+
if (result.insert) {
|
|
79
|
+
result.insert.push(...(edit.insert || []));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
result.insert = edit.insert;
|
|
83
|
+
}
|
|
84
|
+
if (result.delete) {
|
|
85
|
+
result.delete.push(...(edit.delete || []));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
result.delete = edit.delete;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
return {
|
|
92
|
+
...result,
|
|
93
|
+
id: v4(),
|
|
94
|
+
motivation: assign('motivationAssignment', guessMotivation(result)),
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
export const split = (edit) => {
|
|
98
|
+
const result = [];
|
|
99
|
+
for (const insert of edit.insert ?? []) {
|
|
100
|
+
result.push({
|
|
101
|
+
id: v4(),
|
|
102
|
+
insert: [insert]
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
for (const remove of edit.delete ?? []) {
|
|
106
|
+
result.push({
|
|
107
|
+
id: v4(),
|
|
108
|
+
delete: [remove]
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
};
|
package/lib/Edition.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { EditorialAssumption } from "./EditorialAssumption";
|
|
2
|
+
import { WithId } from "./WithId";
|
|
3
|
+
import { DateAssignment, RollCopy } from "./RollCopy";
|
|
4
|
+
import { Version } from "./Version";
|
|
5
|
+
import { CollationTolerance } from "./Collation";
|
|
6
|
+
export interface Person extends Partial<WithId> {
|
|
7
|
+
name: string;
|
|
8
|
+
sameAs: string[];
|
|
9
|
+
role?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface Place {
|
|
12
|
+
name: string;
|
|
13
|
+
sameAs: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface EditionCreation {
|
|
16
|
+
publisher: Person;
|
|
17
|
+
publicationDate: Date;
|
|
18
|
+
collationTolerance?: CollationTolerance;
|
|
19
|
+
}
|
|
20
|
+
export interface RecordingEvent {
|
|
21
|
+
recorded: {
|
|
22
|
+
pianist: Person;
|
|
23
|
+
playing: string;
|
|
24
|
+
};
|
|
25
|
+
place: Place;
|
|
26
|
+
/**
|
|
27
|
+
* The recording date of the roll. This is a date
|
|
28
|
+
* assignment so that we can state e.g. the catalogue
|
|
29
|
+
* or the roll label which indicates the date of the recording.
|
|
30
|
+
*/
|
|
31
|
+
date: DateAssignment;
|
|
32
|
+
created?: Version;
|
|
33
|
+
}
|
|
34
|
+
export interface Roll {
|
|
35
|
+
catalogueNumber: string;
|
|
36
|
+
recordingEvent: RecordingEvent;
|
|
37
|
+
}
|
|
38
|
+
export interface RollTempo {
|
|
39
|
+
startsWith: number;
|
|
40
|
+
endsWith: number;
|
|
41
|
+
unit: string;
|
|
42
|
+
}
|
|
43
|
+
export type TempoAssignment = EditorialAssumption<'tempoAssignment', RollTempo>;
|
|
44
|
+
export interface Edition {
|
|
45
|
+
base: string;
|
|
46
|
+
creation: EditionCreation;
|
|
47
|
+
title: string;
|
|
48
|
+
license: string;
|
|
49
|
+
roll: Roll;
|
|
50
|
+
copies: RollCopy[];
|
|
51
|
+
versions: Version[];
|
|
52
|
+
tempoAdjustment?: TempoAssignment;
|
|
53
|
+
}
|
|
54
|
+
export type EditionMetadata = Pick<Edition, 'base' | 'title' | 'license' | 'creation' | 'roll'>;
|
package/lib/Edition.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { WithId } from "./WithId";
|
|
2
|
+
import { Person } from "./Edition";
|
|
3
|
+
export declare const certainties: readonly ["true", "likely", "possible", "unlikely", "false"];
|
|
4
|
+
export type Certainty = typeof certainties[number];
|
|
5
|
+
export type WithActor = {
|
|
6
|
+
actor?: Person;
|
|
7
|
+
};
|
|
8
|
+
export type WithNote = {
|
|
9
|
+
note?: string;
|
|
10
|
+
};
|
|
11
|
+
export interface Argumentation<T extends string = 'simpleArgumentation'> extends WithActor, WithNote {
|
|
12
|
+
type: T;
|
|
13
|
+
}
|
|
14
|
+
export interface MeaningComprehension<T> extends Argumentation<'meaningComprehension'> {
|
|
15
|
+
comprehends: T[];
|
|
16
|
+
}
|
|
17
|
+
export interface Inference extends Argumentation<'inference'> {
|
|
18
|
+
premises: Belief[];
|
|
19
|
+
}
|
|
20
|
+
export interface BeliefAdoption extends Argumentation<'beliefAdoption'> {
|
|
21
|
+
note: string;
|
|
22
|
+
}
|
|
23
|
+
export type AnyArgumentation = MeaningComprehension<any> | Inference | BeliefAdoption | Argumentation;
|
|
24
|
+
export declare function isMeaningComprehension<AboutT>(object: AnyArgumentation, aboutGuard: (x: any) => x is AboutT): object is MeaningComprehension<AboutT>;
|
|
25
|
+
export interface Belief extends WithId {
|
|
26
|
+
type: 'belief';
|
|
27
|
+
certainty: Certainty;
|
|
28
|
+
reasons: AnyArgumentation[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* An editorial assumpton is always a One-Proposition Set.
|
|
32
|
+
*/
|
|
33
|
+
export interface EditorialAssumption<Name, AssignedType> extends WithId {
|
|
34
|
+
type: Name;
|
|
35
|
+
assigned: AssignedType;
|
|
36
|
+
belief?: Belief;
|
|
37
|
+
}
|
|
38
|
+
export declare function flat<Name, Type>(assumption: EditorialAssumption<Name, Type>): Type;
|
|
39
|
+
export declare function flat<Name, Type>(assumption: EditorialAssumption<Name, Type>[]): Type[];
|
|
40
|
+
export declare function assign<Type extends string, T>(type: Type, object: T): EditorialAssumption<Type, T>;
|
|
41
|
+
export type DimensionMarker = {
|
|
42
|
+
point: 'start' | 'end';
|
|
43
|
+
of: Symbol;
|
|
44
|
+
};
|
|
45
|
+
type PlacementType = 'after' | 'before' | 'with';
|
|
46
|
+
export interface Constraint {
|
|
47
|
+
placed: DimensionMarker;
|
|
48
|
+
placement: PlacementType;
|
|
49
|
+
relativeTo: DimensionMarker | {
|
|
50
|
+
number: number;
|
|
51
|
+
unit: string;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export interface Motivation<MotivationT> extends EditorialAssumption<'motivationAssignment', MotivationT> {
|
|
55
|
+
}
|
|
56
|
+
export declare const isMotivation: (object: any) => object is Motivation<any>;
|
|
57
|
+
export interface QuestionMaking extends WithActor {
|
|
58
|
+
premises: (Belief | Question)[];
|
|
59
|
+
raise: Question;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Modelled on IAM's Question, cf. M. Doerr et al., p. 12
|
|
63
|
+
*/
|
|
64
|
+
export interface Question {
|
|
65
|
+
question: string;
|
|
66
|
+
}
|
|
67
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { v4 } from "uuid";
|
|
2
|
+
export const certainties = [
|
|
3
|
+
'true',
|
|
4
|
+
'likely',
|
|
5
|
+
'possible',
|
|
6
|
+
'unlikely',
|
|
7
|
+
'false'
|
|
8
|
+
];
|
|
9
|
+
export function isMeaningComprehension(object, aboutGuard) {
|
|
10
|
+
return object.type === 'meaningComprehension' && object.comprehends.every(aboutGuard);
|
|
11
|
+
}
|
|
12
|
+
export function flat(assumption) {
|
|
13
|
+
return Array.isArray(assumption)
|
|
14
|
+
? assumption.map(a => a.assigned)
|
|
15
|
+
: assumption.assigned;
|
|
16
|
+
}
|
|
17
|
+
export function assign(type, object) {
|
|
18
|
+
return {
|
|
19
|
+
type,
|
|
20
|
+
id: v4(),
|
|
21
|
+
assigned: object
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export const isMotivation = (object) => {
|
|
25
|
+
return 'type' in object && object.type === 'motivationAssignment';
|
|
26
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { MidiFile } from "midifile-ts";
|
|
2
|
+
import { AnySymbol, Expression, Note } from "./Symbol";
|
|
3
|
+
import { PlaceTimeConversion } from "./PlaceTimeConversion";
|
|
4
|
+
import { Version } from "./Version";
|
|
5
|
+
import { RollFeature } from "./Feature";
|
|
6
|
+
import { RollTempo } from "./Edition";
|
|
7
|
+
interface PerformedRollFeature<T> {
|
|
8
|
+
type: T;
|
|
9
|
+
performs: (AnySymbol | NegotiatedEvent);
|
|
10
|
+
at: number;
|
|
11
|
+
}
|
|
12
|
+
interface PerformedNoteEvent<T> extends PerformedRollFeature<T> {
|
|
13
|
+
pitch: number;
|
|
14
|
+
velocity: number;
|
|
15
|
+
}
|
|
16
|
+
export interface PerformedNoteOnEvent extends PerformedNoteEvent<'noteOn'> {
|
|
17
|
+
}
|
|
18
|
+
export interface PerformedNoteOffEvent extends PerformedNoteEvent<'noteOff'> {
|
|
19
|
+
}
|
|
20
|
+
export interface PerformedSustainPedalOnEvent extends PerformedRollFeature<'sustainPedalOn'> {
|
|
21
|
+
}
|
|
22
|
+
export interface PerformedSustainPedalOffEvent extends PerformedRollFeature<'sustainPedalOff'> {
|
|
23
|
+
}
|
|
24
|
+
export interface PerformedSoftPedalOnEvent extends PerformedRollFeature<'softPedalOn'> {
|
|
25
|
+
}
|
|
26
|
+
export interface PerformedSoftPedalOffEvent extends PerformedRollFeature<'softPedalOff'> {
|
|
27
|
+
}
|
|
28
|
+
export type AnyPerformedRollFeature = PerformedNoteOnEvent | PerformedNoteOffEvent | PerformedSustainPedalOnEvent | PerformedSustainPedalOffEvent | PerformedSoftPedalOnEvent | PerformedSoftPedalOffEvent;
|
|
29
|
+
type AssumedPhysicalTimeSpan = {
|
|
30
|
+
assumedPhysicalTime?: [number, number];
|
|
31
|
+
};
|
|
32
|
+
export type NegotiatedEvent = Omit<Note | Expression, 'carriers'> & Pick<RollFeature, 'horizontal' | 'vertical'> & AssumedPhysicalTimeSpan;
|
|
33
|
+
export type EmulationOptions = {
|
|
34
|
+
welte_p: number;
|
|
35
|
+
welte_f: number;
|
|
36
|
+
welte_mf: number;
|
|
37
|
+
welte_loud: number;
|
|
38
|
+
slow_decay_rate: number;
|
|
39
|
+
fastC_decay_rate: number;
|
|
40
|
+
fastD_decay_rate: number;
|
|
41
|
+
trackerBarDiameter: number;
|
|
42
|
+
punchExtensionFraction: number;
|
|
43
|
+
slow_step?: number;
|
|
44
|
+
fastC_step?: number;
|
|
45
|
+
fastD_step?: number;
|
|
46
|
+
division: number;
|
|
47
|
+
};
|
|
48
|
+
export declare class Emulation {
|
|
49
|
+
placeTimeConversion: PlaceTimeConversion;
|
|
50
|
+
midiEvents: (AnyPerformedRollFeature)[];
|
|
51
|
+
negotiatedEvents: NegotiatedEvent[];
|
|
52
|
+
trebleVelocities: number[];
|
|
53
|
+
bassVelocities: number[];
|
|
54
|
+
startTempo?: number;
|
|
55
|
+
endTempo?: number;
|
|
56
|
+
source?: string;
|
|
57
|
+
options: EmulationOptions;
|
|
58
|
+
constructor(options?: EmulationOptions);
|
|
59
|
+
private findRollTempo;
|
|
60
|
+
private assignPhysicalTime;
|
|
61
|
+
private applyTrackerBarExtension;
|
|
62
|
+
private convertEventsToMIDI;
|
|
63
|
+
emulateFromRoll(events: (Note | Expression)[]): AnyPerformedRollFeature[];
|
|
64
|
+
emulateVersion(version: Version, rollTempo?: RollTempo, skipToFirstNote?: boolean): AnyPerformedRollFeature[];
|
|
65
|
+
/**
|
|
66
|
+
* The original code of the calculateVelocities() method,
|
|
67
|
+
* written by Kitty Shi and Craig Stuart Sapp,
|
|
68
|
+
* was taken from the midi2exp project (https://github.com/pianoroll/midi2exp)
|
|
69
|
+
* and adapted to the different data representation.
|
|
70
|
+
*/
|
|
71
|
+
calculateVelocities(scope: 'treble' | 'bass'): void;
|
|
72
|
+
private insertNote;
|
|
73
|
+
findEventsPerforming(id: string): AnyPerformedRollFeature[];
|
|
74
|
+
asMIDI(): MidiFile;
|
|
75
|
+
}
|
|
76
|
+
export {};
|