From: yomguy <> Date: Sat, 23 Aug 2008 13:40:42 +0000 (+0000) Subject: * Add analyzers X-Git-Tag: 1.1~811 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=92e0128e8b5a9e2bc275ac25d86ff9b97b06f14b;p=telemeta.git * Add analyzers * Modify item detail template * Cleanup --- diff --git a/debian/control b/debian/control index a1158628..6ea6f3f8 100644 --- a/debian/control +++ b/debian/control @@ -8,7 +8,7 @@ Standards-Version: 3.7.3 Package: telemeta Architecture: any -Depends: ${python:Depends}, python-xml, python-mutagen, python-django (>= 0.96.2), sox, vorbis-tools, flac, normalize-audio, python-mysqldb, mysql-server, octave2.9, python-tk, libgd2-xpm, libsndfile1, python-numpy +Depends: ${python:Depends}, python-xml, python-mutagen, python-django (>= 0.96.2), sox, vorbis-tools, flac, normalize-audio, python-mysqldb, mysql-server, octave2.9, python-tk, libgd2-xpm, libsndfile1, python-numpy, python-ctypes (>= 1.0.1), libsndfile1 Recommends: lame Suggests: ecasound, festival, par2 Description: web frontend to backup, transcode and tag any audio content with metadata diff --git a/telemeta/analysis/__init__.py b/telemeta/analysis/__init__.py index cc434015..0336b26d 100644 --- a/telemeta/analysis/__init__.py +++ b/telemeta/analysis/__init__.py @@ -1,5 +1,7 @@ from telemeta.analysis.api import * from telemeta.analysis.core import * +from telemeta.analysis.channels import * +from telemeta.analysis.length import * +from telemeta.analysis.samplerate import * from telemeta.analysis.max_level import * from telemeta.analysis.mean_level import * -from telemeta.analysis.length import * diff --git a/telemeta/analysis/channels.py b/telemeta/analysis/channels.py new file mode 100644 index 00000000..6adf3561 --- /dev/null +++ b/telemeta/analysis/channels.py @@ -0,0 +1,30 @@ +# Copyright (C) 2008 Parisson SARL +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://svn.parisson.org/telemeta/TelemetaLicense. +# +# Author: Guillaume Pellerin + +from telemeta.analysis.core import * +from telemeta.analysis.api import IMediaItemAnalyzer +import numpy + +class ChannelAnalyser(AudioProcessor): + """Media item analyzer driver interface""" + + implements(IMediaItemAnalyzer) + + def get_id(self): + return "nb_channels" + + def get_name(self): + return "Number of channels" + + def get_unit(self): + return "" + + def render(self, media_item, options=None): + self.pre_process(media_item) + return self.channels diff --git a/telemeta/analysis/core.py b/telemeta/analysis/core.py index 93f44bc9..ffc673cc 100644 --- a/telemeta/analysis/core.py +++ b/telemeta/analysis/core.py @@ -50,7 +50,11 @@ class AudioProcessor(Component): # convert to mono by selecting left channel only if self.channels > 1: samples = samples[:,0] - return samples + return samples + + def get_samples(self): + samples = self.audio_file.read_frames(self.frames) + return samples def read(self, start, size, resize_if_less=False): """ read size samples starting at start, if resize_if_less is True and less than size diff --git a/telemeta/analysis/length.py b/telemeta/analysis/length.py index 3c6cf7a2..c1817fba 100644 --- a/telemeta/analysis/length.py +++ b/telemeta/analysis/length.py @@ -16,11 +16,6 @@ class LengthAnalyzer(AudioProcessor): implements(IMediaItemAnalyzer) - def __init__(self): - self.fft_size = 2048 - self.window_function = numpy.hanning - self.window = self.window_function(self.fft_size) - def get_id(self): return "length" @@ -32,4 +27,4 @@ class LengthAnalyzer(AudioProcessor): def render(self, media_item, options=None): self.pre_process(media_item) - return numpy.round(numpy.divide(self.frames, self.samplerate),2) + return numpy.round(float(self.frames)/float(self.samplerate),2) diff --git a/telemeta/analysis/max_level.py b/telemeta/analysis/max_level.py index 6aaa48be..bcc4343f 100644 --- a/telemeta/analysis/max_level.py +++ b/telemeta/analysis/max_level.py @@ -16,22 +16,16 @@ class MaxLevelAnalyzer(AudioProcessor): implements(IMediaItemAnalyzer) - def __init__(self): - self.fft_size = 2048 - self.window_function = numpy.hanning - self.window = self.window_function(self.fft_size) - def get_id(self): return "max_level" def get_name(self): - return "Maximum level" + return "Maximum peak level" def get_unit(self): return "dB" def render(self, media_item, options=None): self.pre_process(media_item) - samples = self.get_mono_samples() - print str(numpy.max(samples)) + samples = self.get_samples() return numpy.round(20*numpy.log10(numpy.max(samples)),2) \ No newline at end of file diff --git a/telemeta/analysis/mean_level.py b/telemeta/analysis/mean_level.py index 1efe14e5..630080d9 100644 --- a/telemeta/analysis/mean_level.py +++ b/telemeta/analysis/mean_level.py @@ -16,16 +16,11 @@ class MeanLevelAnalyser(AudioProcessor): implements(IMediaItemAnalyzer) - def __init__(self): - self.fft_size = 2048 - self.window_function = numpy.hanning - self.window = self.window_function(self.fft_size) - def get_id(self): return "mean_level" def get_name(self): - return "Mean level" + return "Mean RMS level" def get_unit(self): return "dB" diff --git a/telemeta/analysis/samplerate.py b/telemeta/analysis/samplerate.py new file mode 100644 index 00000000..6fcb5feb --- /dev/null +++ b/telemeta/analysis/samplerate.py @@ -0,0 +1,30 @@ +# Copyright (C) 2008 Parisson SARL +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://svn.parisson.org/telemeta/TelemetaLicense. +# +# Author: Guillaume Pellerin + +from telemeta.analysis.core import * +from telemeta.analysis.api import IMediaItemAnalyzer +import numpy + +class SampleRateAnalyzer(AudioProcessor): + """Media item analyzer driver interface""" + + implements(IMediaItemAnalyzer) + + def get_id(self): + return "samplerate" + + def get_name(self): + return "Samplerate" + + def get_unit(self): + return "Hz" + + def render(self, media_item, options=None): + self.pre_process(media_item) + return self.samplerate diff --git a/telemeta/htdocs/css/telemeta.css b/telemeta/htdocs/css/telemeta.css index 1fe5a561..1bbcd46c 100644 --- a/telemeta/htdocs/css/telemeta.css +++ b/telemeta/htdocs/css/telemeta.css @@ -120,7 +120,7 @@ h3 { border: 1px solid #adadad; text-align: center; } -.item_visualization select { width: 210px; } +.item_visualization select { width: 240px; } .item_visualization .viewport { width: 305px; border: 1px solid #adadad; overflow: auto; margin-top: 5px; background-color: #fff;} .exporter { @@ -131,18 +131,18 @@ h3 { padding: 2px; height: 17px; margin: 5px 0 0; - overflow: auto; + /* overflow: auto; */ font-size: 1em; } -.analyser { +.analyzer { background-color: #fff; color: #555; border: 1px solid #adadad; width: 301px; padding: 2px; margin: 5px 0 0; - overflow: auto; + /* overflow: auto; */ font-size: 1em; } diff --git a/telemeta/templates/mediaitem_detail.html b/telemeta/templates/mediaitem_detail.html index 5d4f8a4a..83d5ac0c 100644 --- a/telemeta/templates/mediaitem_detail.html +++ b/telemeta/templates/mediaitem_detail.html @@ -47,22 +47,19 @@ -
-

