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,109 @@
|
|
|
1
|
+
// Sample cache: sampled instruments are rendered once per (sample rate, instrument, pitch, variant) and reused.
|
|
2
|
+
// Rendering happens before a song starts (prepareSamples), in small slices so the main thread never stalls.
|
|
3
|
+
const cache = new Map();
|
|
4
|
+
/** Loop section of a bowed-string sample (seconds) */
|
|
5
|
+
const loops = new WeakMap();
|
|
6
|
+
/** Bowed samples share a cache entry when one instrument borrows another's players (strPad uses strings) */
|
|
7
|
+
const sampleName = (def, name) => def.bow?.name ?? name;
|
|
8
|
+
const keyOf = (sampleRate, name, midi, variant, desk) => `${sampleRate}|${name}|${midi}|${variant}${desk ? `|${desk}` : ''}`;
|
|
9
|
+
/** The pitch actually rendered: bowed strings sample every few semitones, fixed-pitch drums always use one note */
|
|
10
|
+
export function sampleMidi(def, midi) {
|
|
11
|
+
if (def.bow)
|
|
12
|
+
return Math.round(midi / def.bow.zone) * def.bow.zone;
|
|
13
|
+
return def.fixed ?? Math.round(midi);
|
|
14
|
+
}
|
|
15
|
+
/** How much memory bowed-string samples may take at most (bytes): beyond that the least recently used are dropped (notes already playing still hold a reference, so they are unaffected) */
|
|
16
|
+
const BOW_BUDGET = 48e6;
|
|
17
|
+
const bowUse = new Map();
|
|
18
|
+
let bowBytes = 0;
|
|
19
|
+
function keepBow(key, buffer) {
|
|
20
|
+
if (!bowUse.has(key))
|
|
21
|
+
bowBytes += buffer.length * 4;
|
|
22
|
+
bowUse.delete(key);
|
|
23
|
+
bowUse.set(key, buffer.length * 4);
|
|
24
|
+
for (const [old, n] of bowUse) {
|
|
25
|
+
if (bowBytes <= BOW_BUDGET)
|
|
26
|
+
break;
|
|
27
|
+
bowUse.delete(old);
|
|
28
|
+
cache.delete(old);
|
|
29
|
+
bowBytes -= n;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Which layer a bowed string uses at this velocity (times params.bright); near the threshold both layers are prepared (velocity has a little randomness at playback) */
|
|
33
|
+
export function bowLayers(def, velocity, bright = 1) {
|
|
34
|
+
const x = velocity * bright;
|
|
35
|
+
const at = def.bow.loudAt;
|
|
36
|
+
if (Math.abs(x - at) < 0.06)
|
|
37
|
+
return [0, 1];
|
|
38
|
+
return [x > at ? 1 : 0];
|
|
39
|
+
}
|
|
40
|
+
/** How many variants of a sampled instrument to precompute (random variants for drums; the soft and hard layers for bowed strings) */
|
|
41
|
+
export const variantsOf = (def) => (def.bow ? 2 : (def.variants ?? 1));
|
|
42
|
+
/** Only bowed strings have desks (different players for tracks that share an instrument) */
|
|
43
|
+
const deskOf = (def, desk) => (def.bow ? desk : 0);
|
|
44
|
+
/** Whether a sample is already rendered */
|
|
45
|
+
export function hasSample(sampleRate, def, name, midi, variant, desk = 0) {
|
|
46
|
+
return cache.has(keyOf(sampleRate, sampleName(def, name), sampleMidi(def, midi), variant, deskOf(def, desk)));
|
|
47
|
+
}
|
|
48
|
+
/** The loop section (seconds) of a bowed sample, if it has one */
|
|
49
|
+
export const loopOf = (buffer) => loops.get(buffer);
|
|
50
|
+
/** Render (or fetch from the cache) a sample */
|
|
51
|
+
export function getSample(ctx, def, name, midi, variant = 0, desk = 0) {
|
|
52
|
+
const mm = sampleMidi(def, midi);
|
|
53
|
+
const v = variant % variantsOf(def);
|
|
54
|
+
const dk = deskOf(def, desk);
|
|
55
|
+
const k = keyOf(ctx.sampleRate, sampleName(def, name), mm, v, dk);
|
|
56
|
+
let b = cache.get(k);
|
|
57
|
+
if (!b) {
|
|
58
|
+
const sr = def.bow ? Math.round(ctx.sampleRate * def.bow.rate) : ctx.sampleRate;
|
|
59
|
+
const data = def.render(sr, mm, v, dk);
|
|
60
|
+
const chans = data instanceof Float32Array ? [data] : Array.isArray(data) ? data : [data.data];
|
|
61
|
+
// One NaN would circulate through the reverb and delay feedback and silence the whole mix for good
|
|
62
|
+
for (const d of chans)
|
|
63
|
+
for (let i = 0; i < d.length; i++)
|
|
64
|
+
if (!Number.isFinite(d[i]))
|
|
65
|
+
d[i] = 0;
|
|
66
|
+
b = ctx.createBuffer(chans.length, chans[0].length, sr);
|
|
67
|
+
chans.forEach((d, i) => b.getChannelData(i).set(d));
|
|
68
|
+
if (!(data instanceof Float32Array) && !Array.isArray(data))
|
|
69
|
+
loops.set(b, [data.loop[0] / sr, data.loop[1] / sr]);
|
|
70
|
+
cache.set(k, b);
|
|
71
|
+
}
|
|
72
|
+
if (def.bow)
|
|
73
|
+
keepBow(k, b);
|
|
74
|
+
return b;
|
|
75
|
+
}
|
|
76
|
+
/** Drop every cached sample of an instrument (after it is redefined) */
|
|
77
|
+
export function forgetSamples(name) {
|
|
78
|
+
for (const k of [...cache.keys()])
|
|
79
|
+
if (k.split('|')[1] === name)
|
|
80
|
+
cache.delete(k);
|
|
81
|
+
}
|
|
82
|
+
/** Every [variant] of a need that should be rendered */
|
|
83
|
+
function* variantsToRender(def, layer) {
|
|
84
|
+
for (let v = 0; v < variantsOf(def); v++)
|
|
85
|
+
if (layer === undefined || v === layer)
|
|
86
|
+
yield v;
|
|
87
|
+
}
|
|
88
|
+
/** Render samples ahead of time; after more than 12 ms of continuous work, yield the main thread for a moment (so the screen does not stall) */
|
|
89
|
+
export async function prepareSamples(ctx, requests) {
|
|
90
|
+
let last = performance.now();
|
|
91
|
+
for (const { def, name, midi, layer, desk } of requests) {
|
|
92
|
+
for (const v of variantsToRender(def, layer)) {
|
|
93
|
+
if (hasSample(ctx.sampleRate, def, name, midi, v, desk))
|
|
94
|
+
continue;
|
|
95
|
+
getSample(ctx, def, name, midi, v, desk);
|
|
96
|
+
if (performance.now() - last > 12) {
|
|
97
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
98
|
+
last = performance.now();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Synchronous version (offline rendering, short play-once jingles) */
|
|
104
|
+
export function prepareSamplesSync(ctx, requests) {
|
|
105
|
+
for (const { def, name, midi, layer, desk } of requests)
|
|
106
|
+
for (const v of variantsToRender(def, layer))
|
|
107
|
+
getSample(ctx, def, name, midi, v, desk);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=samples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"samples.js","sourceRoot":"","sources":["../../src/instruments/samples.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export interface VoiceCall {
|
|
2
|
+
ctx: BaseAudioContext;
|
|
3
|
+
out: AudioNode;
|
|
4
|
+
t: number;
|
|
5
|
+
/** Note length (seconds) */
|
|
6
|
+
dur: number;
|
|
7
|
+
f: number;
|
|
8
|
+
/** Loudness: the velocity through a curve, times the instrument's level */
|
|
9
|
+
vel: number;
|
|
10
|
+
/** The velocity as played (0-1), for timbre: how far a filter opens, whether a note is accented */
|
|
11
|
+
touch: number;
|
|
12
|
+
/** Glide: [seconds from the start, target frequency] */
|
|
13
|
+
bends?: [number, number][];
|
|
14
|
+
/** Instrument parameters (a song's track.params can override them) */
|
|
15
|
+
o: Readonly<Record<string, number>>;
|
|
16
|
+
}
|
|
17
|
+
export type Voice = (c: VoiceCall) => void;
|
|
18
|
+
export declare const VOICES: {
|
|
19
|
+
flute: Voice;
|
|
20
|
+
/** Pan flute: stopped pipes (odd harmonics), lots of breath, a very noticeable chiff on the attack */
|
|
21
|
+
panflute: Voice;
|
|
22
|
+
/** Ocarina: a vessel (Helmholtz) resonator with no overtones of its own, nearly a sine */
|
|
23
|
+
ocarina: Voice;
|
|
24
|
+
/** Tin whistle: bright, thin, with lots of ornaments */
|
|
25
|
+
whistle: Voice;
|
|
26
|
+
clarinet: Voice;
|
|
27
|
+
oboe: Voice;
|
|
28
|
+
bassoon: Voice;
|
|
29
|
+
horn: Voice;
|
|
30
|
+
horns: Voice;
|
|
31
|
+
trumpet: Voice;
|
|
32
|
+
trumpets: Voice;
|
|
33
|
+
trombone: Voice;
|
|
34
|
+
tuba: Voice;
|
|
35
|
+
/** Saxophones: alto and tenor */
|
|
36
|
+
sax: Voice;
|
|
37
|
+
tenorSax: Voice;
|
|
38
|
+
/** Choir (female voices on the vowels a, o, u) and male voices (A, O, U) */
|
|
39
|
+
choir: Voice;
|
|
40
|
+
choirOo: Voice;
|
|
41
|
+
choirO: Voice;
|
|
42
|
+
/** Male choir */
|
|
43
|
+
menChoir: Voice;
|
|
44
|
+
/** Monk chant: a male o with almost no vibrato */
|
|
45
|
+
chant: Voice;
|
|
46
|
+
/** Solo soprano (aria) */
|
|
47
|
+
soprano: Voice;
|
|
48
|
+
throat: Voice;
|
|
49
|
+
organ: Voice;
|
|
50
|
+
/** Organ with all stops */
|
|
51
|
+
organFull: (c: VoiceCall) => void;
|
|
52
|
+
accordion: Voice;
|
|
53
|
+
drone: Voice;
|
|
54
|
+
warmPad: Voice;
|
|
55
|
+
glassPad: Voice;
|
|
56
|
+
/** Dark pad: the analog pad nearly closed, over a sine an octave down */
|
|
57
|
+
darkPad: Voice;
|
|
58
|
+
airPad: Voice;
|
|
59
|
+
glass: Voice;
|
|
60
|
+
supersaw: Voice;
|
|
61
|
+
synthLead: Voice;
|
|
62
|
+
pluck: Voice;
|
|
63
|
+
powerGtr: Voice;
|
|
64
|
+
muteGtr: (c: VoiceCall) => void;
|
|
65
|
+
bass: Voice;
|
|
66
|
+
synthBass: Voice;
|
|
67
|
+
reese: Voice;
|
|
68
|
+
acid: Voice;
|
|
69
|
+
bass808: Voice;
|
|
70
|
+
sub: Voice;
|
|
71
|
+
distBass: Voice;
|
|
72
|
+
birds: Voice;
|
|
73
|
+
riser: Voice;
|
|
74
|
+
downlifter: Voice;
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=voices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voices.d.ts","sourceRoot":"","sources":["../../src/instruments/voices.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,gBAAgB,CAAC;IACtB,GAAG,EAAE,SAAS,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,mGAAmG;IACnG,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC3B,sEAAsE;IACtE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrC;AAED,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;AA+jC3C,eAAO,MAAM,MAAM;;IAEjB,sGAAsG;;IAEtG,0FAA0F;;IAE1F,wDAAwD;;;;;;;;;;;IAWxD,iCAAiC;;;IAGjC,4EAA4E;;;;IAI5E,iBAAiB;;IAEjB,kDAAkD;;IAElD,0BAA0B;;;;IAI1B,2BAA2B;;;;;;IAM3B,yEAAyE;;;;;;;;;;;;;;;;;;;CAmB1C,CAAC"}
|