]> git.parisson.com Git - telemeta.git/commitdiff
allow visualization colors customization
authorolivier <>
Wed, 24 Dec 2008 18:54:06 +0000 (18:54 +0000)
committerolivier <>
Wed, 24 Dec 2008 18:54:06 +0000 (18:54 +0000)
telemeta/visualization/api.py
telemeta/visualization/spectrogram.py
telemeta/visualization/spectrogram2.py
telemeta/visualization/spectrogram3.py
telemeta/visualization/spectrogram4.py
telemeta/visualization/wav2png.py
telemeta/visualization/waveform.py
telemeta/visualization/waveform2.py
telemeta/visualization/waveform3.py
telemeta/visualization/waveform4.py

index 96727f2c9d979da5058bfff3534d300b7624950d..d68fc53e270fefe605c9789a7ab7a5875ccec550 100644 (file)
@@ -20,5 +20,10 @@ class IMediaItemVisualizer(Interface):
         etc..
         """
 
+    def set_colors(self, background=None, scheme=None):
+        """Set the colors used for image generation. background is a RGB tuple, 
+        and scheme a a predefined color theme name"""
+        pass
+
     def render(media_item, width=None, height=None, options=None):
-        """Generator that streams the visualization output as a PNG image"""
\ No newline at end of file
+        """Generator that streams the visualization output as a PNG image"""
index e24cefa591c7dffbbb1f59cfc248f0ed60d41847..f4f0bfc39e7dbedfbf6dcffcb69d6c06edfa63b7 100644 (file)
@@ -25,6 +25,9 @@ class SpectrogramVisualizer(SnackCoreVisualizer):
     def get_name(self):
         return "Spectrogram 1"
     
+    def set_colors(self, background=None, scheme=None):
+        pass
+
     def render(self, media_item, options=None):
         """Generator that streams the spectral view as a PNG image"""
 
index ea0663d2bdef5e79b3614051055a1a1a9dd299f1..d4c41e9884d77e0c515245ba5a095b9d05cd0354 100644 (file)
@@ -25,8 +25,11 @@ class SpectrogramVisualizer2(OctaveCoreVisualizer):
 
     def get_name(self):
         return "Spectrogram (octave)"
+
+    def set_colors(self, background=None, scheme=None):
+        pass
     
-    def render(self, media_item, options=None):
+    def render(self, media_item, width=None, height=None, options=None):
         """Generator that streams the spectral view as a PNG image"""
 
         stream = self.octave_to_png_stream(media_item)
index 340d2c36ddc2842d0a2ebf831a226fdf2252f874..f970e470e7c8c4282de79cec09a355d8150bf4d1 100644 (file)
@@ -18,12 +18,19 @@ class SpectrogramVisualizer3(Component):
 
     implements(IMediaItemVisualizer)
 
+    bg_color = None
+    color_scheme = None
+
     def get_id(self):
         return "spectrogram3"
 
     def get_name(self):
         return "Spectrogram (audiolab)"
     
+    def set_colors(self, background=None, scheme=None):
+        self.bg_color = background
+        self.color_scheme = scheme
+
     def render(self, media_item, width=None, height=None, options=None):
         """Generator that streams the spectrogram as a PNG image with a python method"""
 
@@ -40,7 +47,8 @@ class SpectrogramVisualizer3(Component):
             image_height = 150
             
         fft_size = 2048
-        args = (wav_file, pngFile.name, image_width, image_height, fft_size)
+        args = (wav_file, pngFile.name, image_width, image_height, fft_size, 
+                self.bg_color, self.color_scheme)
         create_spectrogram_png(*args)
 
         buffer = pngFile.read(0xFFFF)
index 9c9e7efc6f6fa0bd8d21f74c30f67ac0618ae8dc..87e687409a84354b005d31b2fd6ed2301106598d 100644 (file)
@@ -18,12 +18,19 @@ class SpectrogramVisualizer3(Component):
 
     implements(IMediaItemVisualizer)
 
+    bg_color = None
+    color_scheme = None
+
     def get_id(self):
         return "spectrogram4"
 
     def get_name(self):
         return "Spectrogram (audiolab large)"
     
+    def set_colors(self, background=None, scheme=None):
+        self.bg_color = background
+        self.color_scheme = scheme
+
     def render(self, media_item, width=None, height=None, options=None):
         """Generator that streams the spectrogram as a PNG image with a python method"""
 
@@ -40,7 +47,8 @@ class SpectrogramVisualizer3(Component):
             image_height = 300
             
         fft_size = 2048
-        args = (wav_file, pngFile.name, image_width, image_height, fft_size)
+        args = (wav_file, pngFile.name, image_width, image_height, fft_size, 
+                self.bg_color, self.color_scheme)
         create_spectrogram_png(*args)
 
         buffer = pngFile.read(0xFFFF)
index fee6809cee3035fdd11286c853d5b70e12f2205a..adf2dcb583001a4448fdbec9dd3fa26a5c3156ad 100755 (executable)
@@ -28,6 +28,19 @@ import ImageFilter, ImageChops, Image, ImageDraw, ImageColor
 import numpy
 import scikits.audiolab as audiolab
 
+color_schemes = {
+    'default': {
+        'waveform': [(50,0,200), (0,220,80), (255,224,0), (255,0,0)],
+        'spectrogram': [(0, 0, 0), (58/4,68/4,65/4), (80/2,100/2,153/2), (90,180,100),
+                      (224,224,44), (255,60,30), (255,255,255)]
+    },
+    'purple': {
+        'waveform': [(173,173,173), (147,149,196), (77,80,138), (108,66,0)],
+        'spectrogram': [(0, 0, 0), (58/4,68/4,65/4), (80/2,100/2,153/2), (90,180,100),
+                      (224,224,44), (255,60,30), (255,255,255)]
+    }
+}
+
 class TestAudioFile(object):
     """A class that mimics audiolab.sndfile but generates noise instead of reading
     a wave file. Additionally it can be told to have a "broken" header and thus crashing