Download: - {% for format in export_formats %} - {{ format.name }} - {% endfor %}

-
-
-

Analysis:

-
- +
+
+ + + + + {% for analyser in analysers %} -
ParameterValueUnit
{{ analyser.name }} = + {{ analyser.value }} @@ -72,6 +69,13 @@ {% endfor %}
+
+

Download: + {% for format in export_formats %} + {{ format.name }} + {% endfor %}

+
+ {% endif %}
diff --git a/telemeta/visualization/wav2png.py b/telemeta/visualization/wav2png.py index d0e37e01..e173f23d 100755 --- a/telemeta/visualization/wav2png.py +++ b/telemeta/visualization/wav2png.py @@ -294,7 +294,7 @@ class WaveformImage(object): if alpha > 0.0 and alpha < 1.0 and y_max_int + 1 < self.image_height: current_pix = self.pix[x, y_max_int + 1] - + r = int((1-alpha)*current_pix[0] + alpha*color[0]) g = int((1-alpha)*current_pix[1] + alpha*color[1]) b = int((1-alpha)*current_pix[2] + alpha*color[2]) diff --git a/telemeta/visualization/waveform3.py b/telemeta/visualization/waveform3.py index e908dfd4..3fbb7e09 100644 --- a/telemeta/visualization/waveform3.py +++ b/telemeta/visualization/waveform3.py @@ -31,7 +31,7 @@ class WaveFormVisualizer(Component): pngFile_w = NamedTemporaryFile(suffix='.png') pngFile_s = NamedTemporaryFile(suffix='.png') image_width = 305 - image_height = 152 + image_height = 150 fft_size = 2048 args = (wav_file, pngFile_w.name, pngFile_s.name, image_width, image_height, fft_size) create_png(*args)