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 @@
|
|
|
1
|
+
{"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../../src/instruments/dsp/modal.ts"],"names":[],"mappings":"AAIA,wDAAwD;AACxD,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kHAAkH;IAClH,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,SAAS,GAAG,YAAY,CA8C9F"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Modal synthesis: a sum of exponentially decaying partials. Bells, mallets, kalimba, music box.
|
|
2
|
+
import { Biquad, normalize, rng, tailFade } from './core.js';
|
|
3
|
+
export function modal(sr, f, parts, o) {
|
|
4
|
+
const n = Math.floor(o.len * sr);
|
|
5
|
+
const y = new Float32Array(n);
|
|
6
|
+
const nyq = sr * 0.45;
|
|
7
|
+
const att = Math.max(1, Math.floor((o.attack ?? 0.001) * sr));
|
|
8
|
+
const r = rng(o.seed ?? Math.round(f * 13));
|
|
9
|
+
for (const [ratio, a, t60] of parts) {
|
|
10
|
+
const pf = f * ratio;
|
|
11
|
+
if (pf >= nyq)
|
|
12
|
+
continue;
|
|
13
|
+
const amp = o.mallet ? a / (1 + (pf / o.mallet) ** 2) : a;
|
|
14
|
+
const copies = o.beat ? [1, Math.pow(2, o.beat / 1200)] : [1];
|
|
15
|
+
for (const cm of copies) {
|
|
16
|
+
const w0 = (2 * Math.PI * pf * cm) / sr;
|
|
17
|
+
const k = Math.pow(10, -3 / (t60 * sr));
|
|
18
|
+
let env = amp / copies.length;
|
|
19
|
+
let ph = r() * 0.3;
|
|
20
|
+
for (let i = 0; i < n; i++) {
|
|
21
|
+
let w = w0;
|
|
22
|
+
if (o.bend && o.bendT) {
|
|
23
|
+
const tt = i / sr;
|
|
24
|
+
w = w0 * (1 + (o.bend - 1) * Math.exp(-tt / o.bendT));
|
|
25
|
+
}
|
|
26
|
+
ph += w;
|
|
27
|
+
y[i] += Math.sin(ph) * env;
|
|
28
|
+
env *= k;
|
|
29
|
+
if (env < 1e-6)
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
for (let i = 0; i < att && i < n; i++)
|
|
35
|
+
y[i] *= i / att;
|
|
36
|
+
if (o.click) {
|
|
37
|
+
const c = o.click;
|
|
38
|
+
const hz = c.hz < 40 ? c.hz * f : c.hz;
|
|
39
|
+
const bp = new Biquad(sr, 'bp', hz, c.q ?? 1.2);
|
|
40
|
+
const k = Math.pow(10, -3 / (c.t * sr));
|
|
41
|
+
let env = c.amp;
|
|
42
|
+
for (let i = 0; i < n && env > 1e-5; i++) {
|
|
43
|
+
y[i] += bp.run(r()) * env;
|
|
44
|
+
env *= k;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (o.trem) {
|
|
48
|
+
const [rate, depth] = o.trem;
|
|
49
|
+
for (let i = 0; i < n; i++)
|
|
50
|
+
y[i] *= 1 - depth * 0.5 * (1 - Math.cos((2 * Math.PI * rate * i) / sr));
|
|
51
|
+
}
|
|
52
|
+
return tailFade(normalize(y), sr);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal.js","sourceRoot":"","sources":["../../../src/instruments/dsp/modal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Stretch tuning (cents) */
|
|
2
|
+
export declare function pianoStretch(m: number): number;
|
|
3
|
+
/** Seconds for the tail to decay 60 dB (fundamental) */
|
|
4
|
+
export declare const pianoSustain: (m: number) => number;
|
|
5
|
+
/** Piano sample: soft is the soft voicing (felt, warm, used for narrative and the ending) */
|
|
6
|
+
export declare function piano(sr: number, m: number, soft?: boolean): Float32Array;
|
|
7
|
+
/** Electric piano (Rhodes feel): 1:1 FM, modulation index decaying over time, plus a tuning-fork tine ring in the highs */
|
|
8
|
+
export declare function epiano(sr: number, m: number): Float32Array;
|
|
9
|
+
//# sourceMappingURL=piano.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piano.d.ts","sourceRoot":"","sources":["../../../src/instruments/dsp/piano.ts"],"names":[],"mappings":"AAeA,6BAA6B;AAC7B,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9C;AAOD,wDAAwD;AACxD,eAAO,MAAM,YAAY,MAAO,MAAM,KAAG,MAAuE,CAAC;AA0BjH,6FAA6F;AAC7F,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,UAAQ,GAAG,YAAY,CA6GvE;AAoCD,2HAA2H;AAC3H,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CAyB1D"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// Acoustic piano (modal, calibrated against real pianos) and electric piano (FM).
|
|
2
|
+
import { Biquad, normalize, rng, tailFade } from './core.js';
|
|
3
|
+
//
|
|
4
|
+
// Modal synthesis: each partial of each string is a decaying oscillator. The parameters are calibrated against measurements of real pianos and piano recordings from Apple Loops:
|
|
5
|
+
// - 1 to 3 strings per note (1 for the bass, 2 for the low-mid, 3 for the rest); each string is out of tune by a fraction of a cent and has a slightly different inharmonicity coefficient,
|
|
6
|
+
// and the beating between partials makes the sound alive rather than an electronic organ.
|
|
7
|
+
// - Two-stage decay: the vertical vibration of the string hands its energy quickly to the soundboard (dropping about 12 dB right after the attack), while the horizontal vibration leaves a long tail;
|
|
8
|
+
// high partials get an extra loss proportional to the square of frequency (the Chaigne and Askenfelt string damping model).
|
|
9
|
+
// - Excitation spectrum: partial amplitude is about inversely proportional to the square root of frequency, then falls away past a knee; the hammer strikes at about 1/8 to 1/13 of the string length, so partials near that point are weak.
|
|
10
|
+
// The sample is struck brightest (forte) and at playback is rolled off with a low-pass according to velocity (tone in instruments.ts): a light touch is dark, a hard strike bright.
|
|
11
|
+
// - Soundboard: a fixed set of resonance peaks shapes the body's timbre; on the attack, the low-frequency thud of the soundboard being struck, and the hammer's brief scrape.
|
|
12
|
+
// - Stretch tuning: bass slightly flat and treble slightly sharp (the Railsback curve), so octaves do not clash because of inharmonicity.
|
|
13
|
+
/** Stretch tuning (cents) */
|
|
14
|
+
export function pianoStretch(m) {
|
|
15
|
+
const d = m - 64;
|
|
16
|
+
return Math.sign(d) * 0.004 * Math.pow(Math.abs(d), 2.2);
|
|
17
|
+
}
|
|
18
|
+
/** Inharmonicity coefficient: smallest in the low-mid register, growing toward the lowest notes and the treble */
|
|
19
|
+
function pianoB(m) {
|
|
20
|
+
return m <= 40 ? 6e-5 * Math.pow(2, (40 - m) / 14) : 6e-5 * Math.pow(2, (m - 40) / 9.3);
|
|
21
|
+
}
|
|
22
|
+
/** Seconds for the tail to decay 60 dB (fundamental) */
|
|
23
|
+
export const pianoSustain = (m) => Math.min(30, Math.max(1.2, 30 * Math.pow(2, -(m - 21) / 24)));
|
|
24
|
+
/** Frequency response of the soundboard and body (dB): shared by every note of the same piano */
|
|
25
|
+
let boardDb = null;
|
|
26
|
+
function board(f) {
|
|
27
|
+
if (!boardDb) {
|
|
28
|
+
const r = rng(90210);
|
|
29
|
+
const modes = [];
|
|
30
|
+
for (let i = 0; i < 34; i++) {
|
|
31
|
+
const fc = 70 * Math.pow(3200 / 70, (i + 0.5 + r() * 0.45) / 34);
|
|
32
|
+
modes.push([fc, 4.5 * r(), 3 + 4 * Math.abs(r())]);
|
|
33
|
+
}
|
|
34
|
+
boardDb = (x) => {
|
|
35
|
+
let g = 0;
|
|
36
|
+
for (const [fc, gain, q] of modes) {
|
|
37
|
+
const u = ((x - fc) * 2 * q) / fc;
|
|
38
|
+
g += gain / (1 + u * u);
|
|
39
|
+
}
|
|
40
|
+
return g;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// The soundboard radiates poorly at very low frequencies: it drops 12 dB per octave below 45 Hz
|
|
44
|
+
const hp = 1 / Math.sqrt(1 + Math.pow(45 / f, 4));
|
|
45
|
+
return Math.pow(10, boardDb(f) / 20) * hp;
|
|
46
|
+
}
|
|
47
|
+
/** Piano sample: soft is the soft voicing (felt, warm, used for narrative and the ending) */
|
|
48
|
+
export function piano(sr, m, soft = false) {
|
|
49
|
+
const r = rng(m * 31 + (soft ? 7 : 0));
|
|
50
|
+
const f0 = 440 * Math.pow(2, (m - 69 + pianoStretch(m) / 100) / 12);
|
|
51
|
+
const Ts = pianoSustain(m);
|
|
52
|
+
const len = Math.min(9, Math.max(1.6, Ts * 0.85));
|
|
53
|
+
const n = Math.floor(len * sr);
|
|
54
|
+
const acc = new Float64Array(n);
|
|
55
|
+
const nyq = sr * 0.45;
|
|
56
|
+
const B = pianoB(m);
|
|
57
|
+
// Strings: how many, each one's detuning (cents), and the differences in inharmonicity coefficient
|
|
58
|
+
const nStr = m < 30 ? 1 : m < 42 ? 2 : 3;
|
|
59
|
+
const strings = [];
|
|
60
|
+
for (let k = 0; k < nStr; k++) {
|
|
61
|
+
const cents = nStr === 1 ? 0 : (k - (nStr - 1) / 2) * (0.9 + 0.6 * r()) + 0.35 * r();
|
|
62
|
+
strings.push([f0 * Math.pow(2, cents / 1200), B * (1 + 0.02 * r())]);
|
|
63
|
+
}
|
|
64
|
+
// The knee of the excitation spectrum moves up with pitch; the soft voicing is darker
|
|
65
|
+
const oct = Math.pow(2, (m - 40) / 24);
|
|
66
|
+
const fk = (soft ? 650 : 1200) * oct;
|
|
67
|
+
const fe = (soft ? 1700 : 3000) * oct;
|
|
68
|
+
// Hammer strike point (as a fraction of string length): about 1/8 for the bass, about 1/13 for the treble
|
|
69
|
+
const beta = 1 / (8 + Math.max(0, m - 21) * 0.058);
|
|
70
|
+
// From the middle of the keyboard up, the felt stays on the string for about a period of the note, which filters the upper
|
|
71
|
+
// partials away (12 dB per octave above the cutoff: ~530 Hz at C4, 420 Hz from C5 up) and leaves the treble round; it fades in between C3 and C4
|
|
72
|
+
const felt = Math.min(1, Math.max(0, (m - 48) / 12));
|
|
73
|
+
const feltCut = (soft ? 0.8 : 1) * 420 * Math.pow(2, Math.max(0, 72 - m) / 36);
|
|
74
|
+
// Decay: σ = base loss + b3·ω²; the early stage (handed over to the soundboard) is fast, the later stage (the tail) is slow
|
|
75
|
+
const Tf = Ts / 2;
|
|
76
|
+
const prompt = soft ? 0.55 : 0.6;
|
|
77
|
+
// Frequency-dependent loss at the level measured on real strings (Chaigne and Askenfelt): the highs die well before the fundamental
|
|
78
|
+
const b3 = soft ? 9e-9 : 6e-9;
|
|
79
|
+
/** [frequency, amplitude] of the first partials, for the sympathetic strings */
|
|
80
|
+
const struck = [];
|
|
81
|
+
for (let p = 1; p < 400; p++) {
|
|
82
|
+
const fp = p * f0 * Math.sqrt(1 + B * p * p);
|
|
83
|
+
if (fp > nyq)
|
|
84
|
+
break;
|
|
85
|
+
const lp = 1 / (1 + (fp / fk) * (fp / fk));
|
|
86
|
+
const ex = Math.exp(-fp / fe);
|
|
87
|
+
let amp = Math.sqrt((f0 / fp) * lp * ex);
|
|
88
|
+
amp *= Math.pow(1 + Math.pow(fp / feltCut, 4), -felt / 2);
|
|
89
|
+
amp *= Math.abs(Math.sin(Math.PI * p * beta)) * 0.92 + 0.08;
|
|
90
|
+
amp *= board(fp);
|
|
91
|
+
if (amp < 3e-4) {
|
|
92
|
+
if (fp > fk * 4)
|
|
93
|
+
break;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (p <= 8)
|
|
97
|
+
struck.push([fp, amp]);
|
|
98
|
+
const w2 = Math.pow(2 * Math.PI * fp, 2);
|
|
99
|
+
const s1 = 6.9 / Tf + b3 * w2;
|
|
100
|
+
const s2 = 6.9 / Ts + b3 * w2;
|
|
101
|
+
const k1 = Math.exp(-s1 / sr);
|
|
102
|
+
const k2 = Math.exp(-s2 / sr);
|
|
103
|
+
for (const [fs, Bs] of strings) {
|
|
104
|
+
// Each partial is also shifted a tiny bit (string non-uniformity, bridge coupling), so the beats between strings do not all cancel neatly together
|
|
105
|
+
const jit = nStr > 1 ? Math.pow(2, (0.45 * r()) / 1200) : 1;
|
|
106
|
+
const w = (2 * Math.PI * p * fs * jit * Math.sqrt(1 + Bs * p * p)) / sr;
|
|
107
|
+
const cw = Math.cos(w);
|
|
108
|
+
const sw = Math.sin(w);
|
|
109
|
+
// A struck string starts from rest: every partial starts from sin 0
|
|
110
|
+
let re = 1;
|
|
111
|
+
let im = 0;
|
|
112
|
+
let e1 = (amp * prompt) / nStr;
|
|
113
|
+
let e2 = (amp * (1 - prompt)) / nStr;
|
|
114
|
+
const stop = amp * 1e-4 / nStr;
|
|
115
|
+
for (let i = 0; i < n; i++) {
|
|
116
|
+
acc[i] += im * (e1 + e2);
|
|
117
|
+
const nr = re * cw - im * sw;
|
|
118
|
+
im = re * sw + im * cw;
|
|
119
|
+
re = nr;
|
|
120
|
+
e1 *= k1;
|
|
121
|
+
e2 *= k2;
|
|
122
|
+
if (e1 + e2 < stop)
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
sympathetic(acc, sr, m, struck, b3);
|
|
128
|
+
const y = new Float32Array(n);
|
|
129
|
+
for (let i = 0; i < n; i++)
|
|
130
|
+
y[i] = acc[i];
|
|
131
|
+
// Set the volume by the energy in the first 0.25 s after the attack (rather than the peak): every note sounds equally loud, and loudness is left to playback velocity
|
|
132
|
+
let e = 0;
|
|
133
|
+
const w = Math.min(n, Math.floor(sr * 0.25));
|
|
134
|
+
for (let i = 0; i < w; i++)
|
|
135
|
+
e += y[i] * y[i];
|
|
136
|
+
const rms = Math.sqrt(e / w) || 1;
|
|
137
|
+
// The soundboard thud when struck: a few low-frequency soundboard modes, brief; relatively noticeable in the treble (short strings, quiet string sound)
|
|
138
|
+
const knockAmp = rms * (soft ? 0.35 : 0.55) * Math.min(1.6, Math.max(0.5, (m - 30) / 40));
|
|
139
|
+
const knock = [[96, 0.13, 1], [168, 0.09, 0.8], [281, 0.06, 0.6], [470, 0.035, 0.4]];
|
|
140
|
+
for (const [fq, dec, a] of knock) {
|
|
141
|
+
const bp = new Biquad(sr, 'bp', fq, 2.2);
|
|
142
|
+
const kd = Math.pow(10, -3 / (dec * sr));
|
|
143
|
+
let env = knockAmp * a * 6;
|
|
144
|
+
for (let i = 0; i < n && env > 1e-6; i++) {
|
|
145
|
+
y[i] += bp.run(r()) * env;
|
|
146
|
+
env *= kd;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// The hammer's scrape: mid-high frequencies, a few milliseconds
|
|
150
|
+
const hb = new Biquad(sr, 'bp', Math.min(5000, 1400 + f0 * 2), 0.9);
|
|
151
|
+
let he = rms * (soft ? 0.12 : 0.3);
|
|
152
|
+
const hk = Math.pow(10, -3 / (0.006 * sr));
|
|
153
|
+
for (let i = 0; i < n && he > 1e-6; i++) {
|
|
154
|
+
y[i] += hb.run(r()) * he;
|
|
155
|
+
he *= hk;
|
|
156
|
+
}
|
|
157
|
+
// Attack: it takes a moment for the hammer to push the string away (longer with the soft voicing's felt)
|
|
158
|
+
const att = Math.floor(sr * (soft ? 0.004 : 0.0015));
|
|
159
|
+
for (let i = 0; i < att && i < n; i++)
|
|
160
|
+
y[i] *= i / att;
|
|
161
|
+
const g = 0.25 / rms;
|
|
162
|
+
for (let i = 0; i < n; i++)
|
|
163
|
+
y[i] *= g;
|
|
164
|
+
return tailFade(y, sr);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Sympathetic resonance: strings left free by the dampers (the whole keyboard with the pedal down; the top of the treble always)
|
|
168
|
+
* pick up this note's partials through the bridge. A string answers in its n-th mode when that mode lands within a Hz or two of a partial:
|
|
169
|
+
* the strings an octave and a twelfth around a note answer, an equal-tempered third (14 cents off) barely does.
|
|
170
|
+
* Each answers at its own frequency (stretched tuning and inharmonicity differ), blooming in over a tenth of a second and ringing
|
|
171
|
+
* with its own decay, so the sound grows a soft halo that beats gently against the struck strings.
|
|
172
|
+
* The bloom is slow, so short unpedalled notes are damped before it is heard; held and pedalled notes carry it.
|
|
173
|
+
*/
|
|
174
|
+
function sympathetic(acc, sr, m, struck, b3) {
|
|
175
|
+
const n = acc.length;
|
|
176
|
+
for (const [fp, amp] of struck) {
|
|
177
|
+
if (fp > 4000)
|
|
178
|
+
break;
|
|
179
|
+
for (const mode of [1, 2, 3]) {
|
|
180
|
+
const key = Math.round(69 + 12 * Math.log2(fp / mode / 440));
|
|
181
|
+
if (key === m || key < 21 || key > 108)
|
|
182
|
+
continue;
|
|
183
|
+
const fs = 440 * Math.pow(2, (key - 69 + pianoStretch(key) / 100) / 12);
|
|
184
|
+
const f = mode * fs * Math.sqrt(1 + pianoB(key) * mode * mode);
|
|
185
|
+
const match = 1 / (1 + Math.pow((f - fp) / 1.5, 2));
|
|
186
|
+
const level = (amp * 0.12 * match) / mode;
|
|
187
|
+
if (level < 1e-4)
|
|
188
|
+
continue;
|
|
189
|
+
const decay = Math.exp(-(6.9 / pianoSustain(key) + b3 * Math.pow(2 * Math.PI * f, 2)) / sr);
|
|
190
|
+
const bloom = Math.exp(-1 / (0.08 * sr));
|
|
191
|
+
const w = (2 * Math.PI * f) / sr;
|
|
192
|
+
let env = level;
|
|
193
|
+
let rise = 1;
|
|
194
|
+
for (let i = 0; i < n && env > level * 1e-3; i++) {
|
|
195
|
+
acc[i] += Math.sin(w * i) * env * (1 - rise);
|
|
196
|
+
rise *= bloom;
|
|
197
|
+
env *= decay;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/** Electric piano (Rhodes feel): 1:1 FM, modulation index decaying over time, plus a tuning-fork tine ring in the highs */
|
|
203
|
+
export function epiano(sr, m) {
|
|
204
|
+
const f = 440 * Math.pow(2, (m - 69) / 12);
|
|
205
|
+
const t60 = Math.max(1.2, 6 * Math.pow(0.5, (m - 48) / 24));
|
|
206
|
+
const len = Math.min(5, t60 * 0.8);
|
|
207
|
+
const n = Math.floor(len * sr);
|
|
208
|
+
const y = new Float32Array(n);
|
|
209
|
+
const w = (2 * Math.PI * f) / sr;
|
|
210
|
+
const k = Math.pow(10, -3 / (t60 * sr));
|
|
211
|
+
const kt = Math.pow(10, -3 / (0.35 * sr));
|
|
212
|
+
let env = 1;
|
|
213
|
+
let tine = 0.12;
|
|
214
|
+
let pc = 0;
|
|
215
|
+
let pm = 0;
|
|
216
|
+
for (let i = 0; i < n; i++) {
|
|
217
|
+
const t = i / sr;
|
|
218
|
+
const I = 1.6 * Math.exp(-t / 0.3) + 0.35;
|
|
219
|
+
pc += w;
|
|
220
|
+
pm += w;
|
|
221
|
+
y[i] = Math.sin(pc + I * Math.sin(pm)) * env + Math.sin(pc * 7.1) * tine;
|
|
222
|
+
env *= k;
|
|
223
|
+
tine *= kt;
|
|
224
|
+
}
|
|
225
|
+
const att = Math.floor(sr * 0.003);
|
|
226
|
+
for (let i = 0; i < att; i++)
|
|
227
|
+
y[i] *= i / att;
|
|
228
|
+
return tailFade(normalize(y), sr);
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=piano.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piano.js","sourceRoot":"","sources":["../../../src/instruments/dsp/piano.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** A body mode: [frequency Hz, boost at the peak in dB, Q]; it rings for about 2.2·Q/f seconds */
|
|
2
|
+
export type BodyMode = [number, number, number];
|
|
3
|
+
/** Classical guitar: the air in the body (~95 Hz) coupled to the top plate (~200 Hz), and the top's next modes around 400 Hz */
|
|
4
|
+
export declare const GUITAR_BODY: BodyMode[];
|
|
5
|
+
/** Steel-string guitar: a larger, stiffer top braced for the strings' higher tension */
|
|
6
|
+
export declare const STEEL_BODY: BodyMode[];
|
|
7
|
+
/** Lute and oud: a light bowl-backed body with a thin top, modes higher than a guitar's */
|
|
8
|
+
export declare const LUTE_BODY: BodyMode[];
|
|
9
|
+
/** Violin family (pizzicato): the air mode A0 and the corpus modes B1-, B1+ */
|
|
10
|
+
export declare const VIOLIN_BODY: BodyMode[];
|
|
11
|
+
/** Concert harp: the long soundboard and the box behind it */
|
|
12
|
+
export declare const HARP_BODY: BodyMode[];
|
|
13
|
+
/** Hammered dulcimer: a shallow trapezoid box */
|
|
14
|
+
export declare const DULCIMER_BODY: BodyMode[];
|
|
15
|
+
export interface KsOpts {
|
|
16
|
+
/** Length in seconds */
|
|
17
|
+
len: number;
|
|
18
|
+
/** Seconds for the fundamental to decay to -60 dB (at this pitch) */
|
|
19
|
+
t60: number;
|
|
20
|
+
/** How fast the string is let go, 0-1: the pluck's low-pass, from 2 kHz (soft flesh) to 16 kHz (plectrum, hammer) */
|
|
21
|
+
bright: number;
|
|
22
|
+
/** Pluck position as a fraction of the string length, 0-0.5 (the nearer the bridge, the more overtones) */
|
|
23
|
+
pos: number;
|
|
24
|
+
/** Frequency-dependent string loss b3 (s⁻¹ per (rad/s)²): a partial at ω decays b3·(ω² − ω0²) per second faster than the fundamental. 2e-8 lets a 2 kHz partial ring about 1.5 s (steel), 6e-8 about 0.6 s (nylon) */
|
|
25
|
+
loss: number;
|
|
26
|
+
/** Detune of the second string (cents); 0 means a single string */
|
|
27
|
+
detune?: number;
|
|
28
|
+
/** Body modes */
|
|
29
|
+
body?: BodyMode[];
|
|
30
|
+
/** Loudness by register, dB per octave from middle C (the shorter, lighter treble strings move less air) */
|
|
31
|
+
tilt?: number;
|
|
32
|
+
}
|
|
33
|
+
/** A plucked string (or a course of two) through its instrument's body */
|
|
34
|
+
export declare function ks(sr: number, f: number, o: KsOpts): Float32Array;
|
|
35
|
+
export interface PluckOpts {
|
|
36
|
+
len: number;
|
|
37
|
+
/** Seconds for the fundamental to decay to -60 dB; higher harmonics progressively faster */
|
|
38
|
+
t60: number;
|
|
39
|
+
/** Pluck position 0-0.5 (decides which harmonics are weakened) */
|
|
40
|
+
pos: number;
|
|
41
|
+
/** Harmonic slope (the larger, the darker) */
|
|
42
|
+
tilt: number;
|
|
43
|
+
/** Frequencies of the body resonances (Hz): they sound together at the instant of the pluck and vanish quickly */
|
|
44
|
+
body: number[];
|
|
45
|
+
/** Amount of the finger's dull thump */
|
|
46
|
+
thump: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Additive-synthesis plucked string: each harmonic decays on its own (the higher, the faster), slightly inharmonic, plus body resonance and the finger's dull thump.
|
|
50
|
+
* In the bass range Karplus-Strong decays down to a pure sine (like a synthesizer); this model keeps the woody mid-range.
|
|
51
|
+
*/
|
|
52
|
+
export declare function pluckAdd(sr: number, f: number, o: PluckOpts): Float32Array;
|
|
53
|
+
//# sourceMappingURL=pluck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluck.d.ts","sourceRoot":"","sources":["../../../src/instruments/dsp/pluck.ts"],"names":[],"mappings":"AAmBA,kGAAkG;AAClG,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,gIAAgI;AAChI,eAAO,MAAM,WAAW,EAAE,QAAQ,EAA8D,CAAC;AACjG,wFAAwF;AACxF,eAAO,MAAM,UAAU,EAAE,QAAQ,EAA6D,CAAC;AAC/F,2FAA2F;AAC3F,eAAO,MAAM,SAAS,EAAE,QAAQ,EAA+C,CAAC;AAChF,+EAA+E;AAC/E,eAAO,MAAM,WAAW,EAAE,QAAQ,EAA+C,CAAC;AAClF,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,QAAQ,EAA8C,CAAC;AAC/E,iDAAiD;AACjD,eAAO,MAAM,aAAa,EAAE,QAAQ,EAAiD,CAAC;AAEtF,MAAM,WAAW,MAAM;IACrB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,GAAG,EAAE,MAAM,CAAC;IACZ,qHAAqH;IACrH,MAAM,EAAE,MAAM,CAAC;IACf,2GAA2G;IAC3G,GAAG,EAAE,MAAM,CAAC;IACZ,sNAAsN;IACtN,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,4GAA4G;IAC5G,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA+FD,0EAA0E;AAC1E,wBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,YAAY,CA6BjE;AAID,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,4FAA4F;IAC5F,GAAG,EAAE,MAAM,CAAC;IACZ,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,kHAAkH;IAClH,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,GAAG,YAAY,CAwC1E"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// Plucked strings: Karplus-Strong for guitars, harps and dulcimers; an additive model for bass plucks.
|
|
2
|
+
import { Biquad, normalize, rng, tailFade } from './core.js';
|
|
3
|
+
/** Classical guitar: the air in the body (~95 Hz) coupled to the top plate (~200 Hz), and the top's next modes around 400 Hz */
|
|
4
|
+
export const GUITAR_BODY = [[96, 7, 14], [205, 6, 16], [400, 3.5, 12], [560, 2, 10]];
|
|
5
|
+
/** Steel-string guitar: a larger, stiffer top braced for the strings' higher tension */
|
|
6
|
+
export const STEEL_BODY = [[102, 6, 14], [190, 5, 16], [380, 3, 12], [650, 2, 10]];
|
|
7
|
+
/** Lute and oud: a light bowl-backed body with a thin top, modes higher than a guitar's */
|
|
8
|
+
export const LUTE_BODY = [[125, 5, 12], [260, 5, 14], [520, 3, 10]];
|
|
9
|
+
/** Violin family (pizzicato): the air mode A0 and the corpus modes B1-, B1+ */
|
|
10
|
+
export const VIOLIN_BODY = [[275, 6, 12], [460, 5, 14], [540, 4, 14]];
|
|
11
|
+
/** Concert harp: the long soundboard and the box behind it */
|
|
12
|
+
export const HARP_BODY = [[110, 3, 8], [190, 3, 10], [330, 2, 10]];
|
|
13
|
+
/** Hammered dulcimer: a shallow trapezoid box */
|
|
14
|
+
export const DULCIMER_BODY = [[180, 4, 12], [320, 4, 12], [610, 2.5, 10]];
|
|
15
|
+
/**
|
|
16
|
+
* The whole body: the listed low modes, then the many plate and cavity modes above them, too dense to list (24 of them log-spaced up to 4 kHz,
|
|
17
|
+
* -2 to +3 dB, Q 12-30). Each colours the partials near it and rings for some tens of milliseconds, so the bridge's sharp pulse each period
|
|
18
|
+
* comes out as a short wooden ring rather than a bare click train.
|
|
19
|
+
*/
|
|
20
|
+
function bodyModes(body) {
|
|
21
|
+
const r = rng(Math.round(body[0][0] * 97));
|
|
22
|
+
const lo = body[body.length - 1][0] * 1.25;
|
|
23
|
+
const dense = [];
|
|
24
|
+
for (let i = 0; i < 24; i++)
|
|
25
|
+
dense.push([lo * Math.pow(4000 / lo, (i + 0.5 + 0.4 * r()) / 24), 0.5 + 2.5 * r(), 21 + 9 * r()]);
|
|
26
|
+
return [...body, ...dense];
|
|
27
|
+
}
|
|
28
|
+
/** Pass x through the body (in place): each mode adds a resonant band-pass, so a mode of gain G dB lifts its frequency by G dB */
|
|
29
|
+
function throughBody(sr, modes, x) {
|
|
30
|
+
const bank = modes.map(([hz, gain, q]) => [new Biquad(sr, 'bp', hz, q), Math.pow(10, gain / 20) - 1]);
|
|
31
|
+
for (let i = 0; i < x.length; i++) {
|
|
32
|
+
const v = x[i];
|
|
33
|
+
let s = v;
|
|
34
|
+
for (const [bp, k] of bank)
|
|
35
|
+
s += k * bp.run(v);
|
|
36
|
+
x[i] = s;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Per round trip, the one-pole loop filter g·(1−p)/(1−p·z⁻¹) passes this much at ω relative to its gain g */
|
|
40
|
+
const onePole = (p, w) => (1 - p) / Math.sqrt(1 - 2 * p * Math.cos(w) + p * p);
|
|
41
|
+
/**
|
|
42
|
+
* One string, heard through the body; returns the output and the bridge force it starts from (its level the instant before the string is let go).
|
|
43
|
+
* Body and string are both linear, so the body can come first (commuted synthesis): it filters the pluck, a fraction of a second long, rather than the whole note.
|
|
44
|
+
*/
|
|
45
|
+
function ksString(sr, f, o, body, ring) {
|
|
46
|
+
const n = Math.floor(o.len * sr);
|
|
47
|
+
const y = new Float32Array(n);
|
|
48
|
+
const P = sr / f;
|
|
49
|
+
const w0 = (2 * Math.PI * f) / sr;
|
|
50
|
+
// Decay per second of a partial at x Hz, σ = b1 + b3·ω²: b1 is set so the fundamental keeps the T60 asked for, unless the string's own
|
|
51
|
+
// loss at that frequency is already faster (the top of the harp)
|
|
52
|
+
const b1 = Math.max(0.1, 6.91 / o.t60 - o.loss * Math.pow(2 * Math.PI * f, 2));
|
|
53
|
+
const sigma = (x) => b1 + o.loss * Math.pow(2 * Math.PI * x, 2);
|
|
54
|
+
// The loop filter g·(1−p)/(1−p·z⁻¹) loses σ(x)/f per round trip: matched at the fundamental and at a frequency high in the spectrum
|
|
55
|
+
const fr = Math.min(0.4 * sr, Math.max(4000, 3 * f));
|
|
56
|
+
const wr = (2 * Math.PI * fr) / sr;
|
|
57
|
+
const G0 = Math.exp(-sigma(f) / f);
|
|
58
|
+
const want = Math.exp(-(sigma(fr) - sigma(f)) / f);
|
|
59
|
+
let lo = 0;
|
|
60
|
+
let hi = 0.995;
|
|
61
|
+
for (let i = 0; i < 40; i++) {
|
|
62
|
+
const p = (lo + hi) / 2;
|
|
63
|
+
if (onePole(p, wr) / onePole(p, w0) > want)
|
|
64
|
+
lo = p;
|
|
65
|
+
else
|
|
66
|
+
hi = p;
|
|
67
|
+
}
|
|
68
|
+
// It must not gain at 0 Hz, where it loses b1 (on the highest strings this caps how fast the highs can die)
|
|
69
|
+
const gMax = Math.exp(-b1 / f);
|
|
70
|
+
if (G0 / onePole(hi, w0) > gMax) {
|
|
71
|
+
lo = 0;
|
|
72
|
+
for (let i = 0; i < 40; i++) {
|
|
73
|
+
const p = (lo + hi) / 2;
|
|
74
|
+
if (G0 / onePole(p, w0) > gMax)
|
|
75
|
+
hi = p;
|
|
76
|
+
else
|
|
77
|
+
lo = p;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const p = lo;
|
|
81
|
+
const g = G0 / onePole(p, w0);
|
|
82
|
+
// Tuning: the loop filter's phase delay at the fundamental comes off the delay line, and an allpass supplies the remaining fraction of a sample
|
|
83
|
+
const tau = Math.atan2(p * Math.sin(w0), 1 - p * Math.cos(w0)) / w0;
|
|
84
|
+
const L = Math.max(2, Math.floor(P - tau - 0.2));
|
|
85
|
+
const frac = P - tau - L;
|
|
86
|
+
const C = (1 - frac) / (1 + frac);
|
|
87
|
+
// The pluck: one period of the bridge force, summed from its harmonics (a rectangular wave of duty pos, centred on the start, rounded by the release)
|
|
88
|
+
const fc = 2000 * Math.pow(8, o.bright);
|
|
89
|
+
const exc = new Float32Array(L + 1 + ring);
|
|
90
|
+
for (let h = 1; h * f < sr * 0.45; h++) {
|
|
91
|
+
const a = (2 * Math.sin(Math.PI * h * o.pos)) / (Math.PI * h) / Math.sqrt(1 + Math.pow((h * f) / fc, 2));
|
|
92
|
+
const dw = (2 * Math.PI * h) / P;
|
|
93
|
+
for (let i = 0; i <= L; i++)
|
|
94
|
+
exc[i] += a * Math.cos(dw * i);
|
|
95
|
+
}
|
|
96
|
+
const held = exc[0];
|
|
97
|
+
throughBody(sr, body, exc);
|
|
98
|
+
let lpv = 0;
|
|
99
|
+
let apIn = 0;
|
|
100
|
+
let apOut = 0;
|
|
101
|
+
for (let i = 0; i < n; i++) {
|
|
102
|
+
const d = i >= L ? y[i - L] : 0;
|
|
103
|
+
lpv = (1 - p) * d + p * lpv;
|
|
104
|
+
const ap = C * lpv + apIn - C * apOut;
|
|
105
|
+
apIn = lpv;
|
|
106
|
+
apOut = ap;
|
|
107
|
+
y[i] = (i < exc.length ? exc[i] : 0) + g * ap;
|
|
108
|
+
}
|
|
109
|
+
return [y, held];
|
|
110
|
+
}
|
|
111
|
+
/** A plucked string (or a course of two) through its instrument's body */
|
|
112
|
+
export function ks(sr, f, o) {
|
|
113
|
+
const body = o.body ? bodyModes(o.body) : [];
|
|
114
|
+
const ring = Math.ceil(sr * Math.max(0, ...body.map(([hz, , q]) => (2.6 * q) / hz)));
|
|
115
|
+
const [y, held1] = ksString(sr, f, o, body, ring);
|
|
116
|
+
let held = held1;
|
|
117
|
+
if (o.detune) {
|
|
118
|
+
const [y2, held2] = ksString(sr, f * Math.pow(2, o.detune / 1200), o, body, ring);
|
|
119
|
+
for (let i = 0; i < y.length; i++)
|
|
120
|
+
y[i] = 0.55 * (y[i] + y2[i]);
|
|
121
|
+
held = 0.55 * (held1 + held2);
|
|
122
|
+
}
|
|
123
|
+
// Before the release the finger holds the string with a steady force on the bridge, which makes no sound. Measured from there the sound
|
|
124
|
+
// starts from silence (no click), and letting go is a sudden push on the body; the body radiates poorly below its air mode, so the push
|
|
125
|
+
// fades within a couple of milliseconds, knocking the body modes on its way
|
|
126
|
+
const knock = new Float32Array(Math.min(y.length, Math.floor(sr * 0.02) + ring));
|
|
127
|
+
const kd = Math.exp((-2 * Math.PI * 90) / sr);
|
|
128
|
+
for (let i = 0; i < knock.length; i++, held *= kd)
|
|
129
|
+
knock[i] = -held;
|
|
130
|
+
throughBody(sr, body, knock);
|
|
131
|
+
for (let i = 0; i < knock.length; i++)
|
|
132
|
+
y[i] += knock[i];
|
|
133
|
+
// Remove DC and soften the highest frequencies
|
|
134
|
+
const hp = new Biquad(sr, 'hp', 40);
|
|
135
|
+
const lpf = new Biquad(sr, 'lp', 12000);
|
|
136
|
+
for (let i = 0; i < y.length; i++)
|
|
137
|
+
y[i] = lpf.run(hp.run(y[i]));
|
|
138
|
+
// Loudness is set by the energy of the first half second rather than the peak (which the sharp edge of the pluck decides), falling by tilt dB per octave
|
|
139
|
+
const w = Math.min(y.length, Math.floor(sr * 0.5));
|
|
140
|
+
let e = 0;
|
|
141
|
+
for (let i = 0; i < w; i++)
|
|
142
|
+
e += y[i] * y[i];
|
|
143
|
+
const k = (0.2 * Math.pow(10, ((o.tilt ?? 0) * Math.log2(f / 261.63)) / 20)) / (Math.sqrt(e / w) || 1);
|
|
144
|
+
for (let i = 0; i < y.length; i++)
|
|
145
|
+
y[i] *= k;
|
|
146
|
+
return tailFade(y, sr);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Additive-synthesis plucked string: each harmonic decays on its own (the higher, the faster), slightly inharmonic, plus body resonance and the finger's dull thump.
|
|
150
|
+
* In the bass range Karplus-Strong decays down to a pure sine (like a synthesizer); this model keeps the woody mid-range.
|
|
151
|
+
*/
|
|
152
|
+
export function pluckAdd(sr, f, o) {
|
|
153
|
+
const n = Math.floor(o.len * sr);
|
|
154
|
+
const y = new Float32Array(n);
|
|
155
|
+
const nyq = Math.min(sr * 0.42, 7000);
|
|
156
|
+
const B = 0.00012;
|
|
157
|
+
const r = rng(Math.round(f * 11));
|
|
158
|
+
for (let h = 1; h <= 40; h++) {
|
|
159
|
+
const fh = h * f * Math.sqrt(1 + B * h * h);
|
|
160
|
+
if (fh > nyq)
|
|
161
|
+
break;
|
|
162
|
+
const amp = (Math.abs(Math.sin(Math.PI * h * o.pos)) + 0.05) / Math.pow(h, o.tilt);
|
|
163
|
+
const t60 = o.t60 / (1 + 0.45 * (h - 1));
|
|
164
|
+
const k = Math.pow(10, -3 / (t60 * sr));
|
|
165
|
+
const w = (2 * Math.PI * fh) / sr;
|
|
166
|
+
let env = amp;
|
|
167
|
+
let ph = r() * 0.2;
|
|
168
|
+
for (let i = 0; i < n && env > 1e-6; i++) {
|
|
169
|
+
ph += w;
|
|
170
|
+
y[i] += Math.sin(ph) * env;
|
|
171
|
+
env *= k;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
for (const hz of o.body) {
|
|
175
|
+
const w = (2 * Math.PI * hz) / sr;
|
|
176
|
+
const k = Math.pow(10, -3 / (0.22 * sr));
|
|
177
|
+
let env = 0.35;
|
|
178
|
+
for (let i = 0; i < n && env > 1e-6; i++) {
|
|
179
|
+
y[i] += Math.sin(w * i) * env;
|
|
180
|
+
env *= k;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const lp = new Biquad(sr, 'lp', 350, 0.7);
|
|
184
|
+
const kt = Math.pow(10, -3 / (0.05 * sr));
|
|
185
|
+
let env = o.thump;
|
|
186
|
+
for (let i = 0; i < n && env > 1e-6; i++) {
|
|
187
|
+
y[i] += lp.run(r()) * env * 3;
|
|
188
|
+
env *= kt;
|
|
189
|
+
}
|
|
190
|
+
const att = Math.floor(sr * 0.003);
|
|
191
|
+
for (let i = 0; i < att && i < n; i++)
|
|
192
|
+
y[i] *= i / att;
|
|
193
|
+
return tailFade(normalize(y), sr);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=pluck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluck.js","sourceRoot":"","sources":["../../../src/instruments/dsp/pluck.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** The acoustic space a song plays in */
|
|
2
|
+
export interface Room {
|
|
3
|
+
/** Reverb time (seconds, decay by 60 dB) */
|
|
4
|
+
size: number;
|
|
5
|
+
/** 0 bright to 1 dark (how fast the highs decay; default 0.45) */
|
|
6
|
+
damp?: number;
|
|
7
|
+
/** Pre-delay (seconds; default 0.012) */
|
|
8
|
+
preDelay?: number;
|
|
9
|
+
/** Early reflection amount 0-1 (default 0.3) */
|
|
10
|
+
early?: number;
|
|
11
|
+
/** Attack time (seconds); above 0 it is a reverb that "grows in" (a reversed, ghostly feel) */
|
|
12
|
+
bloom?: number;
|
|
13
|
+
}
|
|
14
|
+
/** Generate a stereo impulse response: decaying noise, with the highs eaten away over time */
|
|
15
|
+
export declare function impulse(sr: number, o: Room): [Float32Array, Float32Array];
|
|
16
|
+
//# sourceMappingURL=reverb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverb.d.ts","sourceRoot":"","sources":["../../../src/instruments/dsp/reverb.ts"],"names":[],"mappings":"AAIA,yCAAyC;AACzC,MAAM,WAAW,IAAI;IACnB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8FAA8F;AAC9F,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAoCzE"}
|