pepperscore 0.2.0 → 0.3.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/CHANGELOG.md +44 -0
- package/LICENSE +26 -12
- package/README.md +97 -8
- package/dist/THIRD_PARTY_NOTICES.txt +1222 -0
- package/dist/assets/{import.worker-D0XfuAHu.js → import.worker-nfqQ5M0Y.js} +2 -2
- package/dist/assets/verovio.worker-DGik-H4a.js +7 -0
- package/dist/audio.d.ts +24 -0
- package/dist/audio.js +198 -0
- package/dist/audio.js.map +1 -0
- package/dist/components/PepperScore.d.ts +89 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2586 -3246
- package/dist/index.js.map +1 -1
- package/dist/lib/chrome.d.ts +5 -2
- package/dist/lib/file-state.d.ts +17 -4
- package/dist/lib/header-controls.d.ts +7 -3
- package/dist/lib/hit-test.d.ts +18 -0
- package/dist/lib/instruments.d.ts +82 -0
- package/dist/lib/metronome.d.ts +33 -0
- package/dist/lib/notation/mei-tab.d.ts +51 -0
- package/dist/lib/notation/mei-view.d.ts +8 -0
- package/dist/lib/playback/timeline.d.ts +4 -1
- package/dist/lib/prefs.d.ts +50 -0
- package/dist/lib/render.d.ts +36 -1
- package/dist/lib/score.d.ts +7 -0
- package/dist/lib/sound-players.d.ts +9 -1
- package/dist/lib/tab/fret-assign.d.ts +53 -0
- package/dist/lib/tab/tab-parts.d.ts +58 -0
- package/dist/lib/verovio-protocol.d.ts +15 -0
- package/dist/lib/verovio-runtime.d.ts +9 -1
- package/dist/runtime-files.d.ts +15 -0
- package/dist/{sf2-player-CRlOJDhD.js → sf2-player-oWC6yrUH.js} +28 -6
- package/dist/sf2-player-oWC6yrUH.js.map +1 -0
- package/dist/sound-players-DdLBBZaR.js +1172 -0
- package/dist/sound-players-DdLBBZaR.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/verovio/LICENSE +858 -0
- package/dist/verovio/verovio-module.mjs +0 -0
- package/dist/verovio/verovio.mjs +397 -0
- package/package.json +6 -1
- package/dist/assets/verovio.worker-DkHQmOsT.js +0 -19034
- package/dist/sf2-player-CRlOJDhD.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sf2-player-CRlOJDhD.js","names":["soundfonts","parsedSoundfont","cached","url","response","buffer","soundfont2","LAYERED","layeredInstrument","zones","preset","presetZone","lo","zone","hi","layer","findPreset","presets","item","drums","program","loadSf2Player","smplrInstrument","soundfont","match","instrument","Sf2Sampler","sf2InstrumentToPreset","options","ctx","smplr","json","buffers","output","context","destination","sampler","error","note"],"sources":["../src/lib/sf2-player.ts"],"sourcesContent":["import type { Instrument, InstrumentZone, Preset, SoundFont2 } from 'soundfont2';\nimport type { AudioPlayer } from './sound-players';\n\nconst soundfonts = new Map<string, Promise<SoundFont2>>();\n\n/**\n * Each SF2 is downloaded and parsed once per URL. Every program, part and instance builds its player from the same\n * parsed soundfont (read-only here), so disposing one player never touches data another is using.\n */\nfunction parsedSoundfont(url: string): Promise<SoundFont2> {\n let cached = soundfonts.get(url);\n if (!cached) {\n cached = Promise.all([\n fetch(url).then(response => {\n if (!response.ok) throw new Error(`Could not load the soundfont (${response.status}).`);\n return response.arrayBuffer();\n }),\n import('soundfont2'),\n ]).then(([buffer, { default: soundfont2 }]) => new soundfont2.SoundFont2(new Uint8Array(buffer)));\n cached.catch(() => soundfonts.delete(url));\n soundfonts.set(url, cached);\n }\n return cached;\n}\n\n/** Name of the synthetic instrument that layers every instrument zone of the chosen preset. */\nconst LAYERED = '\\u0000pepperscore-preset';\n\n/**\n * smplr's Soundfont2 plays one SF2 instrument, but a GM preset often layers several (TimGM6mb's Standard kit is\n * Standard0 + Standard1, its strings stack six). This merges them into one instrument, clipped to each preset zone's key\n * range; smplr then sounds every region that matches a note. Sample names get a layer prefix because smplr keys its\n * buffers by name. Velocity ranges, pan and attenuation are not applied (smplr's SF2 conversion ignores them).\n */\nfunction layeredInstrument(preset: Preset): Instrument {\n const zones = preset.zones.flatMap((presetZone, layer) => (presetZone.instrument?.zones ?? []).flatMap((zone): InstrumentZone[] => {\n const lo = Math.max(zone.keyRange?.lo ?? 0, presetZone.keyRange?.lo ?? 0);\n const hi = Math.min(zone.keyRange?.hi ?? 127, presetZone.keyRange?.hi ?? 127);\n if (!zone.sample || lo > hi) return [];\n return [{ ...zone, keyRange: { lo, hi }, sample: { ...zone.sample, header: { ...zone.sample.header, name: `${layer}:${zone.sample.header.name}` } } }];\n }));\n return { header: { name: LAYERED, bagIndex: -1 }, zones };\n}\n\n/** The GM preset: bank 128 preset 0 (Standard kit) for drums, else bank 0 preset `program - 1`; or a preset named `preset`. */\nconst findPreset = (presets: Preset[], drums: boolean, program = 1, preset?: string) =>\n presets.find(item => preset ? item.header.name === preset : drums ? item.header.bank === 128 && item.header.preset === 0 : item.header.bank === 0 && item.header.preset === program - 1);\n\nexport type Sf2Options = { url: string; drums: boolean; program?: number; preset?: string; destination: AudioNode };\n\n/** A player for one preset of an SF2. `preset` names an SF2 preset, or failing that a single SF2 instrument. */\nexport async function loadSf2Player(context: AudioContext, { url, drums, program, preset, destination }: Sf2Options): Promise<AudioPlayer> {\n const [{ Instrument: smplrInstrument, sf2InstrumentToPreset }, soundfont] = await Promise.all([import('smplr'), parsedSoundfont(url)]);\n const match = findPreset(soundfont.presets, drums, program, preset);\n const instrument = match ? layeredInstrument(match) : preset ? soundfont.instruments.find(item => item.header.name === preset) : undefined;\n if (!instrument) throw new Error(preset ? `The soundfont has no preset or instrument named \"${preset}\".` : drums ? 'The soundfont has no standard drum kit.' : `The soundfont has no instrument for GM program ${program}.`);\n // smplr's own Soundfont2 fetches and parses the file per sampler; this plugin only turns the shared instrument into samples.\n const Sf2Sampler = smplrInstrument<{ instrument: Instrument }>((ctx, options, smplr) => {\n const { json, buffers } = sf2InstrumentToPreset(options.instrument, ctx);\n return smplr.loadInstrument(json, buffers);\n });\n const output = context.createGain();\n output.connect(destination);\n const sampler = Sf2Sampler(context, { instrument, destination: output });\n try { await sampler.ready; } catch (error) { sampler.dispose(); output.disconnect(); throw error; }\n // Stacked layers add up: scale by 1/sqrt(the most regions any one note sounds) so the preset sits near single-layer\n // ones. A global approximation: notes with fewer layers are scaled by the same amount.\n if (match) output.gain.value = 1 / Math.sqrt(Math.max(1, ...Array.from({ length: 128 }, (_, note) => instrument.zones.filter(zone => zone.keyRange!.lo <= note && note <= zone.keyRange!.hi).length)));\n return { start: options => sampler.start(options), stop: () => sampler.stop(), dispose: () => { sampler.dispose(); output.disconnect(); } };\n}\n"],"mappings":"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"}
|