@marmooo/midy 0.0.3 → 0.0.5
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/esm/deps/cdn.jsdelivr.net/npm/@marmooo/{soundfont-parser@0.0.1 → soundfont-parser@0.0.2}/+esm.d.ts +13 -6
- package/esm/deps/cdn.jsdelivr.net/npm/@marmooo/soundfont-parser@0.0.2/+esm.d.ts.map +1 -0
- package/esm/deps/cdn.jsdelivr.net/npm/@marmooo/{soundfont-parser@0.0.1 → soundfont-parser@0.0.2}/+esm.js +5 -5
- package/esm/midy-GM1.d.ts +27 -36
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +199 -135
- package/esm/midy-GM2.d.ts +51 -35
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +234 -141
- package/esm/midy-GMLite.d.ts +25 -36
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +187 -135
- package/esm/midy.d.ts +68 -24
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +274 -141
- package/package.json +1 -1
- package/script/deps/cdn.jsdelivr.net/npm/@marmooo/{soundfont-parser@0.0.1 → soundfont-parser@0.0.2}/+esm.d.ts +13 -6
- package/script/deps/cdn.jsdelivr.net/npm/@marmooo/soundfont-parser@0.0.2/+esm.d.ts.map +1 -0
- package/script/deps/cdn.jsdelivr.net/npm/@marmooo/{soundfont-parser@0.0.1 → soundfont-parser@0.0.2}/+esm.js +5 -5
- package/script/midy-GM1.d.ts +27 -36
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +199 -135
- package/script/midy-GM2.d.ts +51 -35
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +234 -141
- package/script/midy-GMLite.d.ts +25 -36
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +187 -135
- package/script/midy.d.ts +68 -24
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +274 -141
- package/esm/deps/cdn.jsdelivr.net/npm/@marmooo/soundfont-parser@0.0.1/+esm.d.ts.map +0 -1
- package/script/deps/cdn.jsdelivr.net/npm/@marmooo/soundfont-parser@0.0.1/+esm.d.ts.map +0 -1
|
@@ -12,7 +12,14 @@ declare class F {
|
|
|
12
12
|
sampleName: any;
|
|
13
13
|
sampleModes: number;
|
|
14
14
|
playbackRate: (e: any) => number;
|
|
15
|
+
modLfoToPitch: number;
|
|
16
|
+
vibLfoToPitch: number;
|
|
15
17
|
modEnvToPitch: number;
|
|
18
|
+
initialFilterFc: number;
|
|
19
|
+
initialFilterQ: number;
|
|
20
|
+
modLfoToFilterFc: number;
|
|
21
|
+
modEnvToFilterFc: number;
|
|
22
|
+
modLfoToVolume: number;
|
|
16
23
|
scaleTuning: number;
|
|
17
24
|
start: number;
|
|
18
25
|
end: number;
|
|
@@ -32,12 +39,12 @@ declare class F {
|
|
|
32
39
|
modRelease: number;
|
|
33
40
|
keyRange: d;
|
|
34
41
|
velRange: d;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
42
|
+
delayModLFO: number;
|
|
43
|
+
freqModLFO: number;
|
|
44
|
+
delayVibLFO: number;
|
|
45
|
+
freqVibLFO: number;
|
|
38
46
|
initialAttenuation: number;
|
|
39
|
-
|
|
40
|
-
pan: undefined;
|
|
47
|
+
pan: number;
|
|
41
48
|
} | null;
|
|
42
49
|
getPresetNames(): {};
|
|
43
50
|
}
|
|
@@ -95,7 +102,7 @@ declare namespace T {
|
|
|
95
102
|
let initialFilterQ: number;
|
|
96
103
|
let initialFilterFc: number;
|
|
97
104
|
let sampleModes: number;
|
|
98
|
-
let pan:
|
|
105
|
+
let pan: number;
|
|
99
106
|
}
|
|
100
107
|
declare function b(e: any, n?: {}): {
|
|
101
108
|
samples: any;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"+esm.d.ts","sourceRoot":"","sources":["../../../../../../src/deps/cdn.jsdelivr.net/npm/@marmooo/soundfont-parser@0.0.2/+esm.js"],"names":[],"mappings":";;AAMizX;IAAQ,oBAA2H;IAAd,YAAa;IAAC,qDAAoJ;IAAA,mCAAoP;IAAA,uCAAwQ;IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAAkqE;IAAA,qBAA0I;CAAC;AAAA,mCAAwC;AAA9oI,+BAA8F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA98D;;;;;;;;;;;;;;;;EAA27B;AAAr4I;IAAqQ,wBAAwD;IAArT,4BAAyN;IAApB,QAAS;IAAC,QAAS;IAAC,oBAAoC;CAAyD;AAAllG;IAAwjC,gCAA8d;CAAC"}
|
|
@@ -6,7 +6,7 @@ exports.createGeneratorObject = I;
|
|
|
6
6
|
exports.parse = b;
|
|
7
7
|
/**
|
|
8
8
|
* Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.37.0.
|
|
9
|
-
* Original file: /npm/@marmooo/soundfont-parser@0.0.
|
|
9
|
+
* Original file: /npm/@marmooo/soundfont-parser@0.0.2/esm/mod.js
|
|
10
10
|
*
|
|
11
11
|
* Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
|
|
12
12
|
*/
|
|
@@ -114,7 +114,7 @@ function I(e) { const t = {}; for (const r of e) {
|
|
|
114
114
|
const e = r.type;
|
|
115
115
|
void 0 !== e && (t[e] = r.value);
|
|
116
116
|
} return t; }
|
|
117
|
-
const T = { keynum: void 0, instrument: void 0, velocity: void 0, exclusiveClass: void 0, keyRange: new d(0, 127), velRange: new d(0, 127), sampleID: void 0, delayVolEnv: -12e3, attackVolEnv: -12e3, decayVolEnv: -12e3, holdVolEnv: -12e3, sustainVolEnv: 0, releaseVolEnv: -12e3, delayModEnv: -12e3, attackModEnv: -12e3, decayModEnv: -12e3, holdModEnv: -12e3, sustainModEnv: 0, releaseModEnv: -12e3, modEnvToPitch: 0, modEnvToFilterFc: 0, modLfoToFilterFc: 0, modLfoToPitch: 0, modLfoToVolume: 0, vibLfoToPitch: 0, chorusEffectsSend: 0, reverbEffectsSend: 0, delayModLFO: 0, freqModLFO: 0, delayVibLFO: 0, keynumToModEnvDecay: 0, keynumToModEnvHold: 0, keynumToVolEnvDecay: 0, keynumToVolEnvHold: 0, coarseTune: 0, fineTune: 0, scaleTuning: 100, freqVibLFO: 0, startAddrsOffset: 0, startAddrsCoarseOffset: 0, endAddrsOffset: 0, endAddrsCoarseOffset: 0, startloopAddrsOffset: 0, startloopAddrsCoarseOffset: 0, initialAttenuation: 0, endloopAddrsOffset: 0, endloopAddrsCoarseOffset: 0, overridingRootKey: void 0, initialFilterQ: 1, initialFilterFc: 13500, sampleModes: 0, pan:
|
|
117
|
+
const T = { keynum: void 0, instrument: void 0, velocity: void 0, exclusiveClass: void 0, keyRange: new d(0, 127), velRange: new d(0, 127), sampleID: void 0, delayVolEnv: -12e3, attackVolEnv: -12e3, decayVolEnv: -12e3, holdVolEnv: -12e3, sustainVolEnv: 0, releaseVolEnv: -12e3, delayModEnv: -12e3, attackModEnv: -12e3, decayModEnv: -12e3, holdModEnv: -12e3, sustainModEnv: 0, releaseModEnv: -12e3, modEnvToPitch: 0, modEnvToFilterFc: 0, modLfoToFilterFc: 0, modLfoToPitch: 0, modLfoToVolume: 0, vibLfoToPitch: 0, chorusEffectsSend: 0, reverbEffectsSend: 0, delayModLFO: 0, freqModLFO: 0, delayVibLFO: 0, keynumToModEnvDecay: 0, keynumToModEnvHold: 0, keynumToVolEnvDecay: 0, keynumToVolEnvHold: 0, coarseTune: 0, fineTune: 0, scaleTuning: 100, freqVibLFO: 0, startAddrsOffset: 0, startAddrsCoarseOffset: 0, endAddrsOffset: 0, endAddrsCoarseOffset: 0, startloopAddrsOffset: 0, startloopAddrsCoarseOffset: 0, initialAttenuation: 0, endloopAddrsOffset: 0, endloopAddrsCoarseOffset: 0, overridingRootKey: void 0, initialFilterQ: 1, initialFilterFc: 13500, sampleModes: 0, pan: 0 };
|
|
118
118
|
exports.defaultInstrumentZone = T;
|
|
119
119
|
class F {
|
|
120
120
|
constructor(e) { Object.defineProperty(this, "parsed", { enumerable: !0, configurable: !0, writable: !0, value: void 0 }), this.parsed = e; }
|
|
@@ -151,12 +151,12 @@ class F {
|
|
|
151
151
|
break;
|
|
152
152
|
} if (!l)
|
|
153
153
|
return console.warn("instrument not found: bank=%s instrument=%s", e, t), null; if (void 0 === l.sampleID)
|
|
154
|
-
throw new Error("Invalid SoundFont: sampleID not found"); const d = { ...T, ...
|
|
154
|
+
throw new Error("Invalid SoundFont: sampleID not found"); const d = { ...T, ...L(o || {}), ...L(s || {}), ...L(l) }, u = this.parsed.samples[d.sampleID], c = this.parsed.sampleHeaders[d.sampleID], f = d.coarseTune + d.fineTune / 100 + c.pitchCorrection / 100 - (d.overridingRootKey || c.originalPitch), p = d.scaleTuning / 100; return { sample: u, sampleRate: c.sampleRate, sampleName: c.sampleName, sampleModes: d.sampleModes, playbackRate: e => Math.pow(Math.pow(2, 1 / 12), (e + f) * p), modLfoToPitch: d.modLfoToPitch, vibLfoToPitch: d.vibLfoToPitch, modEnvToPitch: d.modEnvToPitch, initialFilterFc: d.initialFilterFc, initialFilterQ: d.initialFilterQ, modLfoToFilterFc: d.modLfoToFilterFc, modEnvToFilterFc: d.modEnvToFilterFc, modLfoToVolume: d.modLfoToVolume, scaleTuning: p, start: 32768 * d.startAddrsCoarseOffset + d.startAddrsOffset, end: 32768 * d.endAddrsCoarseOffset + d.endAddrsOffset, loopStart: c.loopStart + 32768 * d.startloopAddrsCoarseOffset + d.startloopAddrsOffset, loopEnd: c.loopEnd + 32768 * d.endloopAddrsCoarseOffset + d.endloopAddrsOffset, volDelay: M(d.delayVolEnv), volAttack: M(d.attackVolEnv), volHold: M(d.holdVolEnv), volDecay: M(d.decayVolEnv), volSustain: d.sustainVolEnv / 1e3, volRelease: M(d.releaseVolEnv), modDelay: M(d.delayModEnv), modAttack: M(d.attackModEnv), modHold: M(d.holdModEnv), modDecay: M(d.decayModEnv), modSustain: d.sustainModEnv / 1e3, modRelease: M(d.releaseModEnv), keyRange: d.keyRange, velRange: d.velRange, delayModLFO: M(d.delayModLFO), freqModLFO: d.freqModLFO, delayVibLFO: M(d.delayVibLFO), freqVibLFO: d.freqVibLFO, initialAttenuation: d.initialAttenuation, pan: d.pan }; }
|
|
155
155
|
getPresetNames() { const e = {}; return this.parsed.presetHeaders.forEach((t => { e[t.bank] || (e[t.bank] = {}), e[t.bank][t.preset] = t.presetName; })), e; }
|
|
156
156
|
}
|
|
157
157
|
exports.SoundFont = F;
|
|
158
158
|
function M(e) { return Math.pow(2, e / 1200); }
|
|
159
|
-
function
|
|
159
|
+
function L(e) { const t = {}; for (const r in e)
|
|
160
160
|
void 0 !== e[r] && (t[r] = e[r]); return t; }
|
|
161
161
|
exports.default = null;
|
|
162
|
-
//# sourceMappingURL=/sm/
|
|
162
|
+
//# sourceMappingURL=/sm/22d03ff23e99217677631c656a57eea14149d50ae4425cf6cd850760c3e93c1e.map
|
package/script/midy-GM1.d.ts
CHANGED
|
@@ -2,9 +2,6 @@ export class MidyGM1 {
|
|
|
2
2
|
static channelSettings: {
|
|
3
3
|
volume: number;
|
|
4
4
|
pan: number;
|
|
5
|
-
vibratoRate: number;
|
|
6
|
-
vibratoDepth: number;
|
|
7
|
-
vibratoDelay: number;
|
|
8
5
|
bank: number;
|
|
9
6
|
dataMSB: number;
|
|
10
7
|
dataLSB: number;
|
|
@@ -44,12 +41,8 @@ export class MidyGM1 {
|
|
|
44
41
|
masterGain: any;
|
|
45
42
|
channels: {
|
|
46
43
|
scheduledNotes: Map<any, any>;
|
|
47
|
-
sostenutoNotes: Map<any, any>;
|
|
48
44
|
gainNode: any;
|
|
49
45
|
pannerNode: any;
|
|
50
|
-
modulationEffect: {
|
|
51
|
-
lfo: any;
|
|
52
|
-
};
|
|
53
46
|
expression: number;
|
|
54
47
|
modulation: number;
|
|
55
48
|
sustainPedal: boolean;
|
|
@@ -58,9 +51,6 @@ export class MidyGM1 {
|
|
|
58
51
|
pitchBendRange: number;
|
|
59
52
|
volume: number;
|
|
60
53
|
pan: number;
|
|
61
|
-
vibratoRate: number;
|
|
62
|
-
vibratoDepth: number;
|
|
63
|
-
vibratoDelay: number;
|
|
64
54
|
bank: number;
|
|
65
55
|
dataMSB: number;
|
|
66
56
|
dataLSB: number;
|
|
@@ -77,18 +67,11 @@ export class MidyGM1 {
|
|
|
77
67
|
setChannelAudioNodes(audioContext: any): {
|
|
78
68
|
gainNode: any;
|
|
79
69
|
pannerNode: any;
|
|
80
|
-
modulationEffect: {
|
|
81
|
-
lfo: any;
|
|
82
|
-
};
|
|
83
70
|
};
|
|
84
71
|
createChannels(audioContext: any): {
|
|
85
72
|
scheduledNotes: Map<any, any>;
|
|
86
|
-
sostenutoNotes: Map<any, any>;
|
|
87
73
|
gainNode: any;
|
|
88
74
|
pannerNode: any;
|
|
89
|
-
modulationEffect: {
|
|
90
|
-
lfo: any;
|
|
91
|
-
};
|
|
92
75
|
expression: number;
|
|
93
76
|
modulation: number;
|
|
94
77
|
sustainPedal: boolean;
|
|
@@ -97,9 +80,6 @@ export class MidyGM1 {
|
|
|
97
80
|
pitchBendRange: number;
|
|
98
81
|
volume: number;
|
|
99
82
|
pan: number;
|
|
100
|
-
vibratoRate: number;
|
|
101
|
-
vibratoDepth: number;
|
|
102
|
-
vibratoDelay: number;
|
|
103
83
|
bank: number;
|
|
104
84
|
dataMSB: number;
|
|
105
85
|
dataLSB: number;
|
|
@@ -109,8 +89,8 @@ export class MidyGM1 {
|
|
|
109
89
|
coarseTuning: number;
|
|
110
90
|
modulationDepthRange: number;
|
|
111
91
|
}[];
|
|
112
|
-
createNoteBuffer(
|
|
113
|
-
createNoteBufferNode(
|
|
92
|
+
createNoteBuffer(instrumentKey: any, isSF3: any): Promise<any>;
|
|
93
|
+
createNoteBufferNode(instrumentKey: any, isSF3: any): Promise<any>;
|
|
114
94
|
convertToFloat32Array(uint8Array: any): Float32Array;
|
|
115
95
|
scheduleTimelineEvents(t: any, offset: any, queueIndex: any): Promise<any>;
|
|
116
96
|
getQueueIndex(second: any): number;
|
|
@@ -129,30 +109,26 @@ export class MidyGM1 {
|
|
|
129
109
|
seekTo(second: any): void;
|
|
130
110
|
calcTotalTime(): number;
|
|
131
111
|
currentTime(): number;
|
|
132
|
-
getActiveNotes(channel: any): Map<any, any>;
|
|
133
|
-
|
|
134
|
-
createModulationEffect(audioContext: any): {
|
|
135
|
-
lfo: any;
|
|
136
|
-
};
|
|
112
|
+
getActiveNotes(channel: any, time: any): Map<any, any>;
|
|
113
|
+
getActiveNote(noteList: any, time: any): any;
|
|
137
114
|
connectNoteEffects(channel: any, gainNode: any): void;
|
|
138
115
|
cbToRatio(cb: any): number;
|
|
139
116
|
centToHz(cent: any): number;
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
117
|
+
calcSemitoneOffset(channel: any): any;
|
|
118
|
+
calcPlaybackRate(instrumentKey: any, noteNumber: any, semitoneOffset: any): number;
|
|
119
|
+
setVolumeEnvelope(channel: any, note: any): void;
|
|
120
|
+
setFilterEnvelope(channel: any, note: any): void;
|
|
121
|
+
startModulation(channel: any, note: any, time: any): void;
|
|
122
|
+
createNote(channel: any, instrumentKey: any, noteNumber: any, velocity: any, startTime: any, isSF3: any): Promise<Note>;
|
|
146
123
|
scheduleNoteOn(channelNumber: any, noteNumber: any, velocity: any, startTime: any): Promise<void>;
|
|
147
124
|
noteOn(channelNumber: any, noteNumber: any, velocity: any): Promise<void>;
|
|
148
125
|
scheduleNoteRelease(channelNumber: any, noteNumber: any, velocity: any, stopTime: any, stopPedal?: boolean): Promise<any> | undefined;
|
|
149
126
|
releaseNote(channelNumber: any, noteNumber: any, velocity: any): Promise<any> | undefined;
|
|
150
127
|
releaseSustainPedal(channelNumber: any, halfVelocity: any): any[];
|
|
151
128
|
handleMIDIMessage(statusByte: any, data1: any, data2: any): void | any[] | Promise<any>;
|
|
152
|
-
handlePolyphonicKeyPressure(channelNumber: any, noteNumber: any, pressure: any): void;
|
|
153
129
|
handleProgramChange(channelNumber: any, program: any): void;
|
|
154
|
-
|
|
155
|
-
handlePitchBend(channelNumber: any,
|
|
130
|
+
handlePitchBendMessage(channelNumber: any, lsb: any, msb: any): void;
|
|
131
|
+
handlePitchBend(channelNumber: any, pitchBend: any): void;
|
|
156
132
|
handleControlChange(channelNumber: any, controller: any, value: any): void | any[];
|
|
157
133
|
setModulation(channelNumber: any, modulation: any): void;
|
|
158
134
|
setVolume(channelNumber: any, volume: any): void;
|
|
@@ -175,4 +151,19 @@ export class MidyGM1 {
|
|
|
175
151
|
handleSysEx(data: any): void;
|
|
176
152
|
scheduleTask(callback: any, startTime: any): Promise<any>;
|
|
177
153
|
}
|
|
154
|
+
declare class Note {
|
|
155
|
+
constructor(noteNumber: any, velocity: any, startTime: any, instrumentKey: any);
|
|
156
|
+
bufferSource: any;
|
|
157
|
+
gainNode: any;
|
|
158
|
+
filterNode: any;
|
|
159
|
+
modLFO: any;
|
|
160
|
+
modLFOGain: any;
|
|
161
|
+
vibLFO: any;
|
|
162
|
+
vibLFOGain: any;
|
|
163
|
+
noteNumber: any;
|
|
164
|
+
velocity: any;
|
|
165
|
+
startTime: any;
|
|
166
|
+
instrumentKey: any;
|
|
167
|
+
}
|
|
168
|
+
export {};
|
|
178
169
|
//# sourceMappingURL=midy-GM1.d.ts.map
|
package/script/midy-GM1.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAuBA;IAmBE;;;;;;;;;;;MAWE;IAEF;;;;;;;MAOE;IAEF,+BAMC;IA9CD,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,gBAAc;IACd,mBAAiB;IACjB,oBAAkB;IAyBhB,kBAAgC;IAChC,gBAA4C;IAE5C;;;;;;;;;;;;;;;;;;;;QAAiD;IAInD,4BAMC;IAED,mCASC;IAED,gDAMC;IAED,sCASC;IAED;;;MAaC;IAED;;;;;;;;;;;;;;;;;;;;QAUC;IAED,+DAyBC;IAED,mEAWC;IAED,qDAOC;IAED,2EA+CC;IAED,mCAOC;IAED,0BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAyEC;IAED,4BAsBC;IAED,uBAKC;IAED,aAGC;IAED,cAKC;IAED,wBAIC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;IAED,uDASC;IAED,6CAQC;IAED,sDAEC;IAED,2BAEC;IAED,4BAEC;IAED,sCAGC;IAED,mFAGC;IAED,iDAmBC;IAED,iDAiCC;IAED,0DAmBC;IAED,wHA6BC;IAED,kGA6BC;IAED,0EAGC;IAED,sIAmDC;IAED,0FAGC;IAED,kEAeC;IAED,wFAiBC;IAED,4DAGC;IAED,qEAGC;IAED,0DAiBC;IAED,mFA+BC;IAED,yDAiBC;IAED,iDAIC;IAED,2CAMC;IAED,yDAIC;IAED,sCAKC;IAED,sDAMC;IAED,gDAEC;IAED,gDAEC;IAED,+DAoBC;IAED,uCAoBC;IAED,8CAEC;IAED,uCAoBC;IAED,4DAgBC;IAED,oBAQC;IAED,yDAaC;IAED,yCAGC;IAED,sCAQC;IAED,wCAEC;IAED,6BASC;IAED,0DAUC;CACF;AAv+BD;IASE,gFAKC;IAbD,kBAAa;IACb,cAAS;IACT,gBAAW;IACX,YAAO;IACP,gBAAW;IACX,YAAO;IACP,gBAAW;IAGT,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,mBAAkC;CAErC"}
|