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,502 @@
|
|
|
1
|
+
// Offline synthesis of bowed string instruments: the whole of "a group of players bowing one note" is computed in advance, so playback only plays a sample and uses almost no CPU at runtime.
|
|
2
|
+
//
|
|
3
|
+
// Comparing against the spectra of real string recordings, there are three reasons the synthesized strings sound like brass:
|
|
4
|
+
// 1. Too clean: the overtones of real strings are smeared bands, with the scraping noise of the bow hair filling the space between partials; the synthesized ones are thin lines with pure black in between.
|
|
5
|
+
// 2. The ensemble is too fake: every player has different intonation, vibrato speed and bowing position, so the high partials spread out; two oscillators vibrating in sync are just a chorus.
|
|
6
|
+
// 3. The body is not messy enough: a wooden body has dozens of narrow, irregular resonances, and as the vibrato sweeps the partials across them their strength keeps flickering.
|
|
7
|
+
// So here every player is computed separately: a fixed intonation offset, slowly drifting intonation, their own vibrato, their own bowing point (the comb notches fall at different positions),
|
|
8
|
+
// and bow noise that appears in sync with each slip of the bow on the string; all of that is summed and then passed through a body of a hundred-odd modes.
|
|
9
|
+
// Measured against the University of Iowa violin, cello and double bass recordings (sustained notes on every string), three things were still off:
|
|
10
|
+
// - the body's actual response did not follow its envelope: below the air resonance and above the bridge hill the modes' skirts piled up, so the
|
|
11
|
+
// open G of a violin had a fundamental as strong as its second partial (real: ~20 dB weaker) and the double bass was 10-20 dB too bright; and
|
|
12
|
+
// above 1 kHz the modes were too few and too broad for the vibrato to make the partials flicker (2-3 dB, real violins 5-15 dB) (bodyModes);
|
|
13
|
+
// - a corner fixed in hertz left the low strings as bright as the high ones (bowTable);
|
|
14
|
+
// - between the partials the noise floor was 6-14 dB cleaner than the recordings (bow noise raised, and rounded off with the tone).
|
|
15
|
+
// Measured again on the cello's A string (A3 up), where the solo cello sounded like a synthesizer: one bowing for every string left it dull
|
|
16
|
+
// and hissy there; the top string now has its own bowing point, corner and noise (TopString, CELLO_A).
|
|
17
|
+
//
|
|
18
|
+
// The sample has two parts: the attack (the bow grips the string, the vibrato comes in and grows) and a sustain section that can loop seamlessly.
|
|
19
|
+
// All the modulation in the sustain section (vibrato, intonation drift, bow-pressure swell, bow noise) has the loop length as its period,
|
|
20
|
+
// and each player's frequency is also fine-tuned so that it covers a whole number of periods within the loop length, so there is no seam at the loop point.
|
|
21
|
+
//
|
|
22
|
+
// Pitch-tracked on held notes, the vibrato was there but easy to miss: it began 0.3 s into a note and reached full depth only at 0.5 s, so eighth
|
|
23
|
+
// notes had none and quarter notes were half straight; it was a little narrow (violin ±20 cents, cello ±15, each double bass ±8) and every cycle
|
|
24
|
+
// was the same; and rounding its speed to whole cycles in a 1.5 s loop put a violin at 5.3 or 6.0 Hz depending on the note, and a section's seven
|
|
25
|
+
// players on just two speeds. Now it starts 0.1 s after the bow (audible from about 0.2 s), is most of the way in two cycles later and keeps
|
|
26
|
+
// deepening a little until 0.8 s, so a held note blooms; a solo's loop is cut to fit its vibrato and a section's is long enough for its players
|
|
27
|
+
// to spread over three speeds; and speed and depth wander a little from cycle to cycle, as a hand's do.
|
|
28
|
+
import { rng } from './dsp/core.js';
|
|
29
|
+
/** Attack section length (seconds): the attack and the vibrato's growth must both finish before it ends, and the body's resonances must have settled */
|
|
30
|
+
const PRE = 0.8;
|
|
31
|
+
/** The vibrato grows in over this long after it begins (about two cycles), to 85% of its depth; the rest it gains slowly up to the end of the attack section, so a held note blooms */
|
|
32
|
+
const VIB_GROW = 0.3;
|
|
33
|
+
const TABLE = 2048;
|
|
34
|
+
/** Samples after the loop's end that repeat its start */
|
|
35
|
+
const GUARD = 64;
|
|
36
|
+
/** Modulation (frequency, volume) is computed once every few samples, with linear interpolation in between */
|
|
37
|
+
const CR = 16;
|
|
38
|
+
/** Polyline envelope (linear interpolation on a log frequency axis), returns dB */
|
|
39
|
+
function envAt(env, f) {
|
|
40
|
+
if (f <= env[0][0])
|
|
41
|
+
return env[0][1];
|
|
42
|
+
for (let i = 1; i < env.length; i++) {
|
|
43
|
+
if (f <= env[i][0]) {
|
|
44
|
+
const [f0, d0] = env[i - 1];
|
|
45
|
+
const [f1, d1] = env[i];
|
|
46
|
+
return d0 + ((d1 - d0) * Math.log(f / f0)) / Math.log(f1 / f0);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return env[env.length - 1][1];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* One period of the bowed string: a sawtooth with the partials at integer multiples of the bowing point cut out, then rounded off; partials are only added up to maxF.
|
|
53
|
+
* The rounding of the Helmholtz corner (Cremer): every period the string's internal losses (a roughly constant loss factor in the gut or
|
|
54
|
+
* synthetic core and the windings, so partial k loses in proportion to k per period) smooth the corner, and every pass under the bow sharpens it again,
|
|
55
|
+
* the more so the harder the bow presses. In balance partial k is cut by 1 / (1 + (k / kc)²): the cut sits at a partial number, not a frequency,
|
|
56
|
+
* so low notes are darker at the same frequency: in the recordings a note on the lowest string has 7 dB (violin) and 16 dB (cello) less of its
|
|
57
|
+
* energy at 4-8 kHz than one on the highest; a corner fixed in hertz gave 2 and 5 dB.
|
|
58
|
+
*/
|
|
59
|
+
function bowTable(f, beta, kc, maxF) {
|
|
60
|
+
const t = new Float32Array(TABLE);
|
|
61
|
+
const K = Math.max(1, Math.min(400, Math.floor(maxF / f)));
|
|
62
|
+
for (let k = 1; k <= K; k++) {
|
|
63
|
+
const a = (0.1 + Math.abs(Math.sin(Math.PI * k * beta))) / k / (1 + (k / kc) ** 2);
|
|
64
|
+
// Compute sin(2πkn/N) with a rotation recurrence, much faster than calling Math.sin at every point
|
|
65
|
+
const th = (2 * Math.PI * k) / TABLE;
|
|
66
|
+
const c = Math.cos(th);
|
|
67
|
+
const s = Math.sin(th);
|
|
68
|
+
let x = 0;
|
|
69
|
+
let y = 1;
|
|
70
|
+
for (let n = 0; n < TABLE; n++) {
|
|
71
|
+
t[n] += a * x;
|
|
72
|
+
const nx = x * c + y * s;
|
|
73
|
+
y = y * c - x * s;
|
|
74
|
+
x = nx;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
let mx = 0;
|
|
78
|
+
for (let n = 0; n < TABLE; n++)
|
|
79
|
+
mx = Math.max(mx, Math.abs(t[n]));
|
|
80
|
+
for (let n = 0; n < TABLE; n++)
|
|
81
|
+
t[n] /= mx;
|
|
82
|
+
return t;
|
|
83
|
+
}
|
|
84
|
+
/** Modes per octave stop growing here: neighbouring modes already overlap */
|
|
85
|
+
const MAX_DENSITY = 30;
|
|
86
|
+
/**
|
|
87
|
+
* Scatter modes according to the envelope (band-pass); each seed is a different instrument.
|
|
88
|
+
* - A plate has roughly a constant number of modes per hertz, so per octave the count grows with frequency: a few isolated modes in the
|
|
89
|
+
* low register (A0, B1-, B1+), a thicket above 1-2 kHz. There a ±20-cent vibrato sweeps each partial across peaks and dips and its level
|
|
90
|
+
* flickers by 5-10 dB, as measured on real violins; with a sparse, broad body the partials sound static.
|
|
91
|
+
* - Each mode reaches the listener with its own sign (radiation is a transfer function, not the bridge's driving-point admittance), so far
|
|
92
|
+
* from their peaks the skirts cancel instead of piling up: the response falls away below the lowest mode, where the air in the f-holes and
|
|
93
|
+
* the plates' volume change are in antiphase (an open G on a violin, 196 Hz below A0, radiates its fundamental ~20 dB under the second
|
|
94
|
+
* partial), and above the bridge hill.
|
|
95
|
+
* - A mode's peak is scaled so its power, spread over the gap to the next mode, matches the envelope: the envelope is the average response.
|
|
96
|
+
*/
|
|
97
|
+
function bodyModes(sr, b) {
|
|
98
|
+
const r = rng(b.seed);
|
|
99
|
+
const out = [];
|
|
100
|
+
const l0 = Math.log2(b.lo);
|
|
101
|
+
const oct = Math.log2(b.hi) - l0;
|
|
102
|
+
const top = Math.log2(Math.min(b.hi, sr * 0.45));
|
|
103
|
+
for (let x = l0;;) {
|
|
104
|
+
const n = Math.min(MAX_DENSITY, b.density * Math.pow(2, (x - l0) * 0.6));
|
|
105
|
+
x += (1 + 0.8 * r()) / n;
|
|
106
|
+
if (x >= top)
|
|
107
|
+
break;
|
|
108
|
+
const f = Math.pow(2, x);
|
|
109
|
+
const q = b.q[0] + ((b.q[1] - b.q[0]) * (x - l0)) / oct;
|
|
110
|
+
const db = envAt(b.env, f) + r() * b.rand;
|
|
111
|
+
const g = (r() < 0 ? -1 : 1) * Math.pow(10, db / 20) * Math.sqrt((2 * q * Math.LN2) / (Math.PI * n));
|
|
112
|
+
const w = (2 * Math.PI * f) / sr;
|
|
113
|
+
const al = Math.sin(w) / (2 * q);
|
|
114
|
+
const a0 = 1 + al;
|
|
115
|
+
out.push({ b: (g * al) / a0, a1: (-2 * Math.cos(w)) / a0, a2: (1 - al) / a0 });
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
119
|
+
/** Smooth 0 -> 1 */
|
|
120
|
+
const smooth = (x) => (x <= 0 ? 0 : x >= 1 ? 1 : x * x * (3 - 2 * x));
|
|
121
|
+
/** The first desk plays the samples as they always were; a fourth track on an instrument sits at the first desk again, and so on round */
|
|
122
|
+
export const DESKS = [
|
|
123
|
+
{ cents: 0, rate: 1, depth: 1, phase: 0, attack: 1, lag: 0 },
|
|
124
|
+
{ cents: 3, rate: 0.94, depth: 1.1, phase: 0.35, attack: 1.2, lag: 0.008 },
|
|
125
|
+
{ cents: -3, rate: 1.06, depth: 0.9, phase: 0.65, attack: 0.85, lag: 0.012 },
|
|
126
|
+
];
|
|
127
|
+
/**
|
|
128
|
+
* Draw one player in the order the samples have always drawn them, so the first desk renders exactly as before.
|
|
129
|
+
* `rate` is the vibrato speed the player varies around (a solo's is already this note's).
|
|
130
|
+
*/
|
|
131
|
+
function drawPlayer(r, d, solo, rate, loud, LS, sr) {
|
|
132
|
+
const L = LS / sr;
|
|
133
|
+
const beta = d.beta[0] + (d.beta[1] - d.beta[0]) * (solo ? 0.5 : (r() + 1) / 2);
|
|
134
|
+
// Vibrato: every player has a different speed, depth, phase and onset; the speed is a whole number of cycles within the loop length
|
|
135
|
+
const vr = Math.max(1, Math.round((solo ? rate : rate * (1 + r() * 0.09)) * L)) / L;
|
|
136
|
+
const vd = d.vibDepth * (loud ? 1 : 0.9) * (solo ? 1 + r() * 0.08 : 0.9 + r() * 0.3);
|
|
137
|
+
const vph = (r() + 1) * Math.PI;
|
|
138
|
+
const von = d.vibDelay * (solo ? 1 : 0.7 + 0.6 * Math.abs(r()));
|
|
139
|
+
// No two cycles alike: the speed wanders by a few percent and the depth by about a tenth, along four slow sinusoids whose period is the loop length.
|
|
140
|
+
// Each is [Hz, phase swing, depth swing, the two phases]; a phase swing of a·sin(2π·hz·t) moves the speed by up to a·hz / vr of itself (here 5%)
|
|
141
|
+
const wob = [1, 2, 3, 4].map((k) => [k / L, (0.05 * r() * vr) / (k / L), 0.12 * r(), (r() + 1) * Math.PI, (r() + 1) * Math.PI]);
|
|
142
|
+
// Intonation drift: three slow sinusoids whose period is the loop length
|
|
143
|
+
const dr = [1, 2, 3].map((k) => [k / L, d.drift * r() * 0.6, (r() + 1) * Math.PI]);
|
|
144
|
+
// Bow-pressure swell: a very slow volume change (±5%)
|
|
145
|
+
const bw = [(1 + Math.round((r() + 1) * 1.5)) / L, (r() + 1) * Math.PI];
|
|
146
|
+
const det = solo ? 0 : d.spread * r() * 1.2;
|
|
147
|
+
const on = solo ? 0 : ((r() + 1) / 2) * d.onset;
|
|
148
|
+
const scoop = d.scoop * (0.6 + 0.4 * Math.abs(r()));
|
|
149
|
+
const nOff = Math.floor(((r() + 1) / 2) * LS);
|
|
150
|
+
const nAmt = d.noise * (loud ? 1.35 : 1) * (solo ? 1 : 0.8 + 0.4 * Math.abs(r()));
|
|
151
|
+
const ph = (r() + 1) / 2;
|
|
152
|
+
return { beta, vr, vd, vph, von, wob, dr, bw, det, on, scoop, nOff, nAmt, ph };
|
|
153
|
+
}
|
|
154
|
+
/** A player's pitch (cents from the note) at time t, with the vibrato grown in to v (0-1) */
|
|
155
|
+
function centsOf(p) {
|
|
156
|
+
const { vr, vd, vph, wob, dr } = p;
|
|
157
|
+
return (t, v) => {
|
|
158
|
+
let ph = 2 * Math.PI * vr * t + vph;
|
|
159
|
+
let g = 1;
|
|
160
|
+
for (const [hz, a, b, p1, p2] of wob) {
|
|
161
|
+
ph += a * Math.sin(2 * Math.PI * hz * t + p1);
|
|
162
|
+
g += b * Math.sin(2 * Math.PI * hz * t + p2);
|
|
163
|
+
}
|
|
164
|
+
let c = vd * v * g * (Math.sin(ph) + 0.12 * Math.sin(2 * ph));
|
|
165
|
+
for (const [hz, a, p2] of dr)
|
|
166
|
+
c += a * Math.sin(2 * Math.PI * hz * t + p2);
|
|
167
|
+
return c;
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/** The mean frequency ratio over the sustain section (the vibrato and drift, at full depth) */
|
|
171
|
+
function meanRatio(cents, L) {
|
|
172
|
+
let m = 0;
|
|
173
|
+
const S = 2048;
|
|
174
|
+
for (let i = 0; i < S; i++)
|
|
175
|
+
m += Math.pow(2, cents(PRE + (i / S) * L, 1) / 1200);
|
|
176
|
+
return m / S;
|
|
177
|
+
}
|
|
178
|
+
/** Samples in a loop of this many seconds: the attack section and the loop section are both integer multiples of CR, so the modulation's sample grid lines up at the loop's head and tail */
|
|
179
|
+
const loopSamples = (sr, seconds) => Math.round((seconds * sr) / CR) * CR;
|
|
180
|
+
/** A solo's vibrato speed for this note (a lighter bow goes with a slightly slower and narrower vibrato, and it varies a little from note to note); the first draw of its seed */
|
|
181
|
+
const soloRate = (r, d, loud) => d.vibRate * (loud ? 1 : 0.96) * (1 + 0.04 * r());
|
|
182
|
+
/** A solo's loop: a whole number of its vibrato cycles */
|
|
183
|
+
const soloLoop = (sr, d, rate, cycles = Math.round(rate * d.loop)) => loopSamples(sr, Math.max(1, cycles) / rate);
|
|
184
|
+
/** The first desk's solo for a note, replayed without rendering: the mean frequency of its sustain (Hz) and its vibrato phase */
|
|
185
|
+
function firstDesk(sr, f, d, loud, seed) {
|
|
186
|
+
const r = rng(seed * 7919 + Math.round(f * 13));
|
|
187
|
+
const rate = soloRate(r, d, loud);
|
|
188
|
+
const LS = soloLoop(sr, d, rate);
|
|
189
|
+
// The bow noise takes the next LS draws
|
|
190
|
+
for (let i = 0; i < LS; i++)
|
|
191
|
+
r();
|
|
192
|
+
const p = drawPlayer(r, d, true, rate, loud, LS, sr);
|
|
193
|
+
const L = LS / sr;
|
|
194
|
+
// Its frequency is fitted to a whole number of periods in the loop (see below), so its mean is that number over the loop length
|
|
195
|
+
return { mean: Math.round(f * meanRatio(centsOf(p), L) * L) / L, vph: p.vph, rate };
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* A note from the top string's open pitch up is played on it (a quarter tone of slack, so its open note's sample counts): its bowing. A
|
|
199
|
+
* section's players keep their spread of bowing points around the top string's
|
|
200
|
+
*/
|
|
201
|
+
function topString(d, f) {
|
|
202
|
+
const s = d.top;
|
|
203
|
+
if (!s || f < s.open * 0.97)
|
|
204
|
+
return d;
|
|
205
|
+
const mid = (d.beta[0] + d.beta[1]) / 2;
|
|
206
|
+
const beta = (b) => s.beta * (b / mid) * (f / s.open);
|
|
207
|
+
return { ...d, beta: [beta(d.beta[0]), beta(d.beta[1])], corner: [d.corner[0] * s.corner, d.corner[1] * s.corner], noise: d.noise * s.noise };
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Compute one bowed-string sample. f is the pitch (Hz), loud decides bow pressure (brightness, bow noise, attack), and seed makes the players different for every note.
|
|
211
|
+
* desk picks the players (see DESKS): 0 is the first desk.
|
|
212
|
+
* The returned sample can loop seamlessly across the loop interval.
|
|
213
|
+
*/
|
|
214
|
+
export function bowSample(sr, f, d, loud, seed, desk = 0) {
|
|
215
|
+
d = topString(d, f);
|
|
216
|
+
const dk = DESKS[desk % DESKS.length];
|
|
217
|
+
let r = rng(seed * 7919 + Math.round(f * 13));
|
|
218
|
+
const P = d.players;
|
|
219
|
+
const solo = P === 1;
|
|
220
|
+
// Vibrato speed: a solo varies a little from note to note and its loop is cut to a whole number of its cycles; in a section each player has
|
|
221
|
+
// their own speed, rounded to whole cycles in the loop
|
|
222
|
+
const rate = soloRate(r, d, loud);
|
|
223
|
+
/** The players' draws: the first desk takes them from the same stream as everything else, another desk from its own */
|
|
224
|
+
let rp = r;
|
|
225
|
+
let LS = solo ? soloLoop(sr, d, rate) : loopSamples(sr, d.loop);
|
|
226
|
+
/** A section desk after the first: how far its players lean from the first desk's (cents) */
|
|
227
|
+
let deskCents = 0;
|
|
228
|
+
/** A solo desk after the first: its vibrato phase and the mean frequency of its sustain (Hz) */
|
|
229
|
+
let deskSolo;
|
|
230
|
+
if (dk !== DESKS[0]) {
|
|
231
|
+
const ds = seed * 7919 + Math.round(f * 13) + desk * 104729;
|
|
232
|
+
r = rng(ds);
|
|
233
|
+
rp = rng(ds + 1);
|
|
234
|
+
const cents = dk.cents + 2 * r();
|
|
235
|
+
if (!solo)
|
|
236
|
+
deskCents = cents;
|
|
237
|
+
else {
|
|
238
|
+
// Its own vibrato, starting away from the first desk's. The loop holds whole vibrato cycles and whole periods of the string, and a
|
|
239
|
+
// period is long for a low note (an A3 in a 2 s loop moves 4 cents a period, a cello's C2 13): of loops a few cycles shorter or
|
|
240
|
+
// longer, take the one whose whole number of periods lands closest to the intended pitch
|
|
241
|
+
const first = firstDesk(sr, f, d, loud, seed);
|
|
242
|
+
const own = first.rate * dk.rate;
|
|
243
|
+
const goal = first.mean * Math.pow(2, cents / 1200);
|
|
244
|
+
let best = Infinity;
|
|
245
|
+
const base = Math.round(own * d.loop);
|
|
246
|
+
for (let c = Math.max(1, base - 3); c <= base + 3; c++) {
|
|
247
|
+
const ls = soloLoop(sr, d, own, c);
|
|
248
|
+
const L = ls / sr;
|
|
249
|
+
const miss = Math.abs(Math.round(goal * L) / L / goal - 1) + Math.abs(c - base) * 1e-5;
|
|
250
|
+
if (miss < best) {
|
|
251
|
+
best = miss;
|
|
252
|
+
LS = ls;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
deskSolo = { vph: first.vph + 2 * Math.PI * dk.phase, mean: Math.round(goal * (LS / sr)) / (LS / sr) };
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const L = LS / sr;
|
|
259
|
+
const A = Math.round((PRE * sr) / CR) * CR;
|
|
260
|
+
const N = A + LS;
|
|
261
|
+
const sum = new Float32Array(N);
|
|
262
|
+
const corner = loud ? d.corner[1] : d.corner[0];
|
|
263
|
+
const atk = (loud ? d.attack[1] : d.attack[0]) * dk.attack;
|
|
264
|
+
const maxF = sr * 0.4;
|
|
265
|
+
// All players share one stretch of bow noise whose period is the loop length (each reads from a different position): high-pass then low-pass, running two passes so the filter state joins up head to tail.
|
|
266
|
+
// The noise rides on the slip, so the string rounds it off like the tone: two low-pass poles at the corner (kc partials, 2-6 kHz).
|
|
267
|
+
// Left flat to 6 kHz, the hiss was all a low cello note had above 4 kHz (12 dB more than a real C string); some hiss comes from the hair itself, so not below 2 kHz.
|
|
268
|
+
const nz = new Float32Array(LS);
|
|
269
|
+
{
|
|
270
|
+
const raw = new Float32Array(LS);
|
|
271
|
+
for (let i = 0; i < LS; i++)
|
|
272
|
+
raw[i] = r();
|
|
273
|
+
let lp = 0;
|
|
274
|
+
let lp2 = 0;
|
|
275
|
+
let hp = 0;
|
|
276
|
+
const al = 1 - Math.exp((-2 * Math.PI * Math.min(6000, Math.max(2000, corner * f))) / sr);
|
|
277
|
+
const ah = 1 - Math.exp((-2 * Math.PI * 700) / sr);
|
|
278
|
+
for (let pass = 0; pass < 2; pass++) {
|
|
279
|
+
for (let i = 0; i < LS; i++) {
|
|
280
|
+
lp += al * (raw[i] - lp);
|
|
281
|
+
lp2 += al * (lp - lp2);
|
|
282
|
+
hp += ah * (lp2 - hp);
|
|
283
|
+
if (pass)
|
|
284
|
+
nz[i] = lp2 - hp;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
const tables = new Map();
|
|
289
|
+
const T = (beta) => {
|
|
290
|
+
const k = Math.round(beta * 200);
|
|
291
|
+
let t = tables.get(k);
|
|
292
|
+
if (!t)
|
|
293
|
+
tables.set(k, (t = bowTable(f, k / 200, corner, maxF)));
|
|
294
|
+
return t;
|
|
295
|
+
};
|
|
296
|
+
/** The speed each player's vibrato varies around: a solo's is this note's */
|
|
297
|
+
const vibRate = (solo ? rate : d.vibRate * (loud ? 1 : 0.96)) * dk.rate;
|
|
298
|
+
for (let p = 0; p < P; p++) {
|
|
299
|
+
const pl = drawPlayer(rp, d, solo, vibRate, loud, LS, sr);
|
|
300
|
+
if (deskSolo)
|
|
301
|
+
pl.vph = deskSolo.vph;
|
|
302
|
+
pl.vd *= dk.depth;
|
|
303
|
+
const { beta, von, bw, on, scoop, nOff, nAmt } = pl;
|
|
304
|
+
const tab = T(beta);
|
|
305
|
+
const cents = centsOf(pl);
|
|
306
|
+
// Frequency fine-tuning: the sustain section's mean frequency times the loop length must come out to exactly a whole number of periods
|
|
307
|
+
// (a solo desk after the first has picked its loop for that: its mean frequency is already a whole number of periods)
|
|
308
|
+
const m = meanRatio(cents, L);
|
|
309
|
+
const target = f * Math.pow(2, (pl.det + deskCents) / 1200);
|
|
310
|
+
const F = deskSolo ? deskSolo.mean / m : Math.max(1, Math.round(target * m * L)) / (m * L);
|
|
311
|
+
const slip = beta;
|
|
312
|
+
const amp = solo ? 1 : 1 / Math.sqrt(P);
|
|
313
|
+
// Control rate: once every CR samples compute the frequency (the phase increment per sample) and the volume
|
|
314
|
+
const nc = N / CR + 2;
|
|
315
|
+
const inc = new Float64Array(nc);
|
|
316
|
+
const env = new Float64Array(nc);
|
|
317
|
+
for (let c = 0; c < nc; c++) {
|
|
318
|
+
const t = (c * CR) / sr;
|
|
319
|
+
const ta = t - on;
|
|
320
|
+
if (ta < 0)
|
|
321
|
+
continue;
|
|
322
|
+
const v = 0.75 * smooth((t - von) / VIB_GROW) + 0.25 * smooth((t - von) / (PRE - von));
|
|
323
|
+
const sc = -scoop * Math.exp(-ta / 0.045);
|
|
324
|
+
inc[c] = (F * Math.pow(2, (cents(t, v) + sc) / 1200)) / sr;
|
|
325
|
+
// Attack: the bow grips the string (a hard bow overshoots a little and then comes back); after that comes a very slow bow-pressure swell
|
|
326
|
+
let e = smooth(ta / atk);
|
|
327
|
+
if (loud)
|
|
328
|
+
e *= 1 + 0.22 * e * Math.exp(-Math.max(0, ta - atk) / 0.08);
|
|
329
|
+
env[c] = amp * e * (1 + 0.05 * Math.sin(2 * Math.PI * bw[0] * t + bw[1]));
|
|
330
|
+
}
|
|
331
|
+
let ph = pl.ph;
|
|
332
|
+
const i0 = Math.floor((on * sr) / CR) * CR;
|
|
333
|
+
for (let i = i0; i < N; i++) {
|
|
334
|
+
const c = (i / CR) | 0;
|
|
335
|
+
const u = (i - c * CR) / CR;
|
|
336
|
+
ph += inc[c] + (inc[c + 1] - inc[c]) * u;
|
|
337
|
+
if (ph >= 1)
|
|
338
|
+
ph -= 1;
|
|
339
|
+
const x = ph * TABLE;
|
|
340
|
+
const j = x | 0;
|
|
341
|
+
const fr = x - j;
|
|
342
|
+
const s0 = tab[j];
|
|
343
|
+
const tone = s0 + (tab[(j + 1) & (TABLE - 1)] - s0) * fr;
|
|
344
|
+
// Bow noise appears along with the slip of the bow on the string (the short stretch at the start of each period)
|
|
345
|
+
const nzv = nz[(i + nOff) % LS] * (ph < slip ? 1 : 0.3) * nAmt;
|
|
346
|
+
sum[i] += (env[c] + (env[c + 1] - env[c]) * u) * (tone + nzv);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// The highs come in a little later on the attack: a one-pole low-pass from dark to fully open (the sustain section passes straight through)
|
|
350
|
+
{
|
|
351
|
+
let y = 0;
|
|
352
|
+
const end = Math.floor((atk * 1.6 + 0.05) * sr);
|
|
353
|
+
for (let i = 0; i < N; i++) {
|
|
354
|
+
if (i >= end) {
|
|
355
|
+
y = sum[i];
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
const u = smooth(i / end);
|
|
359
|
+
const fc = f * 3 + (sr * 0.45 - f * 3) * u * u;
|
|
360
|
+
const a = 1 - Math.exp((-2 * Math.PI * fc) / sr);
|
|
361
|
+
y += a * (sum[i] - y);
|
|
362
|
+
sum[i] = y;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// The attack's scrape (non-periodic, finishing within the attack section)
|
|
366
|
+
if (d.scrape > 0) {
|
|
367
|
+
const sc = d.scrape * (loud ? 1.4 : 0.7);
|
|
368
|
+
let lp = 0;
|
|
369
|
+
let hp = 0;
|
|
370
|
+
const al = 1 - Math.exp((-2 * Math.PI * 5000) / sr);
|
|
371
|
+
const ah = 1 - Math.exp((-2 * Math.PI * 900) / sr);
|
|
372
|
+
const len = Math.min(A - 1, Math.floor((atk + 0.12) * sr));
|
|
373
|
+
for (let i = 0; i < len; i++) {
|
|
374
|
+
const t = i / sr;
|
|
375
|
+
lp += al * (r() - lp);
|
|
376
|
+
hp += ah * (lp - hp);
|
|
377
|
+
sum[i] += (lp - hp) * sc * smooth(t / 0.006) * Math.exp(-t / (atk * 0.6 + 0.03));
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
// Body: a bank of narrow modes in parallel. They all take the same input difference x[n] - x[n-2], and run two at a time
|
|
381
|
+
const modes = bodyModes(sr, d.body);
|
|
382
|
+
const dx = new Float32Array(N);
|
|
383
|
+
for (let i = 0; i < N; i++)
|
|
384
|
+
dx[i] = sum[i] - (i >= 2 ? sum[i - 2] : 0);
|
|
385
|
+
const out = new Float32Array(N);
|
|
386
|
+
const none = { b: 0, a1: 0, a2: 0 };
|
|
387
|
+
for (let m = 0; m < modes.length; m += 2) {
|
|
388
|
+
const { b: pb, a1: pa1, a2: pa2 } = modes[m];
|
|
389
|
+
const { b: qb, a1: qa1, a2: qa2 } = modes[m + 1] ?? none;
|
|
390
|
+
let p1 = 0;
|
|
391
|
+
let p2 = 0;
|
|
392
|
+
let q1 = 0;
|
|
393
|
+
let q2 = 0;
|
|
394
|
+
for (let i = 0; i < N; i++) {
|
|
395
|
+
const x = dx[i];
|
|
396
|
+
const p = pb * x - pa1 * p1 - pa2 * p2;
|
|
397
|
+
const q = qb * x - qa1 * q1 - qa2 * q2;
|
|
398
|
+
p2 = p1;
|
|
399
|
+
p1 = p;
|
|
400
|
+
q2 = q1;
|
|
401
|
+
q1 = q;
|
|
402
|
+
out[i] += p + q;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
// Loop seam: the lowest body modes ring for a few hundred milliseconds, so at the loop start they still carry a trace of the attack (up to -31 dB
|
|
406
|
+
// for a low bass note). Crossfade the last 60 ms of the loop into the 60 ms that lead into it, so the jump back to the loop start is seamless.
|
|
407
|
+
{
|
|
408
|
+
const X = Math.min(Math.round(sr * 0.06), A);
|
|
409
|
+
for (let j = 0; j < X; j++) {
|
|
410
|
+
const w = (j + 0.5) / X;
|
|
411
|
+
out[N - X + j] += w * (out[A - X + j] - out[N - X + j]);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// Set the volume by the sustain section's RMS (every pitch equally loud, the soft and hard layers equally loud too; loudness is left to velocity)
|
|
415
|
+
let e2 = 0;
|
|
416
|
+
for (let i = A; i < N; i++)
|
|
417
|
+
e2 += out[i] * out[i];
|
|
418
|
+
const k = 0.2 / Math.sqrt(e2 / LS + 1e-12);
|
|
419
|
+
for (let i = 0; i < N; i++)
|
|
420
|
+
out[i] *= k;
|
|
421
|
+
// The buffer runs on past the loop's end with a copy of the loop's start. Chrome's looping source does not interpolate across the jump back
|
|
422
|
+
// when the loop ends at the very end of the buffer (a test sine clicked on every pass unless its loop began at a zero crossing), and low notes
|
|
423
|
+
// ticked once a loop; now the samples either side of the loop's end are the ones the loop plays.
|
|
424
|
+
const data = new Float32Array(N + GUARD);
|
|
425
|
+
data.set(out);
|
|
426
|
+
data.set(out.subarray(A, A + GUARD), N);
|
|
427
|
+
return { data, loop: [A, N] };
|
|
428
|
+
}
|
|
429
|
+
// Body envelope: [Hz, dB], the average radiated response. Fitted, with the bow corner, to the sustained mf notes of the University of Iowa
|
|
430
|
+
// violin, cello and double bass recordings (1/3-octave partial levels across every string). The violin: air resonance A0 at 280 Hz, the corpus
|
|
431
|
+
// modes B1- and B1+ at 450-550 Hz, a dip around 700 Hz, the bridge hill at 2-4 kHz and a steep fall above 4-5 kHz. The cello sits an octave
|
|
432
|
+
// and a half lower; the double bass radiates mostly 50-200 Hz and is dark above. Bodies without recordings keep the shape the old model actually produced.
|
|
433
|
+
const VIOLIN_BODY = { seed: 11, lo: 200, hi: 9000, density: 9, q: [36, 70], rand: 7, env: [[200, -12], [280, -1], [480, 2], [560, 0], [720, -5], [1000, -1], [1400, -2], [1900, 3], [2400, 0], [3000, 5], [3800, 8], [5000, -1], [7000, -9], [9000, -16]] };
|
|
434
|
+
/** String section: the averaged body of violins and violas, flatter */
|
|
435
|
+
const SECTION_BODY = { seed: 41, lo: 160, hi: 8000, density: 6, q: [28, 36], rand: 5, env: [[150, -14], [240, 0], [350, 0], [500, 3], [700, -4], [1000, -2], [1400, 1], [2000, 3], [2600, 4], [3500, 0], [5000, -4], [8000, -16]] };
|
|
436
|
+
const CELLO_BODY = { seed: 23, lo: 80, hi: 9000, density: 9, q: [34, 70], rand: 7, env: [[70, -19], [100, -4], [150, 1], [220, -3], [350, 2], [500, 0], [700, -4], [1000, -1], [1800, 7], [2500, 7], [4000, -7], [6000, -7], [9000, -16]] };
|
|
437
|
+
const BASS_BODY = { seed: 31, lo: 36, hi: 6000, density: 7, q: [26, 48], rand: 5, env: [[36, -12], [45, -11], [60, -2], [100, 5], [150, 6], [200, -3], [300, -4], [500, -10], [1000, -11], [1600, -6], [2500, -9], [4000, -9], [6000, -11]] };
|
|
438
|
+
const FIDDLE_BODY = { seed: 53, lo: 220, hi: 10000, density: 9, q: [36, 70], rand: 7, env: [[220, -12], [300, 3], [520, 4], [800, 0], [1100, -1], [1500, -2], [2200, 1], [3000, 4], [4000, 5], [6000, -3], [10000, -16]] };
|
|
439
|
+
/** Morin khuur (horsehead fiddle): a skin-covered square body, a 900 Hz nasal tone, few highs */
|
|
440
|
+
const MORIN_BODY = { seed: 67, lo: 150, hi: 7000, density: 7, q: [26, 40], rand: 6, env: [[150, -12], [240, 1], [400, -2], [900, 6], [1300, 0], [1700, -3], [2400, 0], [3500, -5], [5000, -9], [7000, -16]] };
|
|
441
|
+
/**
|
|
442
|
+
* The cello's A string, fitted to the Iowa A-string notes A3-F#4 (arco mf and ff). Bowed like the lower strings (a comb notch every 8.3
|
|
443
|
+
* partials, the corner at 16, the same bow noise), the solo cello from A3 up had 5 dB too much of its energy in the fundamental and 8 dB too
|
|
444
|
+
* little at 2-4 kHz (spectral centroid 910 Hz, the recordings 1390), and 10-20 dB more hiss between its partials (at 1-2 kHz 29 dB under them,
|
|
445
|
+
* the recordings 43): a dull tone with a layer of hiss over it, like a synthesizer's strings; the low register measures close to the C and
|
|
446
|
+
* G strings. Bowed 3.5 cm from the bridge (5% of the open string) the comb's first notch sits near 4.4 kHz on every note of the string, so
|
|
447
|
+
* the partials run strong up to the bridge hill and fall past it, as in the recordings; the steel string loses less per period than the
|
|
448
|
+
* wound ones (a corner twice as high) and bows cleaner (a third of the noise). Now: centroid 1420 Hz, 2-4 kHz at -8 dB of the total
|
|
449
|
+
* (recordings -7), and the noise between partials 43, 35 and 26 dB under them at 1-2, 2-4 and 4-8 kHz (recordings 43, 35, 27)
|
|
450
|
+
*/
|
|
451
|
+
const CELLO_A = { open: 220, beta: 0.05, corner: 2, noise: 0.3 };
|
|
452
|
+
const section = (body, players) => ({
|
|
453
|
+
players,
|
|
454
|
+
spread: 9,
|
|
455
|
+
drift: 6,
|
|
456
|
+
vibRate: 5.8,
|
|
457
|
+
vibDepth: 22,
|
|
458
|
+
vibDelay: 0.12,
|
|
459
|
+
beta: [0.07, 0.16],
|
|
460
|
+
corner: [7, 14],
|
|
461
|
+
noise: 0.1,
|
|
462
|
+
scrape: 0.6,
|
|
463
|
+
attack: [0.12, 0.06],
|
|
464
|
+
onset: 0.04,
|
|
465
|
+
scoop: 12,
|
|
466
|
+
body,
|
|
467
|
+
loop: 2,
|
|
468
|
+
});
|
|
469
|
+
const solo = (body, vibRate, vibDepth, beta, corner, noise) => ({
|
|
470
|
+
players: 1,
|
|
471
|
+
spread: 0,
|
|
472
|
+
drift: 3,
|
|
473
|
+
vibRate,
|
|
474
|
+
vibDepth,
|
|
475
|
+
vibDelay: 0.1,
|
|
476
|
+
beta: [beta, beta],
|
|
477
|
+
corner,
|
|
478
|
+
noise,
|
|
479
|
+
scrape: 0.5,
|
|
480
|
+
attack: [0.08, 0.045],
|
|
481
|
+
onset: 0,
|
|
482
|
+
scoop: 14,
|
|
483
|
+
body,
|
|
484
|
+
loop: 2,
|
|
485
|
+
});
|
|
486
|
+
export const BOWS = {
|
|
487
|
+
/** String section: seven players */
|
|
488
|
+
strings: { def: section(SECTION_BODY, 7), zone: 3, rate: 0.75, attack: 0.02, release: 0.4, loudAt: 0.72, glide: 0.09, level: 0.89 },
|
|
489
|
+
/** The slow version of the string section (soft, long): the same samples */
|
|
490
|
+
strPad: { def: section(SECTION_BODY, 7), zone: 3, rate: 0.75, attack: 0.6, release: 0.9, loudAt: 2, glide: 0.09, level: 0.81, share: 'strings' },
|
|
491
|
+
violin: { def: solo(VIOLIN_BODY, 6.2, 27, 0.113, [8, 16], 0.1), zone: 3, rate: 0.75, attack: 0.02, release: 0.25, loudAt: 0.72, glide: 0.09, level: 0.57 },
|
|
492
|
+
cello: { def: { ...solo(CELLO_BODY, 5.6, 24, 0.12, [8, 16], 0.2), top: CELLO_A }, zone: 3, rate: 0.5, attack: 0.02, release: 0.3, loudAt: 0.72, glide: 0.09, level: 0.66 },
|
|
493
|
+
/** Folk fiddle: brighter, with a faster, narrower vibrato that comes in later */
|
|
494
|
+
fiddle: { def: { ...solo(FIDDLE_BODY, 6.2, 12, 0.09, [11, 22], 0.12), vibDelay: 0.18 }, zone: 3, rate: 0.75, attack: 0.015, release: 0.2, loudAt: 0.72, glide: 0.07, level: 0.6 },
|
|
495
|
+
/** Morin khuur: horsehair bow, lots of breath noise, wide slow vibrato that comes in later */
|
|
496
|
+
morin: { def: { ...solo(MORIN_BODY, 4.4, 26, 0.15, [6, 11], 0.14), vibDelay: 0.18 }, zone: 3, rate: 0.75, attack: 0.03, release: 0.3, loudAt: 0.72, glide: 0.14, level: 0.81 },
|
|
497
|
+
/** Cello section: five players, for sustained notes and harmony in the low-mid register (use cello for solos) */
|
|
498
|
+
celli: { def: { ...section(CELLO_BODY, 5), vibRate: 5.5, vibDepth: 20, corner: [7, 14], noise: 0.15, top: CELLO_A }, zone: 3, rate: 0.5, attack: 0.03, release: 0.4, loudAt: 0.72, glide: 0.1, level: 0.66 },
|
|
499
|
+
/** Double bass section: three players, with a slower vibrato */
|
|
500
|
+
contrabass: { def: { ...section(BASS_BODY, 3), vibRate: 5, vibDepth: 14, corner: [8, 16], spread: 4 }, zone: 3, rate: 0.5, attack: 0.03, release: 0.35, loudAt: 0.72, glide: 0.1, level: 0.61 },
|
|
501
|
+
};
|
|
502
|
+
//# sourceMappingURL=bowed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bowed.js","sourceRoot":"","sources":["../../src/instruments/bowed.ts"],"names":[],"mappings":"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"}
|