polyphon 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +374 -2
- package/README.zh-TW.md +375 -0
- package/dist/engine/automation.d.ts +24 -0
- package/dist/engine/automation.d.ts.map +1 -0
- package/dist/engine/automation.js +55 -0
- package/dist/engine/automation.js.map +1 -0
- package/dist/engine/compile.d.ts +36 -0
- package/dist/engine/compile.d.ts.map +1 -0
- package/dist/engine/compile.js +103 -0
- package/dist/engine/compile.js.map +1 -0
- package/dist/engine/jukebox.d.ts +113 -0
- package/dist/engine/jukebox.d.ts.map +1 -0
- package/dist/engine/jukebox.js +287 -0
- package/dist/engine/jukebox.js.map +1 -0
- package/dist/engine/mixer.d.ts +29 -0
- package/dist/engine/mixer.d.ts.map +1 -0
- package/dist/engine/mixer.js +141 -0
- package/dist/engine/mixer.js.map +1 -0
- package/dist/engine/output.d.ts +14 -0
- package/dist/engine/output.d.ts.map +1 -0
- package/dist/engine/output.js +51 -0
- package/dist/engine/output.js.map +1 -0
- package/dist/engine/playback.d.ts +97 -0
- package/dist/engine/playback.d.ts.map +1 -0
- package/dist/engine/playback.js +311 -0
- package/dist/engine/playback.js.map +1 -0
- package/dist/engine/prepare.d.ts +6 -0
- package/dist/engine/prepare.d.ts.map +1 -0
- package/dist/engine/prepare.js +12 -0
- package/dist/engine/prepare.js.map +1 -0
- package/dist/engine/render.d.ts +14 -0
- package/dist/engine/render.d.ts.map +1 -0
- package/dist/engine/render.js +60 -0
- package/dist/engine/render.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/instruments/bowed.d.ts +357 -0
- package/dist/instruments/bowed.d.ts.map +1 -0
- package/dist/instruments/bowed.js +502 -0
- package/dist/instruments/bowed.js.map +1 -0
- package/dist/instruments/builtin.d.ts +261 -0
- package/dist/instruments/builtin.d.ts.map +1 -0
- package/dist/instruments/builtin.js +160 -0
- package/dist/instruments/builtin.js.map +1 -0
- package/dist/instruments/definition.d.ts +46 -0
- package/dist/instruments/definition.d.ts.map +1 -0
- package/dist/instruments/definition.js +5 -0
- package/dist/instruments/definition.js.map +1 -0
- package/dist/instruments/dsp/ambience.d.ts +17 -0
- package/dist/instruments/dsp/ambience.d.ts.map +1 -0
- package/dist/instruments/dsp/ambience.js +146 -0
- package/dist/instruments/dsp/ambience.js.map +1 -0
- package/dist/instruments/dsp/core.d.ts +22 -0
- package/dist/instruments/dsp/core.d.ts.map +1 -0
- package/dist/instruments/dsp/core.js +100 -0
- package/dist/instruments/dsp/core.js.map +1 -0
- package/dist/instruments/dsp/drums.d.ts +112 -0
- package/dist/instruments/dsp/drums.d.ts.map +1 -0
- package/dist/instruments/dsp/drums.js +566 -0
- package/dist/instruments/dsp/drums.js.map +1 -0
- package/dist/instruments/dsp/modal.d.ts +30 -0
- package/dist/instruments/dsp/modal.d.ts.map +1 -0
- package/dist/instruments/dsp/modal.js +54 -0
- package/dist/instruments/dsp/modal.js.map +1 -0
- package/dist/instruments/dsp/piano.d.ts +9 -0
- package/dist/instruments/dsp/piano.d.ts.map +1 -0
- package/dist/instruments/dsp/piano.js +230 -0
- package/dist/instruments/dsp/piano.js.map +1 -0
- package/dist/instruments/dsp/pluck.d.ts +53 -0
- package/dist/instruments/dsp/pluck.d.ts.map +1 -0
- package/dist/instruments/dsp/pluck.js +195 -0
- package/dist/instruments/dsp/pluck.js.map +1 -0
- package/dist/instruments/dsp/reverb.d.ts +16 -0
- package/dist/instruments/dsp/reverb.d.ts.map +1 -0
- package/dist/instruments/dsp/reverb.js +47 -0
- package/dist/instruments/dsp/reverb.js.map +1 -0
- package/dist/instruments/dsp/staccato.d.ts +18 -0
- package/dist/instruments/dsp/staccato.d.ts.map +1 -0
- package/dist/instruments/dsp/staccato.js +147 -0
- package/dist/instruments/dsp/staccato.js.map +1 -0
- package/dist/instruments/play.d.ts +21 -0
- package/dist/instruments/play.d.ts.map +1 -0
- package/dist/instruments/play.js +140 -0
- package/dist/instruments/play.js.map +1 -0
- package/dist/instruments/registry.d.ts +63 -0
- package/dist/instruments/registry.d.ts.map +1 -0
- package/dist/instruments/registry.js +50 -0
- package/dist/instruments/registry.js.map +1 -0
- package/dist/instruments/samples.d.ts +30 -0
- package/dist/instruments/samples.d.ts.map +1 -0
- package/dist/instruments/samples.js +109 -0
- package/dist/instruments/samples.js.map +1 -0
- package/dist/instruments/voices.d.ts +76 -0
- package/dist/instruments/voices.d.ts.map +1 -0
- package/dist/instruments/voices.js +1061 -0
- package/dist/instruments/voices.js.map +1 -0
- package/dist/midi.d.ts +15 -0
- package/dist/midi.d.ts.map +1 -0
- package/dist/midi.js +280 -0
- package/dist/midi.js.map +1 -0
- package/dist/notation/format.d.ts +12 -0
- package/dist/notation/format.d.ts.map +1 -0
- package/dist/notation/format.js +102 -0
- package/dist/notation/format.js.map +1 -0
- package/dist/notation/harmony.d.ts +83 -0
- package/dist/notation/harmony.d.ts.map +1 -0
- package/dist/notation/harmony.js +191 -0
- package/dist/notation/harmony.js.map +1 -0
- package/dist/notation/melody.d.ts +25 -0
- package/dist/notation/melody.d.ts.map +1 -0
- package/dist/notation/melody.js +138 -0
- package/dist/notation/melody.js.map +1 -0
- package/dist/notation/part.d.ts +34 -0
- package/dist/notation/part.d.ts.map +1 -0
- package/dist/notation/part.js +15 -0
- package/dist/notation/part.js.map +1 -0
- package/dist/notation/transform.d.ts +28 -0
- package/dist/notation/transform.d.ts.map +1 -0
- package/dist/notation/transform.js +67 -0
- package/dist/notation/transform.js.map +1 -0
- package/dist/song.d.ts +140 -0
- package/dist/song.d.ts.map +1 -0
- package/dist/song.js +45 -0
- package/dist/song.js.map +1 -0
- package/dist/tempo.d.ts +36 -0
- package/dist/tempo.d.ts.map +1 -0
- package/dist/tempo.js +81 -0
- package/dist/tempo.js.map +1 -0
- package/dist/theory.d.ts +70 -0
- package/dist/theory.d.ts.map +1 -0
- package/dist/theory.js +183 -0
- package/dist/theory.js.map +1 -0
- package/dist/transcribe.d.ts +81 -0
- package/dist/transcribe.d.ts.map +1 -0
- package/dist/transcribe.js +433 -0
- package/dist/transcribe.js.map +1 -0
- package/package.json +57 -4
- package/src/engine/automation.ts +65 -0
- package/src/engine/compile.ts +124 -0
- package/src/engine/jukebox.ts +322 -0
- package/src/engine/mixer.ts +166 -0
- package/src/engine/output.ts +59 -0
- package/src/engine/playback.ts +349 -0
- package/src/engine/prepare.ts +15 -0
- package/src/engine/render.ts +71 -0
- package/src/index.ts +28 -0
- package/src/instruments/bowed.ts +660 -0
- package/src/instruments/builtin.ts +180 -0
- package/src/instruments/definition.ts +52 -0
- package/src/instruments/dsp/ambience.ts +142 -0
- package/src/instruments/dsp/core.ts +97 -0
- package/src/instruments/dsp/drums.ts +565 -0
- package/src/instruments/dsp/modal.ts +76 -0
- package/src/instruments/dsp/piano.ts +226 -0
- package/src/instruments/dsp/pluck.ts +240 -0
- package/src/instruments/dsp/reverb.ts +56 -0
- package/src/instruments/dsp/staccato.ts +141 -0
- package/src/instruments/play.ts +151 -0
- package/src/instruments/registry.ts +100 -0
- package/src/instruments/samples.ts +119 -0
- package/src/instruments/voices.ts +1168 -0
- package/src/midi.ts +285 -0
- package/src/notation/format.ts +96 -0
- package/src/notation/harmony.ts +233 -0
- package/src/notation/melody.ts +133 -0
- package/src/notation/part.ts +42 -0
- package/src/notation/transform.ts +78 -0
- package/src/song.ts +170 -0
- package/src/tempo.ts +108 -0
- package/src/theory.ts +208 -0
- package/src/transcribe.ts +487 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import type { LiveInstrument, Render, SampledInstrument } from './definition.ts';
|
|
2
|
+
/** Piano dampers: bass strings are thick and settle slowly; the highest section (above F#6) has no damper */
|
|
3
|
+
declare const pianoDamper: (m: number) => number;
|
|
4
|
+
export declare const BUILT_IN: {
|
|
5
|
+
harp: SampledInstrument;
|
|
6
|
+
nylon: SampledInstrument;
|
|
7
|
+
/** Lute / oud: sharp, bright, short, double-strung */
|
|
8
|
+
lute: SampledInstrument;
|
|
9
|
+
steel: SampledInstrument;
|
|
10
|
+
/** Hammered dulcimer: double-strung, bright, long */
|
|
11
|
+
dulcimer: SampledInstrument;
|
|
12
|
+
pizz: SampledInstrument;
|
|
13
|
+
/** Plucked bass (double bass pizzicato) */
|
|
14
|
+
pizzBass: {
|
|
15
|
+
kind: 'sample';
|
|
16
|
+
render: Render;
|
|
17
|
+
hold: 'ring' | 'damp';
|
|
18
|
+
release?: number;
|
|
19
|
+
level: number;
|
|
20
|
+
variants?: number;
|
|
21
|
+
fixed?: number;
|
|
22
|
+
loop?: boolean;
|
|
23
|
+
bow?: import("./bowed.ts").BowInst & {
|
|
24
|
+
name: string;
|
|
25
|
+
};
|
|
26
|
+
tone?: (midi: number, velocity: number) => number;
|
|
27
|
+
damper?: (midi: number) => number;
|
|
28
|
+
afterRing?: [level: number, seconds: number];
|
|
29
|
+
spread?: number;
|
|
30
|
+
glide?: boolean;
|
|
31
|
+
choke?: string;
|
|
32
|
+
minHold: number;
|
|
33
|
+
};
|
|
34
|
+
/** Kalimba: a steel tine clamped at one end, so its second mode sits near 6× (not a harmonic), plucked by the thumb */
|
|
35
|
+
kalimba: SampledInstrument;
|
|
36
|
+
/** Marimba: rosewood bars undercut to 1 : 4 : ~9-10, a tube under each reinforcing the fundamental; the overtones of a wooden bar die a few times faster */
|
|
37
|
+
marimba: SampledInstrument;
|
|
38
|
+
vibes: SampledInstrument;
|
|
39
|
+
/** Glockenspiel: free steel bars (1 : 2.76 : 5.4), struck with hard mallets; steel barely damps them, so they ring long */
|
|
40
|
+
glock: SampledInstrument;
|
|
41
|
+
/** Celesta: steel bars like a glockenspiel's (1 : 2.76 : 5.4) over wooden resonator boxes, struck by felt hammers */
|
|
42
|
+
celesta: SampledInstrument;
|
|
43
|
+
/** Music box: comb teeth are cantilevers (clamped at one end: 1 : 6.27 : 17.6), plucked by steel pins */
|
|
44
|
+
musicbox: SampledInstrument;
|
|
45
|
+
/** Church bell: hum, prime, minor-third tierce, fifth, nominal (the pitch you hear) */
|
|
46
|
+
bell: SampledInstrument;
|
|
47
|
+
/**
|
|
48
|
+
* Tubular bell: a free tube's modes go as (2n+1)², 9 : 25 : 49 : 81 : 121 : 169 : 225; modes 4, 5 and 6 fall near 2 : 3 : 4, and the ear hears the
|
|
49
|
+
* strike note an octave below mode 4, where no partial is. Modes 1 and 2 are too low to radiate much, mode 3 adds the clang
|
|
50
|
+
*/
|
|
51
|
+
chime: SampledInstrument;
|
|
52
|
+
steelpan: SampledInstrument;
|
|
53
|
+
piano: {
|
|
54
|
+
kind: 'sample';
|
|
55
|
+
render: Render;
|
|
56
|
+
hold: 'ring' | 'damp';
|
|
57
|
+
release?: number;
|
|
58
|
+
level: number;
|
|
59
|
+
variants?: number;
|
|
60
|
+
fixed?: number;
|
|
61
|
+
loop?: boolean;
|
|
62
|
+
minHold?: number;
|
|
63
|
+
bow?: import("./bowed.ts").BowInst & {
|
|
64
|
+
name: string;
|
|
65
|
+
};
|
|
66
|
+
glide?: boolean;
|
|
67
|
+
choke?: string;
|
|
68
|
+
tone: (m: number, v: number) => number;
|
|
69
|
+
damper: typeof pianoDamper;
|
|
70
|
+
afterRing: [number, number];
|
|
71
|
+
spread: number;
|
|
72
|
+
};
|
|
73
|
+
/** Soft piano (felt-muted, used for narrative and the ending) */
|
|
74
|
+
softPiano: {
|
|
75
|
+
kind: 'sample';
|
|
76
|
+
render: Render;
|
|
77
|
+
hold: 'ring' | 'damp';
|
|
78
|
+
release?: number;
|
|
79
|
+
level: number;
|
|
80
|
+
variants?: number;
|
|
81
|
+
fixed?: number;
|
|
82
|
+
loop?: boolean;
|
|
83
|
+
minHold?: number;
|
|
84
|
+
bow?: import("./bowed.ts").BowInst & {
|
|
85
|
+
name: string;
|
|
86
|
+
};
|
|
87
|
+
glide?: boolean;
|
|
88
|
+
choke?: string;
|
|
89
|
+
tone: (m: number, v: number) => number;
|
|
90
|
+
damper: (m: number) => number;
|
|
91
|
+
afterRing: [number, number];
|
|
92
|
+
spread: number;
|
|
93
|
+
};
|
|
94
|
+
epiano: SampledInstrument;
|
|
95
|
+
/** Reversed piano (Rift, memories): swells in from nothing and is sucked in on the beat */
|
|
96
|
+
revPiano: SampledInstrument;
|
|
97
|
+
kick: SampledInstrument;
|
|
98
|
+
boom: SampledInstrument;
|
|
99
|
+
snare: SampledInstrument;
|
|
100
|
+
field: SampledInstrument;
|
|
101
|
+
rim: SampledInstrument;
|
|
102
|
+
clap: SampledInstrument;
|
|
103
|
+
hat: SampledInstrument;
|
|
104
|
+
ohat: SampledInstrument;
|
|
105
|
+
ride: SampledInstrument;
|
|
106
|
+
crash: SampledInstrument;
|
|
107
|
+
swell: SampledInstrument;
|
|
108
|
+
shaker: SampledInstrument;
|
|
109
|
+
tamb: SampledInstrument;
|
|
110
|
+
taiko: SampledInstrument;
|
|
111
|
+
frame: SampledInstrument;
|
|
112
|
+
darbuka: SampledInstrument;
|
|
113
|
+
tom: SampledInstrument;
|
|
114
|
+
/** Felt mallets: the roll-off follows the drum's pitch; four variants so a roll does not repeat */
|
|
115
|
+
timpani: SampledInstrument;
|
|
116
|
+
woodblock: SampledInstrument;
|
|
117
|
+
clave: SampledInstrument;
|
|
118
|
+
anvil: SampledInstrument;
|
|
119
|
+
triangle: SampledInstrument;
|
|
120
|
+
gong: SampledInstrument;
|
|
121
|
+
thunder: SampledInstrument;
|
|
122
|
+
thunderclap: SampledInstrument;
|
|
123
|
+
chain: SampledInstrument;
|
|
124
|
+
snap: SampledInstrument;
|
|
125
|
+
brush: SampledInstrument;
|
|
126
|
+
drip: SampledInstrument;
|
|
127
|
+
/** Monophonic, as an 808 bassline is played: each note cuts off the last */
|
|
128
|
+
kick808: {
|
|
129
|
+
kind: 'sample';
|
|
130
|
+
render: Render;
|
|
131
|
+
hold: 'ring' | 'damp';
|
|
132
|
+
release?: number;
|
|
133
|
+
level: number;
|
|
134
|
+
variants?: number;
|
|
135
|
+
fixed?: number;
|
|
136
|
+
loop?: boolean;
|
|
137
|
+
minHold?: number;
|
|
138
|
+
bow?: import("./bowed.ts").BowInst & {
|
|
139
|
+
name: string;
|
|
140
|
+
};
|
|
141
|
+
tone?: (midi: number, velocity: number) => number;
|
|
142
|
+
damper?: (midi: number) => number;
|
|
143
|
+
afterRing?: [level: number, seconds: number];
|
|
144
|
+
spread?: number;
|
|
145
|
+
glide?: boolean;
|
|
146
|
+
choke: string;
|
|
147
|
+
};
|
|
148
|
+
kick909: SampledInstrument;
|
|
149
|
+
bigKick: SampledInstrument;
|
|
150
|
+
snare909: SampledInstrument;
|
|
151
|
+
clap909: SampledInstrument;
|
|
152
|
+
/** The 909's hi-hats are one voice: a closed hat cuts off a ringing open one */
|
|
153
|
+
hat909: {
|
|
154
|
+
kind: 'sample';
|
|
155
|
+
render: Render;
|
|
156
|
+
hold: 'ring' | 'damp';
|
|
157
|
+
release?: number;
|
|
158
|
+
level: number;
|
|
159
|
+
variants?: number;
|
|
160
|
+
fixed?: number;
|
|
161
|
+
loop?: boolean;
|
|
162
|
+
minHold?: number;
|
|
163
|
+
bow?: import("./bowed.ts").BowInst & {
|
|
164
|
+
name: string;
|
|
165
|
+
};
|
|
166
|
+
tone?: (midi: number, velocity: number) => number;
|
|
167
|
+
damper?: (midi: number) => number;
|
|
168
|
+
afterRing?: [level: number, seconds: number];
|
|
169
|
+
spread?: number;
|
|
170
|
+
glide?: boolean;
|
|
171
|
+
choke: string;
|
|
172
|
+
};
|
|
173
|
+
ohat909: {
|
|
174
|
+
kind: 'sample';
|
|
175
|
+
render: Render;
|
|
176
|
+
hold: 'ring' | 'damp';
|
|
177
|
+
release?: number;
|
|
178
|
+
level: number;
|
|
179
|
+
variants?: number;
|
|
180
|
+
fixed?: number;
|
|
181
|
+
loop?: boolean;
|
|
182
|
+
minHold?: number;
|
|
183
|
+
bow?: import("./bowed.ts").BowInst & {
|
|
184
|
+
name: string;
|
|
185
|
+
};
|
|
186
|
+
tone?: (midi: number, velocity: number) => number;
|
|
187
|
+
damper?: (midi: number) => number;
|
|
188
|
+
afterRing?: [level: number, seconds: number];
|
|
189
|
+
spread?: number;
|
|
190
|
+
glide?: boolean;
|
|
191
|
+
choke: string;
|
|
192
|
+
};
|
|
193
|
+
impact: SampledInstrument;
|
|
194
|
+
spicc: SampledInstrument;
|
|
195
|
+
brassStab: SampledInstrument;
|
|
196
|
+
accordion: LiveInstrument;
|
|
197
|
+
acid: LiveInstrument;
|
|
198
|
+
airPad: LiveInstrument;
|
|
199
|
+
bass: LiveInstrument;
|
|
200
|
+
bass808: LiveInstrument;
|
|
201
|
+
bassoon: LiveInstrument;
|
|
202
|
+
birds: LiveInstrument;
|
|
203
|
+
cave: SampledInstrument;
|
|
204
|
+
celli: SampledInstrument;
|
|
205
|
+
cello: SampledInstrument;
|
|
206
|
+
chant: LiveInstrument;
|
|
207
|
+
choir: LiveInstrument;
|
|
208
|
+
choirO: LiveInstrument;
|
|
209
|
+
choirOo: LiveInstrument;
|
|
210
|
+
clarinet: LiveInstrument;
|
|
211
|
+
contrabass: SampledInstrument;
|
|
212
|
+
crickets: SampledInstrument;
|
|
213
|
+
darkPad: LiveInstrument;
|
|
214
|
+
distBass: LiveInstrument;
|
|
215
|
+
downlifter: LiveInstrument;
|
|
216
|
+
drone: LiveInstrument;
|
|
217
|
+
fiddle: SampledInstrument;
|
|
218
|
+
fire: SampledInstrument;
|
|
219
|
+
flute: LiveInstrument;
|
|
220
|
+
glass: LiveInstrument;
|
|
221
|
+
glassPad: LiveInstrument;
|
|
222
|
+
horn: LiveInstrument;
|
|
223
|
+
horns: LiveInstrument;
|
|
224
|
+
menChoir: LiveInstrument;
|
|
225
|
+
morin: SampledInstrument;
|
|
226
|
+
muteGtr: LiveInstrument;
|
|
227
|
+
oboe: LiveInstrument;
|
|
228
|
+
ocarina: LiveInstrument;
|
|
229
|
+
organ: LiveInstrument;
|
|
230
|
+
organFull: LiveInstrument;
|
|
231
|
+
panflute: LiveInstrument;
|
|
232
|
+
pluck: LiveInstrument;
|
|
233
|
+
powerGtr: LiveInstrument;
|
|
234
|
+
rain: SampledInstrument;
|
|
235
|
+
reese: LiveInstrument;
|
|
236
|
+
riser: LiveInstrument;
|
|
237
|
+
sax: LiveInstrument;
|
|
238
|
+
sea: SampledInstrument;
|
|
239
|
+
soprano: LiveInstrument;
|
|
240
|
+
strPad: SampledInstrument;
|
|
241
|
+
strings: SampledInstrument;
|
|
242
|
+
sub: LiveInstrument;
|
|
243
|
+
supersaw: LiveInstrument;
|
|
244
|
+
synthBass: LiveInstrument;
|
|
245
|
+
synthLead: LiveInstrument;
|
|
246
|
+
tenorSax: LiveInstrument;
|
|
247
|
+
throat: LiveInstrument;
|
|
248
|
+
trombone: LiveInstrument;
|
|
249
|
+
trumpet: LiveInstrument;
|
|
250
|
+
trumpets: LiveInstrument;
|
|
251
|
+
tuba: LiveInstrument;
|
|
252
|
+
violin: SampledInstrument;
|
|
253
|
+
void: SampledInstrument;
|
|
254
|
+
warmPad: LiveInstrument;
|
|
255
|
+
whistle: LiveInstrument;
|
|
256
|
+
wind: SampledInstrument;
|
|
257
|
+
};
|
|
258
|
+
/** The name of a built-in instrument */
|
|
259
|
+
export type BuiltInInstrument = keyof typeof BUILT_IN;
|
|
260
|
+
export {};
|
|
261
|
+
//# sourceMappingURL=builtin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../src/instruments/builtin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAyBhG,6GAA6G;AAC7G,QAAA,MAAM,WAAW,MAAO,MAAM,KAAG,MAAqE,CAAC;AAmJvG,eAAO,MAAM,QAAQ;;;IArInB,sDAAsD;;;IAGtD,qDAAqD;;;IAGrD,2CAA2C;;;;;;;;;;;;;;;;;;;;;IAG3C,uHAAuH;;IAEvH,4JAA4J;;;IAG5J,2HAA2H;;IAE3H,qHAAqH;;IAErH,yGAAyG;;IAEzG,uFAAuF;;IAEvF;;;OAGG;;;;;;;;;;;;;;;;;;;;;;;IAIH,iEAAiE;;;;;;;;;;;;;;;;;;;;;;IAGjE,2FAA2F;;;;;;;;;;;;;;;;;;;IAwB3F,mGAAmG;;;;;;;;;;;;;IAgBnG,4EAA4E;;;;;;;;;;;;;;;;;;;;;;;;;IAM5E,gFAAgF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuD4B,CAAC;AAE/G,wCAAwC;AACxC,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,QAAQ,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// The built-in orchestra. Sampled instruments are rendered offline (dsp/, bowed.ts) and cached per pitch;
|
|
2
|
+
// live instruments (voices.ts) are synthesized note by note. Tracks pick instruments by name.
|
|
3
|
+
import { midiToFrequency as f0 } from './definition.js';
|
|
4
|
+
import { AMB } from './dsp/ambience.js';
|
|
5
|
+
import { DRUMS } from './dsp/drums.js';
|
|
6
|
+
import { modal } from './dsp/modal.js';
|
|
7
|
+
import { epiano, piano } from './dsp/piano.js';
|
|
8
|
+
import { DULCIMER_BODY, GUITAR_BODY, HARP_BODY, ks, LUTE_BODY, pluckAdd, STEEL_BODY, VIOLIN_BODY } from './dsp/pluck.js';
|
|
9
|
+
import { brassStab, spicc } from './dsp/staccato.js';
|
|
10
|
+
import { BOWS, bowSample } from './bowed.js';
|
|
11
|
+
import { VOICES } from './voices.js';
|
|
12
|
+
/** The factor by which decay gets faster as pitch rises */
|
|
13
|
+
const hiShort = (m, ref = 60, per = 24) => Math.pow(0.5, (m - ref) / per);
|
|
14
|
+
function modalInst(parts, len, extra = {}, tscale = true) {
|
|
15
|
+
return (sr, m) => {
|
|
16
|
+
const k = tscale ? Math.min(2.2, Math.max(0.35, hiShort(m, 64, 30))) : 1;
|
|
17
|
+
return modal(sr, f0(m), parts.map(([r, a, t]) => [r, a, t * k]), { len: Math.min(8, len * Math.max(0.5, k)), ...extra });
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** The piano's velocity timbre: the softer the strike, the longer the hammer stays on the string and the fewer the highs (low-pass cutoff, Hz) */
|
|
21
|
+
const pianoTone = (m, v) => 900 * Math.pow(2, (m - 40) / 24) * (1 + 14 * Math.pow(v, 2.5));
|
|
22
|
+
/** After the dampers land, the soundboard and the undamped treble strings keep a faint ring (-24 dB, fading over a second) */
|
|
23
|
+
const PIANO_AFTER_RING = [0.063, 1.1];
|
|
24
|
+
/** Piano dampers: bass strings are thick and settle slowly; the highest section (above F#6) has no damper */
|
|
25
|
+
const pianoDamper = (m) => (m >= 90 ? Infinity : m < 45 ? 0.45 : m < 70 ? 0.25 : 0.16);
|
|
26
|
+
const S = (render, level, hold = 'ring', release = 0.2) => ({ kind: 'sample', render, hold, level, release });
|
|
27
|
+
const D = (name, level, fixed, variants = 3, tone) => ({ kind: 'sample', render: (sr, m, v) => DRUMS[name](sr, m, 1000 + v * 17 + m), hold: 'ring', level, variants, fixed, ...(tone && { tone }) });
|
|
28
|
+
/**
|
|
29
|
+
* Drums are rendered at a forte stroke. A softer stroke drives the head or plate less hard and a felt mallet stays on longer, so fewer high modes sound
|
|
30
|
+
* (a cymbal barely starts the cascade that carries its energy upward): velocity rolls off the highs above `top` Hz, down to `floor` of it for the softest stroke
|
|
31
|
+
*/
|
|
32
|
+
const stroke = (top, floor) => (m, v) => (typeof top === 'number' ? top : top(m)) * (floor + (1 - floor) * Math.pow(v, 2.5));
|
|
33
|
+
const SAMPLED = {
|
|
34
|
+
// ── Plucked strings
|
|
35
|
+
harp: S((sr, m) => ks(sr, f0(m), { len: Math.min(6, 5 * hiShort(m, 48, 30) + 0.6), t60: 6 * hiShort(m, 48, 28), bright: 0.35, pos: 0.28, loss: 4e-8, body: HARP_BODY, tilt: -2.2 }), 0.56),
|
|
36
|
+
nylon: S((sr, m) => ks(sr, f0(m), { len: 3.2, t60: 3.4 * hiShort(m, 52, 30), bright: 0.5, pos: 0.18, loss: 6e-8, body: GUITAR_BODY, tilt: -2.3 }), 0.49, 'damp', 0.35),
|
|
37
|
+
/** Lute / oud: sharp, bright, short, double-strung */
|
|
38
|
+
lute: S((sr, m) => ks(sr, f0(m), { len: 2.4, t60: 2.2 * hiShort(m, 52, 30), bright: 0.8, pos: 0.1, loss: 4e-8, detune: 4, body: LUTE_BODY, tilt: -3.2 }), 0.375, 'damp', 0.25),
|
|
39
|
+
steel: S((sr, m) => ks(sr, f0(m), { len: 4, t60: 4.5 * hiShort(m, 52, 30), bright: 0.85, pos: 0.13, loss: 2e-8, body: STEEL_BODY, tilt: -2.75 }), 0.375, 'damp', 0.4),
|
|
40
|
+
/** Hammered dulcimer: double-strung, bright, long */
|
|
41
|
+
dulcimer: S((sr, m) => ks(sr, f0(m), { len: 4, t60: 3.5 * hiShort(m, 60, 30), bright: 0.9, pos: 0.12, loss: 2e-8, detune: 6, body: DULCIMER_BODY, tilt: -3 }), 0.34),
|
|
42
|
+
pizz: S((sr, m) => ks(sr, f0(m), { len: 0.9, t60: 0.55 * hiShort(m, 48, 36), bright: 0.3, pos: 0.3, loss: 8e-8, body: VIOLIN_BODY, tilt: -1.1 }), 0.33),
|
|
43
|
+
/** Plucked bass (double bass pizzicato) */
|
|
44
|
+
pizzBass: { ...S((sr, m) => pluckAdd(sr, f0(m), { len: 2.2, t60: 1.6 * hiShort(m, 36, 24), pos: 0.22, tilt: 0.85, body: [98, 196], thump: 0.35 }), 1.1, 'damp', 0.35), minHold: 0.32 },
|
|
45
|
+
// ── Struck melodic instruments
|
|
46
|
+
/** Kalimba: a steel tine clamped at one end, so its second mode sits near 6× (not a harmonic), plucked by the thumb */
|
|
47
|
+
kalimba: S(modalInst([[1, 1, 1.6], [5.95, 0.3, 0.4], [2.0, 0.05, 0.5]], 2.2, { mallet: 3500, click: { amp: 0.15, t: 0.006, hz: 3000 } }), 0.55),
|
|
48
|
+
/** Marimba: rosewood bars undercut to 1 : 4 : ~9-10, a tube under each reinforcing the fundamental; the overtones of a wooden bar die a few times faster */
|
|
49
|
+
marimba: S(modalInst([[1, 1, 1.1], [3.93, 0.4, 0.4], [9.2, 0.2, 0.1]], 1.6, { attack: 0.0015, mallet: 2000, click: { amp: 0.35, t: 0.018, hz: 2.6, q: 0.7 } }), 0.65),
|
|
50
|
+
vibes: S(modalInst([[1, 1, 3.5], [4.0, 0.2, 0.8], [10, 0.04, 0.15]], 4, { trem: [5.5, 0.35], attack: 0.002 }), 0.5, 'damp', 0.6),
|
|
51
|
+
/** Glockenspiel: free steel bars (1 : 2.76 : 5.4), struck with hard mallets; steel barely damps them, so they ring long */
|
|
52
|
+
glock: S(modalInst([[1, 1, 3.4], [2.76, 0.35, 1.3], [5.4, 0.15, 0.55]], 4, { click: { amp: 0.1, t: 0.004, hz: 7000 } }), 0.3),
|
|
53
|
+
/** Celesta: steel bars like a glockenspiel's (1 : 2.76 : 5.4) over wooden resonator boxes, struck by felt hammers */
|
|
54
|
+
celesta: S(modalInst([[1, 1, 1.4], [2.76, 0.3, 0.6], [5.4, 0.12, 0.25]], 2, { mallet: 1800, click: { amp: 0.06, t: 0.005, hz: 5000 } }), 0.5),
|
|
55
|
+
/** Music box: comb teeth are cantilevers (clamped at one end: 1 : 6.27 : 17.6), plucked by steel pins */
|
|
56
|
+
musicbox: S(modalInst([[1, 1, 1.5], [6.27, 0.3, 0.35], [17.55, 0.1, 0.1]], 2.2, { click: { amp: 0.12, t: 0.003, hz: 6000 }, beat: 2 }), 0.49),
|
|
57
|
+
/** Church bell: hum, prime, minor-third tierce, fifth, nominal (the pitch you hear) */
|
|
58
|
+
bell: S((sr, m) => modal(sr, f0(m) / 2, [[0.5, 0.55, 9], [1, 0.7, 6], [1.183, 0.5, 4.5], [1.506, 0.28, 3.5], [2, 1, 4], [2.514, 0.3, 2.2], [2.662, 0.25, 2], [3.011, 0.2, 1.6], [4.166, 0.1, 1]], { len: 7, beat: 2.5, click: { amp: 0.2, t: 0.01, hz: 4000, q: 0.7 } }), 0.4),
|
|
59
|
+
/**
|
|
60
|
+
* Tubular bell: a free tube's modes go as (2n+1)², 9 : 25 : 49 : 81 : 121 : 169 : 225; modes 4, 5 and 6 fall near 2 : 3 : 4, and the ear hears the
|
|
61
|
+
* strike note an octave below mode 4, where no partial is. Modes 1 and 2 are too low to radiate much, mode 3 adds the clang
|
|
62
|
+
*/
|
|
63
|
+
chime: S((sr, m) => modal(sr, f0(m), [[0.617, 0.08, 4.5], [1.21, 0.3, 4], [2, 1, 3.5], [2.98, 0.8, 2.8], [4.12, 0.5, 2], [5.47, 0.28, 1.4], [7.0, 0.14, 0.9]], { len: 4, click: { amp: 0.25, t: 0.006, hz: 5000 } }), 0.4),
|
|
64
|
+
steelpan: S(modalInst([[1, 1, 1.4], [2, 0.55, 0.9], [3, 0.22, 0.5], [4.02, 0.1, 0.3]], 1.8, { bend: 1.02, bendT: 0.02, click: { amp: 0.1, t: 0.008, hz: 2500 } }), 0.5),
|
|
65
|
+
piano: { ...S((sr, m) => piano(sr, m), 0.75, 'damp', 0.3), tone: (m, v) => pianoTone(m, v), damper: pianoDamper, afterRing: PIANO_AFTER_RING, spread: 0.35 },
|
|
66
|
+
/** Soft piano (felt-muted, used for narrative and the ending) */
|
|
67
|
+
softPiano: { ...S((sr, m) => piano(sr, m, true), 0.8, 'damp', 0.45), tone: (m, v) => pianoTone(m, v) * 0.8, damper: (m) => pianoDamper(m) * 1.4, afterRing: PIANO_AFTER_RING, spread: 0.35 },
|
|
68
|
+
epiano: S((sr, m) => epiano(sr, m), 0.6, 'damp', 0.3),
|
|
69
|
+
/** Reversed piano (Rift, memories): swells in from nothing and is sucked in on the beat */
|
|
70
|
+
revPiano: S((sr, m) => {
|
|
71
|
+
const d = piano(sr, m, true).slice(0, Math.floor(sr * 1.8));
|
|
72
|
+
d.reverse();
|
|
73
|
+
return d;
|
|
74
|
+
}, 0.6),
|
|
75
|
+
// ── Drums (pitch is passed to tuned drums)
|
|
76
|
+
kick: D('kick', 0.9, 36, 3, stroke(8000, 0.08)),
|
|
77
|
+
boom: D('boom', 0.9, 36, 2),
|
|
78
|
+
snare: D('snare', 0.55, 38, 3, stroke(18000, 0.25)),
|
|
79
|
+
field: D('field', 0.5, 38, 3, stroke(18000, 0.25)),
|
|
80
|
+
rim: D('rim', 0.4, 37, 3, stroke(18000, 0.25)),
|
|
81
|
+
clap: D('clap', 0.9, 39),
|
|
82
|
+
hat: D('hat', 0.6, 42, 4),
|
|
83
|
+
ohat: D('ohat', 0.55, 46, 3, stroke(22000, 0.35)),
|
|
84
|
+
ride: D('ride', 0.5, 51, 2, stroke(22000, 0.3)),
|
|
85
|
+
crash: D('crash', 0.3, 49, 2, stroke(22000, 0.25)),
|
|
86
|
+
swell: D('swell', 0.3, 49, 1),
|
|
87
|
+
shaker: D('shaker', 0.25, 70, 4),
|
|
88
|
+
tamb: D('tamb', 0.45, 54),
|
|
89
|
+
taiko: D('taiko', 0.95, undefined, 3, stroke(8000, 0.08)),
|
|
90
|
+
frame: D('frame', 0.7, undefined, 3, stroke(8000, 0.08)),
|
|
91
|
+
darbuka: D('darbuka', 0.6, undefined, 3, stroke(8000, 0.08)),
|
|
92
|
+
tom: D('tom', 0.7, undefined, 3, stroke(8000, 0.08)),
|
|
93
|
+
/** Felt mallets: the roll-off follows the drum's pitch; four variants so a roll does not repeat */
|
|
94
|
+
timpani: D('timpani', 0.8, undefined, 4, stroke((m) => 8 * f0(m || 38), 0.15)),
|
|
95
|
+
woodblock: D('woodblock', 0.4),
|
|
96
|
+
clave: D('clave', 0.3, 75),
|
|
97
|
+
anvil: D('anvil', 0.3),
|
|
98
|
+
triangle: D('triangle', 0.22, 81, 3, stroke(20000, 0.3)),
|
|
99
|
+
gong: D('gong', 0.5, undefined, 1),
|
|
100
|
+
thunder: D('thunder', 0.6, 30, 2),
|
|
101
|
+
thunderclap: D('thunderclap', 0.8, 30, 2),
|
|
102
|
+
chain: D('chain', 0.3, 60),
|
|
103
|
+
snap: D('snap', 0.35, 60),
|
|
104
|
+
brush: D('brush', 0.3, 60),
|
|
105
|
+
drip: D('drip', 0.25),
|
|
106
|
+
// ── Drum machines and electronic dance music (pitch is passed to the kicks). Balanced on their usual patterns at 128 BPM: the kicks
|
|
107
|
+
// on the beat as loud as `kick` (about -13 LUFS), snare and clap on the backbeat 4-6 dB under them, closed hats on sixteenths and
|
|
108
|
+
// open hats on the off-beats 10-12 dB under; the 909 kick's click peaks at full scale
|
|
109
|
+
/** Monophonic, as an 808 bassline is played: each note cuts off the last */
|
|
110
|
+
kick808: { ...D('kick808', 0.6, undefined, 1), choke: 'kick808' },
|
|
111
|
+
kick909: D('kick909', 0.8),
|
|
112
|
+
bigKick: D('bigKick', 0.57),
|
|
113
|
+
snare909: D('snare909', 0.5, 38),
|
|
114
|
+
clap909: D('clap909', 0.9, 39),
|
|
115
|
+
/** The 909's hi-hats are one voice: a closed hat cuts off a ringing open one */
|
|
116
|
+
hat909: { ...D('hat909', 0.78, 42, 4), choke: 'hat909' },
|
|
117
|
+
ohat909: { ...D('ohat909', 0.41, 46), choke: 'hat909' },
|
|
118
|
+
impact: D('impact', 0.4, 36, 2),
|
|
119
|
+
// ── Short samples for fast figures
|
|
120
|
+
spicc: S((sr, m) => spicc(sr, m), 0.55),
|
|
121
|
+
brassStab: S((sr, m) => brassStab(sr, m), 0.55),
|
|
122
|
+
};
|
|
123
|
+
/** Ambience beds: stereo (two seeds), seamless loops; pitch is meaningless */
|
|
124
|
+
const AMBIENCE_LEVEL = { wind: 0.4, sea: 0.4, fire: 0.35, crickets: 0.2, rain: 0.25, void: 0.17, cave: 0.25 };
|
|
125
|
+
const AMBIENCE = Object.fromEntries(Object.entries(AMB).map(([name, render]) => [
|
|
126
|
+
name,
|
|
127
|
+
{ kind: 'sample', render: (sr) => [render(sr, 11), render(sr, 29)], hold: 'damp', level: AMBIENCE_LEVEL[name], fixed: 60, loop: true },
|
|
128
|
+
]));
|
|
129
|
+
/**
|
|
130
|
+
* Volume of live-synthesized instruments (roughly aligned with the sampled instruments). The synthesizers were measured dry (EBU R128, a four-bar
|
|
131
|
+
* phrase at normal velocity) and set so a lead line sits about 1 dB below the piano playing it (-28 LUFS), four-note chords at about -27, bass
|
|
132
|
+
* lines at about -30 and the 808 at -28 (its weight is below what loudness meters weigh).
|
|
133
|
+
*/
|
|
134
|
+
const LIVE_LEVEL = {
|
|
135
|
+
flute: 0.7, panflute: 0.7, ocarina: 0.7, whistle: 0.7,
|
|
136
|
+
oboe: 1.4, bassoon: 1.4, sax: 1, tenorSax: 1, trumpet: 1.3, trombone: 1.1,
|
|
137
|
+
choir: 0.36, choirO: 0.3, choirOo: 0.26, menChoir: 0.37, chant: 0.31, soprano: 0.55,
|
|
138
|
+
throat: 0.6, organ: 1.2, organFull: 1.2, accordion: 1.4, drone: 2,
|
|
139
|
+
supersaw: 1.2, synthLead: 0.86, pluck: 1.9, warmPad: 1.77, darkPad: 1.65, airPad: 5, powerGtr: 1.4, muteGtr: 1.4,
|
|
140
|
+
bass: 0.5, synthBass: 0.78, reese: 0.42, acid: 0.77, bass808: 0.62, sub: 0.5, distBass: 0.83,
|
|
141
|
+
};
|
|
142
|
+
/** Live instruments that can glide between notes */
|
|
143
|
+
const LIVE_GLIDERS = new Set([
|
|
144
|
+
'flute', 'panflute', 'ocarina', 'whistle', 'clarinet', 'oboe', 'bassoon', 'sax', 'tenorSax', 'horn', 'trumpet', 'trombone', 'soprano',
|
|
145
|
+
'supersaw', 'synthLead', 'synthBass', 'reese', 'acid', 'bass808', 'sub', 'distBass',
|
|
146
|
+
]);
|
|
147
|
+
/** Bowed instruments that can glide between notes */
|
|
148
|
+
const BOWED_GLIDERS = new Set(['violin', 'cello', 'fiddle', 'morin', 'strings']);
|
|
149
|
+
const LIVE = Object.fromEntries(Object.entries(VOICES).map(([name, voice]) => [name, { kind: 'live', voice, level: LIVE_LEVEL[name] ?? 1, glide: LIVE_GLIDERS.has(name) }]));
|
|
150
|
+
/** Bowed strings: ensemble samples of players, computed offline (bowed.ts) */
|
|
151
|
+
const BOWED = Object.fromEntries(Object.entries(BOWS).map(([name, b]) => {
|
|
152
|
+
const key = 'share' in b ? b.share : name;
|
|
153
|
+
let seed = 0;
|
|
154
|
+
for (const ch of key)
|
|
155
|
+
seed = (seed * 31 + ch.charCodeAt(0)) >>> 0;
|
|
156
|
+
const render = (sr, m, v, desk) => bowSample(sr, f0(m), b.def, v === 1, seed + m * 101 + v, desk);
|
|
157
|
+
return [name, { kind: 'sample', render, hold: 'damp', level: b.level, release: b.release, bow: { ...b, name: key }, glide: BOWED_GLIDERS.has(name) }];
|
|
158
|
+
}));
|
|
159
|
+
export const BUILT_IN = { ...SAMPLED, ...AMBIENCE, ...LIVE, ...BOWED };
|
|
160
|
+
//# sourceMappingURL=builtin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin.js","sourceRoot":"","sources":["../../src/instruments/builtin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Bowed, BowInst } from './bowed.ts';
|
|
2
|
+
import type { Voice } from './voices.ts';
|
|
3
|
+
/** Render one note: sample rate, MIDI pitch, variant index, desk (bowed strings: which players, see DESKS in bowed.ts; 0 otherwise) → mono, stereo, or a bowed sample with a loop section */
|
|
4
|
+
export type Render = (sampleRate: number, midi: number, variant: number, desk: number) => Float32Array | [Float32Array, Float32Array] | Bowed;
|
|
5
|
+
export interface SampledInstrument {
|
|
6
|
+
kind: 'sample';
|
|
7
|
+
render: Render;
|
|
8
|
+
/** ring: the sample rings out naturally; damp: closed off with release seconds when the note ends */
|
|
9
|
+
hold: 'ring' | 'damp';
|
|
10
|
+
release?: number;
|
|
11
|
+
level: number;
|
|
12
|
+
/** Number of random variants (so drums do not sound machine-gunned) */
|
|
13
|
+
variants?: number;
|
|
14
|
+
/** Drums that do not follow pitch: always render the sample with this note */
|
|
15
|
+
fixed?: number;
|
|
16
|
+
/** Ambience: loops, the note length is the duration (attack / release come from params.attack / release) */
|
|
17
|
+
loop?: boolean;
|
|
18
|
+
/** Minimum time a damp instrument rings (seconds): a note cut too short sounds electronic */
|
|
19
|
+
minHold?: number;
|
|
20
|
+
/** Bowed strings: one sample every few semitones (soft and hard layers), the sustain section loops, and pitch is made up with a rate change */
|
|
21
|
+
bow?: BowInst & {
|
|
22
|
+
name: string;
|
|
23
|
+
};
|
|
24
|
+
/** Velocity determines timbre: the low-pass cutoff (Hz) for this note and velocity. The sample is the brightest strike; a light touch rolls off the highs */
|
|
25
|
+
tone?: (midi: number, velocity: number) => number;
|
|
26
|
+
/** Damping time by pitch (seconds); Infinity means no damper, so the string rings on even after release (the piano's highest strings) */
|
|
27
|
+
damper?: (midi: number) => number;
|
|
28
|
+
/** After the damper: a faint ring (linear level, and seconds to fade) from the soundboard and the undamped strings */
|
|
29
|
+
afterRing?: [level: number, seconds: number];
|
|
30
|
+
/** Stereo width across the keyboard: low notes left, high notes right (0-1), as heard from the player's seat */
|
|
31
|
+
spread?: number;
|
|
32
|
+
/** Supports glides between notes (the `>` marker in a melody) */
|
|
33
|
+
glide?: boolean;
|
|
34
|
+
/** Choke group: a note cuts off the one still ringing in its group, as a drum machine's closed hi-hat cuts off its open one */
|
|
35
|
+
choke?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface LiveInstrument {
|
|
38
|
+
kind: 'live';
|
|
39
|
+
voice: Voice;
|
|
40
|
+
level: number;
|
|
41
|
+
/** Supports glides between notes (the `>` marker in a melody) */
|
|
42
|
+
glide?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export type InstrumentDef = SampledInstrument | LiveInstrument;
|
|
45
|
+
export declare const midiToFrequency: (midi: number) => number;
|
|
46
|
+
//# sourceMappingURL=definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/instruments/definition.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,6LAA6L;AAC7L,MAAM,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,YAAY,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC;AAE9I,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4GAA4G;IAC5G,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+IAA+I;IAC/I,GAAG,CAAC,EAAE,OAAO,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,6JAA6J;IAC7J,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,yIAAyI;IACzI,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,sHAAsH;IACtH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7C,gHAAgH;IAChH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+HAA+H;IAC/H,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,cAAc,CAAC;AAE/D,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,MAA6C,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// How an instrument is described internally. Two kinds:
|
|
2
|
+
// sample: every note is rendered offline once (DSP in dsp/ and bowed.ts), cached, and played back as a buffer;
|
|
3
|
+
// live: every note builds a small Web Audio graph at play time (voices.ts), for sustained and gliding sounds.
|
|
4
|
+
export const midiToFrequency = (midi) => 440 * Math.pow(2, (midi - 69) / 12);
|
|
5
|
+
//# sourceMappingURL=definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/instruments/definition.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,iHAAiH;AACjH,kHAAkH;AAiDlH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const AMB: {
|
|
2
|
+
/** Wind: two band-pass noises that wander slowly in frequency, with an occasional strong gust */
|
|
3
|
+
wind: (sr: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
4
|
+
/** Sea: low surging waves (period 5.5 s) + the hiss of spray */
|
|
5
|
+
sea: (sr: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
6
|
+
/** Fire: low-frequency roar + random crackles */
|
|
7
|
+
fire: (sr: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
8
|
+
/** Crickets: 4.4 kHz pulses, in bursts */
|
|
9
|
+
crickets: (sr: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
10
|
+
/** Rain: the hiss of high-frequency noise + scattered water drops */
|
|
11
|
+
rain: (sr: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
12
|
+
/** Void: slowly moving narrow-band noise, low-frequency sines in a tritone */
|
|
13
|
+
void: (sr: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
14
|
+
/** Cave: very low air sound */
|
|
15
|
+
cave: (sr: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=ambience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ambience.d.ts","sourceRoot":"","sources":["../../../src/instruments/dsp/ambience.ts"],"names":[],"mappings":"AAuCA,eAAO,MAAM,GAAG;IACd,iGAAiG;;IAWjG,gEAAgE;;IAkBhE,iDAAiD;;IAgBjD,0CAA0C;;IAoB1C,qEAAqE;;IAerE,8EAA8E;;IAY9E,+BAA+B;;CASqC,CAAC"}
|