def testOnFloat(self):
"float result"
- self.result.data.value = 1.2
+ self.result.dataObject.value = 1.2
def testOnInt(self):
"integer result"
- self.result.data.value = 1
+ self.result.dataObject.value = 1
def testOnList(self):
"list result"
- self.result.data.value = [1., 2.]
+ self.result.dataObject.value = [1., 2.]
def testOnString(self):
"string result"
- self.result.data.value = "hello"
+ self.result.dataObject.value = "hello"
def testOnListOfString(self):
"list of strings result"
- self.result.data.value = ["hello", "hola"]
+ self.result.dataObject.value = ["hello", "hola"]
def testOnListOfList(self):
"list of lists result"
- self.result.data.value = [[0, 1], [0, 1, 2]]
+ self.result.dataObject.value = [[0, 1], [0, 1, 2]]
def testOnNumpyVectorOfFloat(self):
"numpy vector of float"
- self.result.data.value = ones(2, dtype='float') * pi
+ self.result.dataObject.value = ones(2, dtype='float') * pi
def testOnNumpy2DArrayOfFloat64(self):
"numpy 2d array of float64"
- self.result.data.value = ones([2, 3], dtype='float64') * pi
+ self.result.dataObject.value = ones([2, 3], dtype='float64') * pi
def testOnNumpy3DArrayOfInt32(self):
"numpy 3d array of int32"
- self.result.data.value = ones([2, 3, 2], dtype='int32')
+ self.result.dataObject.value = ones([2, 3, 2], dtype='int32')
def testOnNumpyArrayOfStrings(self):
"numpy array of strings"
- self.result.data.value = array(['hello', 'hola'])
+ self.result.dataObject.value = array(['hello', 'hola'])
def testOnEmptyList(self):
"empty list"
- self.result.data.value = []
+ self.result.dataObject.value = []
def testOnNone(self):
"None"
- self.result.data.value = None
+ self.result.dataObject.value = None
def testOnUnicode(self):
"None"
- self.result.data.value = None
+ self.result.dataObject.value = None
def tearDown(self):
pass
def method(self):
"numpy %s" % str(numpy_data_type)[7:-1]
import numpy
- self.result.data.value = numpy_data_type(pi)
+ self.result.dataObject.value = numpy_data_type(pi)
return method
data = getattr(numpy, numpy_data_type)(pi)
except ValueError:
data = getattr(numpy, numpy_data_type)()
- self.assertRaises(TypeError, self.result.data.__setattr__, 'value', data)
+ self.assertRaises(TypeError, self.result.dataObject.__setattr__, 'value', data)
return method
for numpy_data_type in good_numpy_data_types:
# Set Data , dataMode='label', timeMode='event'
# Event = list of (time, labelId)
- onsets.data.label = numpy.ones(len(self.onsets))
- onsets.data.time = self.onsets
+ onsets.dataObject.label = numpy.ones(len(self.onsets))
+ onsets.dataObject.time = self.onsets
onsets.labelMetadata.label = {1: 'Onset'}
# Event = list of (time, value)
# TODO : add time
if len(self.onsets) > 1:
- onsetrate.data.value = 60. / numpy.diff(self.onsets)
- onsetrate.data.time = self.onsets[:-1]
+ onsetrate.dataObject.value = 60. / numpy.diff(self.onsets)
+ onsetrate.dataObject.time = self.onsets[:-1]
else:
- onsetrate.data.value = []
+ onsetrate.dataObject.value = []
self._results.add(onsetrate)
if len(self.beats) > 1:
duration = numpy.diff(self.beats)
duration = numpy.append(duration,duration[-1])
- beats.data.time = self.beats
- beats.data.duration = duration
- beats.data.label = numpy.ones(len(self.beats))
+ beats.dataObject.time = self.beats
+ beats.dataObject.duration = duration
+ beats.dataObject.label = numpy.ones(len(self.beats))
else:
- beats.data.label = []
+ beats.dataObject.label = []
beats.labelMetadata.label = {1: 'Beat'}
periods = 60. / numpy.diff(self.beats)
periods = numpy.append(periods, periods[-1])
- bpm.data.time = self.beats
- bpm.data.duration = duration
- bpm.data.value = periods
+ bpm.dataObject.time = self.beats
+ bpm.dataObject.duration = duration
+ bpm.dataObject.value = periods
else:
- bpm.data.value = []
+ bpm.dataObject.value = []
self._results.add(bpm)
_default_value = OrderedDict([('uri', ''),
('start', 0),
('duration', None),
+ ('IS_SEGMENT', None),
('channels', None),
('channelsManagement', '')])
('stepsize', None)])
-class AnalyzerData(MetadataObject):
+class DataObject(MetadataObject):
'''
Metadata object to handle Frame related Metadata
Attributes
----------
- data : numpy array
+ value : numpy array
+ label : numpy array of int
time : numpy array of float
duration : numpy array of float
elif name == 'dataType':
return
- super(AnalyzerData, self).__setattr__(name, value)
+ super(DataObject, self).__setattr__(name, value)
def __eq__(self, other):
try:
A new MetadataObject with the following attributes :
- dataMode
- timeMode
- - data : :class:`AnalyzerData`
+ - data : :class:`DataObject`
- idMetadata : :class:`IdMetadata`
- audioMetadata : :class:`AudioMetadata`
- frameMetadata : :class:`FrameMetadata`
_default_value = OrderedDict([('dataMode', None),
('timeMode', None),
('idMetadata', None),
- ('data', None),
+ ('dataObject', None),
('audioMetadata', None),
('frameMetadata', None),
('labelMetadata', None),
def __setattr__(self, name, value):
setFuncDict = {'idMetadata': IdMetadata,
- 'data': AnalyzerData,
+ 'dataObject': DataObject,
'audioMetadata': AudioMetadata,
'frameMetadata': FrameMetadata,
'labelMetadata': LabelMetadata,
raise TypeError('Wrong argument')
elif name == 'dataMode':
if self[name] is not None:
- raise AttributeError("The value of attribute ''timeMode'' \\\
+ raise AttributeError("The value of attribute ''dataMode'' \\\
can not change after setup")
if value == 'value':
del self.labelMetadata
- del self.data.label
+ del self.dataObject.label
elif value == 'label':
- del self.data.value
+ del self.dataObject.value
elif value is None:
pass
else:
can not change after setup")
if value == 'framewise':
- del self.data.time
- del self.data.duration
+ del self.dataObject.time
+ del self.dataObject.duration
pass
elif value == 'global':
- del self.data.time
- del self.data.duration
+ del self.dataObject.time
+ del self.dataObject.duration
del self.frameMetadata
pass
del self.frameMetadata
elif value == 'event':
del self.frameMetadata
- del self.data.duration
+ del self.dataObject.duration
pass
elif value is None:
return dict([(key, self[key].as_dict())
for key in self.keys() if hasattr(self[key], 'as_dict')] +
[('dataMode', self.dataMode), ('timeMode', self.timeMode)])
-
+ # TODO : check if it can be simplified now
def to_xml(self):
import xml.etree.ElementTree as ET
root = ET.Element('result')
return result
+ def data(self):
+ return {key: self.dataObject[key] for key in ['value', 'label'] if key in self.dataObject.keys()}
+
+ def time(self):
+ if self.timeMode == 'global':
+ return self.audioMetadata.start
+ elif self.timeMode == 'framewise':
+ return (self.audioMetadata.start +
+ self.frameMetadata.stepsize * numpy.arange(0,len(self)))
+ else:
+ return self.dataObject.time
+ pass
+
+ def duration(self):
+ if self.timeMode == 'global':
+ return self.audioMetadata.duration
+ elif self.timeMode == 'framewise':
+ return self.frameMetadata.blockwise * numpy.ones(len(self))
+ elif self.timeMode == 'event':
+ return numpy.zeros(len(self))
+ elif self.timeMode == 'segment':
+ return self.dataObject.duration
+
+ def __len__(self):
+ if self.dataMode == 'value':
+ return len(self.dataObject.value)
+ else:
+ return len(self.dataObject.label)
# @property
>>> (d|a).run() #doctest: +ELLIPSIS
<timeside.core.ProcessPipe object at 0x...>
>>> a.new_result() #doctest: +ELLIPSIS
- AnalyzerResult(dataMode=None, timeMode=None, idMetadata=IdMetadata(id='', name='', unit='', description='', date='...', version='...', author='TimeSide'), data=AnalyzerData(value=None, label=array([], dtype=int64), time=array([], dtype=float64), duration=array([], dtype=float64)), audioMetadata=AudioMetadata(uri='file:///.../tests/samples/sweep.wav', start=1.0, duration=7.0, channels=None, channelsManagement=''), frameMetadata=FrameMetadata(samplerate=None, blocksize=None, stepsize=None), labelMetadata=LabelMetadata(label=None, description=None, labelType='mono'), parameters={})
+ AnalyzerResult(dataMode=None, timeMode=None, idMetadata=IdMetadata(id='', name='', unit='', description='', date='...', version='...', author='TimeSide'), data=DataObject(value=None, label=array([], dtype=int64), time=array([], dtype=float64), duration=array([], dtype=float64)), audioMetadata=AudioMetadata(uri='file:///.../tests/samples/sweep.wav', start=1.0, duration=7.0, channels=None, channelsManagement=''), frameMetadata=FrameMetadata(samplerate=None, blocksize=None, stepsize=None), labelMetadata=LabelMetadata(label=None, description=None, labelType='mono'), parameters={})
>>> resContainer = coreA.AnalyzerResultContainer()
'''
root = ET.Element('timeside')
for result in self.values():
- if result:
+ if result is not None:
root.append(ET.fromstring(result.to_xml()))
return ET.tostring(root, encoding="utf-8", method="xml")
group.attrs['dataMode'] = res['dataMode']
group.attrs['timeMode'] = res['timeMode']
for key in res.keys():
- if key not in ['dataMode', 'timeMode', 'data']:
+ if key not in ['dataMode', 'timeMode', 'dataObject']:
subgroup = group.create_group(key)
# Write attributes
subgroup.attrs[name] = res[key][name]
# Write Datasets
- key = 'data'
+ key = 'dataObject'
subgroup = group.create_group(key)
for dsetName in res[key].keys():
if res[key][dsetName] is not None:
for name, value in subgroup.attrs.items():
result[subgroup_name][name] = value
- if subgroup_name == 'data':
+ if subgroup_name == 'dataObject':
for dsetName, dset in subgroup.items():
# Load value from the hdf5 dataset and store in data
# FIXME : the following conditional statement is to prevent
from datetime import datetime
result = AnalyzerResult(dataMode=dataMode, timeMode=timeMode)
+
# Automatically write known metadata
- result.idMetadata = IdMetadata(
- date=datetime.now().replace(microsecond=0).isoformat(' '),
- version=TimeSideVersion,
- author='TimeSide')
- result.audioMetadata = AudioMetadata(uri=self.mediainfo()['uri'],
- start=self.mediainfo()['start'],
- duration=self.mediainfo()['duration'])
-
- result.data = AnalyzerData()
-
- if dataMode == 'value':
- pass
- elif dataMode == 'label':
- result.labelMetadata = LabelMetadata()
- else:
- # raise ArgError('')
- pass
+ result.idMetadata.date = datetime.now().replace(
+ microsecond=0).isoformat(' ')
+ result.idMetadata.version = TimeSideVersion
+ result.idMetadata.author = 'TimeSide'
+
+ result.audioMetadata.uri = self.mediainfo()['uri']
+ result.audioMetadata.start = self.mediainfo()['start']
+ result.audioMetadata.duration = self.mediainfo()['duration']
+ result.audioMetadata.IS_SEGMENT = self.mediainfo()['IS_SEGMENT']
if timeMode == 'framewise':
- result.frameMetadata = FrameMetadata(
- samplerate=self.result_samplerate,
- blocksize=self.result_blocksize,
- stepsize=self.result_stepsize)
- elif timeMode == 'global':
- # None : handle by data
- pass
- elif timeMode == 'segment':
- # None : handle by data
- pass
- elif timeMode == 'event':
- # None : handle by data, duration = 0
- pass
- else:
- # raise ArgError('')
- pass
+ result.frameMetadata.samplerate = self.result_samplerate
+ result.frameMetadata.blocksize = self.result_blocksize
+ result.frameMetadata.stepsize = self.result_stepsize
return result