@@ -244,8 +257,13 @@ def interpolate_colors(colors, flat=False, num_colors=256):
     
 
 class WaveformImage(object):
-    def __init__(self, image_width, image_height):
-        self.image = Image.new("RGB", (image_width, image_height))
+    def __init__(self, image_width, image_height, bg_color = None, color_scheme = None):
+        if not bg_color:
+            bg_color = (0,0,0)
+        if not color_scheme: 
+            color_scheme = 'default'
+
+        self.image = Image.new("RGB", (image_width, image_height), bg_color)
         
         self.image_width = image_width
         self.image_height = image_height
@@ -253,12 +271,7 @@ class WaveformImage(object):
         self.draw = ImageDraw.Draw(self.image)
         self.previous_x, self.previous_y = None, None
         
-        colors = [
-                    (50,0,200),
-                    (0,220,80),
-                    (255,224,0),
-                    (255,0,0),
-                 ]
+        colors = color_schemes[color_scheme]['waveform']
         
         # this line gets the old "screaming" colors back...
         # colors = [self.color_from_value(value/29.0) for value in range(0,30)]
@@ -327,22 +340,20 @@ class WaveformImage(object):
         
         
 class SpectrogramImage(object):
-    def __init__(self, image_width, image_height, fft_size):
+    def __init__(self, image_width, image_height, fft_size, bg_color = None, color_scheme = None):
+
+        #FIXME: bg_color is ignored
+
+        if not color_scheme: 
+            color_scheme = 'default'
+
         self.image = Image.new("P", (image_height, image_width))
         
         self.image_width = image_width
         self.image_height = image_height
         self.fft_size = fft_size
         
-        colors = [
-                    (0, 0, 0),
-                    (58/4,68/4,65/4),
-                    (80/2,100/2,153/2),
-                    (90,180,100),
-                    (224,224,44),
-                    (255,60,30),
-                    (255,255,255)
-                 ]
+        colors = color_schemes[color_scheme]['spectrogram']
         
         self.image.putpalette(interpolate_colors(colors, True))
 
@@ -378,13 +389,14 @@ class SpectrogramImage(object):
         self.image.transpose(Image.ROTATE_90).save(filename)
 
 
-def create_wavform_png(input_filename, output_filename_w, image_width, image_height, fft_size):
+def create_wavform_png(input_filename, output_filename_w, image_width, image_height, fft_size,
+                       bg_color = None, color_scheme = None):
     audio_file = audiolab.sndfile(input_filename, 'read')
 
     samples_per_pixel = audio_file.get_nframes() / float(image_width)
     processor = AudioProcessor(audio_file, fft_size, numpy.hanning)
     
