81 lines
2.2 KiB
Python
81 lines
2.2 KiB
Python
from dataclasses import dataclass, field
|
|
|
|
import numpy as np
|
|
|
|
IMPORTANT_FIELDS: tuple[str, ...] = (
|
|
"Tempo",
|
|
"Zcr",
|
|
"MeanSpectralCentroid",
|
|
"StdDevSpectralCentroid",
|
|
"MeanSpectralRolloff",
|
|
"StdDevSpectralRolloff",
|
|
"MeanSpectralFlatness",
|
|
"StdDevSpectralFlatness",
|
|
"MeanLoudness",
|
|
"StdDevLoudness",
|
|
"Chroma1",
|
|
"Chroma2",
|
|
"Chroma3",
|
|
"Chroma4",
|
|
"Chroma5",
|
|
"Chroma6",
|
|
"Chroma7",
|
|
"Chroma8",
|
|
"Chroma9",
|
|
"Chroma10",
|
|
)
|
|
|
|
|
|
class DimensionDescriptor:
|
|
def __set_name__(self, owner, name):
|
|
self.name: str = name
|
|
self.idx: int = IMPORTANT_FIELDS.index(name)
|
|
|
|
def __get__(self, instance: "EntityBase", owner) -> float:
|
|
return instance.np_arr[self.idx]
|
|
|
|
def __set__(self, instance: "EntityBase", value: float):
|
|
instance.np_arr[self.idx] = value
|
|
|
|
|
|
@dataclass(kw_only=True)
|
|
class EntityBase:
|
|
np_arr: np.ndarray = field(
|
|
init=False, repr=False, default_factory=lambda: np.zeros(len(IMPORTANT_FIELDS))
|
|
)
|
|
Tempo: float = DimensionDescriptor()
|
|
Zcr: float = DimensionDescriptor()
|
|
MeanSpectralCentroid: float = DimensionDescriptor()
|
|
StdDevSpectralCentroid: float = DimensionDescriptor()
|
|
MeanSpectralRolloff: float = DimensionDescriptor()
|
|
StdDevSpectralRolloff: float = DimensionDescriptor()
|
|
MeanSpectralFlatness: float = DimensionDescriptor()
|
|
StdDevSpectralFlatness: float = DimensionDescriptor()
|
|
MeanLoudness: float = DimensionDescriptor()
|
|
StdDevLoudness: float = DimensionDescriptor()
|
|
Chroma1: float = DimensionDescriptor()
|
|
Chroma2: float = DimensionDescriptor()
|
|
Chroma3: float = DimensionDescriptor()
|
|
Chroma4: float = DimensionDescriptor()
|
|
Chroma5: float = DimensionDescriptor()
|
|
Chroma6: float = DimensionDescriptor()
|
|
Chroma7: float = DimensionDescriptor()
|
|
Chroma8: float = DimensionDescriptor()
|
|
Chroma9: float = DimensionDescriptor()
|
|
Chroma10: float = DimensionDescriptor()
|
|
|
|
|
|
@dataclass(kw_only=True)
|
|
class Centroid(EntityBase):
|
|
id: int
|
|
|
|
|
|
@dataclass(kw_only=True)
|
|
class Song(EntityBase):
|
|
File: str
|
|
|
|
def __str__(self):
|
|
return self.File
|
|
|
|
__repr__ = __str__
|