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,146 @@
|
|
|
1
|
+
// Ambience beds: stereo noise textures rendered once and looped seamlessly (wind, sea, fire, crickets, rain, void, cave).
|
|
2
|
+
import { Biquad, normalize, rng } from './core.js';
|
|
3
|
+
/** Crossfade the tail into the beginning, making a sample that loops seamlessly */
|
|
4
|
+
function seamless(y, sr, xf = 1) {
|
|
5
|
+
const n = Math.floor(xf * sr);
|
|
6
|
+
const out = y.slice(0, y.length - n);
|
|
7
|
+
for (let i = 0; i < n; i++) {
|
|
8
|
+
const k = i / n;
|
|
9
|
+
out[i] = out[i] * Math.sqrt(k) + y[y.length - n + i] * Math.sqrt(1 - k);
|
|
10
|
+
}
|
|
11
|
+
return out;
|
|
12
|
+
}
|
|
13
|
+
/** Band-pass noise that varies over time: centers(t) gives the center frequency */
|
|
14
|
+
function movingBand(y, sr, seed, q, amp, center, gain = () => 1) {
|
|
15
|
+
const r = rng(seed);
|
|
16
|
+
const bq = new Biquad(sr, 'bp', center(0), q);
|
|
17
|
+
for (let i = 0; i < y.length; i++) {
|
|
18
|
+
if (i % 64 === 0)
|
|
19
|
+
bq.set('bp', center(i / sr), q);
|
|
20
|
+
y[i] += bq.run(r()) * amp * gain(i / sr);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const smoothWalk = (seed, len, step) => {
|
|
24
|
+
const r = rng(seed);
|
|
25
|
+
const pts = Array.from({ length: Math.ceil(len / step) + 2 }, () => Math.abs(r()));
|
|
26
|
+
pts[pts.length - 1] = pts[0];
|
|
27
|
+
return (t) => {
|
|
28
|
+
const x = t / step;
|
|
29
|
+
const i = Math.floor(x);
|
|
30
|
+
const k = x - i;
|
|
31
|
+
const a = pts[i % pts.length];
|
|
32
|
+
const b = pts[(i + 1) % pts.length];
|
|
33
|
+
return a + (b - a) * (0.5 - 0.5 * Math.cos(Math.PI * k));
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export const AMB = {
|
|
37
|
+
/** Wind: two band-pass noises that wander slowly in frequency, with an occasional strong gust */
|
|
38
|
+
wind: (sr, s) => {
|
|
39
|
+
const len = 13;
|
|
40
|
+
const y = new Float32Array(Math.floor(sr * len));
|
|
41
|
+
const w1 = smoothWalk(s, len, 1.3);
|
|
42
|
+
const w2 = smoothWalk(s + 5, len, 0.9);
|
|
43
|
+
const gust = smoothWalk(s + 9, len, 2.2);
|
|
44
|
+
movingBand(y, sr, s, 3, 1, (t) => 350 + w1(t) * 900, (t) => 0.4 + gust(t));
|
|
45
|
+
movingBand(y, sr, s + 1, 9, 0.8, (t) => 1100 + w2(t) * 1800, (t) => 0.2 + gust(t) * gust(t));
|
|
46
|
+
return seamless(normalize(y), sr, 1.5);
|
|
47
|
+
},
|
|
48
|
+
/** Sea: low surging waves (period 5.5 s) + the hiss of spray */
|
|
49
|
+
sea: (sr, s) => {
|
|
50
|
+
const period = 5.5;
|
|
51
|
+
const len = period * 2 + 1.5;
|
|
52
|
+
const y = new Float32Array(Math.floor(sr * len));
|
|
53
|
+
const r = rng(s);
|
|
54
|
+
const lp = new Biquad(sr, 'lp', 420, 0.6);
|
|
55
|
+
const hp = new Biquad(sr, 'hp', 3000, 0.5);
|
|
56
|
+
for (let i = 0; i < y.length; i++) {
|
|
57
|
+
const t = i / sr;
|
|
58
|
+
const ph = (t % period) / period;
|
|
59
|
+
const swell = 0.25 + 0.75 * Math.pow(Math.sin(Math.PI * ph), 2);
|
|
60
|
+
const foam = Math.max(0, Math.sin(Math.PI * Math.min(1, Math.max(0, (ph - 0.35) / 0.4)))) ** 3;
|
|
61
|
+
const x = r();
|
|
62
|
+
y[i] = lp.run(x) * swell * 1.4 + hp.run(x) * foam * 0.25;
|
|
63
|
+
}
|
|
64
|
+
return seamless(normalize(y), sr, 1.5);
|
|
65
|
+
},
|
|
66
|
+
/** Fire: low-frequency roar + random crackles */
|
|
67
|
+
fire: (sr, s) => {
|
|
68
|
+
const len = 9;
|
|
69
|
+
const y = new Float32Array(Math.floor(sr * len));
|
|
70
|
+
const r = rng(s);
|
|
71
|
+
const lp = new Biquad(sr, 'lp', 160, 0.8);
|
|
72
|
+
const roar = smoothWalk(s + 2, len, 0.7);
|
|
73
|
+
for (let i = 0; i < y.length; i++)
|
|
74
|
+
y[i] = lp.run(r()) * (0.6 + 0.6 * roar(i / sr)) * 2.2;
|
|
75
|
+
for (let t = 0.05; t < len - 1.2; t += 0.03 + Math.abs(r()) * 0.3) {
|
|
76
|
+
const bq = new Biquad(sr, 'bp', 1800 + Math.abs(r()) * 3500, 2);
|
|
77
|
+
const a = 0.15 + Math.abs(r()) * 0.45;
|
|
78
|
+
const i0 = Math.floor(t * sr);
|
|
79
|
+
for (let j = 0; j < sr * 0.03 && i0 + j < y.length; j++)
|
|
80
|
+
y[i0 + j] += bq.run(r()) * a * Math.exp(-j / (sr * 0.004));
|
|
81
|
+
}
|
|
82
|
+
return seamless(normalize(y), sr, 1);
|
|
83
|
+
},
|
|
84
|
+
/** Crickets: 4.4 kHz pulses, in bursts */
|
|
85
|
+
crickets: (sr, s) => {
|
|
86
|
+
const len = 8;
|
|
87
|
+
const y = new Float32Array(Math.floor(sr * len));
|
|
88
|
+
const r = rng(s);
|
|
89
|
+
for (const [hz, rate, amp] of [[4400, 28, 1], [5100, 34, 0.6]]) {
|
|
90
|
+
let ph = 0;
|
|
91
|
+
let on = 0;
|
|
92
|
+
for (let i = 0; i < y.length; i++) {
|
|
93
|
+
const t = i / sr;
|
|
94
|
+
if (i % Math.floor(sr * 0.45) === 0)
|
|
95
|
+
on = Math.abs(r()) > 0.4 ? 1 : 0;
|
|
96
|
+
ph += (2 * Math.PI * hz) / sr;
|
|
97
|
+
const pulse = Math.sin(Math.PI * ((t * rate) % 1)) ** 4;
|
|
98
|
+
y[i] += Math.sin(ph) * pulse * on * amp;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const lp = new Biquad(sr, 'lp', 6000, 0.7);
|
|
102
|
+
for (let i = 0; i < y.length; i++)
|
|
103
|
+
y[i] = lp.run(y[i]);
|
|
104
|
+
return seamless(normalize(y), sr, 0.6);
|
|
105
|
+
},
|
|
106
|
+
/** Rain: the hiss of high-frequency noise + scattered water drops */
|
|
107
|
+
rain: (sr, s) => {
|
|
108
|
+
const len = 8;
|
|
109
|
+
const y = new Float32Array(Math.floor(sr * len));
|
|
110
|
+
const r = rng(s);
|
|
111
|
+
const hp = new Biquad(sr, 'hp', 1800, 0.5);
|
|
112
|
+
const lp = new Biquad(sr, 'lp', 9000, 0.5);
|
|
113
|
+
for (let i = 0; i < y.length; i++)
|
|
114
|
+
y[i] = lp.run(hp.run(r())) * 0.5;
|
|
115
|
+
for (let t = 0.1; t < len - 1; t += 0.01 + Math.abs(r()) * 0.06) {
|
|
116
|
+
const i0 = Math.floor(t * sr);
|
|
117
|
+
const a = Math.abs(r()) * 0.6;
|
|
118
|
+
for (let j = 0; j < 200 && i0 + j < y.length; j++)
|
|
119
|
+
y[i0 + j] += r() * a * Math.exp(-j / 30);
|
|
120
|
+
}
|
|
121
|
+
return seamless(normalize(y), sr, 1);
|
|
122
|
+
},
|
|
123
|
+
/** Void: slowly moving narrow-band noise, low-frequency sines in a tritone */
|
|
124
|
+
void: (sr, s) => {
|
|
125
|
+
const len = 14;
|
|
126
|
+
const y = new Float32Array(Math.floor(sr * len));
|
|
127
|
+
const w = smoothWalk(s, len, 3.5);
|
|
128
|
+
movingBand(y, sr, s, 14, 2.5, (t) => 110 + w(t) * 500);
|
|
129
|
+
for (const [hz, a] of [[55, 0.35], [77.8, 0.2], [110.3, 0.12]]) {
|
|
130
|
+
const k = Math.round(hz * (len - 2)) / (len - 2);
|
|
131
|
+
for (let i = 0; i < y.length; i++)
|
|
132
|
+
y[i] += Math.sin((2 * Math.PI * k * i) / sr) * a * (0.6 + 0.4 * Math.sin((2 * Math.PI * i) / sr / 7));
|
|
133
|
+
}
|
|
134
|
+
return seamless(normalize(y), sr, 2);
|
|
135
|
+
},
|
|
136
|
+
/** Cave: very low air sound */
|
|
137
|
+
cave: (sr, s) => {
|
|
138
|
+
const len = 10;
|
|
139
|
+
const y = new Float32Array(Math.floor(sr * len));
|
|
140
|
+
const w = smoothWalk(s, len, 2.5);
|
|
141
|
+
movingBand(y, sr, s, 1.2, 1, (t) => 90 + w(t) * 120);
|
|
142
|
+
movingBand(y, sr, s + 3, 6, 0.25, (t) => 600 + w(t) * 300);
|
|
143
|
+
return seamless(normalize(y), sr, 1.5);
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=ambience.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ambience.js","sourceRoot":"","sources":["../../../src/instruments/dsp/ambience.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Reproducible random numbers (the same note comes out the same every time) */
|
|
2
|
+
export declare function rng(seed: number): () => number;
|
|
3
|
+
/** RBJ biquad filter */
|
|
4
|
+
export declare class Biquad {
|
|
5
|
+
private b0;
|
|
6
|
+
private b1;
|
|
7
|
+
private b2;
|
|
8
|
+
private a1;
|
|
9
|
+
private a2;
|
|
10
|
+
private x1;
|
|
11
|
+
private x2;
|
|
12
|
+
private y1;
|
|
13
|
+
private y2;
|
|
14
|
+
private sr;
|
|
15
|
+
constructor(sr: number, type: 'lp' | 'hp' | 'bp' | 'peak', f: number, q?: number, gainDb?: number);
|
|
16
|
+
set(type: 'lp' | 'hp' | 'bp' | 'peak', f: number, q?: number, gainDb?: number): void;
|
|
17
|
+
run(x: number): number;
|
|
18
|
+
}
|
|
19
|
+
export declare function normalize(d: Float32Array, peak?: number): Float32Array;
|
|
20
|
+
/** 10 ms fade-out at the tail to avoid a click from truncation */
|
|
21
|
+
export declare function tailFade(d: Float32Array, sr: number): Float32Array;
|
|
22
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/instruments/dsp/core.ts"],"names":[],"mappings":"AAGA,gFAAgF;AAChF,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CAQ9C;AAED,wBAAwB;AACxB,qBAAa,MAAM;IACjB,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAS;IACnB,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,SAAQ,EAAE,MAAM,SAAI,EAG1F;IACD,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,SAAQ,EAAE,MAAM,SAAI,GAAG,IAAI,CAwC7E;IACD,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAOrB;CACF;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,SAAM,GAAG,YAAY,CAQnE;AAED,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAIlE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Building blocks for offline synthesis: a reproducible random source, an RBJ biquad, and sample clean-up.
|
|
2
|
+
// Every sampled instrument is rendered once into a Float32Array with these, then cached; playback costs almost nothing.
|
|
3
|
+
/** Reproducible random numbers (the same note comes out the same every time) */
|
|
4
|
+
export function rng(seed) {
|
|
5
|
+
let s = seed >>> 0 || 1;
|
|
6
|
+
return () => {
|
|
7
|
+
s ^= s << 13;
|
|
8
|
+
s ^= s >>> 17;
|
|
9
|
+
s ^= s << 5;
|
|
10
|
+
return ((s >>> 0) / 4294967296) * 2 - 1;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** RBJ biquad filter */
|
|
14
|
+
export class Biquad {
|
|
15
|
+
b0 = 1;
|
|
16
|
+
b1 = 0;
|
|
17
|
+
b2 = 0;
|
|
18
|
+
a1 = 0;
|
|
19
|
+
a2 = 0;
|
|
20
|
+
x1 = 0;
|
|
21
|
+
x2 = 0;
|
|
22
|
+
y1 = 0;
|
|
23
|
+
y2 = 0;
|
|
24
|
+
sr;
|
|
25
|
+
constructor(sr, type, f, q = 0.707, gainDb = 0) {
|
|
26
|
+
this.sr = sr;
|
|
27
|
+
this.set(type, f, q, gainDb);
|
|
28
|
+
}
|
|
29
|
+
set(type, f, q = 0.707, gainDb = 0) {
|
|
30
|
+
const w = (2 * Math.PI * Math.min(f, this.sr * 0.45)) / this.sr;
|
|
31
|
+
const cw = Math.cos(w);
|
|
32
|
+
const al = Math.sin(w) / (2 * q);
|
|
33
|
+
let b0, b1, b2, a0, a1, a2;
|
|
34
|
+
if (type === 'lp') {
|
|
35
|
+
b0 = (1 - cw) / 2;
|
|
36
|
+
b1 = 1 - cw;
|
|
37
|
+
b2 = b0;
|
|
38
|
+
a0 = 1 + al;
|
|
39
|
+
a1 = -2 * cw;
|
|
40
|
+
a2 = 1 - al;
|
|
41
|
+
}
|
|
42
|
+
else if (type === 'hp') {
|
|
43
|
+
b0 = (1 + cw) / 2;
|
|
44
|
+
b1 = -(1 + cw);
|
|
45
|
+
b2 = b0;
|
|
46
|
+
a0 = 1 + al;
|
|
47
|
+
a1 = -2 * cw;
|
|
48
|
+
a2 = 1 - al;
|
|
49
|
+
}
|
|
50
|
+
else if (type === 'bp') {
|
|
51
|
+
b0 = al;
|
|
52
|
+
b1 = 0;
|
|
53
|
+
b2 = -al;
|
|
54
|
+
a0 = 1 + al;
|
|
55
|
+
a1 = -2 * cw;
|
|
56
|
+
a2 = 1 - al;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const A = Math.pow(10, gainDb / 40);
|
|
60
|
+
b0 = 1 + al * A;
|
|
61
|
+
b1 = -2 * cw;
|
|
62
|
+
b2 = 1 - al * A;
|
|
63
|
+
a0 = 1 + al / A;
|
|
64
|
+
a1 = -2 * cw;
|
|
65
|
+
a2 = 1 - al / A;
|
|
66
|
+
}
|
|
67
|
+
this.b0 = b0 / a0;
|
|
68
|
+
this.b1 = b1 / a0;
|
|
69
|
+
this.b2 = b2 / a0;
|
|
70
|
+
this.a1 = a1 / a0;
|
|
71
|
+
this.a2 = a2 / a0;
|
|
72
|
+
}
|
|
73
|
+
run(x) {
|
|
74
|
+
const y = this.b0 * x + this.b1 * this.x1 + this.b2 * this.x2 - this.a1 * this.y1 - this.a2 * this.y2;
|
|
75
|
+
this.x2 = this.x1;
|
|
76
|
+
this.x1 = x;
|
|
77
|
+
this.y2 = this.y1;
|
|
78
|
+
this.y1 = y;
|
|
79
|
+
return y;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function normalize(d, peak = 0.9) {
|
|
83
|
+
let mx = 0;
|
|
84
|
+
for (let i = 0; i < d.length; i++)
|
|
85
|
+
mx = Math.max(mx, Math.abs(d[i]));
|
|
86
|
+
if (mx > 0) {
|
|
87
|
+
const k = peak / mx;
|
|
88
|
+
for (let i = 0; i < d.length; i++)
|
|
89
|
+
d[i] *= k;
|
|
90
|
+
}
|
|
91
|
+
return d;
|
|
92
|
+
}
|
|
93
|
+
/** 10 ms fade-out at the tail to avoid a click from truncation */
|
|
94
|
+
export function tailFade(d, sr) {
|
|
95
|
+
const n = Math.min(d.length, Math.floor(sr * 0.01));
|
|
96
|
+
for (let i = 0; i < n; i++)
|
|
97
|
+
d[d.length - 1 - i] *= i / n;
|
|
98
|
+
return d;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/instruments/dsp/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
export declare const DRUMS: {
|
|
2
|
+
/**
|
|
3
|
+
* Kick: a beater on a big, slack head. The body settles at about 52 Hz after a short glide (the strike stretches the head),
|
|
4
|
+
* and the beater's impact is a brief click around 3 kHz, the part of a kick that is heard through a mix.
|
|
5
|
+
*/
|
|
6
|
+
kick: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
7
|
+
/** Long-tailed bass drum (the ground rumble of electronic and epic music) */
|
|
8
|
+
boom: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
9
|
+
snare: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
10
|
+
/** Field snare (march, epic): the long tail of the snare wires */
|
|
11
|
+
field: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
12
|
+
rim: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
13
|
+
clap: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
14
|
+
hat: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
15
|
+
/** Open hi-hat: two small, thin cymbals rattling against each other; their wash blooms within a few milliseconds and the highest band fades first */
|
|
16
|
+
ohat: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
17
|
+
/** Ride: a thick cymbal played on the bow. The stick's ping and the bell's tone come first; the wash builds up slowly under them and its highs fade first */
|
|
18
|
+
ride: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
19
|
+
/** Crash: the stick's strike, then the wash blooms upward over the first ~100 ms; the highs fade within about a second and a low hum rings on */
|
|
20
|
+
crash: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
21
|
+
/** Reversed cymbal: sucked in toward the next beat. A different crash on each side, so it swells wide */
|
|
22
|
+
swell: (sr: number, m: number, s: number) => [Float32Array, Float32Array];
|
|
23
|
+
shaker: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
24
|
+
tamb: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
25
|
+
/**
|
|
26
|
+
* Taiko: two thick cowhide heads on a hollowed trunk, struck near the centre with heavy bachi. The deep (0,1) mode carries the sound,
|
|
27
|
+
* the (1,1) and (2,1) above it fade sooner, the slack hide makes the pitch sag as the strike's stretch relaxes, and the hardwood bachi slaps the hide.
|
|
28
|
+
*/
|
|
29
|
+
taiko: (sr: number, m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
30
|
+
/** Frame drum (a tambourine without jingles, the hand drum): a low thud + the slap of fingers */
|
|
31
|
+
frame: (sr: number, m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
32
|
+
/** Darbuka: below C4 is the doum (low), above is the tek (high, crisp) */
|
|
33
|
+
darbuka: (sr: number, m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
34
|
+
/**
|
|
35
|
+
* Tom: a stick on a tensioned head. The (0,1) mode is the pitch; the (1,1), (2,1), (0,2) and (3,1) modes above it (ideal-membrane ratios) die sooner
|
|
36
|
+
* and make it a drum rather than a sine. The strike's stretch raises the pitch about two semitones at first; the stick's tip adds a short slap.
|
|
37
|
+
*/
|
|
38
|
+
tom: (sr: number, m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
39
|
+
/**
|
|
40
|
+
* Timpani: the air in the kettle loads the head so that its (1,1) to (5,1) modes fall at about 1 : 1.5 : 1.98 : 2.44 : 2.9 (Rossing),
|
|
41
|
+
* a near-harmonic series that gives the drum its pitch; the (1,1) rings longest (2-3 s, longer on the big drums).
|
|
42
|
+
* The symmetric modes pump air in and out of the kettle and die within a few tenths of a second: with the felt, they are the low thud of the stroke.
|
|
43
|
+
* Each variant lands at a slightly different distance from the rim, which changes how strongly each mode is excited (J_m(j_m1·r/a)), so a roll does not repeat itself.
|
|
44
|
+
*/
|
|
45
|
+
timpani: (sr: number, m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
46
|
+
woodblock: (sr: number, m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
47
|
+
clave: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
48
|
+
/** Anvil: a smith's metallic strike (by pitch) */
|
|
49
|
+
anvil: (sr: number, m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
50
|
+
/**
|
|
51
|
+
* Triangle: a steel rod bent into three sides, struck with a steel beater. Its modes are a free bar's (1 : 2.76 : 5.40 : 8.93 …), each
|
|
52
|
+
* split in two by the bends (vibrating in the plane and across it), so it has no clear pitch; the strongest lie between 2 and 10 kHz
|
|
53
|
+
* and ring for seconds, the highest fade first, and the beater's strike clicks
|
|
54
|
+
*/
|
|
55
|
+
triangle: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
56
|
+
/** Gong (tam-tam): a metallic cloud that slowly blooms */
|
|
57
|
+
gong: (sr: number, m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
58
|
+
/** Thunder: distant rolling low frequencies */
|
|
59
|
+
thunder: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
60
|
+
/** Close thunderclap: first a tearing crack, then right after a dull boom, then rolling out into several waves of thunder from near to far */
|
|
61
|
+
thunderclap: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
62
|
+
/** Chains clashing */
|
|
63
|
+
chain: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
64
|
+
/** Finger castanets / finger snap */
|
|
65
|
+
snap: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
66
|
+
/** A brush sweeping past, like a maidenhair fern (jazz brush) */
|
|
67
|
+
brush: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
68
|
+
/** Water drop */
|
|
69
|
+
drip: (sr: number, m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
70
|
+
/**
|
|
71
|
+
* TR-808 bass drum: a bridged-T resonator near 50 Hz (tunable) rung by a 1 ms trigger pulse. For the first few milliseconds the attack
|
|
72
|
+
* circuit raises its frequency, so the note opens with a fast cycle near 150 Hz (the click that cuts through a mix); then it booms on
|
|
73
|
+
* for over a second, its pitch sighing down from about 65 Hz as it fades. The pitch envelope is fitted to recordings of an 808.
|
|
74
|
+
* Give it notes to play it as a bassline
|
|
75
|
+
*/
|
|
76
|
+
kick808: (sr: number, m: number) => Float32Array<ArrayBufferLike>;
|
|
77
|
+
/**
|
|
78
|
+
* TR-909 bass drum: a VCO whose pitch envelope dives from about 290 Hz to 50 Hz (tunable) with a 7 ms time constant, which is the punch
|
|
79
|
+
* (fitted to a recording of a 909); a waveshaper rounds it into a not-quite sine, and the attack control adds a click of noise just ahead of it
|
|
80
|
+
*/
|
|
81
|
+
kick909: (sr: number, m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
82
|
+
/**
|
|
83
|
+
* The modern EDM kick, built in layers: a punch where the pitch dives from 400 Hz past 100 Hz in about 15 ms into a sub body at 50 Hz
|
|
84
|
+
* (tunable), driven into a soft clipper so it holds full level for its first 60 ms and then falls away quickly to leave room for the bass,
|
|
85
|
+
* and on top a click of noise at 2-7 kHz, which is what is heard of a kick on small speakers
|
|
86
|
+
*/
|
|
87
|
+
bigKick: (sr: number, m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
88
|
+
/**
|
|
89
|
+
* TR-909 snare: two oscillators for the shell (185 and 330 Hz), each starting higher and dropping within about 10 ms, under bright
|
|
90
|
+
* high-passed noise for the wires (the snappy control); short and crisp, so it also suits the fast rolls of a build-up
|
|
91
|
+
*/
|
|
92
|
+
snare909: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
93
|
+
/**
|
|
94
|
+
* TR-808 / 909 hand clap: white noise through a band-pass near 1.1 kHz, opened by a sawtooth envelope three times about 11 ms apart
|
|
95
|
+
* (hands not quite together), then once more into a short reverberant tail. The tail is drawn anew for each channel, so it spreads wide
|
|
96
|
+
*/
|
|
97
|
+
clap909: (sr: number, _m: number, s: number) => [Float32Array<ArrayBufferLike>, Float32Array<ArrayBufferLike>];
|
|
98
|
+
/**
|
|
99
|
+
* TR-909 closed hi-hat. The 909 plays a 6-bit recording of a real hat (see rom6): dense noise above 6 kHz centred near 10 kHz, with
|
|
100
|
+
* a shimmer of the 808's six square waves (an octave up) under it, cut short by the decay
|
|
101
|
+
*/
|
|
102
|
+
hat909: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
103
|
+
/** TR-909 open hi-hat: a 6-bit recording of an open hat, its wash blooming within a few milliseconds, faded out over half a second */
|
|
104
|
+
ohat909: (sr: number, _m: number, s: number) => Float32Array<ArrayBufferLike>;
|
|
105
|
+
/**
|
|
106
|
+
* Impact, the hit on the first beat of a drop: a sub thump that dives from about 160 Hz to 36 Hz and rumbles on for two seconds, and a
|
|
107
|
+
* burst of noise whose low-pass closes from bright to dark (a downward whoosh), clipped together. The noise is drawn anew for each
|
|
108
|
+
* channel, so the tail is wide
|
|
109
|
+
*/
|
|
110
|
+
impact: (sr: number, _m: number, s: number) => [Float32Array<ArrayBufferLike>, Float32Array<ArrayBufferLike>];
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=drums.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drums.d.ts","sourceRoot":"","sources":["../../../src/instruments/dsp/drums.ts"],"names":[],"mappings":"AA8LA,eAAO,MAAM,KAAK;IAChB;;;OAGG;;IAQH,6EAA6E;;;IAc7E,kEAAkE;;;;;IAwBlE,qJAAqJ;;IAOrJ,6JAA6J;;IAQ7J,iJAAiJ;;IAOjJ,yGAAyG;iDACtF,CAAC,YAAY,EAAE,YAAY,CAAC;;;IAqB/C;;;OAGG;;IASH,iGAAiG;;IAQjG,0EAA0E;;IAY1E;;;OAGG;;IAYH;;;;;OAKG;;;;IAmBH,kDAAkD;;IAKlD;;;;OAIG;;IAWH,0DAA0D;;IAS1D,+CAA+C;;IAmB/C,8IAA8I;;IAyB9I,sBAAsB;;IAatB,qCAAqC;;IAMrC,iEAAiE;;IAMjE,iBAAiB;;IAiBjB;;;;;OAKG;;IAMH;;;OAGG;;IAQH;;;;OAIG;;IAQH;;;OAGG;;IASH;;;OAGG;;IAYH;;;OAGG;;IAOH,sIAAsI;;IAOtI;;;;OAIG;;CAY0B,CAAC"}
|