loots of bugfixes
This commit is contained in:
parent
920ee5152a
commit
8ae616d1c7
14 changed files with 46 additions and 85 deletions
6
package-lock.json
generated
6
package-lock.json
generated
|
@ -6251,9 +6251,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.4.464",
|
"version": "1.4.465",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.464.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.465.tgz",
|
||||||
"integrity": "sha512-guZ84yoou4+ILNdj0XEbmGs6DEWj6zpVOWYpY09GU66yEb0DSYvP/biBPzHn0GuW/3RC/pnaYNUWlQE1fJYtgA==",
|
"integrity": "sha512-XQcuHvEJRMU97UJ75e170mgcITZoz0lIyiaVjk6R+NMTJ8KBIvUHYd1779swgOppUlzxR+JsLpq59PumaXS1jQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/emoji-regex": {
|
"node_modules/emoji-regex": {
|
||||||
|
|
|
@ -6,7 +6,8 @@
|
||||||
"publish-player": "nx build player && cd dist/packages/player && npm publish --access=public",
|
"publish-player": "nx build player && cd dist/packages/player && npm publish --access=public",
|
||||||
"publish-visualizer": "nx build visualizer && cd dist/packages/visualizer && npm publish --access=public",
|
"publish-visualizer": "nx build visualizer && cd dist/packages/visualizer && npm publish --access=public",
|
||||||
"publish-library": "nx build music-library && cd dist/packages/music-library && npm publish --access=public",
|
"publish-library": "nx build music-library && cd dist/packages/music-library && npm publish --access=public",
|
||||||
"publish-euterpe": "nx build euterpe && cd dist/packages/euterpe && npm publish --access=public"
|
"publish-euterpe": "nx build euterpe && cd dist/packages/euterpe && npm publish --access=public",
|
||||||
|
"publish-all": "npm run publish-player && npm run publish-library && npm run publish-visualizer && npm run publish-euterpe"
|
||||||
},
|
},
|
||||||
"private": false,
|
"private": false,
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@euterpe.js/euterpe",
|
"name": "@euterpe.js/euterpe",
|
||||||
"version": "1.0.1",
|
"version": "1.0.4",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "Fully featured solution for playing music on the web. Support for local library, audio visuals and more!",
|
"description": "Fully featured solution for playing music on the web. Support for local library, audio visuals and more!",
|
||||||
"main": "./src/index.js",
|
"main": "./src/index.js",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@euterpe.js/music-library",
|
"name": "@euterpe.js/music-library",
|
||||||
"version": "1.0.4",
|
"version": "1.0.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "A simple music library, acting as a Local DB as JS Object. Contains everything a person would need to store their music data for website playback.",
|
"description": "A simple music library, acting as a Local DB as JS Object. Contains everything a person would need to store their music data for website playback.",
|
||||||
"main": "./src/index.js",
|
"main": "./src/index.js",
|
||||||
|
|
|
@ -69,7 +69,7 @@ interface SongConstructor {
|
||||||
key?: string
|
key?: string
|
||||||
fft_data?: number[]
|
fft_data?: number[]
|
||||||
id?: ID,
|
id?: ID,
|
||||||
metadata?: Map<string, any>
|
metadata?: any[]
|
||||||
}
|
}
|
||||||
class Song {
|
class Song {
|
||||||
name: string
|
name: string
|
||||||
|
@ -83,7 +83,7 @@ class Song {
|
||||||
bpm?: number
|
bpm?: number
|
||||||
key?: string
|
key?: string
|
||||||
fft_data?: number[]
|
fft_data?: number[]
|
||||||
metadata: Map<string, any>
|
metadata: any[]
|
||||||
/**
|
/**
|
||||||
* The ID is always there, don't worry :)
|
* The ID is always there, don't worry :)
|
||||||
*/
|
*/
|
||||||
|
@ -101,7 +101,7 @@ class Song {
|
||||||
this.key = data.key
|
this.key = data.key
|
||||||
this.fft_data = data.fft_data
|
this.fft_data = data.fft_data
|
||||||
this.id = data.id
|
this.id = data.id
|
||||||
this.metadata = data.metadata || new Map<string, any>
|
this.metadata = data.metadata || []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ interface ArtistConstructor {
|
||||||
collections?: Ref[]
|
collections?: Ref[]
|
||||||
links?: [Platforms, URL][]
|
links?: [Platforms, URL][]
|
||||||
id?: ID
|
id?: ID
|
||||||
metadata?: Map<string, any>
|
metadata?: any[]
|
||||||
}
|
}
|
||||||
class Artist {
|
class Artist {
|
||||||
name = ""
|
name = ""
|
||||||
|
@ -120,7 +120,7 @@ class Artist {
|
||||||
songs: Ref[]
|
songs: Ref[]
|
||||||
collections: Ref[]
|
collections: Ref[]
|
||||||
links?: [Platforms, URL][]
|
links?: [Platforms, URL][]
|
||||||
metadata: Map<string, any>
|
metadata: any[]
|
||||||
/**
|
/**
|
||||||
* The ID is always there, don't worry :)
|
* The ID is always there, don't worry :)
|
||||||
*/
|
*/
|
||||||
|
@ -132,7 +132,7 @@ class Artist {
|
||||||
this.collections = data.collections || []
|
this.collections = data.collections || []
|
||||||
this.links = data.links
|
this.links = data.links
|
||||||
this.id = data.id
|
this.id = data.id
|
||||||
this.metadata = data.metadata || new Map<string, any>
|
this.metadata = data.metadata || []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
interface CollectionConstructor {
|
interface CollectionConstructor {
|
||||||
|
@ -142,7 +142,7 @@ interface CollectionConstructor {
|
||||||
duration?: number
|
duration?: number
|
||||||
publish_date?: Date
|
publish_date?: Date
|
||||||
id?: ID
|
id?: ID
|
||||||
metadata?: Map<string, any>
|
metadata?: any[]
|
||||||
name?: string
|
name?: string
|
||||||
type?: CollectionType
|
type?: CollectionType
|
||||||
|
|
||||||
|
@ -155,7 +155,7 @@ class Collection {
|
||||||
cover?: URL
|
cover?: URL
|
||||||
duration?: number
|
duration?: number
|
||||||
publish_date?: Date
|
publish_date?: Date
|
||||||
metadata: Map<string, any>
|
metadata: any[]
|
||||||
/**
|
/**
|
||||||
* The ID is always there, don't worry :)
|
* The ID is always there, don't worry :)
|
||||||
*/
|
*/
|
||||||
|
@ -168,7 +168,7 @@ class Collection {
|
||||||
this.publish_date = data.publish_date
|
this.publish_date = data.publish_date
|
||||||
this.id = data.id
|
this.id = data.id
|
||||||
this.name = data.name
|
this.name = data.name
|
||||||
this.metadata = data.metadata ? data.metadata : new Map<string, any>
|
this.metadata = data.metadata ? data.metadata : []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class DB {
|
class DB {
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
{
|
|
||||||
"artist": {
|
|
||||||
"id": 0,
|
|
||||||
"name": "",
|
|
||||||
"pfp?": "url('')",
|
|
||||||
"songs?": [
|
|
||||||
"ref(songs,0)",
|
|
||||||
"ref(songs,2)"
|
|
||||||
],
|
|
||||||
"collections?": [
|
|
||||||
"ref(collections,0)"
|
|
||||||
],
|
|
||||||
"links?": [
|
|
||||||
"(youtube, url(''))",
|
|
||||||
"(key, url(''))"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"song": {
|
|
||||||
"id": 0,
|
|
||||||
"publish-date?": "00-00-0000",
|
|
||||||
"name": "",
|
|
||||||
"artists": [
|
|
||||||
"ref(artists, 0)",
|
|
||||||
"ref(artists, 1)"
|
|
||||||
],
|
|
||||||
"remix_artists": [
|
|
||||||
"ref(artists,3)"
|
|
||||||
],
|
|
||||||
"in_collection?": "ref(collections,0)",
|
|
||||||
"url": "url('')",
|
|
||||||
"cover?": "either url or use collections cover",
|
|
||||||
"duration": 123,
|
|
||||||
"bpm?": 120,
|
|
||||||
"key": "A Minor",
|
|
||||||
"fft_data?": [
|
|
||||||
0,
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"collection": {
|
|
||||||
"id": 0,
|
|
||||||
"publish-date?": "00-00-0000",
|
|
||||||
"artists": [
|
|
||||||
"ref(artists, 0)"
|
|
||||||
],
|
|
||||||
"songs": [
|
|
||||||
"ref(songs, 1)",
|
|
||||||
"ref(songs, 2)"
|
|
||||||
],
|
|
||||||
"cover": "url('')",
|
|
||||||
"duration": 123
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"extends": "../../tsconfig.base.json",
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"module": "ESNext",
|
"module": "esnext",
|
||||||
"forceConsistentCasingInFileNames": true,
|
"forceConsistentCasingInFileNames": true,
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"noImplicitOverride": true,
|
"noImplicitOverride": true,
|
||||||
|
|
|
@ -3,8 +3,17 @@
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "../../dist/out-tsc",
|
"outDir": "../../dist/out-tsc",
|
||||||
"declaration": true,
|
"declaration": true,
|
||||||
"types": ["node"]
|
"types": [
|
||||||
|
"node"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"include": ["src/**/*.ts"],
|
"include": [
|
||||||
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]
|
"src/**/*.ts",
|
||||||
|
"README.md"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"jest.config.ts",
|
||||||
|
"src/**/*.spec.ts",
|
||||||
|
"src/**/*.test.ts"
|
||||||
|
]
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@euterpe.js/player",
|
"name": "@euterpe.js/player",
|
||||||
"version": "1.0.22",
|
"version": "1.0.23",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "A simple, safe AudioContext web music player",
|
"description": "A simple, safe AudioContext web music player",
|
||||||
"main": "./src/index.js",
|
"main": "./src/index.js",
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"name": "preprocessor",
|
"name": "@euterpe.js/preprocessor",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"name": "preprocessor",
|
"name": "@euterpe.js/preprocessor",
|
||||||
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||||
"projectType": "application",
|
"projectType": "application",
|
||||||
"sourceRoot": "packages/preprocessor/src",
|
"sourceRoot": "packages/preprocessor/src",
|
||||||
|
|
|
@ -11,6 +11,7 @@ export async function start() {
|
||||||
console.log("Creating svgs...")
|
console.log("Creating svgs...")
|
||||||
const waveform_canvas = document.querySelector("#waveform-canvas") as SVGSVGElement
|
const waveform_canvas = document.querySelector("#waveform-canvas") as SVGSVGElement
|
||||||
for (const song of result.db.songs) {
|
for (const song of result.db.songs) {
|
||||||
|
console.log("creating waveform for -> " + song.name)
|
||||||
const waveform_visual_builder = new AudioVisualBuilder(result.analyzer_node, waveform_canvas)
|
const waveform_visual_builder = new AudioVisualBuilder(result.analyzer_node, waveform_canvas)
|
||||||
.set_fft_data_tresholds({ point_count_i: 100, fft_multiplier_i: 1, fft_offset_i: -80 })
|
.set_fft_data_tresholds({ point_count_i: 100, fft_multiplier_i: 1, fft_offset_i: -80 })
|
||||||
.set_fft_time_smoothing(0.8)
|
.set_fft_time_smoothing(0.8)
|
||||||
|
@ -18,9 +19,12 @@ export async function start() {
|
||||||
const waveform_visual = waveform_visual_builder.build(ShapeType.Waveform, true, { fft_data: new Float32Array(new Float64Array(song.fft_data!)), orientation: WaveformOrientation.Horizontal, shape_type: WaveformShape.LineLike })
|
const waveform_visual = waveform_visual_builder.build(ShapeType.Waveform, true, { fft_data: new Float32Array(new Float64Array(song.fft_data!)), orientation: WaveformOrientation.Horizontal, shape_type: WaveformShape.LineLike })
|
||||||
waveform_visual.draw_once()
|
waveform_visual.draw_once()
|
||||||
await new Promise<void>((done) => setTimeout(() => done(), 300))
|
await new Promise<void>((done) => setTimeout(() => done(), 300))
|
||||||
song.metadata.set("waveform-svg", waveform_canvas.innerHTML)
|
// @ts-ignore
|
||||||
|
song.metadata[0] = waveform_canvas.innerHTML
|
||||||
|
song.fft_data = []
|
||||||
}
|
}
|
||||||
console.log(result.db)
|
console.dir(result.db, { depth: null })
|
||||||
|
console.log(JSON.stringify(result.db))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
async function analyze(): Promise<AnalyzeReturn> {
|
async function analyze(): Promise<AnalyzeReturn> {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@euterpe.js/visualizer",
|
"name": "@euterpe.js/visualizer",
|
||||||
"version": "1.0.3",
|
"version": "1.0.6",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "Music visualizer based on SVG and AudioContext",
|
"description": "Music visualizer based on SVG and AudioContext",
|
||||||
"main": "./src/index.js",
|
"main": "./src/index.js",
|
||||||
|
|
|
@ -177,7 +177,7 @@ export class AudioVisual {
|
||||||
const cp2x = x2 - (x3 - x1) / 6 * k
|
const cp2x = x2 - (x3 - x1) / 6 * k
|
||||||
const cp2y = y2 - (y3 - y1) / 6 * k
|
const cp2y = y2 - (y3 - y1) / 6 * k
|
||||||
|
|
||||||
path += "C" + [cp1x, cp1y, cp2x, cp2y, x2, y2]
|
path += "C" + [cp1x.toFixed(2), cp1y.toFixed(2), cp2x.toFixed(2), cp2y.toFixed(2), x2.toFixed(2), y2.toFixed(2)]
|
||||||
}
|
}
|
||||||
return path
|
return path
|
||||||
}
|
}
|
||||||
|
@ -287,7 +287,7 @@ export class AudioVisual {
|
||||||
switch (this.#shape.shape_type) {
|
switch (this.#shape.shape_type) {
|
||||||
case ShapeType.Line: {
|
case ShapeType.Line: {
|
||||||
for (let i = 0; i < arr.length; i++) {
|
for (let i = 0; i < arr.length; i++) {
|
||||||
path += `L ${arr[i].x},${arr[i].y} `
|
path += `L ${arr[i].x.toFixed(2)},${arr[i].y.toFixed(2)} `
|
||||||
}
|
}
|
||||||
if (this.#shape.shape_type == ShapeType.Line) {
|
if (this.#shape.shape_type == ShapeType.Line) {
|
||||||
path += `L ${this.#canvas_width} ${this.#canvas_height} `
|
path += `L ${this.#canvas_width} ${this.#canvas_height} `
|
||||||
|
@ -297,16 +297,16 @@ export class AudioVisual {
|
||||||
}
|
}
|
||||||
case ShapeType.Circle: {
|
case ShapeType.Circle: {
|
||||||
for (let i = 0; i < arr.length; i++) {
|
for (let i = 0; i < arr.length; i++) {
|
||||||
path += `L ${arr[i].x},${arr[i].y} `
|
path += `L ${arr[i].x.toFixed(2)},${arr[i].y.toFixed(2)} `
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
case ShapeType.Waveform: {
|
case ShapeType.Waveform: {
|
||||||
for (let i = 0; i < arr.length; i += 2) {
|
for (let i = 0; i < arr.length; i += 2) {
|
||||||
path += `L ${arr[i].x},${arr[i].y} `
|
path += `L ${arr[i].x.toFixed(2)},${arr[i].y.toFixed(2)} `
|
||||||
}
|
}
|
||||||
for (let i = arr.length - 1; i >= 0; i -= 2) {
|
for (let i = arr.length - 1; i >= 0; i -= 2) {
|
||||||
path += `L ${arr[i].x},${arr[i].y} `
|
path += `L ${arr[i].x.toFixed(2)},${arr[i].y.toFixed(2)} `
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -318,7 +318,7 @@ export class AudioVisual {
|
||||||
const anchors = this.#create_perpendicular_anchors(arr)
|
const anchors = this.#create_perpendicular_anchors(arr)
|
||||||
|
|
||||||
for (let i = 1; i < arr.length; i++) {
|
for (let i = 1; i < arr.length; i++) {
|
||||||
path += `C ${anchors[i - 1].rightAnchor.x} ${anchors[i - 1].rightAnchor.y} ${anchors[i].leftAnchor.x} ${anchors[i].leftAnchor.y} ${arr[i].x} ${arr[i].y} `
|
path += `C ${anchors[i - 1].rightAnchor.x.toFixed(2)} ${anchors[i - 1].rightAnchor.y.toFixed(2)} ${anchors[i].leftAnchor.x.toFixed(2)} ${anchors[i].leftAnchor.y.toFixed(2)} ${arr[i].x.toFixed(2)} ${arr[i].y.toFixed(2)} `
|
||||||
}
|
}
|
||||||
if (this.#shape.shape_type == ShapeType.Line) {
|
if (this.#shape.shape_type == ShapeType.Line) {
|
||||||
//path += `L ${this.canvasWidth} ${this.canvasHeight / 2} `
|
//path += `L ${this.canvasWidth} ${this.canvasHeight / 2} `
|
||||||
|
|
Loading…
Reference in a new issue