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__