# HG changeset patch # User Chris Cannam # Date 1170340288 0 # Node ID 8ff1ad4e7a9cd56c41441a5a6c1960e145ca270b # Parent bf753a9abf0c6132ef3dbcdfb8f9343fbdef7ecd * Work on harmonising colour and scale ranges between types of layer * Add normalize options to colour 3d plot layer diff -r bf753a9abf0c -r 8ff1ad4e7a9c base/LogRange.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/LogRange.cpp Thu Feb 01 14:31:28 2007 +0000 @@ -0,0 +1,60 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2006 Chris Cannam. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "LogRange.h" + +#include +#include + +void +LogRange::mapRange(float &min, float &max, float logthresh) +{ + if (min > max) std::swap(min, max); + if (max == min) max = min + 1; + + if (min >= 0.f) { + + max = log10f(max); // we know max != 0 + + if (min == 0.f) min = std::min(logthresh, max); + else min = log10f(min); + + } else if (max <= 0.f) { + + min = log10f(-min); // we know min != 0 + + if (max == 0.f) max = std::min(logthresh, min); + else max = log10f(-max); + + std::swap(min, max); + + } else { + + // min < 0 and max > 0 + + max = log10f(std::max(max, -min)); + min = std::min(logthresh, max); + } + + if (min == max) min = max - 1; +} + +float +LogRange::map(float value, float thresh) +{ + if (value == 0.f) return thresh; + return log10f(fabsf(value)); +} + diff -r bf753a9abf0c -r 8ff1ad4e7a9c base/LogRange.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/LogRange.h Thu Feb 01 14:31:28 2007 +0000 @@ -0,0 +1,38 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2006 Chris Cannam. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#ifndef _LOG_RANGE_H_ +#define _LOG_RANGE_H_ + +class LogRange +{ +public: + /** + * Map a linear range onto a logarithmic range. min and max are + * passed as the extents of the linear range and returned as the + * extents of the logarithmic range. thresh is the minimum value + * for the log range, to be used if the linear range spans zero. + */ + static void mapRange(float &min, float &max, float thresh = -10); + + /** + * Map a value onto a logarithmic range. This just means taking + * the base-10 log of the absolute value, or using the threshold + * value if the absolute value is zero. + */ + static float map(float value, float thresh = -10); +}; + +#endif diff -r bf753a9abf0c -r 8ff1ad4e7a9c base/PropertyContainer.h --- a/base/PropertyContainer.h Fri Jan 26 16:59:57 2007 +0000 +++ b/base/PropertyContainer.h Thu Feb 01 14:31:28 2007 +0000 @@ -102,7 +102,7 @@ signals: void propertyChanged(PropertyContainer::PropertyName); - + public slots: /** * Set a property. This is used for all property types. For diff -r bf753a9abf0c -r 8ff1ad4e7a9c base/base.pro --- a/base/base.pro Fri Jan 26 16:59:57 2007 +0000 +++ b/base/base.pro Thu Feb 01 14:31:28 2007 +0000 @@ -19,6 +19,7 @@ Command.h \ CommandHistory.h \ Exceptions.h \ + LogRange.h \ Pitch.h \ PlayParameterRepository.h \ PlayParameters.h \ @@ -44,6 +45,7 @@ Command.cpp \ CommandHistory.cpp \ Exceptions.cpp \ + LogRange.cpp \ Pitch.cpp \ PlayParameterRepository.cpp \ PlayParameters.cpp \