-    waveform = WaveformImage(image_width, image_height)
+    waveform = WaveformImage(image_width, image_height, bg_color, color_scheme)
     
     for x in range(image_width):
         
@@ -404,13 +416,14 @@ def create_wavform_png(input_filename, output_filename_w, image_width, image_hei
     
     print " done"
 
-def create_spectrogram_png(input_filename, output_filename_s, image_width, image_height, fft_size):
+def create_spectrogram_png(input_filename, output_filename_s, image_width, image_height, fft_size,
+                           bg_color = None, color_scheme = None):
     audio_file = audiolab.sndfile(input_filename, 'read')
 
     samples_per_pixel = audio_file.get_nframes() / float(image_width)
     processor = AudioProcessor(audio_file, fft_size, numpy.hanning)
     
-    spectrogram = SpectrogramImage(image_width, image_height, fft_size)
+    spectrogram = SpectrogramImage(image_width, image_height, fft_size, bg_color, color_scheme)
     
     for x in range(image_width):
    
index 6959cc40ea3f412872dfe4c79bd2c8d22da8e9b7..5868c23c5c6914e58805277d7ad163f036e31a69 100644 (file)
@@ -28,6 +28,9 @@ class WaveFormVisualizer(Component):
     def get_name(self):
         return "Waveform"
     
+    def set_colors(self, background=None, scheme=None):
+        pass
+
     def render(self, media_item, options=None):
         """Generator that streams the waveform as a PNG image"""
 
index 18567e042f5f669d833ca49732cef1f02a651f99..5c4ff9a1b63c1fd661fdee5cfde4f7736dc9fe57 100644 (file)
@@ -28,6 +28,9 @@ class WaveformVisualizer2(OctaveCoreVisualizer):
     def get_name(self):
         return "Waveform (octave)"
     
+    def set_colors(self, background=None, scheme=None):
+        pass
+
     def render(self, media_item, options=None):
         """Generator that streams the temporal view as a PNG image"""
 
index 55644f13e8bc847668a24ea282506a8ce0871700..f6a111e6eefd2f1cd73fb8e4b23d18ed3c60d121 100644 (file)
@@ -18,12 +18,19 @@ class WaveFormVisualizer(Component):
 
     implements(IMediaItemVisualizer)
 
+    bg_color = None
+    color_scheme = None
+
     def get_id(self):
         return "waveform3"
 
     def get_name(self):
         return "Waveform (audiolab)"
 
+    def set_colors(self, background=None, scheme=None):
+        self.bg_color = background
+        self.color_scheme = scheme
+
     def render(self, media_item, width=None, height=None, options=None):
         """Generator that streams the waveform as a PNG image with a python method"""
 
@@ -40,7 +47,8 @@ class WaveFormVisualizer(Component):
             image_height = 150
 
         fft_size = 2048
-        args = (wav_file, pngFile.name, image_width, image_height, fft_size)
+        args = (wav_file, pngFile.name, image_width, image_height, fft_size, 
+                self.bg_color, self.color_scheme)
         create_wavform_png(*args)
 
         buffer = pngFile.read(0xFFFF)
index 10895304d810e83ed81b2eb9f8145243515ac109..93d9b57f879a2392dde1d64bd2cf5cc320f84f51 100644 (file)
@@ -18,13 +18,20 @@ class WaveFormVisualizer(Component):
 
     implements(IMediaItemVisualizer)
 
+    bg_color = None
+    color_scheme = None
+
     def get_id(self):
         return "waveform4"
 
     def get_name(self):
         return "Waveform (audiolab large)"
 
-    def render(self, media_item,  width=None, height=None, options=None):
+    def set_colors(self, background=None, scheme=None):
+        self.bg_color = background
+        self.color_scheme = scheme
+
+    def render(self, media_item, width=None, height=None, options=None):
         """Generator that streams the waveform as a PNG image with a python method"""
 
         wav_file = media_item.file.path
@@ -40,7 +47,7 @@ class WaveFormVisualizer(Component):
             image_height = 300
 
         fft_size = 2048
-        args = (wav_file, pngFile.name, image_width, image_height, fft_size)
+        args = (wav_file, pngFile.name, image_width, image_height, fft_size, self.bg_color, self.color_scheme)
         create_wavform_png(*args)
 
         buffer = pngFile.read(0xFFFF)