MTG / essentia.js

JavaScript library for music/audio analysis and processing powered by Essentia WebAssembly
https://essentia.upf.edu/essentiajs
GNU Affero General Public License v3.0
627 stars 41 forks source link

EssentiaWASM.EssentiaJS is not a constructor #99

Closed ng-jim closed 1 year ago

ng-jim commented 2 years ago

What is the issue about?

What part(s) of Essentia.js is involved?

Initialisation

Description

I'm sure I'm doing something fairly obviously wrong here, but can't get past it :(

I have a web worker with the following code ....

`//import { Essentia, EssentiaWASM } from "essentia.js"; const ess = require("essentia.js"); function testEssentia() { const essentia = new ess.Essentia(ess.EssentiaWASM, true); }

/ eslint-disable no-restricted-globals / self.onmessage = ({ data: { question } }) => { testEssentia(); self.postMessage({ answer: 42, }); };`

Which always hits an error in essentia.js-core.umd.js here :

image

That error being : "Uncaught TypeError: EssentiaWASM.EssentiaJS is not a constructor at new Essentia (essentia.js-core.umd.js:95:1)"

Does not seem to matter whether I use the Import or the require syntax.

I've tried everything I can think of, it's no doubt something rather simple that I'm just ignorant about, I'm afraid my web skills are a bit rusty and out of date.

Many thanks in advance!

System info

MacOS, node version v16.15.0, webpack 5 under Create React App, chrome canary : Version 104.0.5091.0 (Official Build) canary (x86_64)

jmarcosfer commented 2 years ago

Hi @ng-jim

I have a similar setup running essentia.js in a web worker (with Vue). Try accessing EssentiaWASM as EssentiaWASM.EssentiaWASM. In your example that would be:

// import { Essentia, EssentiaWASM } from "essentia.js";
const ess = require("essentia.js");
function testEssentia() {
    const essentia = new ess.Essentia(ess.EssentiaWASM.EssentiaWASM, true);
}

This is due to a quirk in the library to make it work with different JS module systems.

Let me know if this works!